<?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>AceEditor</name>
	<version>0.2.3.2</version>
  <mincmsversion>1.9</mincmsversion>
	<help><![CDATA[PGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIiAvPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSJGTEgyQU44OVVQUEFHIiAvPjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9HQi9pL2J0bi9idG5fZG9uYXRlX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsIOKAlCBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZS4iIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7IiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9kZV9ERS9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC9mb3JtPjwvZGl2PjxkaXYgaWQ9InBhZ2VfdGFicyI+PGRpdiBpZD0iZ2VuZXJhbCI+R2VuZXJhbDwvZGl2PjxkaXYgaWQ9InNob3J0Y3V0cyI+S2V5Ym9hcmQgU2hvcnRjdXRzPC9kaXY+PGRpdiBpZD0iZnJvbnRlbmQiPkZyb250ZW5kPC9kaXY+PGRpdiBpZD0iYWJvdXQiPkFib3V0PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXJiIj48L2Rpdj48ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPjxkaXYgaWQ9ImdlbmVyYWxfYyI+PGltZyBzdHlsZT0iZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMTBweCAxMHB4IDEwcHg7IGJvcmRlcjogNXB4IHNvbGlkICNmMGYwZjA7IiBzcmM9Imh0dHA6Ly91bmlxdTMuZHluZG5zLXNlcnZlci5jb20vZGVtb3Mvc2FuZGJveC9tb2R1bGVzL0FjZUVkaXRvci9pbWFnZXMvZWRpdG9yLmpwZyIgYWx0PSJFZGl0b3IiIHdpZHRoPSIzMTYiIGhlaWdodD0iMjU5IiAvPg0KPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj0iaHR0cDovL3d3dy5jbG91ZDlpZGUuY29tIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+DQo8aDM+QWNlIGlzIGhvc3RlZCBvbiBHaXRIdWI8L2gzPg0KPHA+VGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKS48YnIgLz4NClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlPC9oMz4NCjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPg0KQWZ0ZXIgQWNlRWRpdG9yIHdhcyBpbnN0YWxsZWQgZ28gdG8gIk15IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlcyIgYW5kIGNob29zZSBBY2VFZGl0b3IgYXMgeW91ciBTeW50YXhoaWdobGlnaHRlciBvZiBjaG9pY2UgZnJvbSAiU2VsZWN0IHN5bnRheCBoaWdobGlnaHRlciB0byB1c2U6IiBEcm9wZG93bi48YnIgLz4NCk1ha2Ugc3VyZSB5b3UgaGF2ZSAnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnIFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gIkV4dGVuc2lvbnMgJnJhcXVvOyBBY2VFZGl0b3IiPC9wPjxiciBzdHlsZSA9ImNsZWFyOmJvdGg7IiAvPjwvZGl2PjxkaXYgaWQ9InNob3J0Y3V0c19jIj48ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgICAgPGgzPkRlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSJwYWdldGFibGUiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSJEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyI+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SZXR1cm48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZ1bGxzY3JlZW48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnBlcmZvcm0gc2F2ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBsY2Fzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kIG5leHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtRzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZpbmQgcHJldmlvdXM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkRvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Eb3duLEN0cmwtTjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+VXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5MZWZ0LEN0cmwtQjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUxlZnQsSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTGVmdCxIb21lLEN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UmlnaHQsQ3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSG9tZSxDdHJsLVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5pbmRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm91dGRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm92ZXJ3cml0ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+cGFnZXVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlZG88L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtQmFja3NwYWNlLEN0cmwtQWx0LUJhY2tzcGFjZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2U8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zcGxpdCBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij50b2dnbGUgY29tbWVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnVuZG88L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImZyb250ZW5kX2MiPjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+PHA+VGhpcyBNb2R1bGUgYW5kIEFjZSBTY3JpcHQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGVyLjxiciAvPg0KVG8gbWFrZSBpdCB3b3JrIHlvdSBoYXZlIHRvIGluY2x1ZGUgalF1ZXJ5IEZyYW1ld29yaywgZm9yIGV4YW1wbGUgdXNpbmcgQ01TTVMge2Ntc19qcXVlcnl9IHRhZyBhbmQgYXMgd2VsbCBpbmNsdWRlIHtBY2VFZGl0b3J9IGluIHlvdXIgcGFnZSB0d2ljZS4gRmlyc3QgYWRkIHRoZSBtb2R1bGUgdGFnIGluIHlvdXIgJmx0O2hlYWQmZ3Q7IHNlY3Rpb24gb2YgVGVtcGxhdGUgb3IgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7IGZpZWxkIG9mIHlvdXIgQ29udGVudCBwYWdlLCBsaWtlIHtBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSdmb28nfSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlICZsdDtoZWFkJmd0OyBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPg0KCTxwcmU+DQoJe2Ntc19qcXVlcnl9DQoJe0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfQ0KCTwvcHJlPg0KPHA+VGhpcyBpbmNsdWRlcyBuZWVkZWQgc2NyaXB0cyBmb3IgQWNlIFN5bnRheGhpZ2hsaWdodGVyIHRvIHdvcmsuPGJyIC8+DQpJbiBNb2R1bGVzIEFkbWluIGludGVyZmFjZSB5b3UgY2FuIHNlbGVjdCBkZWZhdWx0IHNldHRpbmdzIGZvciB5b3VyICdoZWFkJyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0naHRtbCxqYXZhc2NyaXB0JyBhbmQgdGhlbWVzPSd0ZXh0bWF0ZScgd2hpY2ggd291bGQgb3ZlcnJpZGUgc2VsZWN0ZWQgUHJlZmVyZW5jZXMuPC9wPg0KPHA+Tm93IHdoZW4geW91IGhhdmUgbmVlZGVkIHNjcmlwdHMgaW5jbHVkZWQsIG9uZSBtb3JlIE1vZHVsZSB0YWcgY2FsbCBpcyBuZWVkZWQgKGZvciBleGFtcGxlIGluIHlvdXIgQ29udGVudCBFZGl0b3IgYXJlYSkgdG8gc3BlY2lmeSB3aGljaCBhcmVhIG9mIHlvdXIgUGFnZSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQuPC9wPg0KCTxwcmU+DQoJe0FjZUVkaXRvciBkaXZpZD0nc29tZS1pZCd9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlICZsdDtkaXYmZ3Q7IHdpdGggc3BlY2lmaWVkIGlkLjwvcD48cHJlPg0KJmx0O3ByZSBpZD0mcXVvdDtzb21lLWlkJnF1b3Q7Jmd0Ow0KJmFtcDtsdDtodG1sJmFtcDtndDsNCiDCoCDCoCAmYW1wO2x0O2hlYWQmYW1wO2d0Ow0KIMKgIMKgICZhbXA7bHQ7c3R5bGUgdHlwZT0mcXVvdDt0ZXh0L2NzcyZxdW90OyZhbXA7Z3Q7DQogwqAgwqAgwqAgwqAgLnRleHQtbGF5ZXIgew0KIMKgIMKgIMKgIMKgIMKgIMKgIGZvbnQtZmFtaWx5OiBNb25hY28sICZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7LCBtb25vc3BhY2U7DQogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1zaXplOiAxMnB4Ow0KIMKgIMKgIMKgIMKgIMKgIMKgIGN1cnNvcjogdGV4dDsNCiDCoCDCoCDCoCDCoCB9DQogwqAgwqAgJmFtcDtsdDsvc3R5bGUmYW1wO2d0Ow0KIMKgIMKgICZhbXA7bHQ7L2hlYWQmYW1wO2d0Ow0KIMKgIMKgICZhbXA7bHQ7Ym9keSZhbXA7Z3Q7DQogwqAgwqAgwqAgwqAgJmFtcDtsdDtoMSBzdHlsZT0mcXVvdDtjb2xvcjpyZWQmcXVvdDsmYW1wO2d0O0p1aHUgS2lubmVycyZhbXA7bHQ7L2gxJmFtcDtndDsNCiDCoCDCoCAmYW1wO2x0Oy9ib2R5JmFtcDtndDsgJmFtcDtsdDsvaHRtbCZhbXA7Z3Q7DQombHQ7L3ByZSZndDs8L3ByZT48L2Rpdj48L2Rpdj48ZGl2IGlkPSJhYm91dF9jIj48ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPjxoMz5TdXBwb3J0PC9oMz4NCjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPiZsdDt1bmlxdTNlQGdtYWlsLmNvbSZndDs8L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0IiByZWw9ImV4dGVybmFsIj53d3cuaWNoLW1hY2gtZGFzLmF0PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCgk8aDM+VGVhbTwvaDM+DQoJPHVsPg0KCQk8bGk+R29yYW4gSWxpYyAodW5pcXUzKSBnLmlsaWNAaS1hcnRzLmV1IDxiciAvPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2xpPgkNCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQ0KCQk8bGk+Sm9uYXRoYW4gU2NobWlkIChGb2FseSopIGhpQGpvbmF0aGFuc2NobWlkLmRlIDxiciAvPnd3dy5qb25hdGhhbnNjaG1pZC5kZTwvbGk+DQoJPC91bD4NCjwvZGl2PjwvZGl2PjwvZGl2Pg08aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBhY3Rpb249ImRlZmF1bHQiIC0gaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdGlvbiBvZiBNb2R1bGUgdGFnLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdkZWZhdWx0JyBhbmQgJ2hlYWQnLiBCb3RoIGFyZSBuZWVkZWQgZm9yIGNvcnJlY3QgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nIGZ1bmN0aW9uLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5oZWFkPC9saT4NCgk8bGk+ZGVmYXVsdDwvbGk+DQo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbW9kZXM9Imh0bWwiIC0gaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICdtb2RlcycgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgJmx0O2hlYWQmZ3Q7IG9mIFRlbXBsYXRlIG9yIFBhZ2Ugc3BlY2lmaWMgTWV0YWRhdGEuIFRoaXMgd2lsbCBvdmVycmlkZSB5b3UgUHJlZmVyZW5jZXMgc2VsZWN0ZWQgaW4gTW9kdWxlIEFkbWluIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB0aGVtZXM9InRleHRtYXRlIiAtIGlzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAndGhlbWVzJyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciAmbHQ7aGVhZCZndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbW9kZT0iaHRtbCIgLSBpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0nZGVmYXVsdCd9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciBtb2RlIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB0aGVtZT0idGV4dG1hdGUiIC0gaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2RlZmF1bHQnfTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgdGhlbWUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gd2lkdGg9IjQwMCIgLSBzcGVjaWZpZXMgd2lkdGggb2YgU3ludGF4aGlnaGxpZ2h0ZXIgYXJlYSBpbiBwaXhlbC48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGhlaWdodD0iNDAwIiAtIHNwZWNpZmllcyBoZWlnaHQgb2YgU3ludGF4aGlnaGxpZ2h0ZXIgYXJlYSBpbiBwaXhlbC48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGRpdmlkPSJlZGl0b3IiIC0gaWQgb2YgdGhlIGVsZW1lbnQgY29udGFpbmluZyB5b3VyIGNvZGUuIFVzZSB1bmlxdWUgaWQgZm9yIGVhY2ggY29kZSBjaHVuY2suPC9saT48L3VsPg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBHb3JhbiBJbGljICZsdDt1bmlxdTNlQGdtYWlsLmNvbSZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjIuMy4yPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+DQo8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCdzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4xPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+DQoJPGxpPlVwZGF0ZWQgQUNFIHdpdGggdGhlbWVzPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMjwvaDM+DQo8dWw+DQoJPGxpPkZpeCBmb3IgU2FmYXJpL01hYzwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjM8L2gzPg0KPHVsPg0KICAgIDxsaT5VcGRhdGVkIHRvIGxhdGVzdCBhY2UgZnJvbSBnaXRodWI8L2xpPg0KICAgIDxsaT5BZGRlZCBhZGRpdGlvbmFsIHByZWZlcmVuY2VzIChNb2RpZnkgVGVtcGxhdGVzLCBBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlKTwvbGk+DQogICAgPGxpPkFkZGVkIGFiaWxpdHkgdG8gY2hhbmdlIEFjZUVkaXRvciBwcmVmZXJlbmNlcyBwZXIgdXNlcjwvbGk+DQogICAgPGxpPk1vdmVkIG1vZHVsZSBmcm9tIGV4dGVuaW9ucyB0byBteXByZWZzPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMy4xPC9oMz4NCjx1bD4NCiAgICA8bGk+TW9kZSBwcmVmZXJlbmNlIGJ1Z2ZpeDwvbGk+DQo8L3VsPg0KPGgzPlJvYWRtYXA8L2gzPg0KPHVsPg0KCTxsaT48ZGVsPkFkZCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmc8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBGdWxsc2NyZWVubW9kZTwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEtleWJpbmRpbmcgKENUUkwrUyk8L2RlbD48L2xpPg0KCTxsaT5BZGQgRWRpdG9yIGJlaGF2aW9yIChWaW0sIEVNYWNzKTwvbGk+DQoJPGxpPk1heWJlIGFkZCBUb29sYmFyPC9saT4NCjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[AceEditor is a Syntaxhighlighter module using <strong>Ace</strong> a standalone code editor written in JavaScript.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/ChangeLog.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[MjAxMS4wOC4wMiwgVmVyc2lvbiAwLjIuMA0KDQoqIFNwbGl0IHZpZXcgKEp1bGlhbiBWaWVyZWNrKQ0KICAtIHNwbGl0IGVkaXRvciBhcmVhIGhvcml6b250YWxseSBvciB2ZXJ0aXZhbGx5IHRvIHNob3cgdHdvIGZpbGVzIGF0IHRoZSBzYW1lDQogICAgdGltZQ0KDQoqIENvZGUgRm9sZGluZyAoSnVsaWFuIFZpZXJlY2spDQogIC0gVW5zdHJ1Y3R1cmVkIGNvZGUgZm9sZGluZw0KICAtIFdpbGwgYmUgdGhlIGJhc2lzIGZvciBsYW5ndWFnZSBhd2FyZSBmb2xkaW5nDQoNCiogTW9kZSBiZWhhdmlvdXJzIChDaHJpcyBTcGVuY2VyKQ0KICAtIEFkZHMgbW9kZSBzcGVjaWZpYyBob29rcyB3aGljaCBhbGxvdyB0cmFuc2Zvcm1hdGlvbnMgb2YgZW50ZXJlZCB0ZXh0DQogIC0gQXV0b2Nsb3Npbmcgb2YgYnJhY2VzLCBwYXJhbnRoZXNpcyBhbmQgcXVvdGF0aW9uIG1hcmtzIGluIEMgc3R5bGUgbW9kZXMNCiAgLSBBdXRvY2xvc2luZyBvZiBhbmd1bGFyIGJyYWNrZXRzIGluIFhNTCBzdHlsZSBtb2Rlcw0KDQoqIE5ldyBsYW5ndWFnZSBtb2Rlcw0KICAtIENsb2p1cmUgKENhcmluIE1laWVyKQ0KICAtIEMjIChSb2IgQ29uZXJ5KQ0KICAtIEdyb292eSAoQmVuIFRpbGZvcmQpDQogIC0gU2NhbGEgKEJlbiBUaWxmb3JkKQ0KICAtIEpTT04NCiAgLSBPQ2FtbCAoU2VyZ2kgTWFuc2lsbGEpDQogIC0gUGVybCAoUGFuYWdpb3RpcyBBc3RpdGhhcykNCiAgLSBTQ1NTL1NBU1MgKEFuZHJlYXMgTWFkc2VuKQ0KICAtIFNWRw0KICAtIFRleHRpbGUgKEtlbGxleSB2YW4gRXZlcnQpDQogIC0gU0NBRCAoSmFjb2IgSGFuc3NvbikNCiAgDQoqIExpdmUgc3ludGF4IGNoZWNrcw0KICAtIExpbnQgZm9yIENzcyB1c2luZyBDU1MgTGludCA8aHR0cDovL2Nzc2xpbnQubmV0Lz4NCiAgLSBDb2ZmZWVTY3JpcHQNCg0KKiBOZXcgVGhlbWVzDQogIC0gQ3JpbXNvbiBFZGl0b3IgKGllYnVnZ3kpDQogIC0gTWVyYml2b3JlIChNaWNoYWVsIFNjaHdhcnR6KQ0KICAtIE1lcmJpdm9yZSBzb2Z0IChNaWNoYWVsIFNjaHdhcnR6KQ0KICAtIFNvbGFyaXplZCBkYXJrL2xpZ2h0IDxodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQ+IChEYXZpZCBBbGFuDQogICAgSGplbGxlKQ0KICAtIFZpYnJhbnQgSW5rIChNaWNoYWVsIFNjaHdhcnR6KQ0KDQoqIFNtYWxsIEZlYXR1cmVzL0VuaGFuY2VtZW50cw0KICAtIExvdHMgb2YgcmVuZGVyIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgKEhhcnV0eXVuIEFtaXJqYW55YW4pDQogIC0gSW1wcm92ZWQgUnVieSBoaWdobGlnaHRpbmcgKENocmlzIFdhbnN0cmF0aCwgVHJlbnQgT2dyZW4pDQogIC0gSW1wcm92ZWQgUEhQIGhpZ2hsaWdodGluZyAoVGhvbWFzIEhydXNrYSkNCiAgLSBJbXByb3ZlZCBDU1MgaGlnaGxpZ2h0aW5nIChTZWFuIEtlbGxvZ2cpDQogIC0gQ2xpY2tzIHdoaWNoIGNhdXNlIHRoZSBlZGl0b3IgdG8gYmUgZm9jdXNlZCBkb24ndCByZXNldCB0aGUgc2VsZWN0aW9uDQogIC0gTWFrZSBwYWRkaW5nIHRleHQgbGF5ZXIgc3BlY2lmaWMgc28gdGhhdCBwcmludCBtYXJnaW4gYW5kIGFjdGl2ZSBsaW5lDQogICAgaGlnaGxpZ2h0IGFyZSBub3QgYWZmZWN0ZWQgKElyYWtsaSBHb3phbGlzaHZpbGkpDQogIC0gQWRkZWQgc2V0Rm9udFNpemUgbWV0aG9kDQogIC0gSW1wcm92ZWQgdmkga2V5YmluZGluZ3MgKFRyZW50IE9ncmVuKQ0KICAtIFdoZW4gdW5mb2N1c2VkIG1ha2UgY3Vyc29yIHRyYW5zcGFyZW50IGluc3RlYWQgb2YgcmVtb3ZpbmcgaXQgKEhhcnV0eXVuDQogICAgQW1pcmphbnlhbikNCiAgLSBTdXBwb3J0IGZvciBtYXRjaGluZyBncm91cHMgaW4gdG9rZW5pemVyIHdpdGggYXJyYXlzIG9mIHRva2VucyAoQ2hyaXMNCiAgICBTcGVuY2VyKQ0KDQoqIEJ1ZyBmaXhlcw0KICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IE9TWCBzY3JvbGwgYmFycw0KICAtIFByb3Blcmx5IGhpZ2hsaWdodCBKYXZhU2NyaXB0IHJlZ2V4cCBsaXRlcmFscw0KICAtIFByb3BlciBoYW5kbGluZyBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaW4gSmF2YVNjcmlwdCBpZGVudGlmaWVycw0KICAtIEZpeCByZW1vdmUgbGluZXMgY29tbWFuZCBvbiBsYXN0IGxpbmUgKEhhcnV0eXVuIEFtaXJqYW55YW4pDQogIC0gRml4IHNjcm9sbCB3aGVlbCBzbHVnZ2lzaG5lc3MgaW4gU2FmYXJpDQogIC0gTWFrZSBrZXlib2FyZCBpbmZyYXN0cnVjdHVyZSByb3V0ZSBrZXlzIGxpa2UgW11eJCB0aGUgcmlnaHQgd2F5IChKdWxpYW4NCiAgICBWaWVyZWNrKQ0KDQoyMDExLjAyLjE0LCBWZXJzaW9uIDAuMS42DQoNCiogRmxvYXRpbmcgQW5jaG9ycw0KICAtIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiANCiAgLSBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yIGRlbGV0ZWQgYmVmb3JlIHRoZSBjdXJzb3IsIHRoZSBwb3NpdGlvbiBvZg0KICAgIHRoZSBjdXJzb3IgaXMgdXBkYXRlZA0KICAtIFVzZXNkIGZvciB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24NCiAgLSBCYXNpcyBmb3IgYm9va21hcmtzLCBtdWx0aXBsZSBjdXJzb3JzIGFuZCBzbmlwcGV0cyBpbiB0aGUgZnV0dXJlDQoqIEV4dGVuc2l2ZSBzdXBwb3J0IGZvciBDb2NvYSBzdHlsZSBrZXliaW5kaW5ncyBvbiB0aGUgTWFjIDxodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvaXNzdWVzL2Nsb3NlZCNpc3N1ZS8xMTYvY29tbWVudC83Njc4MDM+DQoqIE5ldyBjb21tYW5kczoNCiAgLSBjZW50ZXIgc2VsZWN0aW9uIGluIHZpZXdwb3J0DQogIC0gcmVtb3ZlIHRvIGVuZC9zdGFydCBvZiBsaW5lDQogIC0gc3BsaXQgbGluZQ0KICAtIHRyYW5zcG9zZSBsZXR0ZXJzDQoqIFJlZmF0b3IgbWFya2VycyAgDQogIC0gQ3VzdG9tIGNvZGUgY2FuIGJlIHVzZWQgdG8gcmVuZGVyIG1hcmtlcnMNCiAgLSBNYXJrZXJzIGNhbiBiZSBpbiBmcm9udCBvciBiZWhpbmQgdGhlIHRleHQNCiAgLSBNYXJrZXJzIGFyZSBub3cgc3RvcmVkIGluIHRoZSBzZXNzaW9uICh3YXMgaW4gdGhlIHJlbmRlcmVyKQ0KKiBMb3RzIG9mIElFOCBmaXhlcyBpbmNsdWRpbmcgY29weSwgY3V0IGFuZCBzZWxlY3Rpb25zDQoqIFVuaXQgdGVzdHMgY2FuIGFsc28gYmUgcnVuIGluIHRoZSBicm93c2VyDQogIDxodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvYmxvYi9tYXN0ZXIvbGliL2FjZS90ZXN0L3Rlc3RzLmh0bWw+DQoqIFNvZnQgd3JhcCBjYW4gYWRhcHQgdG8gdGhlIHdpZHRoIG9mIHRoZSBlZGl0b3IgKE1pa2UgUmF0Y2xpZmZlLCBKb2UgQ2hlbmcpDQoqIEFkZCBtaW5pbWFsIG5vZGUgc2VydmVyIHNlcnZlci5qcyB0byBydW4gdGhlIEFjZSBkZW1vIGluIENocm9tZQ0KKiBUaGUgdG9wIGxldmVsIGVkaXRvci5odG1sIGRlbW8gaGFzIGJlZW4gcmVuYW1lZCB0byBpbmRleC5odG1sDQoqIEJ1ZyBmaXhlcw0KICAtIEZpeGVkIGdvdG9MaW5lIHRvIGNvbnNpZGVyIHdyYXBwZWQgbGluZXMgd2hlbiBjYWxjdWxhdGluZyB3aGVyZSB0byBzY3JvbGwgdG8gKEphbWVzIEFsbGVuKQ0KICAtIEZpeGVkIGlzdWVzIHdoZW4gdGhlIGVkaXRvciB3YXMgc2Nyb2xsZWQgaW4gdGhlIHdlYiBwYWdlIChFcmljIEFsbGFtKQ0KICAtIEhpZ2hsaWdodGluZyBvZiBQeXRob24gc3RyaW5nIGxpdGVyYWxzDQogIC0gU3ludGF4IHJ1bGUgZm9yIFBIUCBjb21tZW50cw0KDQoyMDExLjAyLjA4LCBWZXJzaW9uIDAuMS41DQoNCiogQWRkIENvZmZlZXNjcmlwdCBNb2RlIChTYXRvc2hpIE11cmFrYW1pKQ0KKiBGaXggd29yZCB3cmFwIGJ1ZyAoSnVsaWFuIFZpZXJlY2spDQoqIEZpeCBwYWNrYWdlZCB2ZXJzaW9uIG9mIHRoZSBFY2xpcHNlIG1vZGUNCiogTG9hZGluZyBvZiB3b3JrZXJzIGlzIG1vcmUgcm9idXN0DQoqIEZpeCAiY2xpY2sgc2VsZWN0aW9uIg0KKiBBbGxvdyB0b2tpemluZyBlbXB0eSBsaW5lcyAoRGFuaWVsIEtyZWNoKQ0KKiBNYWtlIFBhZ2VVcC9Eb3duIGJlaGF2aW9yIG1vcmUgY29uc2lzdGVudCB3aXRoIG5hdGl2ZSBPUyAoSm9lIENoZW5nKQ0KDQoyMDExLjAyLjA0LCBWZXJzaW9uIDAuMS40DQoNCiogQWRkIEMvQysrIG1vZGUgY29udHJpYnV0ZWQgYnkgR2FzdMOzbiBLbGVpbWFuDQoqIEZpeCBleGNlcHRpb24gaW4ga2V5IGlucHV0DQoNCjIwMTEuMDIuMDQsIFZlcnNpb24gMC4xLjMNCg0KKiBMZXQgdGhlIHBhY2thZ2VkIHZlcnNpb24gcGxheSBuaWNlIHdpdGggcmVxdWlyZUpTDQoqIEFkZCBSdWJ5IG1vZGUgY29udHJpYnV0ZWQgYnkgU2hsb21vIFphbG1hbiBIZWlnaA0KKiBBZGQgSmF2YSBtb2RlIGNvbnRyaWJ1dGVkIGJ5IFRvbSBUYXNjaGUNCiogRml4IGFubm90YXRpb24gYnVnDQoqIENoYW5naW5nIGEgZG9jdW1lbnQgYWRkZWQgYSBuZXcgZW1wdHkgbGluZSBhdCB0aGUgZW5k]]></data>
	</file>
	<file>
	  <filename>/ace/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TGljZW5zZWQgdW5kZXIgdGhlIHRyaS1saWNlbnNlIE1QTC9MR1BML0dQTC4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBNT1pJTExBIFBVQkxJQyBMSUNFTlNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS4xDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLQ0KDQoxLiBEZWZpbml0aW9ucy4NCg0KICAgICAxLjAuMS4gIkNvbW1lcmNpYWwgVXNlIiBtZWFucyBkaXN0cmlidXRpb24gb3Igb3RoZXJ3aXNlIG1ha2luZyB0aGUNCiAgICAgQ292ZXJlZCBDb2RlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5Lg0KDQogICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8NCiAgICAgdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuDQoNCiAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbA0KICAgICBDb2RlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciwgYW5kIHRoZSBNb2RpZmljYXRpb25zDQogICAgIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLg0KDQogICAgIDEuMy4gIkNvdmVyZWQgQ29kZSIgbWVhbnMgdGhlIE9yaWdpbmFsIENvZGUgb3IgTW9kaWZpY2F0aW9ucyBvciB0aGUNCiAgICAgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZQ0KICAgICBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4NCg0KICAgICAxLjQuICJFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20iIG1lYW5zIGEgbWVjaGFuaXNtIGdlbmVyYWxseQ0KICAgICBhY2NlcHRlZCBpbiB0aGUgc29mdHdhcmUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGZvciB0aGUgZWxlY3Ryb25pYw0KICAgICB0cmFuc2ZlciBvZiBkYXRhLg0KDQogICAgIDEuNS4gIkV4ZWN1dGFibGUiIG1lYW5zIENvdmVyZWQgQ29kZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZQ0KICAgICBDb2RlLg0KDQogICAgIDEuNi4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgaWRlbnRpZmllZA0KICAgICBhcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0DQogICAgIEEuDQoNCiAgICAgMS43LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIENvZGUgb3INCiAgICAgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQoNCiAgICAgMS44LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4NCg0KICAgICAxLjguMS4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtDQogICAgIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvcg0KICAgICBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLg0KDQogICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIGFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZQ0KICAgICBzdWJzdGFuY2Ugb3Igc3RydWN0dXJlIG9mIGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbnkgcHJldmlvdXMNCiAgICAgTW9kaWZpY2F0aW9ucy4gV2hlbiBDb3ZlcmVkIENvZGUgaXMgcmVsZWFzZWQgYXMgYSBzZXJpZXMgb2YgZmlsZXMsIGENCiAgICAgTW9kaWZpY2F0aW9uIGlzOg0KICAgICAgICAgIEEuIEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUNCiAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4NCg0KICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yDQogICAgICAgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4NCg0KICAgICAxLjEwLiAiT3JpZ2luYWwgQ29kZSIgbWVhbnMgU291cmNlIENvZGUgb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZQ0KICAgICB3aGljaCBpcyBkZXNjcmliZWQgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEgYXMNCiAgICAgT3JpZ2luYWwgQ29kZSwgYW5kIHdoaWNoLCBhdCB0aGUgdGltZSBvZiBpdHMgcmVsZWFzZSB1bmRlciB0aGlzDQogICAgIExpY2Vuc2UgaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZS4NCg0KICAgICAxLjEwLjEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3INCiAgICAgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCAgbWV0aG9kLCBwcm9jZXNzLA0KICAgICBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuDQoNCiAgICAgMS4xMS4gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIENvdmVyZWQgQ29kZSBmb3INCiAgICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cw0KICAgICBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wNCiAgICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBhbiBFeGVjdXRhYmxlLCBvciBzb3VyY2UgY29kZQ0KICAgICBkaWZmZXJlbnRpYWwgY29tcGFyaXNvbnMgYWdhaW5zdCBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW5vdGhlcg0KICAgICB3ZWxsIGtub3duLCBhdmFpbGFibGUgQ292ZXJlZCBDb2RlIG9mIHRoZSBDb250cmlidXRvcidzIGNob2ljZS4gVGhlDQogICAgIFNvdXJjZSBDb2RlIGNhbiBiZSBpbiBhIGNvbXByZXNzZWQgb3IgYXJjaGl2YWwgZm9ybSwgcHJvdmlkZWQgdGhlDQogICAgIGFwcHJvcHJpYXRlIGRlY29tcHJlc3Npb24gb3IgZGUtYXJjaGl2aW5nIHNvZnR3YXJlIGlzIHdpZGVseSBhdmFpbGFibGUNCiAgICAgZm9yIG5vIGNoYXJnZS4NCg0KICAgICAxLjEyLiAiWW91IiAob3IgIllvdXIiKSAgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eQ0KICAgICBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMNCiAgICAgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpc3N1ZWQgdW5kZXIgU2VjdGlvbiA2LjEuDQogICAgIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMNCiAgICAgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZg0KICAgICB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsDQogICAgIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieQ0KICAgICBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQNCiAgICAgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoDQogICAgIGVudGl0eS4NCg0KMi4gU291cmNlIENvZGUgTGljZW5zZS4NCg0KICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4NCiAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLA0KICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5DQogICAgIGNsYWltczoNCiAgICAgICAgICAoYSkgIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yDQogICAgICAgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyIHRvIHVzZSwgcmVwcm9kdWNlLA0KICAgICAgICAgIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwNCiAgICAgICAgICBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKSB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yDQogICAgICAgICAgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQNCg0KICAgICAgICAgIChiKSB1bmRlciBQYXRlbnRzIENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3INCiAgICAgICAgICBzZWxsaW5nIG9mIE9yaWdpbmFsIENvZGUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwNCiAgICAgICAgICBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUNCiAgICAgICAgICBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4NCg0KICAgICAgICAgIChjKSB0aGUgbGljZW5zZXMgZ3JhbnRlZCBpbiB0aGlzIFNlY3Rpb24gMi4xKGEpIGFuZCAoYikgYXJlDQogICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzDQogICAgICAgICAgT3JpZ2luYWwgQ29kZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KDQogICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMNCiAgICAgICAgICBncmFudGVkOiAxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgMikNCiAgICAgICAgICBzZXBhcmF0ZSBmcm9tIHRoZSBPcmlnaW5hbCBDb2RlOyAgb3IgMykgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkDQogICAgICAgICAgYnk6IGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgb3IgaWkpIHRoZQ0KICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4NCg0KICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50Lg0KICAgICBTdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3INCiAgICAgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZQ0KDQogICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcg0KICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwNCiAgICAgICAgICBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zDQogICAgICAgICAgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSBlaXRoZXIgb24gYW4NCiAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgQ29kZQ0KICAgICAgICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZA0KDQogICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvcg0KICAgICAgICAgIHNlbGxpbmcgb2YgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZQ0KICAgICAgICAgIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucw0KICAgICAgICAgIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlDQogICAgICAgICAgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kIDIpIHRoZSBjb21iaW5hdGlvbiBvZg0KICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yDQogICAgICAgICAgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuDQoNCiAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlDQogICAgICAgICAgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IG1ha2VzIENvbW1lcmNpYWwgVXNlIG9mDQogICAgICAgICAgdGhlIENvdmVyZWQgQ29kZS4NCg0KICAgICAgICAgIChkKSAgICBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzDQogICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUNCiAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uOyAyKSAgc2VwYXJhdGUgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsNCiAgICAgICAgICAzKSAgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiBpKSB0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mDQogICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiBvciBpaSkgIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUNCiAgICAgICAgICBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgIChleGNlcHQgYXMgcGFydCBvZiB0aGUNCiAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciA0KSB1bmRlciBQYXRlbnQgQ2xhaW1zDQogICAgICAgICAgaW5mcmluZ2VkIGJ5IENvdmVyZWQgQ29kZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkNCiAgICAgICAgICB0aGF0IENvbnRyaWJ1dG9yLg0KDQozLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuDQoNCiAgICAgMy4xLiBBcHBsaWNhdGlvbiBvZiBMaWNlbnNlLg0KICAgICBUaGUgTW9kaWZpY2F0aW9ucyB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQ0KICAgICBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQogICAgIFNlY3Rpb24gMi4yLiBUaGUgU291cmNlIENvZGUgdmVyc2lvbiBvZiBDb3ZlcmVkIENvZGUgbWF5IGJlDQogICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uDQogICAgIG9mIHRoaXMgTGljZW5zZSByZWxlYXNlZCB1bmRlciBTZWN0aW9uIDYuMSwgYW5kIFlvdSBtdXN0IGluY2x1ZGUgYQ0KICAgICBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIFlvdQ0KICAgICBkaXN0cmlidXRlLiBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBTb3VyY2UgQ29kZQ0KICAgICB2ZXJzaW9uIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMNCiAgICAgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gSG93ZXZlciwgWW91IG1heSBpbmNsdWRlDQogICAgIGFuIGFkZGl0aW9uYWwgZG9jdW1lbnQgb2ZmZXJpbmcgdGhlIGFkZGl0aW9uYWwgcmlnaHRzIGRlc2NyaWJlZCBpbg0KICAgICBTZWN0aW9uIDMuNS4NCg0KICAgICAzLjIuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4NCiAgICAgQW55IE1vZGlmaWNhdGlvbiB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIG11c3QgYmUNCiAgICAgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlDQogICAgIGVpdGhlciBvbiB0aGUgc2FtZSBtZWRpYSBhcyBhbiBFeGVjdXRhYmxlIHZlcnNpb24gb3IgdmlhIGFuIGFjY2VwdGVkDQogICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSB0byBhbnlvbmUgdG8gd2hvbSB5b3UgbWFkZSBhbg0KICAgICBFeGVjdXRhYmxlIHZlcnNpb24gYXZhaWxhYmxlOyBhbmQgaWYgbWFkZSBhdmFpbGFibGUgdmlhIEVsZWN0cm9uaWMNCiAgICAgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSwgbXVzdCByZW1haW4gYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0d2VsdmUgKDEyKQ0KICAgICBtb250aHMgYWZ0ZXIgdGhlIGRhdGUgaXQgaW5pdGlhbGx5IGJlY2FtZSBhdmFpbGFibGUsIG9yIGF0IGxlYXN0IHNpeA0KICAgICAoNikgbW9udGhzIGFmdGVyIGEgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoYXQgcGFydGljdWxhciBNb2RpZmljYXRpb24NCiAgICAgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gc3VjaCByZWNpcGllbnRzLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvcg0KICAgICBlbnN1cmluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlDQogICAgIEVsZWN0cm9uaWMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSBpcyBtYWludGFpbmVkIGJ5IGEgdGhpcmQgcGFydHkuDQoNCiAgICAgMy4zLiBEZXNjcmlwdGlvbiBvZiBNb2RpZmljYXRpb25zLg0KICAgICBZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYQ0KICAgICBmaWxlIGRvY3VtZW50aW5nIHRoZSBjaGFuZ2VzIFlvdSBtYWRlIHRvIGNyZWF0ZSB0aGF0IENvdmVyZWQgQ29kZSBhbmQNCiAgICAgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gWW91IG11c3QgaW5jbHVkZSBhIHByb21pbmVudCBzdGF0ZW1lbnQgdGhhdA0KICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIGRlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwNCiAgICAgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUNCiAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaW4gKGEpIHRoZSBTb3VyY2UgQ29kZSwgYW5kIChiKSBpbiBhbnkgbm90aWNlIGluIGFuDQogICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4gd2hpY2ggWW91IGRlc2NyaWJlIHRoZQ0KICAgICBvcmlnaW4gb3Igb3duZXJzaGlwIG9mIHRoZSBDb3ZlcmVkIENvZGUuDQoNCiAgICAgMy40LiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTWF0dGVycw0KICAgICAgICAgIChhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuDQogICAgICAgICAgSWYgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSB0aGF0IGEgbGljZW5zZSB1bmRlciBhIHRoaXJkIHBhcnR5J3MNCiAgICAgICAgICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIHJlcXVpcmVkIHRvIGV4ZXJjaXNlIHRoZSByaWdodHMNCiAgICAgICAgICBncmFudGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiwNCiAgICAgICAgICBDb250cmlidXRvciBtdXN0IGluY2x1ZGUgYSB0ZXh0IGZpbGUgd2l0aCB0aGUgU291cmNlIENvZGUNCiAgICAgICAgICBkaXN0cmlidXRpb24gdGl0bGVkICJMRUdBTCIgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbGFpbSBhbmQgdGhlDQogICAgICAgICAgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50IHdpbGwNCiAgICAgICAgICBrbm93IHdob20gdG8gY29udGFjdC4gSWYgQ29udHJpYnV0b3Igb2J0YWlucyBzdWNoIGtub3dsZWRnZSBhZnRlcg0KICAgICAgICAgIHRoZSBNb2RpZmljYXRpb24gaXMgbWFkZSBhdmFpbGFibGUgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLA0KICAgICAgICAgIENvbnRyaWJ1dG9yIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzDQogICAgICAgICAgQ29udHJpYnV0b3IgbWFrZXMgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMNCiAgICAgICAgICAoc3VjaCBhcyBub3RpZnlpbmcgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0cyBvciBuZXdzZ3JvdXBzKQ0KICAgICAgICAgIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkDQogICAgICAgICAgQ29kZSB0aGF0IG5ldyBrbm93bGVkZ2UgaGFzIGJlZW4gb2J0YWluZWQuDQoNCiAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4NCiAgICAgICAgICBJZiBDb250cmlidXRvcidzIE1vZGlmaWNhdGlvbnMgaW5jbHVkZSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZw0KICAgICAgICAgIGludGVyZmFjZSBhbmQgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSBvZiBwYXRlbnQgbGljZW5zZXMgd2hpY2gNCiAgICAgICAgICBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoYXQgQVBJLCBDb250cmlidXRvciBtdXN0DQogICAgICAgICAgYWxzbyBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIExFR0FMIGZpbGUuDQoNCiAgICAgICAgICAgICAgIChjKSAgICBSZXByZXNlbnRhdGlvbnMuDQogICAgICAgICAgQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0LCBleGNlcHQgYXMgZGlzY2xvc2VkIHB1cnN1YW50IHRvDQogICAgICAgICAgU2VjdGlvbiAzLjQoYSkgYWJvdmUsIENvbnRyaWJ1dG9yIGJlbGlldmVzIHRoYXQgQ29udHJpYnV0b3Incw0KICAgICAgICAgIE1vZGlmaWNhdGlvbnMgYXJlIENvbnRyaWJ1dG9yJ3Mgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yDQogICAgICAgICAgQ29udHJpYnV0b3IgaGFzIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkNCiAgICAgICAgICB0aGlzIExpY2Vuc2UuDQoNCiAgICAgMy41LiBSZXF1aXJlZCBOb3RpY2VzLg0KICAgICBZb3UgbXVzdCBkdXBsaWNhdGUgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UNCiAgICAgQ29kZS4gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZQ0KICAgICBDb2RlIGZpbGUgZHVlIHRvIGl0cyBzdHJ1Y3R1cmUsIHRoZW4gWW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhDQogICAgIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5DQogICAgIHRvIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuICBJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocykNCiAgICAgWW91IG1heSBhZGQgeW91ciBuYW1lIGFzIGEgQ29udHJpYnV0b3IgdG8gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4NCiAgICAgRXhoaWJpdCBBLiAgWW91IG11c3QgYWxzbyBkdXBsaWNhdGUgdGhpcyBMaWNlbnNlIGluIGFueSBkb2N1bWVudGF0aW9uDQogICAgIGZvciB0aGUgU291cmNlIENvZGUgd2hlcmUgWW91IGRlc2NyaWJlIHJlY2lwaWVudHMnIHJpZ2h0cyBvciBvd25lcnNoaXANCiAgICAgcmlnaHRzIHJlbGF0aW5nIHRvIENvdmVyZWQgQ29kZS4gIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8NCiAgICAgY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkNCiAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdQ0KICAgICBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsDQogICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuDQogICAgIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMNCiAgICAgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbA0KICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZQ0KICAgICBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LA0KICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4NCg0KICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLg0KICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZQ0KICAgICByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLA0KICAgICBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mDQogICAgIHRoZSBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsDQogICAgIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZQ0KICAgICBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQNCiAgICAgaW4gYW55IG5vdGljZSBpbiBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvcg0KICAgICBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlDQogICAgIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZA0KICAgICBDb2RlIG9yIG93bmVyc2hpcCByaWdodHMgdW5kZXIgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkNCiAgICAgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbg0KICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlDQogICAgIEV4ZWN1dGFibGUgdmVyc2lvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQncw0KICAgICByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzDQogICAgIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQNCiAgICAgbGljZW5zZSBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyDQogICAgIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsDQogICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQ0KICAgICBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkNCiAgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2gNCiAgICAgdGVybXMgWW91IG9mZmVyLg0KDQogICAgIDMuNy4gTGFyZ2VyIFdvcmtzLg0KICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlDQogICAgIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXINCiAgICAgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZQ0KICAgICByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuDQoNCjQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbi4NCg0KICAgICBJZiBpdCBpcyBpbXBvc3NpYmxlIGZvciBZb3UgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSB0ZXJtcyBvZiB0aGlzDQogICAgIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIENvZGUgZHVlIHRvDQogICAgIHN0YXR1dGUsIGp1ZGljaWFsIG9yZGVyLCBvciByZWd1bGF0aW9uIHRoZW4gWW91IG11c3Q6IChhKSBjb21wbHkgd2l0aA0KICAgICB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZTsgYW5kIChiKQ0KICAgICBkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uDQogICAgIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIExFR0FMIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy40IGFuZCBtdXN0DQogICAgIGJlIGluY2x1ZGVkIHdpdGggYWxsIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIFNvdXJjZSBDb2RlLiBFeGNlcHQgdG8gdGhlDQogICAgIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUgb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlDQogICAgIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYSByZWNpcGllbnQgb2Ygb3JkaW5hcnkgc2tpbGwgdG8gYmUgYWJsZSB0bw0KICAgICB1bmRlcnN0YW5kIGl0Lg0KDQo1LiBBcHBsaWNhdGlvbiBvZiB0aGlzIExpY2Vuc2UuDQoNCiAgICAgVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gY29kZSB0byB3aGljaCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGFzDQogICAgIGF0dGFjaGVkIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGFuZCB0byByZWxhdGVkIENvdmVyZWQgQ29kZS4NCg0KNi4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuDQoNCiAgICAgNi4xLiBOZXcgVmVyc2lvbnMuDQogICAgIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uICgiTmV0c2NhcGUiKSBtYXkgcHVibGlzaCByZXZpc2VkDQogICAgIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbg0KICAgICB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuDQoNCiAgICAgNi4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLg0KICAgICBPbmNlIENvdmVyZWQgQ29kZSBoYXMgYmVlbiBwdWJsaXNoZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlDQogICAgIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdA0KICAgICB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMNCiAgICAgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgTmV0c2NhcGUuIE5vIG9uZQ0KICAgICBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvDQogICAgIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4NCg0KICAgICA2LjMuIERlcml2YXRpdmUgV29ya3MuDQogICAgIElmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkNCiAgICAgb25seSBkbyBpbiBvcmRlciB0byBhcHBseSBpdCB0byBjb2RlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZQ0KICAgICBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UpLCBZb3UgbXVzdCAoYSkgcmVuYW1lIFlvdXIgbGljZW5zZSBzbyB0aGF0DQogICAgIHRoZSBwaHJhc2VzICJNb3ppbGxhIiwgIk1PWklMTEFQTCIsICJNT1pQTCIsICJOZXRzY2FwZSIsDQogICAgICJNUEwiLCAiTlBMIiBvciBhbnkgY29uZnVzaW5nbHkgc2ltaWxhciBwaHJhc2UgZG8gbm90IGFwcGVhciBpbiB5b3VyDQogICAgIGxpY2Vuc2UgKGV4Y2VwdCB0byBub3RlIHRoYXQgeW91ciBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpDQogICAgIGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCBZb3VyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UNCiAgICAgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgYW5kDQogICAgIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiAoRmlsbGluZyBpbiB0aGUgbmFtZSBvZiB0aGUgSW5pdGlhbA0KICAgICBEZXZlbG9wZXIsIE9yaWdpbmFsIENvZGUgb3IgQ29udHJpYnV0b3IgaW4gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4NCiAgICAgRXhoaWJpdCBBIHNoYWxsIG5vdCBvZiB0aGVtc2VsdmVzIGJlIGRlZW1lZCB0byBiZSBtb2RpZmljYXRpb25zIG9mDQogICAgIHRoaXMgTGljZW5zZS4pDQoNCjcuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuDQoNCiAgICAgQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLA0KICAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywNCiAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GDQogICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4NCiAgICAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBDT0RFDQogICAgIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsDQogICAgIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUNCiAgICAgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUg0KICAgICBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRg0KICAgICBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuDQoNCjguIFRFUk1JTkFUSU9OLg0KDQogICAgIDguMS4gIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZQ0KICAgICBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlDQogICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIEFsbA0KICAgICBzdWJsaWNlbnNlcyB0byB0aGUgQ292ZXJlZCBDb2RlIHdoaWNoIGFyZSBwcm9wZXJseSBncmFudGVkIHNoYWxsDQogICAgIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXINCiAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UNCiAgICAgc2hhbGwgc3Vydml2ZS4NCg0KICAgICA4LjIuICBJZiBZb3UgaW5pdGlhdGUgbGl0aWdhdGlvbiBieSBhc3NlcnRpbmcgYSBwYXRlbnQgaW5mcmluZ2VtZW50DQogICAgIGNsYWltIChleGNsdWRpbmcgZGVjbGF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXINCiAgICAgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbQ0KICAgICBZb3UgZmlsZSBzdWNoIGFjdGlvbiBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKSAgYWxsZWdpbmcgdGhhdDoNCg0KICAgICAoYSkgIHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkNCiAgICAgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgYnkgc3VjaA0KICAgICBQYXJ0aWNpcGFudCB0byBZb3UgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlDQogICAgIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHksDQogICAgIHVubGVzcyBpZiB3aXRoaW4gNjAgZGF5cyBhZnRlciByZWNlaXB0IG9mIG5vdGljZSBZb3UgZWl0aGVyOiAoaSkNCiAgICAgYWdyZWUgaW4gd3JpdGluZyB0byBwYXkgUGFydGljaXBhbnQgYSBtdXR1YWxseSBhZ3JlZWFibGUgcmVhc29uYWJsZQ0KICAgICByb3lhbHR5IGZvciBZb3VyIHBhc3QgYW5kIGZ1dHVyZSB1c2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHN1Y2gNCiAgICAgUGFydGljaXBhbnQsIG9yIChpaSkgd2l0aGRyYXcgWW91ciBsaXRpZ2F0aW9uIGNsYWltIHdpdGggcmVzcGVjdCB0bw0KICAgICB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQuICBJZiB3aXRoaW4gNjAgZGF5cw0KICAgICBvZiBub3RpY2UsIGEgcmVhc29uYWJsZSByb3lhbHR5IGFuZCBwYXltZW50IGFycmFuZ2VtZW50IGFyZSBub3QNCiAgICAgbXV0dWFsbHkgYWdyZWVkIHVwb24gaW4gd3JpdGluZyBieSB0aGUgcGFydGllcyBvciB0aGUgbGl0aWdhdGlvbiBjbGFpbQ0KICAgICBpcyBub3Qgd2l0aGRyYXduLCB0aGUgcmlnaHRzIGdyYW50ZWQgYnkgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyDQogICAgIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIGF0IHRoZSBleHBpcmF0aW9uIG9mDQogICAgIHRoZSA2MCBkYXkgbm90aWNlIHBlcmlvZCBzcGVjaWZpZWQgYWJvdmUuDQoNCiAgICAgKGIpICBhbnkgc29mdHdhcmUsIGhhcmR3YXJlLCBvciBkZXZpY2UsIG90aGVyIHRoYW4gc3VjaCBQYXJ0aWNpcGFudCdzDQogICAgIENvbnRyaWJ1dG9yIFZlcnNpb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4NCiAgICAgYW55IHJpZ2h0cyBncmFudGVkIHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMShiKQ0KICAgICBhbmQgMi4yKGIpIGFyZSByZXZva2VkIGVmZmVjdGl2ZSBhcyBvZiB0aGUgZGF0ZSBZb3UgZmlyc3QgbWFkZSwgdXNlZCwNCiAgICAgc29sZCwgZGlzdHJpYnV0ZWQsIG9yIGhhZCBtYWRlLCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KICAgICBQYXJ0aWNpcGFudC4NCg0KICAgICA4LjMuICBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50DQogICAgIGFsbGVnaW5nIHRoYXQgc3VjaCBQYXJ0aWNpcGFudCdzIENvbnRyaWJ1dG9yIFZlcnNpb24gZGlyZWN0bHkgb3INCiAgICAgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzDQogICAgIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50DQogICAgIGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcw0KICAgICBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbg0KICAgICBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvcg0KICAgICBsaWNlbnNlLg0KDQogICAgIDguNC4gIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA4LjEgb3IgOC4yIGFib3ZlLA0KICAgICBhbGwgZW5kIHVzZXIgbGljZW5zZSBhZ3JlZW1lbnRzIChleGNsdWRpbmcgZGlzdHJpYnV0b3JzIGFuZCByZXNlbGxlcnMpDQogICAgIHdoaWNoIGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXINCiAgICAgcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4NCg0KOS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuDQoNCiAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQNCiAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTA0KICAgICBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgQ09ERSwNCiAgICAgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUg0KICAgICBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkNCiAgICAgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLA0KICAgICBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUg0KICAgICBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVODQogICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRg0KICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZDQogICAgIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcNCiAgICAgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUNCiAgICAgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPDQogICAgIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLg0KDQoxMC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4NCg0KICAgICBUaGUgQ292ZXJlZCBDb2RlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluDQogICAgIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbCBjb21wdXRlcg0KICAgICBzb2Z0d2FyZSIgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24sIiBhcyBzdWNoDQogICAgIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDgNCiAgICAgQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLA0KICAgICBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgQ29kZSB3aXRoIG9ubHkgdGhvc2UNCiAgICAgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uDQoNCjExLiBNSVNDRUxMQU5FT1VTLg0KDQogICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0DQogICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUNCiAgICAgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50DQogICAgIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkNCiAgICAgQ2FsaWZvcm5pYSBsYXcgcHJvdmlzaW9ucyAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmDQogICAgIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIGl0cyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4NCiAgICAgV2l0aCByZXNwZWN0IHRvIGRpc3B1dGVzIGluIHdoaWNoIGF0IGxlYXN0IG9uZSBwYXJ0eSBpcyBhIGNpdGl6ZW4gb2YsDQogICAgIG9yIGFuIGVudGl0eSBjaGFydGVyZWQgb3IgcmVnaXN0ZXJlZCB0byBkbyBidXNpbmVzcyBpbiB0aGUgVW5pdGVkDQogICAgIFN0YXRlcyBvZiBBbWVyaWNhLCBhbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUNCiAgICAgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4NCiAgICAgRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksDQogICAgIENhbGlmb3JuaWEsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZw0KICAgICB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQNCiAgICAgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbg0KICAgICBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLg0KICAgICBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdA0KICAgICBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcw0KICAgICBMaWNlbnNlLg0KDQoxMi4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4NCg0KICAgICBBcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzDQogICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwNCiAgICAgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8NCiAgICAgd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoDQogICAgIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3INCiAgICAgc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuDQoNCjEzLiBNVUxUSVBMRS1MSUNFTlNFRCBDT0RFLg0KDQogICAgIEluaXRpYWwgRGV2ZWxvcGVyIG1heSBkZXNpZ25hdGUgcG9ydGlvbnMgb2YgdGhlIENvdmVyZWQgQ29kZSBhcw0KICAgICAiTXVsdGlwbGUtTGljZW5zZWQiLiAgIk11bHRpcGxlLUxpY2Vuc2VkIiBtZWFucyB0aGF0IHRoZSBJbml0aWFsDQogICAgIERldmVsb3BlciBwZXJtaXRzIHlvdSB0byB1dGlsaXplIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgdW5kZXINCiAgICAgWW91ciBjaG9pY2Ugb2YgdGhlIE5QTCBvciB0aGUgYWx0ZXJuYXRpdmUgbGljZW5zZXMsIGlmIGFueSwgc3BlY2lmaWVkDQogICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBpbiB0aGUgZmlsZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLg0KDQpFWEhJQklUIEEgLU1vemlsbGEgUHVibGljIExpY2Vuc2UuDQoNCiAgICAgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlDQogICAgIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4NCiAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQoNCiAgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIg0KICAgICBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQ0KICAgICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMNCiAgICAgdW5kZXIgdGhlIExpY2Vuc2UuDQoNCiAgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uDQoNCiAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fXy4NCiAgICAgUG9ydGlvbnMgY3JlYXRlZCBieSBfX19fX19fX19fX19fX19fX19fX19fIGFyZSBDb3B5cmlnaHQgKEMpIF9fX19fXw0KICAgICBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCg0KICAgICBDb250cmlidXRvcihzKTogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uDQoNCiAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMNCiAgICAgb2YgdGhlIF9fX19fIGxpY2Vuc2UgKHRoZSAgIltfX19dIExpY2Vuc2UiKSwgaW4gd2hpY2ggY2FzZSB0aGUNCiAgICAgcHJvdmlzaW9ucyBvZiBbX19fX19fXSBMaWNlbnNlIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UNCiAgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgW19fX19dIExpY2Vuc2UgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlDQogICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQ0KICAgICBkZWxldGluZyAgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZA0KICAgICBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBbX19fXSBMaWNlbnNlLiAgSWYgeW91IGRvIG5vdCBkZWxldGUNCiAgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQ0KICAgICB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgW19fX10gTGljZW5zZS4iDQoNCiAgICAgW05PVEU6IFRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIG1heSBkaWZmZXIgc2xpZ2h0bHkgZnJvbSB0aGUgdGV4dCBvZg0KICAgICB0aGUgbm90aWNlcyBpbiB0aGUgU291cmNlIENvZGUgZmlsZXMgb2YgdGhlIE9yaWdpbmFsIENvZGUuIFlvdSBzaG91bGQNCiAgICAgdXNlIHRoZSB0ZXh0IG9mIHRoaXMgRXhoaWJpdCBBIHJhdGhlciB0aGFuIHRoZSB0ZXh0IGZvdW5kIGluIHRoZQ0KICAgICBPcmlnaW5hbCBDb2RlIFNvdXJjZSBDb2RlIGZvciBZb3VyIE1vZGlmaWNhdGlvbnMuXQ0KDQoNCg0KICAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNw==]]></data>
	</file>
	<file>
	  <filename>/ace/Readme.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QWNlIChBamF4Lm9yZyBDbG91ZDkgRWRpdG9yKQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpBY2UgaXMgYSBzdGFuZGFsb25lIGNvZGUgZWRpdG9yIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgYnJvd3NlciBiYXNlZCBlZGl0b3IgdGhhdCBtYXRjaGVzIGFuZCBleHRlbmRzIHRoZSBmZWF0dXJlcywgdXNhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiBleGlzdGluZyBuYXRpdmUgZWRpdG9ycyBzdWNoIGFzIFRleHRNYXRlLCBWaW0gb3IgRWNsaXBzZS4gSXQgY2FuIGJlIGVhc2lseSBlbWJlZGRlZCBpbiBhbnkgd2ViIHBhZ2Ugb3IgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi4gQWNlIGlzIGRldmVsb3BlZCBhcyB0aGUgcHJpbWFyeSBlZGl0b3IgZm9yIFtDbG91ZDkgSURFXShodHRwOi8vd3d3LmNsb3VkOWlkZS5jb20vKSBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC4NCg0KRmVhdHVyZXMNCi0tLS0tLS0tDQoNCiogU3ludGF4IGhpZ2hsaWdodGluZw0KKiBBdXRvbWF0aWMgaW5kZW50IGFuZCBvdXRkZW50DQoqIEFuIG9wdGlvbmFsIGNvbW1hbmQgbGluZQ0KKiBIYW5kbGVzIGh1Z2UgZG9jdW1lbnRzICgxMDAsMDAwIGxpbmVzIGFuZCBtb3JlIGFyZSBubyBwcm9ibGVtKQ0KKiBGdWxseSBjdXN0b21pemFibGUga2V5IGJpbmRpbmdzIGluY2x1ZGluZyBWSSBhbmQgRW1hY3MgbW9kZXMNCiogVGhlbWVzIChUZXh0TWF0ZSB0aGVtZXMgY2FuIGJlIGltcG9ydGVkKQ0KKiBTZWFyY2ggYW5kIHJlcGxhY2Ugd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zDQoqIEhpZ2hsaWdodCBtYXRjaGluZyBwYXJlbnRoZXNlcw0KKiBUb2dnbGUgYmV0d2VlbiBzb2Z0IHRhYnMgYW5kIHJlYWwgdGFicw0KKiBEaXNwbGF5cyBoaWRkZW4gY2hhcmFjdGVycw0KKiBEcmFnIGFuZCBkcm9wIHRleHQgdXNpbmcgdGhlIG1vdXNlDQoqIExpbmUgd3JhcHBpbmcNCiogVW5zdHJ1Y3R1cmVkIC8gdXNlciBjb2RlIGZvbGRpbmcNCiogTGl2ZSBzeW50YXggY2hlY2tlciAoY3VycmVudGx5IEphdmFTY3JpcHQvQ29mZmVlU2NyaXB0KQ0KDQpUYWtlIEFjZSBmb3IgYSBzcGluIQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KQ2hlY2sgb3V0IHRoZSBBY2UgbGl2ZSBbZGVtb10oaHR0cDovL2FqYXhvcmcuZ2l0aHViLmNvbS9hY2UvKSBvciBnZXQgYSBbQ2xvdWQ5IElERSBhY2NvdW50XShodHRwOi8vcnVuLmNsb3VkOWlkZS5jb20pIHRvIGV4cGVyaWVuY2UgQWNlIHdoaWxlIGVkaXRpbmcgb25lIG9mIHlvdXIgb3duIEdpdEh1YiBwcm9qZWN0cy4NCg0KSWYgeW91IHdhbnQsIHlvdSBjYW4gdXNlIEFjZSBhcyBhIHRleHRhcmVhIHJlcGxhY2VtZW50IHRoYW5rcyB0byB0aGUgW0FjZSBCb29rbWFya2xldF0oaHR0cDovL2FqYXhvcmcuZ2l0aHViLmNvbS9hY2UvYnVpbGQvdGV4dGFyZWEvZWRpdG9yLmh0bWwpLg0KDQpIaXN0b3J5DQotLS0tLS0tDQoNClByZXZpb3VzbHkga25vd24gYXMg4oCcQmVzcGlu4oCdIGFuZCDigJxTa3l3cml0ZXLigJ0gaXTigJlzIG5vdyBrbm93biBhcyBBY2UgKEFqYXgub3JnIENsb3VkOSBFZGl0b3IpISBCZXNwaW4gYW5kIEFjZSBzdGFydGVkIGFzIHR3byBpbmRlcGVuZGVudCBwcm9qZWN0cywgYm90aCBhaW1pbmcgdG8gYnVpbGQgYSBuby1jb21wcm9taXNlIGNvZGUgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhlIHdlYi4gQmVzcGluIHN0YXJ0ZWQgYXMgcGFydCBvZiBNb3ppbGxhIExhYnMgYW5kIHdhcyBiYXNlZCBvbiB0aGUgY2FudmFzIHRhZywgd2hpbGUgQWNlIGlzIHRoZSBFZGl0b3IgY29tcG9uZW50IG9mIHRoZSBDbG91ZDkgSURFIGFuZCBpcyB1c2luZyB0aGUgRE9NIGZvciByZW5kZXJpbmcuIEFmdGVyIHRoZSByZWxlYXNlIG9mIEFjZSBhdCBKU0NvbmYuZXUgMjAxMCBpbiBCZXJsaW4gdGhlIFNreXdyaXRlciB0ZWFtIGRlY2lkZWQgdG8gbWVyZ2UgQWNlIHdpdGggYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgU2t5d3JpdGVyJ3MgcGx1Z2luIHN5c3RlbSBhbmQgc29tZSBvZiBTa3l3cml0ZXIncyBleHRlbnNpYmlsaXR5IHBvaW50cy4gQWxsIHRoZXNlIGNoYW5nZXMgaGF2ZSBiZWVuIG1lcmdlZCBiYWNrIHRvIEFjZS4gQm90aCBBamF4Lm9yZyBhbmQgTW96aWxsYSBhcmUgYWN0aXZlbHkgZGV2ZWxvcGluZyBhbmQgbWFpbnRhaW5pbmcgQWNlLg0KDQpHZXR0aW5nIHRoZSBjb2RlDQotLS0tLS0tLS0tLS0tLS0tDQoNCkFjZSBpcyBhIGNvbW11bml0eSBwcm9qZWN0LiBXZSBhY3RpdmVseSBlbmNvdXJhZ2UgYW5kIHN1cHBvcnQgY29udHJpYnV0aW9ucy4gVGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKSwgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LiBUYWtlIGNoYXJnZSBvZiB5b3VyIGVkaXRvciBhbmQgYWRkIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UgaGlnaGxpZ2h0aW5nIGFuZCBrZXliaW5kaW5ncyENCg0KYGBgYmFzaA0KICAgIGdpdCBjbG9uZSBnaXQ6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlLmdpdA0KICAgIGNkIGFjZQ0KICAgIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCAtLXJlY3Vyc2l2ZQ0KYGBgDQoNCkVtYmVkZGluZyBBY2UNCi0tLS0tLS0tLS0tLS0NCg0KQWNlIGNhbiBiZSBlYXNpbHkgZW1iZWRkZWQgaW50byBhbnkgZXhpc3Rpbmcgd2ViIHBhZ2UuIFRoZSBBY2UgZ2l0IHJlcG9zaXRvcnkgc2hpcHMgd2l0aCBhIHByZS1wYWNrYWdlZCB2ZXJzaW9uIG9mIEFjZSBpbnNpZGUgb2YgdGhlIGBidWlsZGAgZGlyZWN0b3J5LiBUaGUgc2FtZSBwYWNrYWdlZCBmaWxlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXMgYSBzZXBhcmF0ZSBbZG93bmxvYWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS9kb3dubG9hZHMpLiBTaW1wbHkgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGBzcmNgIHN1YmRpcmVjdG9yeSBzb21ld2hlcmUgaW50byB5b3VyIHByb2plY3QgYW5kIHRha2UgYSBsb29rIGF0IHRoZSBpbmNsdWRlZCBkZW1vcyBvZiBob3cgdG8gdXNlIEFjZS4NCg0KVGhlIGVhc2llc3QgdmVyc2lvbiBpcyBzaW1wbHk6DQoNCmBgYGh0bWwNCiAgICA8ZGl2IGlkPSJlZGl0b3IiPnNvbWUgdGV4dDwvZGl2Pg0KICAgIDxzY3JpcHQgc3JjPSJzcmMvYWNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4NCiAgICA8c2NyaXB0Pg0KICAgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGVkaXRvciA9IGFjZS5lZGl0KCJlZGl0b3IiKTsNCiAgICB9Ow0KICAgIDwvc2NyaXB0Pg0KYGBgDQoNCldpdGggImVkaXRvciIgYmVpbmcgdGhlIGlkIG9mIHRoZSBET00gZWxlbWVudCwgd2hpY2ggc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBlZGl0b3IuIE5vdGUgdGhhdCB0aGlzIGVsZW1lbnQgbXVzdCBiZSBleHBsaWNpdGx5IHNpemVkIGFuZCBwb3NpdGlvbmVkIGBhYnNvbHV0ZWAgb3IgYHJlbGF0aXZlYCBmb3IgQWNlIHRvIHdvcmsuIGUuZy4NCg0KYGBgY3NzDQogICAgI2VkaXRvciB7DQogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICAgICAgd2lkdGg6IDUwMHB4Ow0KICAgICAgICBoZWlnaHQ6IDQwMHB4Ow0KICAgIH0NCmBgYA0KDQpUbyBjaGFuZ2UgdGhlIHRoZW1lIHNpbXBseSBpbmNsdWRlIHRoZSBUaGVtZSdzIEphdmFTY3JpcHQgZmlsZQ0KDQpgYGBodG1sDQogICAgPHNjcmlwdCBzcmM9InNyYy90aGVtZS10d2lsaWdodC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQpgYGANCg0KYW5kIGNvbmZpZ3VyZSB0aGUgZWRpdG9yIHRvIHVzZSB0aGUgdGhlbWU6DQoNCmBgYGphdmFzY3JpcHQNCiAgICBlZGl0b3Iuc2V0VGhlbWUoImFjZS90aGVtZS90d2lsaWdodCIpOw0KYGBgDQoNCkJ5IGRlZmF1bHQgdGhlIGVkaXRvciBvbmx5IHN1cHBvcnRzIHBsYWluIHRleHQgbW9kZTsgbWFueSBvdGhlciBsYW5ndWFnZXMgYXJlIGF2YWlsYWJsZSBhcyBzZXBhcmF0ZSBtb2R1bGVzLiBBZnRlciBpbmNsdWRpbmcgdGhlIG1vZGUncyBKYXZhU2NyaXB0IGZpbGU6DQoNCmBgYGh0bWwNCiAgICA8c2NyaXB0IHNyYz0ic3JjL21vZGUtamF2YXNjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQpgYGANCg0KVGhlbiB0aGUgbW9kZSBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6DQoNCmBgYGphdmFzY3JpcHQNCiAgICB2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCJhY2UvbW9kZS9qYXZhc2NyaXB0IikuTW9kZTsNCiAgICBlZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUobmV3IEphdmFTY3JpcHRNb2RlKCkpOw0KYGBgDQoNCkRvY3VtZW50YXRpb24NCi0tLS0tLS0tLS0tLS0NCg0KWW91IGZpbmQgYSBsb3QgbW9yZSBzYW1wbGUgY29kZSBpbiB0aGUgW2RlbW8gYXBwXShodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvYmxvYi9tYXN0ZXIvZGVtby9kZW1vLmpzKS4NCg0KVGhlcmUgaXMgYWxzbyBzb21lIGRvY3VtZW50YXRpb24gb24gdGhlIFt3aWtpIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS93aWtpKS4NCg0KSWYgeW91IHN0aWxsIG5lZWQgaGVscCwgZmVlbCBmcmVlIHRvIGRyb3AgYSBtYWlsIG9uIHRoZSBbYWNlIG1haWxpbmcgbGlzdF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FjZS1kaXNjdXNzKS4NCg0KUnVubmluZyBBY2UNCi0tLS0tLS0tLS0tDQoNCkFmdGVyIHRoZSBjaGVja291dCBBY2Ugd29ya3Mgb3V0IG9mIHRoZSBib3guIE5vIGJ1aWxkIHN0ZXAgaXMgcmVxdWlyZWQuIE9wZW4gJ2VkaXRvci5odG1sJyBpbiBhbnkgYnJvd3NlciBleGNlcHQgR29vZ2xlIENocm9tZS4gR29vZ2xlIENocm9tZSBkb2Vzbid0IGFsbG93IFhNTEhUVFBSZXF1ZXN0cyBmcm9tIGZpbGVzIGxvYWRlZCBmcm9tIGRpc2MgKGkuZS4gd2l0aCBhIGZpbGU6Ly8vIFVSTCkuIFRvIG9wZW4gQWNlIGluIENocm9tZSBzaW1wbHkgc3RhcnQgdGhlIGJ1bmRsZWQgbWluaSBIVFRQIHNlcnZlcjoNCg0KYGBgYmFzaA0KICAgIC4vc3RhdGljLnB5DQpgYGANCg0KT3IgdXNpbmcgTm9kZS5KUw0KDQpgYGBiYXNoDQogICAgLi9zdGF0aWMuanMNCmBgYA0KDQpUaGUgZWRpdG9yIGNhbiB0aGVuIGJlIG9wZW5lZCBhdCBodHRwOi8vbG9jYWxob3N0Ojg4ODgvaW5kZXguaHRtbC4NCg0KUGFja2FnZSBBY2UNCi0tLS0tLS0tLS0tDQoNClRvIHBhY2thZ2UgQWNlIHdlIHVzZSB0aGUgZHJ5aWNlIGJ1aWxkIHRvb2wgZGV2ZWxvcGVkIGJ5IHRoZSBNb3ppbGxhIFNreXdyaXRlciB0ZWFtLiBCZWZvcmUgeW91IGNhbiBidWlsZCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3VibW9kdWxlcyBhcmUgdXAgdG8gZGF0ZS4NCg0KYGBgYmFzaA0KICAgIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCAtLXJlY3Vyc2l2ZQ0KYGBgDQoNCk1ha2Ugc3VyZSB5b3UgYXQgbGVhc3QgdmVyc2lvbiAwLjMuMCBvZiBkcnlpY2UNCg0KYGBgYmFzaA0KICAgIG5wbSBpbnN0YWxsIGRyeWljZQ0KYGBgDQoNCkFmdGVyd2FyZHMgQWNlIGNhbiBiZSBidWlsdCBieSBjYWxsaW5nDQoNCmBgYGJhc2gNCiAgICAuL01ha2VmaWxlLmRyeWljZS5qcyBub3JtYWwNCmBgYA0KDQpUaGUgcGFja2FnZWQgQWNlIHdpbGwgYmUgcHV0IGluIHRoZSAnYnVpbGQnIGZvbGRlci4NCg0KVG8gYnVpbGQgdGhlIGJvb2ttYXJrbGV0IHZlcnNpb24gZXhlY3V0ZQ0KDQpgYGBiYXNoDQogICAgLi9NYWtlZmlsZS5kcnlpY2UuanMgYm0NCmBgYA0KDQpSdW5uaW5nIHRoZSBVbml0IFRlc3RzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRoZSBBY2UgdW5pdCB0ZXN0cyBydW4gb24gbm9kZS5qcy4gQmVmb3JlIHRoZSBmaXJzdCBydW4gYSBjb3VwbGUgb2Ygbm9kZSBtb2R1bGVzIGhhdmUgdG8gYmUgaW5zdGFsbGVkLiBUaGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyBieSB1c2luZyB0aGUgbm9kZSBwYWNrYWdlIG1hbmFnZXIgKG5wbSkuIEluIHRoZSBBY2UgYmFzZSBkaXJlY3Rvcnkgc2ltcGx5IGNhbGwNCg0KYGBgYmFzaA0KICAgIG5wbSBsaW5rIC4NCmBgYA0KDQpUbyBydW4gdGhlIHRlc3RzIGNhbGw6DQoNCmBgYGJhc2gNCiAgICBub2RlIGxpYi9hY2UvdGVzdC9hbGwuanMNCmBgYA0KDQpZb3UgY2FuIGFsc28gcnVuIHRoZSB0ZXN0cyBpbiB5b3VyIGJyb3dzZXIgYnkgc2VydmluZzoNCg0KICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9saWIvYWNlL3Rlc3QvdGVzdHMuaHRtbA0KDQpUaGlzIG1ha2VzIGRlYnVnZ2luZyBmYWlsaW5nIHRlc3RzIHdheSBtb3JlIGVhc2llci4NCg0KQ29udGludW91cyBJbnRlZ3JhdGlvbiBzdGF0dXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRoaXMgcHJvamVjdCBpcyB0ZXN0ZWQgd2l0aCBbVHJhdmlzIENJXShodHRwOi8vdHJhdmlzLWNpLm9yZykNClshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly9zZWN1cmUudHJhdmlzLWNpLm9yZy9hamF4b3JnL2FjZS5wbmcpXShodHRwOi8vdHJhdmlzLWNpLm9yZy9hamF4b3JnL2FjZSkNCg0KQ29udHJpYnV0aW5nDQotLS0tLS0tLS0tLS0NCg0KQWNlIHdvdWxkbid0IGJlIHdoYXQgaXQgaXMgd2l0aG91dCBjb250cmlidXRpb25zISBGZWVsIGZyZWUgdG8gZm9yayBhbmQgaW1wcm92ZS9lbmhhbmNlIEFjZSBhbnkgd2F5IHlvdSB3YW50LiBJZiB5b3UgZmVlbCB0aGF0IHRoZSBlZGl0b3Igb3IgdGhlIEFjZSBjb21tdW5pdHkgd2lsbCBiZW5lZml0IGZyb20geW91ciBjaGFuZ2VzLCBwbGVhc2Ugb3BlbiBhIHB1bGwgcmVxdWVzdC4gVG8gcHJvdGVjdCB0aGUgaW50ZXJlc3RzIG9mIHRoZSBBY2UgY29udHJpYnV0b3JzIGFuZCB1c2VycyB3ZSByZXF1aXJlIGNvbnRyaWJ1dG9ycyB0byBzaWduIGEgQ29udHJpYnV0b3JzIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpIGJlZm9yZSB3ZSBwdWxsIHRoZSBjaGFuZ2VzIGludG8gdGhlIG1haW4gcmVwb3NpdG9yeS4gT3VyIENMQSBpcyB0aGUgc2ltcGxlc3Qgb2YgYWdyZWVtZW50cywgcmVxdWlyaW5nIHRoYXQgdGhlIGNvbnRyaWJ1dGlvbnMgeW91IG1ha2UgdG8gYW4gYWpheC5vcmcgcHJvamVjdCBhcmUgb25seSB0aG9zZSB5b3UncmUgYWxsb3dlZCB0byBtYWtlLiBUaGlzIGhlbHBzIHVzIHNpZ25pZmljYW50bHkgcmVkdWNlIGZ1dHVyZSBsZWdhbCByaXNrIGZvciBldmVyeW9uZSBpbnZvbHZlZC4gSXQgaXMgZWFzeSwgaGVscHMgZXZlcnlvbmUsIHRha2VzIHRlbiBtaW51dGVzLCBhbmQgb25seSBuZWVkcyB0byBiZSBjb21wbGV0ZWQgb25jZS4gIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhlIGFncmVlbWVudDoNCg0KMS4gW1RoZSBJbmRpdmlkdWFsIENMQV0oaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlL3Jhdy9tYXN0ZXIvZG9jL0NvbnRyaWJ1dG9yX0xpY2Vuc2VfQWdyZWVtZW50LXYyLnBkZik6IHVzZSB0aGlzIHZlcnNpb24gaWYgeW91J3JlIHdvcmtpbmcgb24gYW4gYWpheC5vcmcgaW4geW91ciBzcGFyZSB0aW1lLCBvciBjYW4gY2xlYXJseSBjbGFpbSBvd25lcnNoaXAgb2YgY29weXJpZ2h0IGluIHdoYXQgeW91J2xsIGJlIHN1Ym1pdHRpbmcuDQoyLiBbVGhlIENvcnBvcmF0ZSBDTEFdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS9yYXcvbWFzdGVyL2RvYy9Db3Jwb3JhdGVfQ29udHJpYnV0b3JfTGljZW5zZV9BZ3JlZW1lbnQtdjIucGRmKTogaGF2ZSB5b3VyIGNvcnBvcmF0ZSBsYXd5ZXIgcmV2aWV3IGFuZCBzdWJtaXQgdGhpcyBpZiB5b3VyIGNvbXBhbnkgaXMgZ29pbmcgdG8gYmUgY29udHJpYnV0aW5nIHRvIGFqYXgub3JnICBwcm9qZWN0cw0KDQpJZiB5b3Ugd2FudCB0byBjb250cmlidXRlIHRvIGFuIGFqYXgub3JnIHByb2plY3QgcGxlYXNlIHByaW50IHRoZSBDTEEgYW5kIGZpbGwgaXQgb3V0IGFuZCBzaWduIGl0LiBUaGVuIGVpdGhlciBzZW5kIGl0IGJ5IHNuYWlsIG1haWwgb3IgZmF4IHRvIHVzIG9yIHNlbmQgaXQgYmFjayBzY2FubmVkIChvciBhcyBhIHBob3RvKSBieSBlbWFpbC4NCg0KRW1haWw6IGZhYmlhbi5qYWtvYnNAd2ViLmRlDQoNCkZheDogKzMxICgwKSAyMDYzODg5NTMNCg0KQWRkcmVzczogQWpheC5vcmcgQi5WLg0KICBLZWl6ZXJzZ3JhY2h0IDI0MQ0KICAxMDE2IEVBLCBBbXN0ZXJkYW0NCiAgdGhlIE5ldGhlcmxhbmRz]]></data>
	</file>
	<file>
	  <filename>/ace/src/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/src/ace-compat-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2luZGV4JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdwaWxvdC9icm93c2VyX2ZvY3VzJywgJ3BpbG90L2RvbScsICdwaWxvdC9ldmVudCcsICdwaWxvdC9ldmVudF9lbWl0dGVyJywgJ3BpbG90L2ZpeG9sZGJyb3dzZXJzJywgJ3BpbG90L2tleXMnLCAncGlsb3QvbGFuZycsICdwaWxvdC9vb3AnLCAncGlsb3QvdXNlcmFnZW50JywgJ3BpbG90L2Nhbm9uJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIHJlcXVpcmUoInBpbG90L2Jyb3dzZXJfZm9jdXMiKTsNCiAgICByZXF1aXJlKCJwaWxvdC9kb20iKTsNCiAgICByZXF1aXJlKCJwaWxvdC9ldmVudCIpOw0KICAgIHJlcXVpcmUoInBpbG90L2V2ZW50X2VtaXR0ZXIiKTsNCiAgICByZXF1aXJlKCJwaWxvdC9maXhvbGRicm93c2VycyIpOw0KICAgIHJlcXVpcmUoInBpbG90L2tleXMiKTsNCiAgICByZXF1aXJlKCJwaWxvdC9sYW5nIik7DQogICAgcmVxdWlyZSgicGlsb3Qvb29wIik7DQogICAgcmVxdWlyZSgicGlsb3QvdXNlcmFnZW50Iik7DQogICAgcmVxdWlyZSgicGlsb3QvY2Fub24iKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2Jyb3dzZXJfZm9jdXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9icm93c2VyX2ZvY3VzJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cycgaW5zdGVhZCIpOw0KICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9icm93c2VyX2ZvY3VzIik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9kb20nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2RvbScgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2RvbScgaW5zdGVhZCIpOw0KICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9kb20iKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2V2ZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2V2ZW50J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2V2ZW50JyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvZXZlbnQnIGluc3RlYWQiKTsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIvZXZlbnQiKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L2V2ZW50X2VtaXR0ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9ldmVudF9lbWl0dGVyJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicgaW5zdGVhZCIpOw0KICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9maXhvbGRicm93c2VycyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9maXhvbGRicm93c2VycycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2ZpeG9sZGJyb3dzZXJzJyBpbnN0ZWFkIik7DQogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9rZXlzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2tleXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3Qva2V5cycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2tleXMnIGluc3RlYWQiKTsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIva2V5cyIpOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgncGlsb3QvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2xhbmcnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9sYW5nJyBpbnN0ZWFkIik7DQogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL2xhbmciKTsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ3BpbG90L29vcCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3Qvb29wJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvb29wJyBpbnN0ZWFkIik7DQogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL29vcCIpOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgncGlsb3QvdXNlcmFnZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL3VzZXJhZ2VudCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC91c2VyYWdlbnQnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi91c2VyYWdlbnQnIGluc3RlYWQiKTsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIvdXNlcmFnZW50Iik7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdwaWxvdC9jYW5vbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvY2Fub24nIGlzIGRlcHJlY2F0ZWQuIik7DQogICAgLy9yZXR1cm4gcmVxdWlyZSgiYWNlL2xpYi9kb20iKTsNCiAgICANCiAgICBleHBvcnRzLmFkZENvbW1hbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24uYWRkQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpOw0KICAgICAgICBjb25zb2xlLnRyYWNlKCk7DQogICAgfQ0KICAgIA0KICAgIGV4cG9ydHMucmVtb3ZlQ29tbWFuZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdjYW5vbi5yZW1vdmVDb21tYW5kKCknIGlzIGRlcHJlY2F0ZWQuIFVzZSAnZWRpdG9yLmNvbW1hbmRzLnJlbW92ZUNvbW1hbmQoY29tbWFuZCknIGluc3RlYWQuIik7DQogICAgICAgIGNvbnNvbGUudHJhY2UoKTsNCiAgICB9DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace-compat.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJwaWxvdC9pbmRleCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsInBpbG90L2Jyb3dzZXJfZm9jdXMiLCJwaWxvdC9kb20iLCJwaWxvdC9ldmVudCIsInBpbG90L2V2ZW50X2VtaXR0ZXIiLCJwaWxvdC9maXhvbGRicm93c2VycyIsInBpbG90L2tleXMiLCJwaWxvdC9sYW5nIiwicGlsb3Qvb29wIiwicGlsb3QvdXNlcmFnZW50IiwicGlsb3QvY2Fub24iXSxmdW5jdGlvbihhLGIsYyl7YSgicGlsb3QvYnJvd3Nlcl9mb2N1cyIpLGEoInBpbG90L2RvbSIpLGEoInBpbG90L2V2ZW50IiksYSgicGlsb3QvZXZlbnRfZW1pdHRlciIpLGEoInBpbG90L2ZpeG9sZGJyb3dzZXJzIiksYSgicGlsb3Qva2V5cyIpLGEoInBpbG90L2xhbmciKSxhKCJwaWxvdC9vb3AiKSxhKCJwaWxvdC91c2VyYWdlbnQiKSxhKCJwaWxvdC9jYW5vbiIpfSksZGVmaW5lKCJwaWxvdC9icm93c2VyX2ZvY3VzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9icm93c2VyX2ZvY3VzIl0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2Jyb3dzZXJfZm9jdXMnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9icm93c2VyX2ZvY3VzJyBpbnN0ZWFkIiksYy5leHBvcnRzPWEoImFjZS9saWIvYnJvd3Nlcl9mb2N1cyIpfSksZGVmaW5lKCJwaWxvdC9kb20iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9kb20nIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9kb20nIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9kb20iKX0pLGRlZmluZSgicGlsb3QvZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2V2ZW50JyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvZXZlbnQnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9ldmVudCIpfSksZGVmaW5lKCJwaWxvdC9ldmVudF9lbWl0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2V2ZW50X2VtaXR0ZXInIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJyBpbnN0ZWFkIiksYy5leHBvcnRzPWEoImFjZS9saWIvZXZlbnRfZW1pdHRlciIpfSksZGVmaW5lKCJwaWxvdC9maXhvbGRicm93c2VycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvZml4b2xkYnJvd3NlcnMnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9maXhvbGRicm93c2VycycgaW5zdGVhZCIpLGMuZXhwb3J0cz1hKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIil9KSxkZWZpbmUoInBpbG90L2tleXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3Qva2V5cycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2tleXMnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9rZXlzIil9KSxkZWZpbmUoInBpbG90L2xhbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvbGFuZycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2xhbmcnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9sYW5nIil9KSxkZWZpbmUoInBpbG90L29vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L29vcCcgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL29vcCcgaW5zdGVhZCIpLGMuZXhwb3J0cz1hKCJhY2UvbGliL29vcCIpfSksZGVmaW5lKCJwaWxvdC91c2VyYWdlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGEsYixjKXtjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC91c2VyYWdlbnQnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi91c2VyYWdlbnQnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi91c2VyYWdlbnQiKX0pLGRlZmluZSgicGlsb3QvY2Fub24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvY2Fub24nIGlzIGRlcHJlY2F0ZWQuIiksYi5hZGRDb21tYW5kPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24uYWRkQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpLGNvbnNvbGUudHJhY2UoKX0sYi5yZW1vdmVDb21tYW5kPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24ucmVtb3ZlQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5yZW1vdmVDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpLGNvbnNvbGUudHJhY2UoKX19KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCi8qKg0KICogRGVmaW5lIGEgbW9kdWxlIGFsb25nIHdpdGggYSBwYXlsb2FkDQogKiBAcGFyYW0gbW9kdWxlIGEgbmFtZSBmb3IgdGhlIHBheWxvYWQNCiAqIEBwYXJhbSBwYXlsb2FkIGEgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHBhcmFtcw0KICovDQoNCihmdW5jdGlvbigpIHsNCg0KdmFyIEFDRV9OQU1FU1BBQ0UgPSAiIjsNCg0KdmFyIGdsb2JhbCA9IChmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpczsNCn0pKCk7DQoNCnZhciBfZGVmaW5lID0gZnVuY3Rpb24obW9kdWxlLCBkZXBzLCBwYXlsb2FkKSB7DQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICdzdHJpbmcnKSB7DQogICAgICAgIGlmIChfZGVmaW5lLm9yaWdpbmFsKQ0KICAgICAgICAgICAgX2RlZmluZS5vcmlnaW5hbC5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgY29uc29sZS5lcnJvcignZHJvcHBpbmcgbW9kdWxlIGJlY2F1c2UgZGVmaW5lIHdhc25cJ3QgYSBzdHJpbmcuJyk7DQogICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpDQogICAgICAgIHBheWxvYWQgPSBkZXBzOw0KDQogICAgaWYgKCFfZGVmaW5lLm1vZHVsZXMpDQogICAgICAgIF9kZWZpbmUubW9kdWxlcyA9IHt9Ow0KDQogICAgX2RlZmluZS5tb2R1bGVzW21vZHVsZV0gPSBwYXlsb2FkOw0KfTsNCg0KLyoqDQogKiBHZXQgYXQgZnVuY3Rpb25hbGl0eSBkZWZpbmUoKWVkIHVzaW5nIHRoZSBmdW5jdGlvbiBhYm92ZQ0KICovDQp2YXIgX3JlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlLCBjYWxsYmFjaykgew0KICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobW9kdWxlKSA9PT0gIltvYmplY3QgQXJyYXldIikgew0KICAgICAgICB2YXIgcGFyYW1zID0gW107DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbW9kdWxlLmxlbmd0aDsgaSA8IGw7ICsraSkgew0KICAgICAgICAgICAgdmFyIGRlcCA9IGxvb2t1cChwYXJlbnRJZCwgbW9kdWxlW2ldKTsNCiAgICAgICAgICAgIGlmICghZGVwICYmIF9yZXF1aXJlLm9yaWdpbmFsKQ0KICAgICAgICAgICAgICAgIHJldHVybiBfcmVxdWlyZS5vcmlnaW5hbC5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7DQogICAgICAgICAgICBwYXJhbXMucHVzaChkZXApOw0KICAgICAgICB9DQogICAgICAgIGlmIChjYWxsYmFjaykgew0KICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgcGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnc3RyaW5nJykgew0KICAgICAgICB2YXIgcGF5bG9hZCA9IGxvb2t1cChwYXJlbnRJZCwgbW9kdWxlKTsNCiAgICAgICAgaWYgKCFwYXlsb2FkICYmIF9yZXF1aXJlLm9yaWdpbmFsKQ0KICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlLm9yaWdpbmFsLmFwcGx5KHdpbmRvdywgYXJndW1lbnRzKTsNCg0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIGNhbGxiYWNrKCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcGF5bG9hZDsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGlmIChfcmVxdWlyZS5vcmlnaW5hbCkNCiAgICAgICAgICAgIHJldHVybiBfcmVxdWlyZS5vcmlnaW5hbC5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7DQogICAgfQ0KfTsNCg0KdmFyIG5vcm1hbGl6ZU1vZHVsZSA9IGZ1bmN0aW9uKHBhcmVudElkLCBtb2R1bGVOYW1lKSB7DQogICAgLy8gbm9ybWFsaXplIHBsdWdpbiByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmluZGV4T2YoIiEiKSAhPT0gLTEpIHsNCiAgICAgICAgdmFyIGNodW5rcyA9IG1vZHVsZU5hbWUuc3BsaXQoIiEiKTsNCiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzBdKSArICIhIiArIG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzFdKTsNCiAgICB9DQogICAgLy8gbm9ybWFsaXplIHJlbGF0aXZlIHJlcXVpcmVzDQogICAgaWYgKG1vZHVsZU5hbWUuY2hhckF0KDApID09ICIuIikgew0KICAgICAgICB2YXIgYmFzZSA9IHBhcmVudElkLnNwbGl0KCIvIikuc2xpY2UoMCwgLTEpLmpvaW4oIi8iKTsNCiAgICAgICAgbW9kdWxlTmFtZSA9IGJhc2UgKyAiLyIgKyBtb2R1bGVOYW1lOw0KDQogICAgICAgIHdoaWxlKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7DQogICAgICAgICAgICB2YXIgcHJldmlvdXMgPSBtb2R1bGVOYW1lOw0KICAgICAgICAgICAgbW9kdWxlTmFtZSA9IG1vZHVsZU5hbWUucmVwbGFjZSgvXC9cLlwvLywgIi8iKS5yZXBsYWNlKC9bXlwvXStcL1wuXC5cLy8sICIiKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KLyoqDQogKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBsb29rdXAgbW9kdWxlTmFtZXMgYW5kIHJlc29sdmUgdGhlbSBieSBjYWxsaW5nIHRoZQ0KICogZGVmaW5pdGlvbiBmdW5jdGlvbiBpZiBuZWVkZWQuDQogKi8NCnZhciBsb29rdXAgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KDQogICAgbW9kdWxlTmFtZSA9IG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgbW9kdWxlTmFtZSk7DQoNCiAgICB2YXIgbW9kdWxlID0gX2RlZmluZS5tb2R1bGVzW21vZHVsZU5hbWVdOw0KICAgIGlmICghbW9kdWxlKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCg0KICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgIHZhciBleHBvcnRzID0ge307DQogICAgICAgIHZhciBtb2QgPSB7DQogICAgICAgICAgICBpZDogbW9kdWxlTmFtZSwNCiAgICAgICAgICAgIHVyaTogJycsDQogICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLA0KICAgICAgICAgICAgcGFja2FnZWQ6IHRydWUNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgcmVxID0gZnVuY3Rpb24obW9kdWxlLCBjYWxsYmFjaykgew0KICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlKG1vZHVsZU5hbWUsIG1vZHVsZSwgY2FsbGJhY2spOw0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IG1vZHVsZShyZXEsIGV4cG9ydHMsIG1vZCk7DQogICAgICAgIGV4cG9ydHMgPSByZXR1cm5WYWx1ZSB8fCBtb2QuZXhwb3J0czsNCg0KICAgICAgICAvLyBjYWNoZSB0aGUgcmVzdWx0aW5nIG1vZHVsZSBvYmplY3QgZm9yIG5leHQgdGltZQ0KICAgICAgICBfZGVmaW5lLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBleHBvcnRzOw0KICAgICAgICByZXR1cm4gZXhwb3J0czsNCiAgICB9DQoNCiAgICByZXR1cm4gbW9kdWxlOw0KfTsNCg0KZnVuY3Rpb24gZXhwb3J0QWNlKG5zKSB7DQoNCiAgICBpZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gInVuZGVmaW5lZCIpIHsNCg0KICAgICAgICB2YXIgZGVmaW5lID0gZ2xvYmFsLmRlZmluZTsNCiAgICAgICAgZ2xvYmFsLmRlZmluZSA9IGZ1bmN0aW9uKGlkLCBkZXBzLCBjYWxsYmFjaykgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikNCiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoNCiAgICAgICAgICAgIHJldHVybiBkZWZpbmUoaWQsIGRlcHMsIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICAgICAgICAgICAgICAgIGlmIChkZXBzWzJdID09ICJtb2R1bGUiKQ0KICAgICAgICAgICAgICAgICAgICBtb2R1bGUucGFja2FnZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIGdsb2JhbC5kZWZpbmUucGFja2FnZWQgPSB0cnVlOw0KDQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICB2YXIgcmVxdWlyZSA9IGZ1bmN0aW9uKG1vZHVsZSwgY2FsbGJhY2spIHsNCiAgICAgICAgcmV0dXJuIF9yZXF1aXJlKCIiLCBtb2R1bGUsIGNhbGxiYWNrKTsNCiAgICB9Ow0KICAgIHJlcXVpcmUucGFja2FnZWQgPSB0cnVlOw0KDQogICAgdmFyIHJvb3QgPSBnbG9iYWw7DQogICAgaWYgKG5zKSB7DQogICAgICAgIGlmICghZ2xvYmFsW25zXSkNCiAgICAgICAgICAgIGdsb2JhbFtuc10gPSB7fTsNCiAgICAgICAgcm9vdCA9IGdsb2JhbFtuc107DQogICAgfQ0KDQogICAgaWYgKHJvb3QuZGVmaW5lKQ0KICAgICAgICBfZGVmaW5lLm9yaWdpbmFsID0gcm9vdC5kZWZpbmU7DQoNCiAgICByb290LmRlZmluZSA9IF9kZWZpbmU7DQoNCiAgICBpZiAocm9vdC5yZXF1aXJlKQ0KICAgICAgICBfcmVxdWlyZS5vcmlnaW5hbCA9IHJvb3QucmVxdWlyZTsNCg0KICAgIHJvb3QucmVxdWlyZSA9IHJlcXVpcmU7DQp9DQoNCmV4cG9ydEFjZShBQ0VfTkFNRVNQQUNFKTsNCg0KfSkoKTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBNb3ppbGxhLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwOQ0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBLZXZpbiBEYW5nb29yIChrZGFuZ29vckBtb3ppbGxhLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9hY2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZml4b2xkYnJvd3NlcnMnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvZWRpdG9yJywgJ2FjZS9lZGl0X3Nlc3Npb24nLCAnYWNlL3VuZG9tYW5hZ2VyJywgJ2FjZS92aXJ0dWFsX3JlbmRlcmVyJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvdGhlbWUvdGV4dG1hdGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnJlcXVpcmUoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7DQoNCnZhciBEb20gPSByZXF1aXJlKCIuL2xpYi9kb20iKTsNCnZhciBFdmVudCA9IHJlcXVpcmUoIi4vbGliL2V2ZW50Iik7DQoNCnZhciBFZGl0b3IgPSByZXF1aXJlKCIuL2VkaXRvciIpLkVkaXRvcjsNCnZhciBFZGl0U2Vzc2lvbiA9IHJlcXVpcmUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb247DQp2YXIgVW5kb01hbmFnZXIgPSByZXF1aXJlKCIuL3VuZG9tYW5hZ2VyIikuVW5kb01hbmFnZXI7DQp2YXIgUmVuZGVyZXIgPSByZXF1aXJlKCIuL3ZpcnR1YWxfcmVuZGVyZXIiKS5WaXJ0dWFsUmVuZGVyZXI7DQoNCnJlcXVpcmUoIi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKTsNCg0KZXhwb3J0cy5lZGl0ID0gZnVuY3Rpb24oZWwpIHsNCiAgICBpZiAodHlwZW9mKGVsKSA9PSAic3RyaW5nIikgew0KICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsKTsNCiAgICB9DQoNCiAgICB2YXIgZG9jID0gbmV3IEVkaXRTZXNzaW9uKERvbS5nZXRJbm5lclRleHQoZWwpKTsNCiAgICBkb2Muc2V0VW5kb01hbmFnZXIobmV3IFVuZG9NYW5hZ2VyKCkpOw0KICAgIGVsLmlubmVySFRNTCA9ICcnOw0KDQogICAgdmFyIGVkaXRvciA9IG5ldyBFZGl0b3IobmV3IFJlbmRlcmVyKGVsLCByZXF1aXJlKCIuL3RoZW1lL3RleHRtYXRlIikpKTsNCiAgICBlZGl0b3Iuc2V0U2Vzc2lvbihkb2MpOw0KDQogICAgdmFyIGVudiA9IHt9Ow0KICAgIGVudi5kb2N1bWVudCA9IGRvYzsNCiAgICBlbnYuZWRpdG9yID0gZWRpdG9yOw0KICAgIGVkaXRvci5yZXNpemUoKTsNCiAgICBFdmVudC5hZGRMaXN0ZW5lcih3aW5kb3csICJyZXNpemUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgZWRpdG9yLnJlc2l6ZSgpOw0KICAgIH0pOw0KICAgIGVsLmVudiA9IGVudjsNCiAgICAvLyBTdG9yZSBlbnYgb24gZWRpdG9yIHN1Y2ggdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgbGF0ZXIgb24gZnJvbQ0KICAgIC8vIHRoZSByZXR1cm5lZCBvYmplY3QuDQogICAgZWRpdG9yLmVudiA9IGVudjsNCiAgICByZXR1cm4gZWRpdG9yOw0KfTsNCg0KfSk7Ly8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKCB0eXBlb2Yoc3RyKSA9PSAnc3RyaW5nJyAmJiBtYXRjaCkgew0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yDQogICAgICAgICAgICAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgew0KICAgICAgICAgICAgICAgIHIyID0gUmVnRXhwKHRoaXMuc291cmNlLCByZWFsLnJlcGxhY2UuY2FsbChnZXROYXRpdmVGbGFncyh0aGlzKSwgImciLCAiIikpOw0KICAgICAgICAgICAgICAgIC8vIFVzaW5nIGBzdHIuc2xpY2UobWF0Y2guaW5kZXgpYCByYXRoZXIgdGhhbiBgbWF0Y2hbMF1gIGluIGNhc2UgbG9va2FoZWFkIGFsbG93ZWQNCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaA0KICAgICAgICAgICAgICAgIHJlYWwucmVwbGFjZS5jYWxsKHN0ci5zbGljZShtYXRjaC5pbmRleCksIHIyLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW2ldID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBBdHRhY2ggbmFtZWQgY2FwdHVyZSBwcm9wZXJ0aWVzDQogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWF0Y2gubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2kgLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW25hbWVdID0gbWF0Y2hbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHRoYXQgaW5jcmVtZW50IGBsYXN0SW5kZXhgIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50ICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgIH07DQoNCiAgICAvLyBEb24ndCBvdmVycmlkZSBgdGVzdGAgaWYgaXQgd29uJ3QgY2hhbmdlIGFueXRoaW5nDQogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsNCiAgICAgICAgLy8gRml4IGJyb3dzZXIgYnVnIGluIG5hdGl2ZSBtZXRob2QNCiAgICAgICAgUmVnRXhwLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHN0cikgew0KICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuDQogICAgICAgICAgICAvLyBgZXhlY2Agd291bGQgdGFrZSBjYXJlIG9mIHRoZSBgbGFzdEluZGV4YCBmaXgNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlYWwuZXhlYy5jYWxsKHRoaXMsIHN0cik7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgZnVuY3Rpb24gZ2V0TmF0aXZlRmxhZ3MgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguaWdub3JlQ2FzZSA/ICJpIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXgubXVsdGlsaW5lICA/ICJtIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMw0KICAgICAgICAgICAgICAgKHJlZ2V4LnN0aWNreSAgICAgPyAieSIgOiAiIik7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGluZGV4T2YgKGFycmF5LCBpdGVtLCBmcm9tKSB7DQogICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgLy8gVXNlIHRoZSBuYXRpdmUgYXJyYXkgbWV0aG9kIGlmIGF2YWlsYWJsZQ0KICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7DQogICAgICAgIGZvciAodmFyIGkgPSBmcm9tIHx8IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KDQp9KTsNCi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgQVQgc3VjYW4gQVQgZ21haWwgT0RUIGNvbT4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2RvbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBYSFRNTF9OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsNCg0KZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24odGFnLCBucykgew0KICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgPw0KICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMgfHwgWEhUTUxfTlMsIHRhZykgOg0KICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7DQp9Ow0KDQpleHBvcnRzLnNldFRleHQgPSBmdW5jdGlvbihlbGVtLCB0ZXh0KSB7DQogICAgaWYgKGVsZW0uaW5uZXJUZXh0ICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgZWxlbS5pbm5lclRleHQgPSB0ZXh0Ow0KICAgIH0NCiAgICBpZiAoZWxlbS50ZXh0Q29udGVudCAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgIGVsZW0udGV4dENvbnRlbnQgPSB0ZXh0Ow0KICAgIH0NCn07DQoNCmV4cG9ydHMuaGFzQ3NzQ2xhc3MgPSBmdW5jdGlvbihlbCwgbmFtZSkgew0KICAgIHZhciBjbGFzc2VzID0gZWwuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7DQogICAgcmV0dXJuIGNsYXNzZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7DQp9Ow0KDQovKioNCiogQWRkIGEgQ1NTIGNsYXNzIHRvIHRoZSBsaXN0IG9mIGNsYXNzZXMgb24gdGhlIGdpdmVuIG5vZGUNCiovDQpleHBvcnRzLmFkZENzc0NsYXNzID0gZnVuY3Rpb24oZWwsIG5hbWUpIHsNCiAgICBpZiAoIWV4cG9ydHMuaGFzQ3NzQ2xhc3MoZWwsIG5hbWUpKSB7DQogICAgICAgIGVsLmNsYXNzTmFtZSArPSAiICIgKyBuYW1lOw0KICAgIH0NCn07DQoNCi8qKg0KKiBSZW1vdmUgYSBDU1MgY2xhc3MgZnJvbSB0aGUgbGlzdCBvZiBjbGFzc2VzIG9uIHRoZSBnaXZlbiBub2RlDQoqLw0KZXhwb3J0cy5yZW1vdmVDc3NDbGFzcyA9IGZ1bmN0aW9uKGVsLCBuYW1lKSB7DQogICAgdmFyIGNsYXNzZXMgPSBlbC5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKTsNCiAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICB2YXIgaW5kZXggPSBjbGFzc2VzLmluZGV4T2YobmFtZSk7DQogICAgICAgIGlmIChpbmRleCA9PSAtMSkgew0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgY2xhc3Nlcy5zcGxpY2UoaW5kZXgsIDEpOw0KICAgIH0NCiAgICBlbC5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oIiAiKTsNCn07DQoNCmV4cG9ydHMudG9nZ2xlQ3NzQ2xhc3MgPSBmdW5jdGlvbihlbCwgbmFtZSkgew0KICAgIHZhciBjbGFzc2VzID0gZWwuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyksIGFkZCA9IHRydWU7DQogICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgdmFyIGluZGV4ID0gY2xhc3Nlcy5pbmRleE9mKG5hbWUpOw0KICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGFkZCA9IGZhbHNlOw0KICAgICAgICBjbGFzc2VzLnNwbGljZShpbmRleCwgMSk7DQogICAgfQ0KICAgIGlmKGFkZCkNCiAgICAgICAgY2xhc3Nlcy5wdXNoKG5hbWUpOw0KDQogICAgZWwuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCIgIik7DQogICAgcmV0dXJuIGFkZDsNCn07DQoNCi8qKg0KICogQWRkIG9yIHJlbW92ZSBhIENTUyBjbGFzcyBmcm9tIHRoZSBsaXN0IG9mIGNsYXNzZXMgb24gdGhlIGdpdmVuIG5vZGUNCiAqIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgPHR0PmluY2x1ZGU8L3R0Pg0KICovDQpleHBvcnRzLnNldENzc0NsYXNzID0gZnVuY3Rpb24obm9kZSwgY2xhc3NOYW1lLCBpbmNsdWRlKSB7DQogICAgaWYgKGluY2x1ZGUpIHsNCiAgICAgICAgZXhwb3J0cy5hZGRDc3NDbGFzcyhub2RlLCBjbGFzc05hbWUpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGV4cG9ydHMucmVtb3ZlQ3NzQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmhhc0Nzc1N0cmluZyA9IGZ1bmN0aW9uKGlkLCBkb2MpIHsNCiAgICB2YXIgaW5kZXggPSAwLCBzaGVldHM7DQogICAgZG9jID0gZG9jIHx8IGRvY3VtZW50Ow0KDQogICAgaWYgKGRvYy5jcmVhdGVTdHlsZVNoZWV0ICYmIChzaGVldHMgPSBkb2Muc3R5bGVTaGVldHMpKSB7DQogICAgICAgIHdoaWxlIChpbmRleCA8IHNoZWV0cy5sZW5ndGgpDQogICAgICAgICAgICBpZiAoc2hlZXRzW2luZGV4KytdLm93bmluZ0VsZW1lbnQuaWQgPT09IGlkKSByZXR1cm4gdHJ1ZTsNCiAgICB9IGVsc2UgaWYgKChzaGVldHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0eWxlIikpKSB7DQogICAgICAgIHdoaWxlIChpbmRleCA8IHNoZWV0cy5sZW5ndGgpDQogICAgICAgICAgICBpZiAoc2hlZXRzW2luZGV4KytdLmlkID09PSBpZCkgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcmV0dXJuIGZhbHNlOw0KfTsNCg0KZXhwb3J0cy5pbXBvcnRDc3NTdHJpbmcgPSBmdW5jdGlvbiBpbXBvcnRDc3NTdHJpbmcoY3NzVGV4dCwgaWQsIGRvYykgew0KICAgIGRvYyA9IGRvYyB8fCBkb2N1bWVudDsNCiAgICAvLyBJZiBzdHlsZSBpcyBhbHJlYWR5IGltcG9ydGVkIHJldHVybiBpbW1lZGlhdGVseS4NCiAgICBpZiAoaWQgJiYgZXhwb3J0cy5oYXNDc3NTdHJpbmcoaWQsIGRvYykpDQogICAgICAgIHJldHVybiBudWxsOw0KICAgIA0KICAgIHZhciBzdHlsZTsNCiAgICANCiAgICBpZiAoZG9jLmNyZWF0ZVN0eWxlU2hlZXQpIHsNCiAgICAgICAgc3R5bGUgPSBkb2MuY3JlYXRlU3R5bGVTaGVldCgpOw0KICAgICAgICBzdHlsZS5jc3NUZXh0ID0gY3NzVGV4dDsNCiAgICAgICAgaWYgKGlkKQ0KICAgICAgICAgICAgc3R5bGUub3duaW5nRWxlbWVudC5pZCA9IGlkOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnROUw0KICAgICAgICAgICAgPyBkb2MuY3JlYXRlRWxlbWVudE5TKFhIVE1MX05TLCAic3R5bGUiKQ0KICAgICAgICAgICAgOiBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsNCg0KICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoY3NzVGV4dCkpOw0KICAgICAgICBpZiAoaWQpDQogICAgICAgICAgICBzdHlsZS5pZCA9IGlkOw0KDQogICAgICAgIHZhciBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jLmRvY3VtZW50RWxlbWVudDsNCiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5pbXBvcnRDc3NTdHlsc2hlZXQgPSBmdW5jdGlvbih1cmksIGRvYykgew0KICAgIGlmIChkb2MuY3JlYXRlU3R5bGVTaGVldCkgew0KICAgICAgICBkb2MuY3JlYXRlU3R5bGVTaGVldCh1cmkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHZhciBsaW5rID0gZXhwb3J0cy5jcmVhdGVFbGVtZW50KCdsaW5rJyk7DQogICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOw0KICAgICAgICBsaW5rLmhyZWYgPSB1cmk7DQoNCiAgICAgICAgdmFyIGhlYWQgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50Ow0KICAgICAgICBoZWFkLmFwcGVuZENoaWxkKGxpbmspOw0KICAgIH0NCn07DQoNCmV4cG9ydHMuZ2V0SW5uZXJXaWR0aCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gKA0KICAgICAgICBwYXJzZUludChleHBvcnRzLmNvbXB1dGVkU3R5bGUoZWxlbWVudCwgInBhZGRpbmdMZWZ0IiksIDEwKSArDQogICAgICAgIHBhcnNlSW50KGV4cG9ydHMuY29tcHV0ZWRTdHlsZShlbGVtZW50LCAicGFkZGluZ1JpZ2h0IiksIDEwKSArIA0KICAgICAgICBlbGVtZW50LmNsaWVudFdpZHRoDQogICAgKTsNCn07DQoNCmV4cG9ydHMuZ2V0SW5uZXJIZWlnaHQgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuICgNCiAgICAgICAgcGFyc2VJbnQoZXhwb3J0cy5jb21wdXRlZFN0eWxlKGVsZW1lbnQsICJwYWRkaW5nVG9wIiksIDEwKSArDQogICAgICAgIHBhcnNlSW50KGV4cG9ydHMuY29tcHV0ZWRTdHlsZShlbGVtZW50LCAicGFkZGluZ0JvdHRvbSIpLCAxMCkgKw0KICAgICAgICBlbGVtZW50LmNsaWVudEhlaWdodA0KICAgICk7DQp9Ow0KDQppZiAod2luZG93LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHsNCiAgICBleHBvcnRzLmdldFBhZ2VTY3JvbGxUb3AgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHdpbmRvdy5wYWdlWU9mZnNldDsNCiAgICB9Ow0KDQogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0Ow0KICAgIH07DQp9DQplbHNlIHsNCiAgICBleHBvcnRzLmdldFBhZ2VTY3JvbGxUb3AgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOw0KICAgIH07DQoNCiAgICBleHBvcnRzLmdldFBhZ2VTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7DQogICAgfTsNCn0NCg0KaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKQ0KICAgIGV4cG9ydHMuY29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogICAgICAgIGlmIChzdHlsZSkNCiAgICAgICAgICAgIHJldHVybiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgIiIpIHx8IHt9KVtzdHlsZV0gfHwgIiI7DQogICAgICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAiIikgfHwge307DQogICAgfTsNCmVsc2UNCiAgICBleHBvcnRzLmNvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgew0KICAgICAgICBpZiAoc3R5bGUpDQogICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jdXJyZW50U3R5bGVbc3R5bGVdOw0KICAgICAgICByZXR1cm4gZWxlbWVudC5jdXJyZW50U3R5bGU7DQogICAgfTsNCg0KZXhwb3J0cy5zY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uKGRvY3VtZW50KSB7DQoNCiAgICB2YXIgaW5uZXIgPSBleHBvcnRzLmNyZWF0ZUVsZW1lbnQoInAiKTsNCiAgICBpbm5lci5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICBpbm5lci5zdHlsZS5taW5XaWR0aCA9ICIwcHgiOw0KICAgIGlubmVyLnN0eWxlLmhlaWdodCA9ICIyMDBweCI7DQoNCiAgICB2YXIgb3V0ZXIgPSBleHBvcnRzLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHZhciBzdHlsZSA9IG91dGVyLnN0eWxlOw0KDQogICAgc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOw0KICAgIHN0eWxlLmxlZnQgPSAiLTEwMDAwcHgiOw0KICAgIHN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7DQogICAgc3R5bGUud2lkdGggPSAiMjAwcHgiOw0KICAgIHN0eWxlLm1pbldpZHRoID0gIjBweCI7DQogICAgc3R5bGUuaGVpZ2h0ID0gIjE1MHB4IjsNCg0KICAgIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKTsNCg0KICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7DQogICAgYm9keS5hcHBlbmRDaGlsZChvdXRlcik7DQoNCiAgICB2YXIgbm9TY3JvbGxiYXIgPSBpbm5lci5vZmZzZXRXaWR0aDsNCg0KICAgIHN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCI7DQogICAgdmFyIHdpdGhTY3JvbGxiYXIgPSBpbm5lci5vZmZzZXRXaWR0aDsNCg0KICAgIGlmIChub1Njcm9sbGJhciA9PSB3aXRoU2Nyb2xsYmFyKSB7DQogICAgICAgIHdpdGhTY3JvbGxiYXIgPSBvdXRlci5jbGllbnRXaWR0aDsNCiAgICB9DQoNCiAgICBib2R5LnJlbW92ZUNoaWxkKG91dGVyKTsNCg0KICAgIHJldHVybiBub1Njcm9sbGJhci13aXRoU2Nyb2xsYmFyOw0KfTsNCg0KLyoqDQogKiBPcHRpbWl6ZWQgc2V0IGlubmVySFRNTC4gVGhpcyBpcyBmYXN0ZXIgdGhhbiBwbGFpbiBpbm5lckhUTUwgaWYgdGhlIGVsZW1lbnQNCiAqIGFscmVhZHkgY29udGFpbnMgYSBsb3Qgb2YgY2hpbGQgZWxlbWVudHMuDQogKg0KICogU2VlIGh0dHA6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9mYXN0ZXItdGhhbi1pbm5lcmh0bWwgZm9yIGRldGFpbHMNCiAqLw0KZXhwb3J0cy5zZXRJbm5lckh0bWwgPSBmdW5jdGlvbihlbCwgaW5uZXJIdG1sKSB7DQogICAgdmFyIGVsZW1lbnQgPSBlbC5jbG9uZU5vZGUoZmFsc2UpOy8vZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgZWxlbWVudC5pbm5lckhUTUwgPSBpbm5lckh0bWw7DQogICAgZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZWxlbWVudCwgZWwpOw0KICAgIHJldHVybiBlbGVtZW50Ow0KfTsNCg0KZXhwb3J0cy5zZXRJbm5lclRleHQgPSBmdW5jdGlvbihlbCwgaW5uZXJUZXh0KSB7DQogICAgdmFyIGRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudDsNCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAidGV4dENvbnRlbnQiIGluIGRvY3VtZW50LmJvZHkpDQogICAgICAgIGVsLnRleHRDb250ZW50ID0gaW5uZXJUZXh0Ow0KICAgIGVsc2UNCiAgICAgICAgZWwuaW5uZXJUZXh0ID0gaW5uZXJUZXh0Ow0KDQp9Ow0KDQpleHBvcnRzLmdldElubmVyVGV4dCA9IGZ1bmN0aW9uKGVsKSB7DQogICAgdmFyIGRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudDsNCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAidGV4dENvbnRlbnQiIGluIGRvY3VtZW50LmJvZHkpDQogICAgICAgIHJldHVybiBlbC50ZXh0Q29udGVudDsNCiAgICBlbHNlDQogICAgICAgICByZXR1cm4gZWwuaW5uZXJUZXh0IHx8IGVsLnRleHRDb250ZW50IHx8ICIiOw0KfTsNCg0KZXhwb3J0cy5nZXRQYXJlbnRXaW5kb3cgPSBmdW5jdGlvbihkb2N1bWVudCkgew0KICAgIHJldHVybiBkb2N1bWVudC5kZWZhdWx0VmlldyB8fCBkb2N1bWVudC5wYXJlbnRXaW5kb3c7DQp9Ow0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2V2ZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2tleXMnLCAnYWNlL2xpYi91c2VyYWdlbnQnLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBrZXlzID0gcmVxdWlyZSgiLi9rZXlzIik7DQp2YXIgdXNlcmFnZW50ID0gcmVxdWlyZSgiLi91c2VyYWdlbnQiKTsNCnZhciBkb20gPSByZXF1aXJlKCIuL2RvbSIpOw0KDQpleHBvcnRzLmFkZExpc3RlbmVyID0gZnVuY3Rpb24oZWxlbSwgdHlwZSwgY2FsbGJhY2spIHsNCiAgICBpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgIHJldHVybiBlbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIGZhbHNlKTsNCiAgICB9DQogICAgaWYgKGVsZW0uYXR0YWNoRXZlbnQpIHsNCiAgICAgICAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGNhbGxiYWNrKHdpbmRvdy5ldmVudCk7DQogICAgICAgIH07DQogICAgICAgIGNhbGxiYWNrLl93cmFwcGVyID0gd3JhcHBlcjsNCiAgICAgICAgZWxlbS5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgd3JhcHBlcik7DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsZW0sIHR5cGUsIGNhbGxiYWNrKSB7DQogICAgaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikgew0KICAgICAgICByZXR1cm4gZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBmYWxzZSk7DQogICAgfQ0KICAgIGlmIChlbGVtLmRldGFjaEV2ZW50KSB7DQogICAgICAgIGVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGNhbGxiYWNrLl93cmFwcGVyIHx8IGNhbGxiYWNrKTsNCiAgICB9DQp9Ow0KDQovKioNCiogUHJldmVudHMgcHJvcGFnYXRpb24gYW5kIGNsb2JiZXJzIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgcGFzc2VkIGV2ZW50DQoqLw0KZXhwb3J0cy5zdG9wRXZlbnQgPSBmdW5jdGlvbihlKSB7DQogICAgZXhwb3J0cy5zdG9wUHJvcGFnYXRpb24oZSk7DQogICAgZXhwb3J0cy5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICByZXR1cm4gZmFsc2U7DQp9Ow0KDQpleHBvcnRzLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pDQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgZWxzZQ0KICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7DQp9Ow0KDQpleHBvcnRzLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oZSkgew0KICAgIGlmIChlLnByZXZlbnREZWZhdWx0KQ0KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgZWxzZQ0KICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7DQp9Ow0KDQpleHBvcnRzLmdldERvY3VtZW50WCA9IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAoZS5jbGllbnRYKSB7DQogICAgICAgIHJldHVybiBlLmNsaWVudFggKyBkb20uZ2V0UGFnZVNjcm9sbExlZnQoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gZS5wYWdlWDsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmdldERvY3VtZW50WSA9IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAoZS5jbGllbnRZKSB7DQogICAgICAgIHJldHVybiBlLmNsaWVudFkgKyBkb20uZ2V0UGFnZVNjcm9sbFRvcCgpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBlLnBhZ2VZOw0KICAgIH0NCn07DQoNCi8qKg0KICogQHJldHVybiB7TnVtYmVyfSAwIGZvciBsZWZ0IGJ1dHRvbiwgMSBmb3IgbWlkZGxlIGJ1dHRvbiwgMiBmb3IgcmlnaHQgYnV0dG9uDQogKi8NCmV4cG9ydHMuZ2V0QnV0dG9uID0gZnVuY3Rpb24oZSkgew0KICAgIGlmIChlLnR5cGUgPT0gImRibGNsaWNrIikNCiAgICAgICAgcmV0dXJuIDA7DQogICAgZWxzZSBpZiAoZS50eXBlID09ICJjb250ZXh0bWVudSIpDQogICAgICAgIHJldHVybiAyOw0KDQogICAgLy8gRE9NIEV2ZW50DQogICAgaWYgKGUucHJldmVudERlZmF1bHQpIHsNCiAgICAgICAgcmV0dXJuIGUuYnV0dG9uOw0KICAgIH0NCiAgICAvLyBvbGQgSUUNCiAgICBlbHNlIHsNCiAgICAgICAgcmV0dXJuIHsxOjAsIDI6MiwgNDoxfVtlLmJ1dHRvbl07DQogICAgfQ0KfTsNCg0KaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRDYXB0dXJlKSB7DQogICAgZXhwb3J0cy5jYXB0dXJlID0gZnVuY3Rpb24oZWwsIGV2ZW50SGFuZGxlciwgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKSB7DQogICAgICAgIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHsNCiAgICAgICAgICAgIGV2ZW50SGFuZGxlcihlKTsNCiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLnN0b3BQcm9wYWdhdGlvbihlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTsNCiAgICAgICAgZnVuY3Rpb24gb25SZWxlYXNlQ2FwdHVyZShlKSB7DQogICAgICAgICAgICBldmVudEhhbmRsZXIoZSk7DQoNCiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7DQogICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZWxlYXNlQ2FwdHVyZUhhbmRsZXIoZSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGV4cG9ydHMucmVtb3ZlTGlzdGVuZXIoZWwsICJtb3VzZW1vdmUiLCBldmVudEhhbmRsZXIpOw0KICAgICAgICAgICAgZXhwb3J0cy5yZW1vdmVMaXN0ZW5lcihlbCwgIm1vdXNldXAiLCBvblJlbGVhc2VDYXB0dXJlKTsNCiAgICAgICAgICAgIGV4cG9ydHMucmVtb3ZlTGlzdGVuZXIoZWwsICJsb3NlY2FwdHVyZSIsIG9uUmVsZWFzZUNhcHR1cmUpOw0KDQogICAgICAgICAgICBlbC5yZWxlYXNlQ2FwdHVyZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNlbW92ZSIsIGV2ZW50SGFuZGxlcik7DQogICAgICAgIGV4cG9ydHMuYWRkTGlzdGVuZXIoZWwsICJtb3VzZXVwIiwgb25SZWxlYXNlQ2FwdHVyZSk7DQogICAgICAgIGV4cG9ydHMuYWRkTGlzdGVuZXIoZWwsICJsb3NlY2FwdHVyZSIsIG9uUmVsZWFzZUNhcHR1cmUpOw0KICAgICAgICBlbC5zZXRDYXB0dXJlKCk7DQogICAgfTsNCn0NCmVsc2Ugew0KICAgIGV4cG9ydHMuY2FwdHVyZSA9IGZ1bmN0aW9uKGVsLCBldmVudEhhbmRsZXIsIHJlbGVhc2VDYXB0dXJlSGFuZGxlcikgew0KICAgICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7DQogICAgICAgICAgICBldmVudEhhbmRsZXIoZSk7DQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gb25Nb3VzZVVwKGUpIHsNCiAgICAgICAgICAgIGV2ZW50SGFuZGxlciAmJiBldmVudEhhbmRsZXIoZSk7DQogICAgICAgICAgICByZWxlYXNlQ2FwdHVyZUhhbmRsZXIgJiYgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKGUpOw0KDQogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgdHJ1ZSk7DQogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgb25Nb3VzZVVwLCB0cnVlKTsNCg0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIG9uTW91c2VNb3ZlLCB0cnVlKTsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIG9uTW91c2VVcCwgdHJ1ZSk7DQogICAgfTsNCn0NCg0KZXhwb3J0cy5hZGRNb3VzZVdoZWVsTGlzdGVuZXIgPSBmdW5jdGlvbihlbCwgY2FsbGJhY2spIHsNCiAgICB2YXIgZmFjdG9yID0gODsNCiAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGlmIChlLndoZWVsRGVsdGEgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgaWYgKGUud2hlZWxEZWx0YVggIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGUud2hlZWxYID0gLWUud2hlZWxEZWx0YVggLyBmYWN0b3I7DQogICAgICAgICAgICAgICAgZS53aGVlbFkgPSAtZS53aGVlbERlbHRhWSAvIGZhY3RvcjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZS53aGVlbFggPSAwOw0KICAgICAgICAgICAgICAgIGUud2hlZWxZID0gLWUud2hlZWxEZWx0YSAvIGZhY3RvcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGlmIChlLmF4aXMgJiYgZS5heGlzID09IGUuSE9SSVpPTlRBTF9BWElTKSB7DQogICAgICAgICAgICAgICAgZS53aGVlbFggPSAoZS5kZXRhaWwgfHwgMCkgKiA1Ow0KICAgICAgICAgICAgICAgIGUud2hlZWxZID0gMDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZS53aGVlbFggPSAwOw0KICAgICAgICAgICAgICAgIGUud2hlZWxZID0gKGUuZGV0YWlsIHx8IDApICogNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBjYWxsYmFjayhlKTsNCiAgICB9Ow0KICAgIGV4cG9ydHMuYWRkTGlzdGVuZXIoZWwsICJET01Nb3VzZVNjcm9sbCIsIGxpc3RlbmVyKTsNCiAgICBleHBvcnRzLmFkZExpc3RlbmVyKGVsLCAibW91c2V3aGVlbCIsIGxpc3RlbmVyKTsNCn07DQoNCmV4cG9ydHMuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lciA9IGZ1bmN0aW9uKGVsLCBidXR0b24sIGNvdW50LCB0aW1lb3V0LCBjYWxsYmFjaykgew0KICAgIHZhciBjbGlja3MgPSAwOw0KICAgIHZhciBzdGFydFgsIHN0YXJ0WTsNCg0KICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgY2xpY2tzICs9IDE7DQogICAgICAgIGlmIChjbGlja3MgPT0gMSkgew0KICAgICAgICAgICAgc3RhcnRYID0gZS5jbGllbnRYOw0KICAgICAgICAgICAgc3RhcnRZID0gZS5jbGllbnRZOw0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIGNsaWNrcyA9IDA7DQogICAgICAgICAgICB9LCB0aW1lb3V0IHx8IDYwMCk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgaXNCdXR0b24gPSBleHBvcnRzLmdldEJ1dHRvbihlKSA9PSBidXR0b247DQogICAgICAgIGlmICghaXNCdXR0b24gfHwgTWF0aC5hYnMoZS5jbGllbnRYIC0gc3RhcnRYKSA+IDUgfHwgTWF0aC5hYnMoZS5jbGllbnRZIC0gc3RhcnRZKSA+IDUpDQogICAgICAgICAgICBjbGlja3MgPSAwOw0KDQogICAgICAgIGlmIChjbGlja3MgPT0gY291bnQpIHsNCiAgICAgICAgICAgIGNsaWNrcyA9IDA7DQogICAgICAgICAgICBjYWxsYmFjayhlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChpc0J1dHRvbikNCiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLnByZXZlbnREZWZhdWx0KGUpOw0KICAgIH07DQoNCiAgICBleHBvcnRzLmFkZExpc3RlbmVyKGVsLCAibW91c2Vkb3duIiwgbGlzdGVuZXIpOw0KICAgIHVzZXJhZ2VudC5pc09sZElFICYmIGV4cG9ydHMuYWRkTGlzdGVuZXIoZWwsICJkYmxjbGljayIsIGxpc3RlbmVyKTsNCn07DQoNCmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbW1hbmRLZXlzKGNhbGxiYWNrLCBlLCBrZXlDb2RlKSB7DQogICAgdmFyIGhhc2hJZCA9IDA7DQogICAgaWYgKHVzZXJhZ2VudC5pc09wZXJhICYmIHVzZXJhZ2VudC5pc01hYykgew0KICAgICAgICBoYXNoSWQgPSAwIHwgKGUubWV0YUtleSA/IDEgOiAwKSB8IChlLmFsdEtleSA/IDIgOiAwKQ0KICAgICAgICAgICAgfCAoZS5zaGlmdEtleSA/IDQgOiAwKSB8IChlLmN0cmxLZXkgPyA4IDogMCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaGFzaElkID0gMCB8IChlLmN0cmxLZXkgPyAxIDogMCkgfCAoZS5hbHRLZXkgPyAyIDogMCkNCiAgICAgICAgICAgIHwgKGUuc2hpZnRLZXkgPyA0IDogMCkgfCAoZS5tZXRhS2V5ID8gOCA6IDApOw0KICAgIH0NCg0KICAgIGlmIChrZXlDb2RlIGluIGtleXMuTU9ESUZJRVJfS0VZUykgew0KICAgICAgICBzd2l0Y2ggKGtleXMuTU9ESUZJRVJfS0VZU1trZXlDb2RlXSkgew0KICAgICAgICAgICAgY2FzZSAiQWx0IjoNCiAgICAgICAgICAgICAgICBoYXNoSWQgPSAyOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiU2hpZnQiOg0KICAgICAgICAgICAgICAgIGhhc2hJZCA9IDQ7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJDdHJsIjoNCiAgICAgICAgICAgICAgICBoYXNoSWQgPSAxOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBoYXNoSWQgPSA4Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGtleUNvZGUgPSAwOw0KICAgIH0NCg0KICAgIGlmIChoYXNoSWQgJiA4ICYmIChrZXlDb2RlID09IDkxIHx8IGtleUNvZGUgPT0gOTMpKSB7DQogICAgICAgIGtleUNvZGUgPSAwOw0KICAgIH0NCg0KICAgIC8vIElmIHRoZXJlIGlzIG5vIGhhc2hJRCBhbmQgdGhlIGtleUNvZGUgaXMgbm90IGEgZnVuY3Rpb24ga2V5LCB0aGVuDQogICAgLy8gd2UgZG9uJ3QgY2FsbCB0aGUgY2FsbGJhY2sgYXMgd2UgZG9uJ3QgaGFuZGxlIGEgY29tbWFuZCBrZXkgaGVyZQ0KICAgIC8vIChpdCdzIGEgbm9ybWFsIGtleS9jaGFyYWN0ZXIgaW5wdXQpLg0KICAgIGlmICghaGFzaElkICYmICEoa2V5Q29kZSBpbiBrZXlzLkZVTkNUSU9OX0tFWVMpICYmICEoa2V5Q29kZSBpbiBrZXlzLlBSSU5UQUJMRV9LRVlTKSkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICAgIHJldHVybiBjYWxsYmFjayhlLCBoYXNoSWQsIGtleUNvZGUpOw0KfQ0KDQpleHBvcnRzLmFkZENvbW1hbmRLZXlMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsLCBjYWxsYmFjaykgew0KICAgIHZhciBhZGRMaXN0ZW5lciA9IGV4cG9ydHMuYWRkTGlzdGVuZXI7DQogICAgaWYgKHVzZXJhZ2VudC5pc09sZEdlY2tvIHx8IHVzZXJhZ2VudC5pc09wZXJhKSB7DQogICAgICAgIC8vIE9sZCB2ZXJzaW9ucyBvZiBHZWNrbyBha2EuIEZpcmVmb3ggPCA0LjAgZGlkbid0IHJlcGVhdCB0aGUga2V5ZG93bg0KICAgICAgICAvLyBldmVudCBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSBrZXkgZm9yIGEgbG9uZ2VyIHRpbWUuIEluc3RlYWQsIHRoZQ0KICAgICAgICAvLyBrZXlkb3duIGV2ZW50IHdhcyBmaXJlZCBvbmNlIGFuZCBsYXRlciBvbiBvbmx5IHRoZSBrZXlwcmVzcyBldmVudC4NCiAgICAgICAgLy8gVG8gZW11bGF0ZSB0aGUgJ3JpZ2h0JyBrZXlkb3duIGJlaGF2aW9yLCB0aGUga2V5Q29kZSBvZiB0aGUgaW5pdGlhbA0KICAgICAgICAvLyBrZXlEb3duIGV2ZW50IGlzIHN0b3JlZCBhbmQgaW4gdGhlIGZvbGxvd2luZyBrZXlwcmVzcyBldmVudHMgdGhlDQogICAgICAgIC8vIHN0b3JlcyBrZXlDb2RlIGlzIHVzZWQgdG8gZW11bGF0ZSBhIGtleURvd24gZXZlbnQuDQogICAgICAgIHZhciBsYXN0S2V5RG93bktleUNvZGUgPSBudWxsOw0KICAgICAgICBhZGRMaXN0ZW5lcihlbCwgImtleWRvd24iLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBsYXN0S2V5RG93bktleUNvZGUgPSBlLmtleUNvZGU7DQogICAgICAgIH0pOw0KICAgICAgICBhZGRMaXN0ZW5lcihlbCwgImtleXByZXNzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUNvbW1hbmRLZXlzKGNhbGxiYWNrLCBlLCBsYXN0S2V5RG93bktleUNvZGUpOw0KICAgICAgICB9KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgbGFzdERvd24gPSBudWxsOw0KDQogICAgICAgIGFkZExpc3RlbmVyKGVsLCAia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIGxhc3REb3duID0gZS5rZXlJZGVudGlmaWVyIHx8IGUua2V5Q29kZTsNCiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVDb21tYW5kS2V5cyhjYWxsYmFjaywgZSwgZS5rZXlDb2RlKTsNCiAgICAgICAgfSk7DQogICAgfQ0KfTsNCg0KaWYgKHdpbmRvdy5wb3N0TWVzc2FnZSkgew0KICAgIHZhciBwb3N0TWVzc2FnZUlkID0gMTsNCiAgICBleHBvcnRzLm5leHRUaWNrID0gZnVuY3Rpb24oY2FsbGJhY2ssIHdpbikgew0KICAgICAgICB3aW4gPSB3aW4gfHwgd2luZG93Ow0KICAgICAgICB2YXIgbWVzc2FnZU5hbWUgPSAiemVyby10aW1lb3V0LW1lc3NhZ2UtIiArIHBvc3RNZXNzYWdlSWQ7ICAgICAgICAgICAgDQogICAgICAgIGV4cG9ydHMuYWRkTGlzdGVuZXIod2luLCAibWVzc2FnZSIsIGZ1bmN0aW9uIGxpc3RlbmVyKGUpIHsNCiAgICAgICAgICAgIGlmIChlLmRhdGEgPT0gbWVzc2FnZU5hbWUpIHsNCiAgICAgICAgICAgICAgICBleHBvcnRzLnN0b3BQcm9wYWdhdGlvbihlKTsNCiAgICAgICAgICAgICAgICBleHBvcnRzLnJlbW92ZUxpc3RlbmVyKHdpbiwgIm1lc3NhZ2UiLCBsaXN0ZW5lcik7DQogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIHdpbi5wb3N0TWVzc2FnZShtZXNzYWdlTmFtZSwgIioiKTsNCiAgICB9Ow0KfQ0KZWxzZSB7DQogICAgZXhwb3J0cy5uZXh0VGljayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB3aW4pIHsNCiAgICAgICAgd2luID0gd2luIHx8IHdpbmRvdzsNCiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDApOw0KICAgIH07DQp9DQoNCn0pOw0KLyohIEBsaWNlbnNlDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KU3Byb3V0Q29yZSAtLSBKYXZhU2NyaXB0IEFwcGxpY2F0aW9uIEZyYW1ld29yaw0KY29weXJpZ2h0IDIwMDYtMjAwOSwgU3Byb3V0IFN5c3RlbXMgSW5jLiwgQXBwbGUgSW5jLiBhbmQgY29udHJpYnV0b3JzLg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQ0KY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24NCnRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLA0KYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlDQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcNCkZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVINCkRFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCg0KU3Byb3V0Q29yZSBhbmQgdGhlIFNwcm91dENvcmUgbG9nbyBhcmUgdHJhZGVtYXJrcyBvZiBTcHJvdXQgU3lzdGVtcywgSW5jLg0KDQpGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBTcHJvdXRDb3JlLCB2aXNpdCBodHRwOi8vd3d3LnNwcm91dGNvcmUuY29tDQoNCg0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCkBsaWNlbnNlICovDQoNCi8vIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHRha2VuIGZyb20gU3Byb3V0Q29yZSB3aXRoIGEgZmV3IGNoYW5nZXMuDQoNCmRlZmluZSgnYWNlL2xpYi9rZXlzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vb29wIik7DQoNCi8qKg0KICogSGVscGVyIGZ1bmN0aW9ucyBhbmQgaGFzaGVzIGZvciBrZXkgaGFuZGxpbmcuDQogKi8NCnZhciBLZXlzID0gKGZ1bmN0aW9uKCkgew0KICAgIHZhciByZXQgPSB7DQogICAgICAgIE1PRElGSUVSX0tFWVM6IHsNCiAgICAgICAgICAgIDE2OiAnU2hpZnQnLCAxNzogJ0N0cmwnLCAxODogJ0FsdCcsIDIyNDogJ01ldGEnDQogICAgICAgIH0sDQoNCiAgICAgICAgS0VZX01PRFM6IHsNCiAgICAgICAgICAgICJjdHJsIjogMSwgImFsdCI6IDIsICJvcHRpb24iIDogMiwNCiAgICAgICAgICAgICJzaGlmdCI6IDQsICJtZXRhIjogOCwgImNvbW1hbmQiOiA4DQogICAgICAgIH0sDQoNCiAgICAgICAgRlVOQ1RJT05fS0VZUyA6IHsNCiAgICAgICAgICAgIDggIDogIkJhY2tzcGFjZSIsDQogICAgICAgICAgICA5ICA6ICJUYWIiLA0KICAgICAgICAgICAgMTMgOiAiUmV0dXJuIiwNCiAgICAgICAgICAgIDE5IDogIlBhdXNlIiwNCiAgICAgICAgICAgIDI3IDogIkVzYyIsDQogICAgICAgICAgICAzMiA6ICJTcGFjZSIsDQogICAgICAgICAgICAzMyA6ICJQYWdlVXAiLA0KICAgICAgICAgICAgMzQgOiAiUGFnZURvd24iLA0KICAgICAgICAgICAgMzUgOiAiRW5kIiwNCiAgICAgICAgICAgIDM2IDogIkhvbWUiLA0KICAgICAgICAgICAgMzcgOiAiTGVmdCIsDQogICAgICAgICAgICAzOCA6ICJVcCIsDQogICAgICAgICAgICAzOSA6ICJSaWdodCIsDQogICAgICAgICAgICA0MCA6ICJEb3duIiwNCiAgICAgICAgICAgIDQ0IDogIlByaW50IiwNCiAgICAgICAgICAgIDQ1IDogIkluc2VydCIsDQogICAgICAgICAgICA0NiA6ICJEZWxldGUiLA0KICAgICAgICAgICAgOTYgOiAiTnVtcGFkMCIsDQogICAgICAgICAgICA5NyA6ICJOdW1wYWQxIiwNCiAgICAgICAgICAgIDk4IDogIk51bXBhZDIiLA0KICAgICAgICAgICAgOTkgOiAiTnVtcGFkMyIsDQogICAgICAgICAgICAxMDA6ICJOdW1wYWQ0IiwNCiAgICAgICAgICAgIDEwMTogIk51bXBhZDUiLA0KICAgICAgICAgICAgMTAyOiAiTnVtcGFkNiIsDQogICAgICAgICAgICAxMDM6ICJOdW1wYWQ3IiwNCiAgICAgICAgICAgIDEwNDogIk51bXBhZDgiLA0KICAgICAgICAgICAgMTA1OiAiTnVtcGFkOSIsDQogICAgICAgICAgICAxMTI6ICJGMSIsDQogICAgICAgICAgICAxMTM6ICJGMiIsDQogICAgICAgICAgICAxMTQ6ICJGMyIsDQogICAgICAgICAgICAxMTU6ICJGNCIsDQogICAgICAgICAgICAxMTY6ICJGNSIsDQogICAgICAgICAgICAxMTc6ICJGNiIsDQogICAgICAgICAgICAxMTg6ICJGNyIsDQogICAgICAgICAgICAxMTk6ICJGOCIsDQogICAgICAgICAgICAxMjA6ICJGOSIsDQogICAgICAgICAgICAxMjE6ICJGMTAiLA0KICAgICAgICAgICAgMTIyOiAiRjExIiwNCiAgICAgICAgICAgIDEyMzogIkYxMiIsDQogICAgICAgICAgICAxNDQ6ICJOdW1sb2NrIiwNCiAgICAgICAgICAgIDE0NTogIlNjcm9sbGxvY2siDQogICAgICAgIH0sDQoNCiAgICAgICAgUFJJTlRBQkxFX0tFWVM6IHsNCiAgICAgICAgICAgMzI6ICcgJywgIDQ4OiAnMCcsICA0OTogJzEnLCAgNTA6ICcyJywgIDUxOiAnMycsICA1MjogJzQnLCA1MzogICc1JywNCiAgICAgICAgICAgNTQ6ICc2JywgIDU1OiAnNycsICA1NjogJzgnLCAgNTc6ICc5JywgIDU5OiAnOycsICA2MTogJz0nLCA2NTogICdhJywNCiAgICAgICAgICAgNjY6ICdiJywgIDY3OiAnYycsICA2ODogJ2QnLCAgNjk6ICdlJywgIDcwOiAnZicsICA3MTogJ2cnLCA3MjogICdoJywNCiAgICAgICAgICAgNzM6ICdpJywgIDc0OiAnaicsICA3NTogJ2snLCAgNzY6ICdsJywgIDc3OiAnbScsICA3ODogJ24nLCA3OTogICdvJywNCiAgICAgICAgICAgODA6ICdwJywgIDgxOiAncScsICA4MjogJ3InLCAgODM6ICdzJywgIDg0OiAndCcsICA4NTogJ3UnLCA4NjogICd2JywNCiAgICAgICAgICAgODc6ICd3JywgIDg4OiAneCcsICA4OTogJ3knLCAgOTA6ICd6JywgMTA3OiAnKycsIDEwOTogJy0nLCAxMTA6ICcuJywNCiAgICAgICAgICAxODg6ICcsJywgMTkwOiAnLicsIDE5MTogJy8nLCAxOTI6ICdgJywgMjE5OiAnWycsIDIyMDogJ1xcJywNCiAgICAgICAgICAyMjE6ICddJywgMjIyOiAnXCInDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gQSByZXZlcnNlIG1hcCBvZiBGVU5DVElPTl9LRVlTDQogICAgZm9yICh2YXIgaSBpbiByZXQuRlVOQ1RJT05fS0VZUykgew0KICAgICAgICB2YXIgbmFtZSA9IHJldC5GVU5DVElPTl9LRVlTW2ldLnRvVXBwZXJDYXNlKCk7DQogICAgICAgIHJldFtuYW1lXSA9IHBhcnNlSW50KGksIDEwKTsNCiAgICB9DQoNCiAgICAvLyBBZGQgdGhlIE1PRElGSUVSX0tFWVMsIEZVTkNUSU9OX0tFWVMgYW5kIFBSSU5UQUJMRV9LRVlTIHRvIHRoZSBLRVkNCiAgICAvLyB2YXJpYWJsZXMgYXMgd2VsbC4NCiAgICBvb3AubWl4aW4ocmV0LCByZXQuTU9ESUZJRVJfS0VZUyk7DQogICAgb29wLm1peGluKHJldCwgcmV0LlBSSU5UQUJMRV9LRVlTKTsNCiAgICBvb3AubWl4aW4ocmV0LCByZXQuRlVOQ1RJT05fS0VZUyk7DQoNCiAgICByZXR1cm4gcmV0Ow0KfSkoKTsNCm9vcC5taXhpbihleHBvcnRzLCBLZXlzKTsNCg0KZXhwb3J0cy5rZXlDb2RlVG9TdHJpbmcgPSBmdW5jdGlvbihrZXlDb2RlKSB7DQogICAgcmV0dXJuIChLZXlzW2tleUNvZGVdIHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Q29kZSkpLnRvTG93ZXJDYXNlKCk7DQp9DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xpYi91c2VyYWdlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb3MgPSAobmF2aWdhdG9yLnBsYXRmb3JtLm1hdGNoKC9tYWN8d2lufGxpbnV4L2kpIHx8IFsib3RoZXIiXSlbMF0udG9Mb3dlckNhc2UoKTsNCnZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7DQoNCi8qKiBJcyB0aGUgdXNlciB1c2luZyBhIGJyb3dzZXIgdGhhdCBpZGVudGlmaWVzIGl0c2VsZiBhcyBXaW5kb3dzICovDQpleHBvcnRzLmlzV2luID0gKG9zID09ICJ3aW4iKTsNCg0KLyoqIElzIHRoZSB1c2VyIHVzaW5nIGEgYnJvd3NlciB0aGF0IGlkZW50aWZpZXMgaXRzZWxmIGFzIE1hYyBPUyAqLw0KZXhwb3J0cy5pc01hYyA9IChvcyA9PSAibWFjIik7DQoNCi8qKiBJcyB0aGUgdXNlciB1c2luZyBhIGJyb3dzZXIgdGhhdCBpZGVudGlmaWVzIGl0c2VsZiBhcyBMaW51eCAqLw0KZXhwb3J0cy5pc0xpbnV4ID0gKG9zID09ICJsaW51eCIpOw0KDQpleHBvcnRzLmlzSUUgPSANCiAgICBuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIg0KICAgICYmIHBhcnNlRmxvYXQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoWzAtOV0rW1wuMC05XSspLylbMV0pOw0KICAgIA0KZXhwb3J0cy5pc09sZElFID0gZXhwb3J0cy5pc0lFICYmIGV4cG9ydHMuaXNJRSA8IDk7DQoNCi8qKiBJcyB0aGlzIEZpcmVmb3ggb3IgcmVsYXRlZD8gKi8NCmV4cG9ydHMuaXNHZWNrbyA9IGV4cG9ydHMuaXNNb3ppbGxhID0gd2luZG93LmNvbnRyb2xsZXJzICYmIHdpbmRvdy5uYXZpZ2F0b3IucHJvZHVjdCA9PT0gIkdlY2tvIjsNCg0KLyoqIG9sZEdlY2tvID09IHJldiA8IDIuMCAqKi8NCmV4cG9ydHMuaXNPbGRHZWNrbyA9IGV4cG9ydHMuaXNHZWNrbyAmJiBwYXJzZUludCgobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvcnZcOihcZCspLyl8fFtdKVsxXSwgMTApIDwgNDsNCg0KLyoqIElzIHRoaXMgT3BlcmEgKi8NCmV4cG9ydHMuaXNPcGVyYSA9IHdpbmRvdy5vcGVyYSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93Lm9wZXJhKSA9PSAiW29iamVjdCBPcGVyYV0iOw0KDQovKiogSXMgdGhlIHVzZXIgdXNpbmcgYSBicm93c2VyIHRoYXQgaWRlbnRpZmllcyBpdHNlbGYgYXMgV2ViS2l0ICovDQpleHBvcnRzLmlzV2ViS2l0ID0gcGFyc2VGbG9hdCh1YS5zcGxpdCgiV2ViS2l0LyIpWzFdKSB8fCB1bmRlZmluZWQ7DQoNCmV4cG9ydHMuaXNDaHJvbWUgPSBwYXJzZUZsb2F0KHVhLnNwbGl0KCIgQ2hyb21lLyIpWzFdKSB8fCB1bmRlZmluZWQ7DQoNCmV4cG9ydHMuaXNBSVIgPSB1YS5pbmRleE9mKCJBZG9iZUFJUiIpID49IDA7DQoNCmV4cG9ydHMuaXNJUGFkID0gdWEuaW5kZXhPZigiaVBhZCIpID49IDA7DQoNCmV4cG9ydHMuaXNUb3VjaFBhZCA9IHVhLmluZGV4T2YoIlRvdWNoUGFkIikgPj0gMDsNCg0KLyoqDQogKiBJIGhhdGUgZG9pbmcgdGhpcywgYnV0IHdlIG5lZWQgc29tZSB3YXkgdG8gZGV0ZXJtaW5lIGlmIHRoZSB1c2VyIGlzIG9uIGEgTWFjDQogKiBUaGUgcmVhc29uIGlzIHRoYXQgdXNlcnMgaGF2ZSBkaWZmZXJlbnQgZXhwZWN0YXRpb25zIG9mIHRoZWlyIGtleSBjb21iaW5hdGlvbnMuDQogKg0KICogVGFrZSBjb3B5IGFzIGFuIGV4YW1wbGUsIE1hYyBwZW9wbGUgZXhwZWN0IHRvIHVzZSBDTUQgb3IgQVBQTEUgKyBDDQogKiBXaW5kb3dzIGZvbGtzIGV4cGVjdCB0byB1c2UgQ1RSTCArIEMNCiAqLw0KZXhwb3J0cy5PUyA9IHsNCiAgICBMSU5VWDogIkxJTlVYIiwNCiAgICBNQUM6ICJNQUMiLA0KICAgIFdJTkRPV1M6ICJXSU5ET1dTIg0KfTsNCg0KLyoqDQogKiBSZXR1cm4gYW4gZXhwb3J0cy5PUyBjb25zdGFudA0KICovDQpleHBvcnRzLmdldE9TID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKGV4cG9ydHMuaXNNYWMpIHsNCiAgICAgICAgcmV0dXJuIGV4cG9ydHMuT1MuTUFDOw0KICAgIH0gZWxzZSBpZiAoZXhwb3J0cy5pc0xpbnV4KSB7DQogICAgICAgIHJldHVybiBleHBvcnRzLk9TLkxJTlVYOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBleHBvcnRzLk9TLldJTkRPV1M7DQogICAgfQ0KfTsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9lZGl0b3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZml4b2xkYnJvd3NlcnMnLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvdXNlcmFnZW50JywgJ2FjZS9rZXlib2FyZC90ZXh0aW5wdXQnLCAnYWNlL21vdXNlL21vdXNlX2hhbmRsZXInLCAnYWNlL21vdXNlL2ZvbGRfaGFuZGxlcicsICdhY2Uva2V5Ym9hcmQva2V5YmluZGluZycsICdhY2UvZWRpdF9zZXNzaW9uJywgJ2FjZS9zZWFyY2gnLCAnYWNlL3JhbmdlJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyJywgJ2FjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpyZXF1aXJlKCIuL2xpYi9maXhvbGRicm93c2VycyIpOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4vbGliL2xhbmciKTsNCnZhciB1c2VyYWdlbnQgPSByZXF1aXJlKCIuL2xpYi91c2VyYWdlbnQiKTsNCnZhciBUZXh0SW5wdXQgPSByZXF1aXJlKCIuL2tleWJvYXJkL3RleHRpbnB1dCIpLlRleHRJbnB1dDsNCnZhciBNb3VzZUhhbmRsZXIgPSByZXF1aXJlKCIuL21vdXNlL21vdXNlX2hhbmRsZXIiKS5Nb3VzZUhhbmRsZXI7DQp2YXIgRm9sZEhhbmRsZXIgPSByZXF1aXJlKCIuL21vdXNlL2ZvbGRfaGFuZGxlciIpLkZvbGRIYW5kbGVyOw0KLy92YXIgVG91Y2hIYW5kbGVyID0gcmVxdWlyZSgiLi90b3VjaF9oYW5kbGVyIikuVG91Y2hIYW5kbGVyOw0KdmFyIEtleUJpbmRpbmcgPSByZXF1aXJlKCIuL2tleWJvYXJkL2tleWJpbmRpbmciKS5LZXlCaW5kaW5nOw0KdmFyIEVkaXRTZXNzaW9uID0gcmVxdWlyZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbjsNCnZhciBTZWFyY2ggPSByZXF1aXJlKCIuL3NlYXJjaCIpLlNlYXJjaDsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KdmFyIENvbW1hbmRNYW5hZ2VyID0gcmVxdWlyZSgiLi9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiKS5Db21tYW5kTWFuYWdlcjsNCnZhciBkZWZhdWx0Q29tbWFuZHMgPSByZXF1aXJlKCIuL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKS5jb21tYW5kczsNCg0KdmFyIEVkaXRvciA9IGZ1bmN0aW9uKHJlbmRlcmVyLCBzZXNzaW9uKSB7DQogICAgdmFyIGNvbnRhaW5lciA9IHJlbmRlcmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTsNCiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsNCiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7DQogICAgDQogICAgdGhpcy50ZXh0SW5wdXQgID0gbmV3IFRleHRJbnB1dChyZW5kZXJlci5nZXRUZXh0QXJlYUNvbnRhaW5lcigpLCB0aGlzKTsNCiAgICB0aGlzLmtleUJpbmRpbmcgPSBuZXcgS2V5QmluZGluZyh0aGlzKTsNCg0KICAgIC8vIFRPRE8gZGV0ZWN0IHRvdWNoIGV2ZW50IHN1cHBvcnQNCiAgICBpZiAodXNlcmFnZW50LmlzSVBhZCkgew0KICAgICAgICAvL3RoaXMuJG1vdXNlSGFuZGxlciA9IG5ldyBUb3VjaEhhbmRsZXIodGhpcyk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy4kbW91c2VIYW5kbGVyID0gbmV3IE1vdXNlSGFuZGxlcih0aGlzKTsNCiAgICAgICAgbmV3IEZvbGRIYW5kbGVyKHRoaXMpOw0KICAgIH0NCg0KICAgIHRoaXMuJGJsb2NrU2Nyb2xsaW5nID0gMDsNCiAgICB0aGlzLiRzZWFyY2ggPSBuZXcgU2VhcmNoKCkuc2V0KHsNCiAgICAgICAgd3JhcDogdHJ1ZQ0KICAgIH0pOw0KDQogICAgdGhpcy5jb21tYW5kcyA9IG5ldyBDb21tYW5kTWFuYWdlcih1c2VyYWdlbnQuaXNNYWMgPyAibWFjIiA6ICJ3aW4iLCBkZWZhdWx0Q29tbWFuZHMpOw0KICAgIHRoaXMuc2V0U2Vzc2lvbihzZXNzaW9uIHx8IG5ldyBFZGl0U2Vzc2lvbigiIikpOw0KfTsNCg0KKGZ1bmN0aW9uKCl7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQoNCiAgICB0aGlzLnNldEtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKGtleWJvYXJkSGFuZGxlcikgew0KICAgICAgICB0aGlzLmtleUJpbmRpbmcuc2V0S2V5Ym9hcmRIYW5kbGVyKGtleWJvYXJkSGFuZGxlcik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmtleUJpbmRpbmcuZ2V0S2V5Ym9hcmRIYW5kbGVyKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbiA9PSBzZXNzaW9uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIGlmICh0aGlzLnNlc3Npb24pIHsNCiAgICAgICAgICAgIHZhciBvbGRTZXNzaW9uID0gdGhpcy5zZXNzaW9uOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2UpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZU1vZGUiLCB0aGlzLiRvbkNoYW5nZU1vZGUpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRva2VuaXplclVwZGF0ZSIsIHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VUYWJTaXplIiwgdGhpcy4kb25DaGFuZ2VUYWJTaXplKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTGltaXQiLCB0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcE1vZGUiLCB0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJvbkNoYW5nZUZvbGQiLCB0aGlzLiRvbkNoYW5nZUZvbGQpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUZyb250TWFya2VyIiwgdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlcik7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQmFja01hcmtlciIsIHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcik7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQnJlYWtwb2ludCIsIHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQW5ub3RhdGlvbiIsIHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbik7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlT3ZlcndyaXRlIiwgdGhpcy4kb25DdXJzb3JDaGFuZ2UpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVNjcm9sbFRvcCIsIHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKTsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VMZWZ0VG9wIiwgdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKTsNCg0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTsNCiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLCB0aGlzLiRvbkN1cnNvckNoYW5nZSk7DQogICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2VsZWN0aW9uIiwgdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsNCg0KICAgICAgICB0aGlzLiRvbkRvY3VtZW50Q2hhbmdlID0gdGhpcy5vbkRvY3VtZW50Q2hhbmdlLmJpbmQodGhpcyk7DQogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy4kb25Eb2N1bWVudENoYW5nZSk7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2Vzc2lvbihzZXNzaW9uKTsNCg0KICAgICAgICB0aGlzLiRvbkNoYW5nZU1vZGUgPSB0aGlzLm9uQ2hhbmdlTW9kZS5iaW5kKHRoaXMpOw0KICAgICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZU1vZGUiLCB0aGlzLiRvbkNoYW5nZU1vZGUpOw0KDQogICAgICAgIHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlID0gdGhpcy5vblRva2VuaXplclVwZGF0ZS5iaW5kKHRoaXMpOw0KICAgICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoInRva2VuaXplclVwZGF0ZSIsIHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKTsNCg0KICAgICAgICB0aGlzLiRvbkNoYW5nZVRhYlNpemUgPSB0aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQuYmluZCh0aGlzLnJlbmRlcmVyKTsNCiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VUYWJTaXplIiwgdGhpcy4kb25DaGFuZ2VUYWJTaXplKTsNCg0KICAgICAgICB0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCA9IHRoaXMub25DaGFuZ2VXcmFwTGltaXQuYmluZCh0aGlzKTsNCiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTGltaXQiLCB0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCk7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSA9IHRoaXMub25DaGFuZ2VXcmFwTW9kZS5iaW5kKHRoaXMpOw0KICAgICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBNb2RlIiwgdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSk7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VGb2xkID0gdGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKTsNCiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VGb2xkIiwgdGhpcy4kb25DaGFuZ2VGb2xkKTsNCg0KICAgICAgICB0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyID0gdGhpcy5vbkNoYW5nZUZyb250TWFya2VyLmJpbmQodGhpcyk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VGcm9udE1hcmtlciIsIHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpOw0KDQogICAgICAgIHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlciA9IHRoaXMub25DaGFuZ2VCYWNrTWFya2VyLmJpbmQodGhpcyk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VCYWNrTWFya2VyIiwgdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKTsNCg0KICAgICAgICB0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQgPSB0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludC5iaW5kKHRoaXMpOw0KICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQnJlYWtwb2ludCIsIHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCk7DQoNCiAgICAgICAgdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uID0gdGhpcy5vbkNoYW5nZUFubm90YXRpb24uYmluZCh0aGlzKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUFubm90YXRpb24iLCB0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pOw0KDQogICAgICAgIHRoaXMuJG9uQ3Vyc29yQ2hhbmdlID0gdGhpcy5vbkN1cnNvckNoYW5nZS5iaW5kKHRoaXMpOw0KICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlT3ZlcndyaXRlIiwgdGhpcy4kb25DdXJzb3JDaGFuZ2UpOw0KDQogICAgICAgIHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlID0gdGhpcy5vblNjcm9sbFRvcENoYW5nZS5iaW5kKHRoaXMpOw0KICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsVG9wIiwgdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UpOw0KDQogICAgICAgIHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSA9IHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlLmJpbmQodGhpcyk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTY3JvbGxMZWZ0IiwgdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKTsNCg0KICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUN1cnNvciIsIHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKTsNCg0KICAgICAgICB0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2VsZWN0aW9uIiwgdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UpOw0KDQogICAgICAgIHRoaXMub25DaGFuZ2VNb2RlKCk7DQoNCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsNCiAgICAgICAgdGhpcy5vbkN1cnNvckNoYW5nZSgpOw0KICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyAtPSAxOw0KDQogICAgICAgIHRoaXMub25TY3JvbGxUb3BDaGFuZ2UoKTsNCiAgICAgICAgdGhpcy5vblNjcm9sbExlZnRDaGFuZ2UoKTsNCiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpOw0KICAgICAgICB0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIoKTsNCiAgICAgICAgdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIoKTsNCiAgICAgICAgdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQoKTsNCiAgICAgICAgdGhpcy5vbkNoYW5nZUFubm90YXRpb24oKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkgJiYgdGhpcy5yZW5kZXJlci5hZGp1c3RXcmFwTGltaXQoKTsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7DQoNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlU2Vzc2lvbiIsIHsNCiAgICAgICAgICAgIHNlc3Npb246IHNlc3Npb24sDQogICAgICAgICAgICBvbGRTZXNzaW9uOiBvbGRTZXNzaW9uDQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNlc3Npb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uOw0KICAgIH07DQoNCiAgICB0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLm9uUmVzaXplKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0VGhlbWUgPSBmdW5jdGlvbih0aGVtZSkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFRoZW1lKHRoZW1lKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUaGVtZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRUaGVtZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFN0eWxlID0gZnVuY3Rpb24oc3R5bGUpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzdHlsZSk7DQogICAgfTsNCg0KICAgIHRoaXMudW5zZXRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIudW5zZXRTdHlsZShzdHlsZSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0Rm9udFNpemUgPSBmdW5jdGlvbihzaXplKSB7DQogICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmZvbnRTaXplID0gc2l6ZTsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGb250U2l6ZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLiRoaWdobGlnaHRCcmFja2V0cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCk7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQgPSBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuJGhpZ2hsaWdodFBlbmRpbmcpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHBlcmZvcm0gaGlnaGxpZ2h0IGFzeW5jIHRvIG5vdCBibG9jayB0aGUgYnJvd3NlciBkdXJpbmcgbmF2aWdhdGlvbg0KICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQogICAgICAgIHRoaXMuJGhpZ2hsaWdodFBlbmRpbmcgPSB0cnVlOw0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgc2VsZi4kaGlnaGxpZ2h0UGVuZGluZyA9IGZhbHNlOw0KDQogICAgICAgICAgICB2YXIgcG9zID0gc2VsZi5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoc2VsZi5nZXRDdXJzb3JQb3NpdGlvbigpKTsNCiAgICAgICAgICAgIGlmIChwb3MpIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2UocG9zLnJvdywgcG9zLmNvbHVtbiwgcG9zLnJvdywgcG9zLmNvbHVtbisxKTsNCiAgICAgICAgICAgICAgICBzZWxmLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQgPSBzZWxmLnNlc3Npb24uYWRkTWFya2VyKHJhbmdlLCAiYWNlX2JyYWNrZXQiLCAidGV4dCIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LCAxMCk7DQogICAgfTsNCg0KICAgIHRoaXMuZm9jdXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gU2FmYXJpIG5lZWRzIHRoZSB0aW1lb3V0DQogICAgICAgIC8vIGlPUyBhbmQgRmlyZWZveCBuZWVkIGl0IGNhbGxlZCBpbW1lZGlhdGVseQ0KICAgICAgICAvLyB0byBiZSBvbiB0aGUgc2F2ZSBzaWRlIHdlIGRvIGJvdGgNCiAgICAgICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIF9zZWxmLnRleHRJbnB1dC5mb2N1cygpOw0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy50ZXh0SW5wdXQuZm9jdXMoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc0ZvY3VzZWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudGV4dElucHV0LmlzRm9jdXNlZCgpOw0KICAgIH07DQoNCiAgICB0aGlzLmJsdXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy50ZXh0SW5wdXQuYmx1cigpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uRm9jdXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zaG93Q3Vyc29yKCk7DQogICAgICAgIHRoaXMucmVuZGVyZXIudmlzdWFsaXplRm9jdXMoKTsNCiAgICAgICAgdGhpcy5fZW1pdCgiZm9jdXMiKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkJsdXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQ3Vyc29yKCk7DQogICAgICAgIHRoaXMucmVuZGVyZXIudmlzdWFsaXplQmx1cigpOw0KICAgICAgICB0aGlzLl9lbWl0KCJibHVyIik7DQogICAgfTsNCg0KICAgIHRoaXMub25Eb2N1bWVudENoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB2YXIgcmFuZ2UgPSBkZWx0YS5yYW5nZTsNCiAgICAgICAgdmFyIGxhc3RSb3c7DQoNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93ICYmIGRlbHRhLmFjdGlvbiAhPSAiaW5zZXJ0TGluZXMiICYmIGRlbHRhLmFjdGlvbiAhPSAicmVtb3ZlTGluZXMiKQ0KICAgICAgICAgICAgbGFzdFJvdyA9IHJhbmdlLmVuZC5yb3c7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGxhc3RSb3cgPSBJbmZpbml0eTsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhyYW5nZS5zdGFydC5yb3csIGxhc3RSb3cpOw0KDQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIGUpOw0KDQogICAgICAgIC8vIHVwZGF0ZSBjdXJzb3IgYmVjYXVzZSB0YWIgY2hhcmFjdGVycyBjYW4gaW5mbHVlbmNlIHRoZSBjdXJzb3IgcG9zaXRpb24NCiAgICAgICAgdGhpcy5vbkN1cnNvckNoYW5nZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uVG9rZW5pemVyVXBkYXRlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgcm93cyA9IGUuZGF0YTsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhyb3dzLmZpcnN0LCByb3dzLmxhc3QpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9ZKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSk7DQogICAgfTsNCg0KICAgIHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9YKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ3Vyc29yQ2hhbmdlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7DQoNCiAgICAgICAgaWYgKCF0aGlzLiRibG9ja1Njcm9sbGluZykgew0KICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gbW92ZSB0ZXh0IGlucHV0IG92ZXIgdGhlIGN1cnNvcg0KICAgICAgICAvLyB0aGlzIGlzIHJlcXVpcmVkIGZvciBpT1MgYW5kIElNRQ0KICAgICAgICB0aGlzLnJlbmRlcmVyLm1vdmVUZXh0QXJlYVRvQ3Vyc29yKHRoaXMudGV4dElucHV0LmdldEVsZW1lbnQoKSk7DQoNCiAgICAgICAgdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHMoKTsNCiAgICAgICAgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5nZXRTZXNzaW9uKCk7DQoNCiAgICAgICAgaWYgKHNlc3Npb24uJGhpZ2hsaWdodExpbmVNYXJrZXIpIHsNCiAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlTWFya2VyKHNlc3Npb24uJGhpZ2hsaWdodExpbmVNYXJrZXIpOw0KICAgICAgICB9DQogICAgICAgIHNlc3Npb24uJGhpZ2hsaWdodExpbmVNYXJrZXIgPSBudWxsOw0KDQogICAgICAgIGlmICh0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmUoKSAmJiAodGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpICE9ICJsaW5lIiB8fCAhdGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSkpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKCksDQogICAgICAgICAgICAgICAgZm9sZExpbmUgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmFuZ2U7DQogICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShmb2xkTGluZS5zdGFydC5yb3csIDAsIGZvbGRMaW5lLmVuZC5yb3cgKyAxLCAwKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoY3Vyc29yLnJvdywgMCwgY3Vyc29yLnJvdysxLCAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uJGhpZ2hsaWdodExpbmVNYXJrZXIgPSBzZXNzaW9uLmFkZE1hcmtlcihyYW5nZSwgImFjZV9hY3RpdmVfbGluZSIsICJiYWNrZ3JvdW5kIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLmdldFNlc3Npb24oKTsNCg0KICAgICAgICBpZiAoc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VyKSB7DQogICAgICAgICAgICBzZXNzaW9uLnJlbW92ZU1hcmtlcihzZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXIpOw0KICAgICAgICB9DQogICAgICAgIHNlc3Npb24uJHNlbGVjdGlvbk1hcmtlciA9IG51bGw7DQoNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7DQogICAgICAgICAgICBzZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXIgPSBzZXNzaW9uLmFkZE1hcmtlcihyYW5nZSwgImFjZV9zZWxlY3Rpb24iLCBzdHlsZSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkKQ0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmdldE1vZGUoKS5oaWdobGlnaHRTZWxlY3Rpb24odGhpcyk7DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2VGcm9udE1hcmtlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUZyb250TWFya2VycygpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlQmFja01hcmtlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCk7DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2VCcmVha3BvaW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QnJlYWtwb2ludHModGhpcy5zZXNzaW9uLmdldEJyZWFrcG9pbnRzKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEFubm90YXRpb25zKHRoaXMuc2Vzc2lvbi5nZXRBbm5vdGF0aW9ucygpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNoYW5nZU1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVUZXh0KCk7DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2VXcmFwTGltaXQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7DQogICAgfTsNCg0KICAgIHRoaXMub25DaGFuZ2VXcmFwTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLm9uUmVzaXplKHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ2hhbmdlRm9sZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAvLyBVcGRhdGUgdGhlIGFjdGl2ZSBsaW5lIG1hcmtlciBhcyBkdWUgdG8gZm9sZGluZyBjaGFuZ2VzIHRoZSBjdXJyZW50DQogICAgICAgIC8vIGxpbmUgcmFuZ2Ugb24gdGhlIHNjcmVlbiBtaWdodCBoYXZlIGNoYW5nZWQuDQogICAgICAgIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTsNCiAgICAgICAgLy8gVE9ETzogVGhpcyBtaWdodCBiZSB0b28gbXVjaCB1cGRhdGluZy4gT2theSBmb3Igbm93Lg0KICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRDb3B5VGV4dCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgdGV4dCA9ICIiOw0KICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHRleHQgPSB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk7DQoNCiAgICAgICAgdGhpcy5fZW1pdCgiY29weSIsIHRleHQpOw0KICAgICAgICByZXR1cm4gdGV4dDsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkN1dCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy4kcmVhZE9ubHkpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICB0aGlzLl9lbWl0KCJjdXQiLCByYW5nZSk7DQoNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUocmFuZ2UpOw0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjsNCiAgICAgICAgdmFyIG1vZGUgPSBzZXNzaW9uLmdldE1vZGUoKTsNCg0KICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpOw0KDQogICAgICAgIGlmICh0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkpIHsNCiAgICAgICAgICAgIC8vIEdldCBhIHRyYW5zZm9ybSBpZiB0aGUgY3VycmVudCBtb2RlIHdhbnRzIG9uZS4NCiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm0gPSBtb2RlLnRyYW5zZm9ybUFjdGlvbihzZXNzaW9uLmdldFN0YXRlKGN1cnNvci5yb3cpLCAnaW5zZXJ0aW9uJywgdGhpcywgc2Vzc2lvbiwgdGV4dCk7DQogICAgICAgICAgICBpZiAodHJhbnNmb3JtKQ0KICAgICAgICAgICAgICAgIHRleHQgPSB0cmFuc2Zvcm0udGV4dDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIlx0IiwgdGhpcy5zZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCg0KICAgICAgICAvLyByZW1vdmUgc2VsZWN0ZWQgdGV4dA0KICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgY3Vyc29yID0gdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOw0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSkgew0KICAgICAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlLmZyb21Qb2ludHMoY3Vyc29yLCBjdXJzb3IpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiArPSB0ZXh0Lmxlbmd0aDsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUocmFuZ2UpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KDQogICAgICAgIHZhciBzdGFydCA9IGN1cnNvci5jb2x1bW47DQogICAgICAgIHZhciBsaW5lU3RhdGUgPSBzZXNzaW9uLmdldFN0YXRlKGN1cnNvci5yb3cpOw0KICAgICAgICB2YXIgc2hvdWxkT3V0ZGVudCA9IG1vZGUuY2hlY2tPdXRkZW50KGxpbmVTdGF0ZSwgc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpLCB0ZXh0KTsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgIHZhciBsaW5lSW5kZW50ID0gbW9kZS5nZXROZXh0TGluZUluZGVudChsaW5lU3RhdGUsIGxpbmUuc2xpY2UoMCwgY3Vyc29yLmNvbHVtbiksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi5pbnNlcnQoY3Vyc29yLCB0ZXh0KTsNCg0KICAgICAgICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybS5zZWxlY3Rpb24pIHsNCiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0uc2VsZWN0aW9uLmxlbmd0aCA9PSAyKSB7IC8vIFRyYW5zZm9ybSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2x1bW4NCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZSgNCiAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmdlKGN1cnNvci5yb3csIHN0YXJ0ICsgdHJhbnNmb3JtLnNlbGVjdGlvblswXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5yb3csIHN0YXJ0ICsgdHJhbnNmb3JtLnNlbGVjdGlvblsxXSkpOw0KICAgICAgICAgICAgfSBlbHNlIHsgLy8gVHJhbnNmb3JtIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHJvdy4NCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZSgNCiAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmdlKGN1cnNvci5yb3cgKyB0cmFuc2Zvcm0uc2VsZWN0aW9uWzBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnNlbGVjdGlvblsxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5yb3cgKyB0cmFuc2Zvcm0uc2VsZWN0aW9uWzJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnNlbGVjdGlvblszXSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGxpbmVTdGF0ZSA9IHNlc3Npb24uZ2V0U3RhdGUoY3Vyc29yLnJvdyk7DQoNCiAgICAgICAgLy8gVE9ETyBkaXNhYmxlZCBtdWx0aWxpbmUgYXV0byBpbmRlbnQNCiAgICAgICAgLy8gcG9zc2libHkgZG9pbmcgdGhlIGluZGVudCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSB0ZXh0DQogICAgICAgIC8vIGlmIChjdXJzb3Iucm93ICE9PSBlbmQucm93KSB7DQogICAgICAgIGlmIChzZXNzaW9uLmdldERvY3VtZW50KCkuaXNOZXdMaW5lKHRleHQpKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhjdXJzb3Iucm93KzEsIDApOw0KDQogICAgICAgICAgICB2YXIgc2l6ZSA9IHNlc3Npb24uZ2V0VGFiU2l6ZSgpOw0KICAgICAgICAgICAgdmFyIG1pbkluZGVudCA9IE51bWJlci5NQVhfVkFMVUU7DQoNCiAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IGN1cnNvci5yb3cgKyAxOyByb3cgPD0gZW5kLnJvdzsgKytyb3cpIHsNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gMDsNCg0KICAgICAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyArK2kpDQogICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdChpKSA9PSAnXHQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHNpemU7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUuY2hhckF0KGkpID09ICcgJykNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAxOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBpZiAoL1teXHNdLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgICAgICAgICBtaW5JbmRlbnQgPSBNYXRoLm1pbihpbmRlbnQsIG1pbkluZGVudCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IGN1cnNvci5yb3cgKyAxOyByb3cgPD0gZW5kLnJvdzsgKytyb3cpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3V0ZGVudCA9IG1pbkluZGVudDsNCg0KICAgICAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoICYmIG91dGRlbnQgPiAwOyArK2kpDQogICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdChpKSA9PSAnXHQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCAtPSBzaXplOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsaW5lLmNoYXJBdChpKSA9PSAnICcpDQogICAgICAgICAgICAgICAgICAgICAgICBvdXRkZW50IC09IDE7DQogICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmUobmV3IFJhbmdlKHJvdywgMCwgcm93LCBpKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXNzaW9uLmluZGVudFJvd3MoY3Vyc29yLnJvdyArIDEsIGVuZC5yb3csIGxpbmVJbmRlbnQpOw0KICAgICAgICB9DQogICAgICAgIGlmIChzaG91bGRPdXRkZW50KQ0KICAgICAgICAgICAgbW9kZS5hdXRvT3V0ZGVudChsaW5lU3RhdGUsIHNlc3Npb24sIGN1cnNvci5yb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uVGV4dElucHV0ID0gZnVuY3Rpb24odGV4dCwgcGFzdGVkKSB7DQogICAgICAgIGlmIChwYXN0ZWQpDQogICAgICAgICAgICB0aGlzLl9lbWl0KCJwYXN0ZSIsIHRleHQpOw0KDQogICAgICAgIHRoaXMua2V5QmluZGluZy5vblRleHRJbnB1dCh0ZXh0LCBwYXN0ZWQpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ29tbWFuZEtleSA9IGZ1bmN0aW9uKGUsIGhhc2hJZCwga2V5Q29kZSkgew0KICAgICAgICB0aGlzLmtleUJpbmRpbmcub25Db21tYW5kS2V5KGUsIGhhc2hJZCwga2V5Q29kZSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0T3ZlcndyaXRlID0gZnVuY3Rpb24ob3ZlcndyaXRlKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRPdmVyd3JpdGUob3ZlcndyaXRlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRPdmVyd3JpdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy50b2dnbGVPdmVyd3JpdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uLnRvZ2dsZU92ZXJ3cml0ZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNjcm9sbFNwZWVkID0gZnVuY3Rpb24oc3BlZWQpIHsNCiAgICAgICAgdGhpcy4kbW91c2VIYW5kbGVyLnNldFNjcm9sbFNwZWVkKHNwZWVkKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTY3JvbGxTcGVlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbW91c2VIYW5kbGVyLmdldFNjcm9sbFNwZWVkKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0RHJhZ0RlbGF5ID0gZnVuY3Rpb24oZHJhZ0RlbGF5KSB7DQogICAgICAgIHRoaXMuJG1vdXNlSGFuZGxlci5zZXREcmFnRGVsYXkoZHJhZ0RlbGF5KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXREcmFnRGVsYXkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG1vdXNlSGFuZGxlci5nZXREcmFnRGVsYXkoKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kc2VsZWN0aW9uU3R5bGUgPSAibGluZSI7DQogICAgdGhpcy5zZXRTZWxlY3Rpb25TdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKSB7DQogICAgICAgIGlmICh0aGlzLiRzZWxlY3Rpb25TdHlsZSA9PSBzdHlsZSkgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJHNlbGVjdGlvblN0eWxlID0gc3R5bGU7DQogICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uU3R5bGUiLCB7ZGF0YTogc3R5bGV9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTZWxlY3Rpb25TdHlsZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kc2VsZWN0aW9uU3R5bGU7DQogICAgfTsNCg0KICAgIHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUgPSB0cnVlOw0KICAgIHRoaXMuc2V0SGlnaGxpZ2h0QWN0aXZlTGluZSA9IGZ1bmN0aW9uKHNob3VsZEhpZ2hsaWdodCkgew0KICAgICAgICBpZiAodGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZSA9PSBzaG91bGRIaWdobGlnaHQpIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lID0gc2hvdWxkSGlnaGxpZ2h0Ow0KICAgICAgICB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0SGlnaGxpZ2h0QWN0aXZlTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZTsNCiAgICB9Ow0KDQogICAgdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID0gdHJ1ZTsNCiAgICB0aGlzLnNldEhpZ2hsaWdodFNlbGVjdGVkV29yZCA9IGZ1bmN0aW9uKHNob3VsZEhpZ2hsaWdodCkgew0KICAgICAgICBpZiAodGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID09IHNob3VsZEhpZ2hsaWdodCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQgPSBzaG91bGRIaWdobGlnaHQ7DQogICAgICAgIGlmIChzaG91bGRIaWdobGlnaHQpDQogICAgICAgICAgICB0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLmhpZ2hsaWdodFNlbGVjdGlvbih0aGlzKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmdldE1vZGUoKS5jbGVhclNlbGVjdGlvbkhpZ2hsaWdodCh0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZDsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTaG93SW52aXNpYmxlcyA9IGZ1bmN0aW9uKHNob3dJbnZpc2libGVzKSB7DQogICAgICAgIGlmICh0aGlzLmdldFNob3dJbnZpc2libGVzKCkgPT0gc2hvd0ludmlzaWJsZXMpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaG93SW52aXNpYmxlcyhzaG93SW52aXNpYmxlcyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2hvd0ludmlzaWJsZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd0ludmlzaWJsZXMoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTaG93UHJpbnRNYXJnaW4gPSBmdW5jdGlvbihzaG93UHJpbnRNYXJnaW4pIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaG93UHJpbnRNYXJnaW4oc2hvd1ByaW50TWFyZ2luKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTaG93UHJpbnRNYXJnaW4gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd1ByaW50TWFyZ2luKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0UHJpbnRNYXJnaW5Db2x1bW4gPSBmdW5jdGlvbihzaG93UHJpbnRNYXJnaW4pIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcmludE1hcmdpbkNvbHVtbihzaG93UHJpbnRNYXJnaW4pOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFByaW50TWFyZ2luQ29sdW1uKCk7DQogICAgfTsNCg0KICAgIHRoaXMuJHJlYWRPbmx5ID0gZmFsc2U7DQogICAgdGhpcy5zZXRSZWFkT25seSA9IGZ1bmN0aW9uKHJlYWRPbmx5KSB7DQogICAgICAgIHRoaXMuJHJlYWRPbmx5ID0gcmVhZE9ubHk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0UmVhZE9ubHkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHJlYWRPbmx5Ow0KICAgIH07DQoNCiAgICB0aGlzLiRtb2RlQmVoYXZpb3VycyA9IHRydWU7DQogICAgdGhpcy5zZXRCZWhhdmlvdXJzRW5hYmxlZCA9IGZ1bmN0aW9uIChlbmFibGVkKSB7DQogICAgICAgIHRoaXMuJG1vZGVCZWhhdmlvdXJzID0gZW5hYmxlZDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG1vZGVCZWhhdmlvdXJzOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNob3dGb2xkV2lkZ2V0cyA9IGZ1bmN0aW9uKHNob3cpIHsNCiAgICAgICAgdmFyIGd1dHRlciA9IHRoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyOw0KICAgICAgICBpZiAoZ3V0dGVyLmdldFNob3dGb2xkV2lkZ2V0cygpID09IHNob3cpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0ZvbGRXaWRnZXRzKHNob3cpOw0KICAgICAgICB0aGlzLiRzaG93Rm9sZFdpZGdldHMgPSBzaG93Ow0KICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRTaG93Rm9sZFdpZGdldHMoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihkaXIpIHsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7DQogICAgICAgICAgICBpZihkaXIgPT0gImxlZnQiKQ0KICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RSaWdodCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICBpZiAodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpKSB7DQogICAgICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjsNCiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHNlc3Npb24uZ2V0U3RhdGUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciBuZXdfcmFuZ2UgPSBzZXNzaW9uLmdldE1vZGUoKS50cmFuc2Zvcm1BY3Rpb24oc3RhdGUsICdkZWxldGlvbicsIHRoaXMsIHNlc3Npb24sIHJhbmdlKTsNCiAgICAgICAgICAgIGlmIChuZXdfcmFuZ2UpDQogICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXdfcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZVdvcmRSaWdodCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKQ0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZFJpZ2h0KCk7DQoNCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlV29yZExlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRMZWZ0KCk7DQoNCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlVG9MaW5lU3RhcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVTdGFydCgpOw0KDQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZVRvTGluZUVuZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKQ0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZUVuZCgpOw0KDQogICAgICAgIHZhciByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSByYW5nZS5lbmQuY29sdW1uICYmIHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gMDsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5yb3crKzsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUocmFuZ2UpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc3BsaXRMaW5lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk7DQogICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICB0aGlzLmluc2VydCgiXG4iKTsNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihjdXJzb3IpOw0KICAgIH07DQoNCiAgICB0aGlzLnRyYW5zcG9zZUxldHRlcnMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgIHZhciBjb2x1bW4gPSBjdXJzb3IuY29sdW1uOw0KICAgICAgICBpZiAoY29sdW1uID09PSAwKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBsaW5lID0gdGhpcy5zZXNzaW9uLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgIHZhciBzd2FwLCByYW5nZTsNCiAgICAgICAgaWYgKGNvbHVtbiA8IGxpbmUubGVuZ3RoKSB7DQogICAgICAgICAgICBzd2FwID0gbGluZS5jaGFyQXQoY29sdW1uKSArIGxpbmUuY2hhckF0KGNvbHVtbi0xKTsNCiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGN1cnNvci5yb3csIGNvbHVtbi0xLCBjdXJzb3Iucm93LCBjb2x1bW4rMSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBzd2FwID0gbGluZS5jaGFyQXQoY29sdW1uLTEpICsgbGluZS5jaGFyQXQoY29sdW1uLTIpOw0KICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoY3Vyc29yLnJvdywgY29sdW1uLTIsIGN1cnNvci5yb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlcGxhY2UocmFuZ2UsIHN3YXApOw0KICAgIH07DQoNCiAgICB0aGlzLnRvTG93ZXJDYXNlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBvcmlnaW5hbFJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgIHZhciB0ZXh0ID0gdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZXBsYWNlKHJhbmdlLCB0ZXh0LnRvTG93ZXJDYXNlKCkpOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShvcmlnaW5hbFJhbmdlKTsNCiAgICB9Ow0KDQogICAgdGhpcy50b1VwcGVyQ2FzZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgb3JpZ2luYWxSYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICB2YXIgdGV4dCA9IHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICB0aGlzLnNlc3Npb24ucmVwbGFjZShyYW5nZSwgdGV4dC50b1VwcGVyQ2FzZSgpKTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2Uob3JpZ2luYWxSYW5nZSk7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uOw0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7DQoNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8IHJhbmdlLmVuZC5yb3cgfHwgcmFuZ2Uuc3RhcnQuY29sdW1uIDwgcmFuZ2UuZW5kLmNvbHVtbikgew0KICAgICAgICAgICAgdmFyIHJvd3MgPSB0aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTsNCiAgICAgICAgICAgIHNlc3Npb24uaW5kZW50Um93cyhyb3dzLmZpcnN0LCByb3dzLmxhc3QsICJcdCIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIGluZGVudFN0cmluZzsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5nZXRVc2VTb2Z0VGFicygpKSB7DQogICAgICAgICAgICAgICAgdmFyIHNpemUgICAgICAgID0gc2Vzc2lvbi5nZXRUYWJTaXplKCksDQogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uICAgID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gICAgICA9IHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbiksDQogICAgICAgICAgICAgICAgICAgIGNvdW50ICAgICAgID0gKHNpemUgLSBjb2x1bW4gJSBzaXplKTsNCg0KICAgICAgICAgICAgICAgIGluZGVudFN0cmluZyA9IGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgY291bnQpOw0KICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgaW5kZW50U3RyaW5nID0gIlx0IjsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc2VydChpbmRlbnRTdHJpbmcpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuYmxvY2tPdXRkZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5vdXRkZW50Um93cyhzZWxlY3Rpb24uZ2V0UmFuZ2UoKSk7DQogICAgfTsNCg0KICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc2Vzc2lvbi5nZXRTdGF0ZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KTsNCiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTsNCiAgICAgICAgdGhpcy5zZXNzaW9uLmdldE1vZGUoKS50b2dnbGVDb21tZW50TGluZXMoc3RhdGUsIHRoaXMuc2Vzc2lvbiwgcm93cy5maXJzdCwgcm93cy5sYXN0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93cyA9IHRoaXMuJGdldFNlbGVjdGVkUm93cygpOw0KICAgICAgICB2YXIgcmFuZ2U7DQogICAgICAgIGlmIChyb3dzLmZpcnN0ID09PSAwIHx8IHJvd3MubGFzdCsxIDwgdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpKQ0KICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93cy5maXJzdCwgMCwgcm93cy5sYXN0KzEsIDApOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZSgNCiAgICAgICAgICAgICAgICByb3dzLmZpcnN0LTEsIHRoaXMuc2Vzc2lvbi5nZXRMaW5lKHJvd3MuZmlyc3QtMSkubGVuZ3RoLA0KICAgICAgICAgICAgICAgIHJvd3MubGFzdCwgdGhpcy5zZXNzaW9uLmdldExpbmUocm93cy5sYXN0KS5sZW5ndGgNCiAgICAgICAgICAgICk7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUocmFuZ2UpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUxpbmVzRG93biA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlTGluZXMoZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ubW92ZUxpbmVzRG93bihmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVMaW5lc1VwID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5tb3ZlTGluZXNVcChmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVUZXh0ID0gZnVuY3Rpb24ocmFuZ2UsIHRvUG9zaXRpb24pIHsNCiAgICAgICAgaWYgKHRoaXMuJHJlYWRPbmx5KQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5tb3ZlVGV4dChyYW5nZSwgdG9Qb3NpdGlvbik7DQogICAgfTsNCg0KICAgIHRoaXMuY29weUxpbmVzVXAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24uZHVwbGljYXRlTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLmNvcHlMaW5lc0Rvd24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmR1cGxpY2F0ZUxpbmVzKGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICAgICAgfSk7DQogICAgfTsNCg0KDQogICAgdGhpcy4kbW92ZUxpbmVzID0gZnVuY3Rpb24obW92ZXIpIHsNCiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTsNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uOw0KICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciByZXZlcnNlID0gc2VsZWN0aW9uLmlzQmFja3dhcmRzKCk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbGluZXNNb3ZlZCA9IG1vdmVyLmNhbGwodGhpcywgcm93cy5maXJzdCwgcm93cy5sYXN0KTsNCg0KICAgICAgICBpZiAocmFuZ2UpIHsNCiAgICAgICAgICAgIHJhbmdlLnN0YXJ0LnJvdyArPSBsaW5lc01vdmVkOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdyArPSBsaW5lc01vdmVkOw0KICAgICAgICAgICAgc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKHJhbmdlLCByZXZlcnNlKTsNCiAgICAgICAgfSANCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBzZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKHJvd3MubGFzdCtsaW5lc01vdmVkKzEsIDApOw0KICAgICAgICAgICAgc2VsZWN0aW9uLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8ocm93cy5maXJzdCtsaW5lc01vdmVkLCAwKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGdldFNlbGVjdGVkUm93cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuY29sbGFwc2VSb3dzKCk7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGZpcnN0OiByYW5nZS5zdGFydC5yb3csDQogICAgICAgICAgICBsYXN0OiByYW5nZS5lbmQucm93DQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHRoaXMub25Db21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dDb21wb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ29tcG9zaXRpb25VcGRhdGUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q29tcG9zaXRpb25UZXh0KHRleHQpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uQ29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQ29tcG9zaXRpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGaXJzdFZpc2libGVSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RWaXNpYmxlUm93KCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGFzdFZpc2libGVSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0TGFzdFZpc2libGVSb3coKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc1Jvd1Zpc2libGUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIChyb3cgPj0gdGhpcy5nZXRGaXJzdFZpc2libGVSb3coKSAmJiByb3cgPD0gdGhpcy5nZXRMYXN0VmlzaWJsZVJvdygpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gKHJvdyA+PSB0aGlzLnJlbmRlcmVyLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93KCkgJiYgcm93IDw9IHRoaXMucmVuZGVyZXIuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdygpKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpIC0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKSArIDE7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldFBhZ2VEb3duUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRQYWdlVXBSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKTsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpOw0KDQogICAgICAgIHJldHVybiBmaXJzdFJvdyAtIChsYXN0Um93IC0gZmlyc3RSb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFBhZ2VEb3duID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3cgPSB0aGlzLiRnZXRQYWdlRG93blJvdygpICsgTWF0aC5mbG9vcih0aGlzLiRnZXRWaXNpYmxlUm93Q291bnQoKSAvIDIpOw0KDQogICAgICAgIHRoaXMuc2Nyb2xsUGFnZURvd24oKTsNCg0KICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTsNCiAgICAgICAgdmFyIGxlYWRTY3JlZW5Qb3MgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHNlbGVjdGlvbi5nZXRTZWxlY3Rpb25MZWFkKCkpOw0KICAgICAgICB2YXIgZGVzdCA9IHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24ocm93LCBsZWFkU2NyZWVuUG9zLmNvbHVtbik7DQogICAgICAgIHNlbGVjdGlvbi5zZWxlY3RUbyhkZXN0LnJvdywgZGVzdC5jb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFBhZ2VVcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgdmlzaWJsZVJvd3MgPSB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpIC0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKTsNCiAgICAgICAgdmFyIHJvdyA9IHRoaXMuJGdldFBhZ2VVcFJvdygpICsgTWF0aC5yb3VuZCh2aXNpYmxlUm93cyAvIDIpOw0KDQogICAgICAgIHRoaXMuc2Nyb2xsUGFnZVVwKCk7DQoNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7DQogICAgICAgIHZhciBsZWFkU2NyZWVuUG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihzZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpKTsNCiAgICAgICAgdmFyIGRlc3QgPSB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHJvdywgbGVhZFNjcmVlblBvcy5jb2x1bW4pOw0KICAgICAgICBzZWxlY3Rpb24uc2VsZWN0VG8oZGVzdC5yb3csIGRlc3QuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nb3RvUGFnZURvd24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvdyA9IHRoaXMuJGdldFBhZ2VEb3duUm93KCk7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuKCkuY29sdW1uOw0KDQogICAgICAgIHRoaXMuc2Nyb2xsVG9Sb3cocm93KTsNCiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb24oKS5tb3ZlQ3Vyc29yVG9TY3JlZW4ocm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLmdvdG9QYWdlVXAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvdyA9IHRoaXMuJGdldFBhZ2VVcFJvdygpOw0KICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbigpLmNvbHVtbjsNCg0KICAgICAgIHRoaXMuc2Nyb2xsVG9Sb3cocm93KTsNCiAgICAgICB0aGlzLmdldFNlbGVjdGlvbigpLm1vdmVDdXJzb3JUb1NjcmVlbihyb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsUGFnZURvd24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zY3JvbGxUb1Jvdyh0aGlzLiRnZXRQYWdlRG93blJvdygpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxQYWdlVXAgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zY3JvbGxUb1Jvdyh0aGlzLiRnZXRQYWdlVXBSb3coKSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsVG9Sb3cgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zY3JvbGxUb1Jvdyhyb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbFRvTGluZSA9IGZ1bmN0aW9uKGxpbmUsIGNlbnRlcikgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcm9sbFRvTGluZShsaW5lLCBjZW50ZXIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNlbnRlclNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgIHZhciBsaW5lID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydC5yb3cgKyAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdykgLyAyKTsNCiAgICAgICAgdGhpcy5yZW5kZXJlci5zY3JvbGxUb0xpbmUobGluZSwgdHJ1ZSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7DQogICAgfTsNCg0KDQogICAgdGhpcy5zZWxlY3RBbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0QWxsKCk7DQogICAgICAgIHRoaXMuJGJsb2NrU2Nyb2xsaW5nIC09IDE7DQogICAgfTsNCg0KICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yVG8gPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8ocm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uID0gZnVuY3Rpb24ocG9zKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7DQogICAgfTsNCg0KICAgIHRoaXMuanVtcFRvTWF0Y2hpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgdmFyIHBvcyA9IHRoaXMuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KGN1cnNvcik7DQogICAgICAgIGlmICghcG9zKSB7DQogICAgICAgICAgICBjdXJzb3IuY29sdW1uICs9IDE7DQogICAgICAgICAgICBwb3MgPSB0aGlzLnNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldChjdXJzb3IpOw0KICAgICAgICB9DQogICAgICAgIGlmICghcG9zKSB7DQogICAgICAgICAgICBjdXJzb3IuY29sdW1uIC09IDI7DQogICAgICAgICAgICBwb3MgPSB0aGlzLnNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldChjdXJzb3IpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAocG9zKSB7DQogICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhwb3Mucm93LCBwb3MuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdGhpcy5nb3RvTGluZSA9IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIGNvbHVtbikgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB0aGlzLnNlc3Npb24udW5mb2xkKHtyb3c6IGxpbmVOdW1iZXIgLSAxLCBjb2x1bW46IGNvbHVtbiB8fCAwfSk7DQoNCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8obGluZU51bWJlci0xLCBjb2x1bW4gfHwgMCk7DQogICAgICAgIHRoaXMuJGJsb2NrU2Nyb2xsaW5nIC09IDE7DQogICAgICAgIGlmICghdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KSkNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9MaW5lKGxpbmVOdW1iZXIsIHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlVG8gPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZVVwID0gZnVuY3Rpb24odGltZXMpIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTsNCiAgICAgICAgdGltZXMgPSB0aW1lcyB8fCAxOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoLXRpbWVzLCAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZURvd24gPSBmdW5jdGlvbih0aW1lcykgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpOw0KICAgICAgICB0aW1lcyA9IHRpbWVzIHx8IDE7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeSh0aW1lcywgMCk7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVMZWZ0ID0gZnVuY3Rpb24odGltZXMpIHsNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25TdGFydCA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5zdGFydDsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oc2VsZWN0aW9uU3RhcnQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGltZXMgPSB0aW1lcyB8fCAxOw0KICAgICAgICAgICAgd2hpbGUgKHRpbWVzLS0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGVmdCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZVJpZ2h0ID0gZnVuY3Rpb24odGltZXMpIHsNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25FbmQgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuZW5kOw0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihzZWxlY3Rpb25FbmQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGltZXMgPSB0aW1lcyB8fCAxOw0KICAgICAgICAgICAgd2hpbGUgKHRpbWVzLS0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yUmlnaHQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVMaW5lU3RhcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVTdGFydCgpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgfTsNCg0KICAgIHRoaXMubmF2aWdhdGVMaW5lRW5kID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lRW5kKCk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5uYXZpZ2F0ZUZpbGVFbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVFbmQoKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlRmlsZVN0YXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlU3RhcnQoKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlV29yZFJpZ2h0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkUmlnaHQoKTsNCiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLm5hdmlnYXRlV29yZExlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRMZWZ0KCk7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24ocmVwbGFjZW1lbnQsIG9wdGlvbnMpIHsNCiAgICAgICAgaWYgKG9wdGlvbnMpDQogICAgICAgICAgICB0aGlzLiRzZWFyY2guc2V0KG9wdGlvbnMpOw0KDQogICAgICAgIHZhciByYW5nZSA9IHRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7DQogICAgICAgIGlmICghcmFuZ2UpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kdHJ5UmVwbGFjZShyYW5nZSwgcmVwbGFjZW1lbnQpOw0KICAgICAgICBpZiAocmFuZ2UgIT09IG51bGwpDQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShyYW5nZSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZUFsbCA9IGZ1bmN0aW9uKHJlcGxhY2VtZW50LCBvcHRpb25zKSB7DQogICAgICAgIGlmIChvcHRpb25zKSB7DQogICAgICAgICAgICB0aGlzLiRzZWFyY2guc2V0KG9wdGlvbnMpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlcyA9IHRoaXMuJHNlYXJjaC5maW5kQWxsKHRoaXMuc2Vzc2lvbik7DQogICAgICAgIGlmICghcmFuZ2VzLmxlbmd0aCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbygwLCAwKTsNCg0KICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyArPSAxOw0KICAgICAgICBmb3IgKHZhciBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKQ0KICAgICAgICAgICAgdGhpcy4kdHJ5UmVwbGFjZShyYW5nZXNbaV0sIHJlcGxhY2VtZW50KTsNCg0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyAtPSAxOw0KICAgIH07DQoNCiAgICB0aGlzLiR0cnlSZXBsYWNlID0gZnVuY3Rpb24ocmFuZ2UsIHJlcGxhY2VtZW50KSB7DQogICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICByZXBsYWNlbWVudCA9IHRoaXMuJHNlYXJjaC5yZXBsYWNlKGlucHV0LCByZXBsYWNlbWVudCk7DQogICAgICAgIGlmIChyZXBsYWNlbWVudCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy5zZXNzaW9uLnJlcGxhY2UocmFuZ2UsIHJlcGxhY2VtZW50KTsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGFzdFNlYXJjaE9wdGlvbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHNlYXJjaC5nZXRPcHRpb25zKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZmluZCA9IGZ1bmN0aW9uKG5lZWRsZSwgb3B0aW9ucykgew0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KICAgICAgICBvcHRpb25zLm5lZWRsZSA9IG5lZWRsZTsNCiAgICAgICAgdGhpcy4kc2VhcmNoLnNldChvcHRpb25zKTsNCiAgICAgICAgdGhpcy4kZmluZCgpOw0KICAgIH07DQoNCiAgICB0aGlzLmZpbmROZXh0ID0gZnVuY3Rpb24ob3B0aW9ucykgew0KICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsNCiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhY2t3YXJkcyA9PSAidW5kZWZpbmVkIikNCiAgICAgICAgICAgIG9wdGlvbnMuYmFja3dhcmRzID0gZmFsc2U7DQogICAgICAgIHRoaXMuJHNlYXJjaC5zZXQob3B0aW9ucyk7DQogICAgICAgIHRoaXMuJGZpbmQoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5maW5kUHJldmlvdXMgPSBmdW5jdGlvbihvcHRpb25zKSB7DQogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYmFja3dhcmRzID09ICJ1bmRlZmluZWQiKQ0KICAgICAgICAgICAgb3B0aW9ucy5iYWNrd2FyZHMgPSB0cnVlOw0KICAgICAgICB0aGlzLiRzZWFyY2guc2V0KG9wdGlvbnMpOw0KICAgICAgICB0aGlzLiRmaW5kKCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGZpbmQgPSBmdW5jdGlvbihiYWNrd2FyZHMpIHsNCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpDQogICAgICAgICAgICB0aGlzLiRzZWFyY2guc2V0KHtuZWVkbGU6IHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKX0pOw0KDQogICAgICAgIGlmICh0eXBlb2YgYmFja3dhcmRzICE9ICJ1bmRlZmluZWQiKQ0KICAgICAgICAgICAgdGhpcy4kc2VhcmNoLnNldCh7YmFja3dhcmRzOiBiYWNrd2FyZHN9KTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pOw0KICAgICAgICBpZiAocmFuZ2UpIHsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi51bmZvbGQocmFuZ2UpOw0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOyAvLyB0aGlzIHNjcm9sbHMgc2VsZWN0aW9uIGludG8gdmlldw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMudW5kbyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS51bmRvKCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVkbyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5yZWRvKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnJlbmRlcmVyLmRlc3Ryb3koKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEVkaXRvci5wcm90b3R5cGUpOw0KDQoNCmV4cG9ydHMuRWRpdG9yID0gRWRpdG9yOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2xhbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik7DQp9Ow0KDQpleHBvcnRzLnN0cmluZ1JlcGVhdCA9IGZ1bmN0aW9uIChzdHJpbmcsIGNvdW50KSB7DQogICAgIHJldHVybiBuZXcgQXJyYXkoY291bnQgKyAxKS5qb2luKHN0cmluZyk7DQp9Ow0KDQp2YXIgdHJpbUJlZ2luUmVnZXhwID0gL15cc1xzKi87DQp2YXIgdHJpbUVuZFJlZ2V4cCA9IC9cc1xzKiQvOw0KDQpleHBvcnRzLnN0cmluZ1RyaW1MZWZ0ID0gZnVuY3Rpb24gKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsNCn07DQoNCmV4cG9ydHMuc3RyaW5nVHJpbVJpZ2h0ID0gZnVuY3Rpb24gKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltRW5kUmVnZXhwLCAnJyk7DQp9Ow0KDQpleHBvcnRzLmNvcHlPYmplY3QgPSBmdW5jdGlvbihvYmopIHsNCiAgICB2YXIgY29weSA9IHt9Ow0KICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsNCiAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5jb3B5QXJyYXkgPSBmdW5jdGlvbihhcnJheSl7DQogICAgdmFyIGNvcHkgPSBbXTsNCiAgICBmb3IgKHZhciBpPTAsIGw9YXJyYXkubGVuZ3RoOyBpPGw7IGkrKykgew0KICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQ0KICAgICAgICAgICAgY29weVtpXSA9IHRoaXMuY29weU9iamVjdCggYXJyYXlbaV0gKTsNCiAgICAgICAgZWxzZSANCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsNCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmRlZXBDb3B5ID0gZnVuY3Rpb24gKG9iaikgew0KICAgIGlmICh0eXBlb2Ygb2JqICE9ICJvYmplY3QiKSB7DQogICAgICAgIHJldHVybiBvYmo7DQogICAgfQ0KICAgIA0KICAgIHZhciBjb3B5ID0gb2JqLmNvbnN0cnVjdG9yKCk7DQogICAgZm9yICh2YXIga2V5IGluIG9iaikgew0KICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICBjb3B5W2tleV0gPSB0aGlzLmRlZXBDb3B5KG9ialtrZXldKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24oYXJyKSB7DQogICAgdmFyIG1hcCA9IHt9Ow0KICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgbWFwW2FycltpXV0gPSAxOw0KICAgIH0NCiAgICByZXR1cm4gbWFwOw0KDQp9Ow0KDQovKioNCiAqIHNwbGljZSBvdXQgb2YgJ2FycmF5JyBhbnl0aGluZyB0aGF0ID09PSAndmFsdWUnDQogKi8NCmV4cG9ydHMuYXJyYXlSZW1vdmUgPSBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7DQogICAgICBhcnJheS5zcGxpY2UoaSwgMSk7DQogICAgfQ0KICB9DQp9Ow0KDQpleHBvcnRzLmVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uKHN0cikgew0KICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOw0KfTsNCg0KZXhwb3J0cy5kZWZlcnJlZENhbGwgPSBmdW5jdGlvbihmY24pIHsNCg0KICAgIHZhciB0aW1lciA9IG51bGw7DQogICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRpbWVyID0gbnVsbDsNCiAgICAgICAgZmNuKCk7DQogICAgfTsNCg0KICAgIHZhciBkZWZlcnJlZCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsNCiAgICAgICAgZGVmZXJyZWQuY2FuY2VsKCk7DQogICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCB8fCAwKTsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICBkZWZlcnJlZC5zY2hlZHVsZSA9IGRlZmVycmVkOw0KDQogICAgZGVmZXJyZWQuY2FsbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmNhbmNlbCgpOw0KICAgICAgICBmY24oKTsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICBkZWZlcnJlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsNCiAgICAgICAgdGltZXIgPSBudWxsOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIHJldHVybiBkZWZlcnJlZDsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2tleWJvYXJkL3RleHRpbnB1dCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7DQp2YXIgdXNlcmFnZW50ID0gcmVxdWlyZSgiLi4vbGliL3VzZXJhZ2VudCIpOw0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCg0KdmFyIFRleHRJbnB1dCA9IGZ1bmN0aW9uKHBhcmVudE5vZGUsIGhvc3QpIHsNCg0KICAgIHZhciB0ZXh0ID0gZG9tLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7DQogICAgaWYgKHVzZXJhZ2VudC5pc1RvdWNoUGFkKQ0KICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZSgieC1wYWxtLWRpc2FibGUtYXV0by1jYXAiLCB0cnVlKTsNCiAgICAgICAgDQogICAgdGV4dC5zdHlsZS5sZWZ0ID0gIi0xMDAwMHB4IjsNCiAgICB0ZXh0LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsNCiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0ZXh0LCBwYXJlbnROb2RlLmZpcnN0Q2hpbGQpOw0KDQogICAgdmFyIFBMQUNFSE9MREVSID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTsNCiAgICBzZW5kVGV4dCgpOw0KDQogICAgdmFyIGluQ29tcG9zdGlvbiA9IGZhbHNlOw0KICAgIHZhciBjb3BpZWQgPSBmYWxzZTsNCiAgICB2YXIgcGFzdGVkID0gZmFsc2U7DQogICAgdmFyIHRlbXBTdHlsZSA9ICcnOw0KDQogICAgZnVuY3Rpb24gc2VsZWN0KCkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgdGV4dC5zZWxlY3QoKTsNCiAgICAgICAgfSBjYXRjaCAoZSkge30NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZW5kVGV4dCh2YWx1ZVRvU2VuZCkgew0KICAgICAgICBpZiAoIWNvcGllZCkgew0KICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVUb1NlbmQgfHwgdGV4dC52YWx1ZTsNCiAgICAgICAgICAgIGlmICh2YWx1ZSkgew0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQ29kZUF0KHZhbHVlLmxlbmd0aC0xKSA9PSBQTEFDRUhPTERFUi5jaGFyQ29kZUF0KDApKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLTEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpDQogICAgICAgICAgICAgICAgICAgICAgICBob3N0Lm9uVGV4dElucHV0KHZhbHVlLCBwYXN0ZWQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaG9zdC5vblRleHRJbnB1dCh2YWx1ZSwgcGFzdGVkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBJZiBlZGl0b3IgaXMgbm8gbG9uZ2VyIGZvY3VzZWQgd2UgcXVpdCBpbW1lZGlhdGVseSwgc2luY2UNCiAgICAgICAgICAgICAgICAvLyBpdCBtZWFucyB0aGF0IHNvbWV0aGluZyBlbHNlIGlzIGluIGNoYXJnZSBub3cuDQogICAgICAgICAgICAgICAgaWYgKCFpc0ZvY3VzZWQoKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29waWVkID0gZmFsc2U7DQogICAgICAgIHBhc3RlZCA9IGZhbHNlOw0KDQogICAgICAgIC8vIFNhZmFyaSBkb2Vzbid0IGZpcmUgY29weSBldmVudHMgaWYgbm8gdGV4dCBpcyBzZWxlY3RlZA0KICAgICAgICB0ZXh0LnZhbHVlID0gUExBQ0VIT0xERVI7DQogICAgICAgIHNlbGVjdCgpOw0KICAgIH0NCg0KICAgIHZhciBvblRleHRJbnB1dCA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAoIWluQ29tcG9zdGlvbikNCiAgICAgICAgICAgICAgICBzZW5kVGV4dChlLmRhdGEpOyAgICAgICAgICAgICAgICANCiAgICAgICAgfSwgMCk7DQogICAgfTsNCiAgICANCiAgICB2YXIgb25Qcm9wZXJ0eUNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgaWYgKHVzZXJhZ2VudC5pc09sZElFICYmIHRleHQudmFsdWUuY2hhckNvZGVBdCgwKSA+IDEyOCkgcmV0dXJuOw0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgaWYgKCFpbkNvbXBvc3Rpb24pDQogICAgICAgICAgICAgICAgc2VuZFRleHQoKTsNCiAgICAgICAgfSwgMCk7DQogICAgfTsNCg0KICAgIHZhciBvbkNvbXBvc2l0aW9uU3RhcnQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGluQ29tcG9zdGlvbiA9IHRydWU7DQogICAgICAgIGhvc3Qub25Db21wb3NpdGlvblN0YXJ0KCk7DQogICAgICAgIGlmICghdXNlcmFnZW50LmlzR2Vja28pIHNldFRpbWVvdXQob25Db21wb3NpdGlvblVwZGF0ZSwgMCk7DQogICAgfTsNCg0KICAgIHZhciBvbkNvbXBvc2l0aW9uVXBkYXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICghaW5Db21wb3N0aW9uKSByZXR1cm47DQogICAgICAgIGhvc3Qub25Db21wb3NpdGlvblVwZGF0ZSh0ZXh0LnZhbHVlKTsNCiAgICB9Ow0KDQogICAgdmFyIG9uQ29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGluQ29tcG9zdGlvbiA9IGZhbHNlOw0KICAgICAgICBob3N0Lm9uQ29tcG9zaXRpb25FbmQoKTsNCiAgICB9Ow0KDQogICAgdmFyIG9uQ29weSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgY29waWVkID0gdHJ1ZTsNCiAgICAgICAgdmFyIGNvcHlUZXh0ID0gaG9zdC5nZXRDb3B5VGV4dCgpOw0KICAgICAgICBpZihjb3B5VGV4dCkNCiAgICAgICAgICAgIHRleHQudmFsdWUgPSBjb3B5VGV4dDsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICBzZWxlY3QoKTsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBzZW5kVGV4dCgpOw0KICAgICAgICB9LCAwKTsNCiAgICB9Ow0KICAgIA0KICAgIHZhciBvbkN1dCA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgY29waWVkID0gdHJ1ZTsNCiAgICAgICAgdmFyIGNvcHlUZXh0ID0gaG9zdC5nZXRDb3B5VGV4dCgpOw0KICAgICAgICBpZihjb3B5VGV4dCkgew0KICAgICAgICAgICAgdGV4dC52YWx1ZSA9IGNvcHlUZXh0Ow0KICAgICAgICAgICAgaG9zdC5vbkN1dCgpOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgc2VsZWN0KCk7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc2VuZFRleHQoKTsNCiAgICAgICAgfSwgMCk7DQogICAgfTsNCg0KICAgIGV2ZW50LmFkZENvbW1hbmRLZXlMaXN0ZW5lcih0ZXh0LCBob3N0Lm9uQ29tbWFuZEtleS5iaW5kKGhvc3QpKTsNCiAgICBpZiAodXNlcmFnZW50LmlzT2xkSUUpIHsNCiAgICAgICAgdmFyIGtleXRhYmxlID0geyAxMzoxLCAyNzoxIH07DQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJrZXl1cCIsIGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICBpZiAoaW5Db21wb3N0aW9uICYmICghdGV4dC52YWx1ZSB8fCBrZXl0YWJsZVtlLmtleUNvZGVdKSkNCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG9uQ29tcG9zaXRpb25FbmQsIDApOw0KICAgICAgICAgICAgaWYgKCh0ZXh0LnZhbHVlLmNoYXJDb2RlQXQoMCl8MCkgPCAxMjkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpbkNvbXBvc3Rpb24gPyBvbkNvbXBvc2l0aW9uVXBkYXRlKCkgOiBvbkNvbXBvc2l0aW9uU3RhcnQoKTsNCiAgICAgICAgfSk7DQogICAgfQ0KICAgIA0KICAgIGlmICgib25wcm9wZXJ0eWNoYW5nZSIgaW4gdGV4dCAmJiAhKCJvbmlucHV0IiBpbiB0ZXh0KSkNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgInByb3BlcnR5Y2hhbmdlIiwgb25Qcm9wZXJ0eUNoYW5nZSk7DQogICAgZWxzZQ0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiaW5wdXQiLCBvblRleHRJbnB1dCk7DQogICAgDQogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgInBhc3RlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIG5leHQgaW5wdXQgdGV4dCBjb21lcyBmcm9tIHBhc3QuDQogICAgICAgIHBhc3RlZCA9IHRydWU7DQogICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgc3VwcG9ydCB0aGUgZXZlbnQuY2xpcGJvYXJkRGF0YSBBUEkuIFVzZSB0aGlzIHRvIGdldA0KICAgICAgICAvLyB0aGUgcGFzdGVkIGNvbnRlbnQgd2hpY2ggaW5jcmVhc2VzIHNwZWVkIGlmIHBhc3RpbmcgYSBsb3Qgb2YgbGluZXMuDQogICAgICAgIGlmIChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLmdldERhdGEpIHsNCiAgICAgICAgICAgIHNlbmRUZXh0KGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpOw0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICB9IA0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIC8vIElmIGEgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgYW55IG9mIHRoZSB0aGluZ3MgYWJvdmUsIHVzZSB0aGUgcmVndWxhcg0KICAgICAgICAgICAgLy8gbWV0aG9kIHRvIGRldGVjdCB0aGUgcGFzdGVkIGlucHV0Lg0KICAgICAgICAgICAgb25Qcm9wZXJ0eUNoYW5nZSgpOw0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICBpZiAoIm9uYmVmb3JlY29weSIgaW4gdGV4dCAmJiB0eXBlb2YgY2xpcGJvYXJkRGF0YSAhPT0gInVuZGVmaW5lZCIpIHsNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImJlZm9yZWNvcHkiLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICB2YXIgY29weVRleHQgPSBob3N0LmdldENvcHlUZXh0KCk7DQogICAgICAgICAgICBpZiAoY29weVRleHQpDQogICAgICAgICAgICAgICAgY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJUZXh0IiwgY29weVRleHQpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgfSk7DQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHBhcmVudE5vZGUsICJrZXlkb3duIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgaWYgKGUuY3RybEtleSAmJiBlLmtleUNvZGUgPT0gODgpIHsNCiAgICAgICAgICAgICAgICB2YXIgY29weVRleHQgPSBob3N0LmdldENvcHlUZXh0KCk7DQogICAgICAgICAgICAgICAgaWYgKGNvcHlUZXh0KSB7DQogICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGEuc2V0RGF0YSgiVGV4dCIsIGNvcHlUZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgaG9zdC5vbkN1dCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiY29weSIsIG9uQ29weSk7DQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJjdXQiLCBvbkN1dCk7DQogICAgfQ0KDQogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImNvbXBvc2l0aW9uc3RhcnQiLCBvbkNvbXBvc2l0aW9uU3RhcnQpOw0KICAgIGlmICh1c2VyYWdlbnQuaXNHZWNrbykgew0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAidGV4dCIsIG9uQ29tcG9zaXRpb25VcGRhdGUpOw0KICAgIH0NCiAgICBpZiAodXNlcmFnZW50LmlzV2ViS2l0KSB7DQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJrZXl1cCIsIG9uQ29tcG9zaXRpb25VcGRhdGUpOw0KICAgIH0NCiAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiY29tcG9zaXRpb25lbmQiLCBvbkNvbXBvc2l0aW9uRW5kKTsNCg0KICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJibHVyIiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGhvc3Qub25CbHVyKCk7DQogICAgfSk7DQoNCiAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiZm9jdXMiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgaG9zdC5vbkZvY3VzKCk7DQogICAgICAgIHNlbGVjdCgpOw0KICAgIH0pOw0KDQogICAgdGhpcy5mb2N1cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBob3N0Lm9uRm9jdXMoKTsNCiAgICAgICAgc2VsZWN0KCk7DQogICAgICAgIHRleHQuZm9jdXMoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5ibHVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRleHQuYmx1cigpOw0KICAgIH07DQoNCiAgICBmdW5jdGlvbiBpc0ZvY3VzZWQoKSB7DQogICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0ZXh0Ow0KICAgIH0NCiAgICB0aGlzLmlzRm9jdXNlZCA9IGlzRm9jdXNlZDsNCg0KICAgIHRoaXMuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGV4dDsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNvbnRleHRNZW51ID0gZnVuY3Rpb24obW91c2VQb3MsIGlzRW1wdHkpew0KICAgICAgICBpZiAobW91c2VQb3MpIHsNCiAgICAgICAgICAgIGlmICghdGVtcFN0eWxlKQ0KICAgICAgICAgICAgICAgIHRlbXBTdHlsZSA9IHRleHQuc3R5bGUuY3NzVGV4dDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIHRleHQuc3R5bGUuY3NzVGV4dCA9IA0KICAgICAgICAgICAgICAgICdwb3NpdGlvbjpmaXhlZDsgei1pbmRleDoxMDAwOycgKw0KICAgICAgICAgICAgICAgICdsZWZ0OicgKyAobW91c2VQb3MueCAtIDIpICsgJ3B4OyB0b3A6JyArIChtb3VzZVBvcy55IC0gMikgKyAncHg7JzsNCg0KICAgICAgICB9DQogICAgICAgIGlmIChpc0VtcHR5KQ0KICAgICAgICAgICAgdGV4dC52YWx1ZT0nJzsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UgPSBmdW5jdGlvbigpew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmICh0ZW1wU3R5bGUpIHsNCiAgICAgICAgICAgICAgICB0ZXh0LnN0eWxlLmNzc1RleHQgPSB0ZW1wU3R5bGU7DQogICAgICAgICAgICAgICAgdGVtcFN0eWxlID0gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZW5kVGV4dCgpOw0KICAgICAgICB9LCAwKTsNCiAgICB9Ow0KfTsNCg0KZXhwb3J0cy5UZXh0SW5wdXQgPSBUZXh0SW5wdXQ7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb3VzZS9tb3VzZV9oYW5kbGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzJywgJ2FjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyJywgJ2FjZS9tb3VzZS9tb3VzZV9ldmVudCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7DQp2YXIgRGVmYXVsdEhhbmRsZXJzID0gcmVxdWlyZSgiLi9kZWZhdWx0X2hhbmRsZXJzIikuRGVmYXVsdEhhbmRsZXJzOw0KdmFyIERlZmF1bHRHdXR0ZXJIYW5kbGVyID0gcmVxdWlyZSgiLi9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIikuR3V0dGVySGFuZGxlcjsNCnZhciBNb3VzZUV2ZW50ID0gcmVxdWlyZSgiLi9tb3VzZV9ldmVudCIpLk1vdXNlRXZlbnQ7DQoNCnZhciBNb3VzZUhhbmRsZXIgPSBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsNCiAgICANCiAgICBuZXcgRGVmYXVsdEhhbmRsZXJzKGVkaXRvcik7DQogICAgbmV3IERlZmF1bHRHdXR0ZXJIYW5kbGVyKGVkaXRvcik7DQogICAgDQogICAgZXZlbnQuYWRkTGlzdGVuZXIoZWRpdG9yLmNvbnRhaW5lciwgIm1vdXNlZG93biIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgZWRpdG9yLmZvY3VzKCk7DQogICAgICAgIHJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICB9KTsNCiAgICBldmVudC5hZGRMaXN0ZW5lcihlZGl0b3IuY29udGFpbmVyLCAic2VsZWN0c3RhcnQiLCBmdW5jdGlvbihlKSB7DQogICAgICAgIHJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICB9KTsNCg0KICAgIHZhciBtb3VzZVRhcmdldCA9IGVkaXRvci5yZW5kZXJlci5nZXRNb3VzZUV2ZW50VGFyZ2V0KCk7DQogICAgZXZlbnQuYWRkTGlzdGVuZXIobW91c2VUYXJnZXQsICJtb3VzZWRvd24iLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJtb3VzZWRvd24iKSk7DQogICAgZXZlbnQuYWRkTGlzdGVuZXIobW91c2VUYXJnZXQsICJjbGljayIsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgImNsaWNrIikpOw0KICAgIGV2ZW50LmFkZExpc3RlbmVyKG1vdXNlVGFyZ2V0LCAibW91c2Vtb3ZlIiwgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsICJtb3VzZW1vdmUiKSk7DQogICAgZXZlbnQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihtb3VzZVRhcmdldCwgMCwgMiwgNTAwLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJkYmxjbGljayIpKTsNCiAgICBldmVudC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKG1vdXNlVGFyZ2V0LCAwLCAzLCA2MDAsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgInRyaXBsZWNsaWNrIikpOw0KICAgIGV2ZW50LmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIobW91c2VUYXJnZXQsIDAsIDQsIDYwMCwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAicXVhZGNsaWNrIikpOw0KICAgIGV2ZW50LmFkZE1vdXNlV2hlZWxMaXN0ZW5lcihlZGl0b3IuY29udGFpbmVyLCB0aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMsICJtb3VzZXdoZWVsIikpOw0KICAgIA0KICAgIHZhciBndXR0ZXJFbCA9IGVkaXRvci5yZW5kZXJlci4kZ3V0dGVyOw0KICAgIGV2ZW50LmFkZExpc3RlbmVyKGd1dHRlckVsLCAibW91c2Vkb3duIiwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAiZ3V0dGVybW91c2Vkb3duIikpOw0KICAgIGV2ZW50LmFkZExpc3RlbmVyKGd1dHRlckVsLCAiY2xpY2siLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJndXR0ZXJjbGljayIpKTsNCiAgICBldmVudC5hZGRMaXN0ZW5lcihndXR0ZXJFbCwgImRibGNsaWNrIiwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAiZ3V0dGVyZGJsY2xpY2siKSk7DQogICAgZXZlbnQuYWRkTGlzdGVuZXIoZ3V0dGVyRWwsICJtb3VzZW1vdmUiLCB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcywgImd1dHRlciIpKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHNjcm9sbFNwZWVkID0gMTsNCiAgICB0aGlzLnNldFNjcm9sbFNwZWVkID0gZnVuY3Rpb24oc3BlZWQpIHsNCiAgICAgICAgdGhpcy4kc2Nyb2xsU3BlZWQgPSBzcGVlZDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTY3JvbGxTcGVlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kc2Nyb2xsU3BlZWQ7DQogICAgfTsNCg0KICAgIHRoaXMub25Nb3VzZUV2ZW50ID0gZnVuY3Rpb24obmFtZSwgZSkgew0KICAgICAgICB0aGlzLmVkaXRvci5fZW1pdChuYW1lLCBuZXcgTW91c2VFdmVudChlLCB0aGlzLmVkaXRvcikpOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kZHJhZ0RlbGF5ID0gMjUwOw0KICAgIHRoaXMuc2V0RHJhZ0RlbGF5ID0gZnVuY3Rpb24oZHJhZ0RlbGF5KSB7DQogICAgICAgIHRoaXMuJGRyYWdEZWxheSA9IGRyYWdEZWxheTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXREcmFnRGVsYXkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGRyYWdEZWxheTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uKG5hbWUsIGUpIHsNCiAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBiZWNhdXNlIG1vdXNlbW92ZSBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGhhbmRsZXIuDQogICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeSAmJiB0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeS5tb3VzZW1vdmU7DQogICAgICAgIGlmICghbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuZWRpdG9yLl9lbWl0KG5hbWUsIG5ldyBNb3VzZUV2ZW50KGUsIHRoaXMuZWRpdG9yKSk7DQogICAgfTsNCg0KICAgIHRoaXMub25Nb3VzZVdoZWVsID0gZnVuY3Rpb24obmFtZSwgZSkgew0KICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5ldyBNb3VzZUV2ZW50KGUsIHRoaXMuZWRpdG9yKTsNCiAgICAgICAgbW91c2VFdmVudC5zcGVlZCA9IHRoaXMuJHNjcm9sbFNwZWVkICogMjsNCiAgICAgICAgbW91c2VFdmVudC53aGVlbFggPSBlLndoZWVsWDsNCiAgICAgICAgbW91c2VFdmVudC53aGVlbFkgPSBlLndoZWVsWTsNCiAgICAgICAgDQogICAgICAgIHRoaXMuZWRpdG9yLl9lbWl0KG5hbWUsIG1vdXNlRXZlbnQpOw0KICAgIH07DQoNCn0pLmNhbGwoTW91c2VIYW5kbGVyLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW91c2VIYW5kbGVyID0gTW91c2VIYW5kbGVyOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWtlIGRlIEJvZXIgPG1pa2UgQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnQnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9icm93c2VyX2ZvY3VzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgZXZlbnQgPSByZXF1aXJlKCIuLi9saWIvZXZlbnQiKTsNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQp2YXIgQnJvd3NlckZvY3VzID0gcmVxdWlyZSgiLi4vbGliL2Jyb3dzZXJfZm9jdXMiKS5Ccm93c2VyRm9jdXM7DQoNCnZhciBTVEFURV9VTktOT1dOID0gMDsNCnZhciBTVEFURV9TRUxFQ1QgPSAxOw0KdmFyIFNUQVRFX0RSQUcgPSAyOw0KDQp2YXIgRFJBR19PRkZTRVQgPSA1OyAvLyBwaXhlbHMNCg0KZnVuY3Rpb24gRGVmYXVsdEhhbmRsZXJzKGVkaXRvcikgew0KICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOw0KICAgIHRoaXMuJGNsaWNrU2VsZWN0aW9uID0gbnVsbDsNCiAgICB0aGlzLmJyb3dzZXJGb2N1cyA9IG5ldyBCcm93c2VyRm9jdXMoKTsNCg0KICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigibW91c2Vkb3duIiwgdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpKTsNCiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImRibGNsaWNrIiwgdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcykpOw0KICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigidHJpcGxlY2xpY2siLCB0aGlzLm9uVHJpcGxlQ2xpY2suYmluZCh0aGlzKSk7DQogICAgZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJxdWFkY2xpY2siLCB0aGlzLm9uUXVhZENsaWNrLmJpbmQodGhpcykpOw0KICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigibW91c2V3aGVlbCIsIHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSk7DQp9DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLm9uTW91c2VEb3duID0gZnVuY3Rpb24oZXYpIHsNCiAgICAgICAgdmFyIGluU2VsZWN0aW9uID0gZXYuaW5TZWxlY3Rpb24oKTsNCiAgICAgICAgdmFyIHBhZ2VYID0gZXYucGFnZVg7DQogICAgICAgIHZhciBwYWdlWSA9IGV2LnBhZ2VZOw0KICAgICAgICB2YXIgcG9zID0gZXYuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOw0KICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7DQogICAgICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgICAgIA0KICAgICAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgdmFyIHNlbGVjdGlvbkVtcHR5ID0gc2VsZWN0aW9uUmFuZ2UuaXNFbXB0eSgpOw0KICAgICAgICB2YXIgc3RhdGUgPSBTVEFURV9VTktOT1dOOw0KICAgICAgICANCiAgICAgICAgLy8gaWYgdGhpcyBjbGljayBjYXVzZWQgdGhlIGVkaXRvciB0byBiZSBmb2N1c2VkIHNob3VsZCBub3QgY2xlYXIgdGhlDQogICAgICAgIC8vIHNlbGVjdGlvbg0KICAgICAgICBpZiAoDQogICAgICAgICAgICBpblNlbGVjdGlvbiAmJiAoDQogICAgICAgICAgICAgICAgIXRoaXMuYnJvd3NlckZvY3VzLmlzRm9jdXNlZCgpDQogICAgICAgICAgICAgICAgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLmJyb3dzZXJGb2N1cy5sYXN0Rm9jdXMgPCAyMA0KICAgICAgICAgICAgICAgIHx8ICFlZGl0b3IuaXNGb2N1c2VkKCkNCiAgICAgICAgICAgICkNCiAgICAgICAgKSB7DQogICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBidXR0b24gPSBldi5nZXRCdXR0b24oKTsNCiAgICAgICAgaWYgKGJ1dHRvbiAhPT0gMCkgew0KICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkVtcHR5KSB7DQogICAgICAgICAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYnV0dG9uID09IDIpIHsNCiAgICAgICAgICAgICAgICBlZGl0b3IudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoe3g6IGV2LmNsaWVudFgsIHk6IGV2LmNsaWVudFl9LCBzZWxlY3Rpb25FbXB0eSk7DQogICAgICAgICAgICAgICAgZXZlbnQuY2FwdHVyZShlZGl0b3IuY29udGFpbmVyLCBmdW5jdGlvbigpe30sIGVkaXRvci50ZXh0SW5wdXQub25Db250ZXh0TWVudUNsb3NlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghaW5TZWxlY3Rpb24pIHsNCiAgICAgICAgICAgIC8vIERpcmVjdGx5IHBpY2sgU1RBVEVfU0VMRUNULCBzaW5jZSB0aGUgdXNlciBpcyBub3QgY2xpY2tpbmcgaW5zaWRlDQogICAgICAgICAgICAvLyBhIHNlbGVjdGlvbi4NCiAgICAgICAgICAgIG9uU3RhcnRTZWxlY3QocG9zKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBtb3VzZVBhZ2VYID0gcGFnZVgsIG1vdXNlUGFnZVkgPSBwYWdlWTsNCiAgICAgICAgdmFyIG1vdXNlZG93blRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOw0KICAgICAgICB2YXIgZHJhZ0N1cnNvciwgZHJhZ1JhbmdlLCBkcmFnU2VsZWN0aW9uTWFya2VyOw0KDQogICAgICAgIHZhciBvbk1vdXNlU2VsZWN0aW9uID0gZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgbW91c2VQYWdlWCA9IGV2ZW50LmdldERvY3VtZW50WChlKTsNCiAgICAgICAgICAgIG1vdXNlUGFnZVkgPSBldmVudC5nZXREb2N1bWVudFkoZSk7DQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIG9uTW91c2VTZWxlY3Rpb25FbmQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVySWQpOw0KICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX1VOS05PV04pDQogICAgICAgICAgICAgICAgb25TdGFydFNlbGVjdChwb3MpOw0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfRFJBRykNCiAgICAgICAgICAgICAgICBvbk1vdXNlRHJhZ1NlbGVjdGlvbkVuZChlKTsNCg0KICAgICAgICAgICAgX3NlbGYuJGNsaWNrU2VsZWN0aW9uID0gbnVsbDsNCiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfVU5LTk9XTjsNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgb25Nb3VzZURyYWdTZWxlY3Rpb25FbmQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3MoZWRpdG9yLmNvbnRhaW5lciwgImFjZV9kcmFnZ2luZyIpOw0KICAgICAgICAgICAgZWRpdG9yLnNlc3Npb24ucmVtb3ZlTWFya2VyKGRyYWdTZWxlY3Rpb25NYXJrZXIpOw0KDQogICAgICAgICAgICBpZiAoIWVkaXRvci4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbikgew0KICAgICAgICAgICAgICAgIGlmICghZHJhZ0N1cnNvcikgew0KICAgICAgICAgICAgICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24ocG9zKTsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbihwb3Mucm93LCBwb3MuY29sdW1uKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghZHJhZ0N1cnNvcikNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIGlmIChkcmFnUmFuZ2UuY29udGFpbnMoZHJhZ0N1cnNvci5yb3csIGRyYWdDdXJzb3IuY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIGRyYWdDdXJzb3IgPSBudWxsOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7DQogICAgICAgICAgICBpZiAoZSAmJiAoZS5jdHJsS2V5IHx8IGUuYWx0S2V5KSkgew0KICAgICAgICAgICAgICAgIHZhciBzZXNzaW9uID0gZWRpdG9yLnNlc3Npb247DQogICAgICAgICAgICAgICAgdmFyIG5ld1JhbmdlID0gc2Vzc2lvbi5pbnNlcnQoZHJhZ0N1cnNvciwgc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoZHJhZ1JhbmdlKSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBuZXdSYW5nZSA9IGVkaXRvci5tb3ZlVGV4dChkcmFnUmFuZ2UsIGRyYWdDdXJzb3IpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCFuZXdSYW5nZSkgew0KICAgICAgICAgICAgICAgIGRyYWdDdXJzb3IgPSBudWxsOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXdSYW5nZSk7DQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIG9uU2VsZWN0aW9uSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9VTktOT1dOKSB7DQogICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gY2FsY0Rpc3RhbmNlKHBhZ2VYLCBwYWdlWSwgbW91c2VQYWdlWCwgbW91c2VQYWdlWSk7DQogICAgICAgICAgICAgICAgdmFyIHRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOw0KDQogICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gRFJBR19PRkZTRVQpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TRUxFQ1Q7DQogICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMobW91c2VQYWdlWCwgbW91c2VQYWdlWSk7DQogICAgICAgICAgICAgICAgICAgIGN1cnNvci5yb3cgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJzb3Iucm93LCBlZGl0b3Iuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSk7DQogICAgICAgICAgICAgICAgICAgIG9uU3RhcnRTZWxlY3QoY3Vyc29yKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKHRpbWUgLSBtb3VzZWRvd25UaW1lKSA+IGVkaXRvci5nZXREcmFnRGVsYXkoKSkgew0KICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RSQUc7DQogICAgICAgICAgICAgICAgICAgIGRyYWdSYW5nZSA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uU3R5bGUoKTsNCiAgICAgICAgICAgICAgICAgICAgZHJhZ1NlbGVjdGlvbk1hcmtlciA9IGVkaXRvci5zZXNzaW9uLmFkZE1hcmtlcihkcmFnUmFuZ2UsICJhY2Vfc2VsZWN0aW9uIiwgc3R5bGUpOw0KICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICAgICAgICAgICAgICAgICAgZG9tLmFkZENzc0NsYXNzKGVkaXRvci5jb250YWluZXIsICJhY2VfZHJhZ2dpbmciKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0RSQUcpDQogICAgICAgICAgICAgICAgb25EcmFnU2VsZWN0aW9uSW50ZXJ2YWwoKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX1NFTEVDVCkNCiAgICAgICAgICAgICAgICBvblVwZGF0ZVNlbGVjdGlvbkludGVydmFsKCk7DQogICAgICAgIH07DQoNCiAgICAgICAgZnVuY3Rpb24gb25TdGFydFNlbGVjdChwb3MpIHsNCiAgICAgICAgICAgIGlmIChldi5nZXRTaGlmdEtleSgpKSB7DQogICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKHBvcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAoIV9zZWxmLiRjbGlja1NlbGVjdGlvbikgew0KICAgICAgICAgICAgICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24ocG9zKTsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbihwb3Mucm93LCBwb3MuY29sdW1uKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NFTEVDVDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBvblVwZGF0ZVNlbGVjdGlvbkludGVydmFsID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgYW5jaG9yOw0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhtb3VzZVBhZ2VYLCBtb3VzZVBhZ2VZKTsNCiAgICAgICAgICAgIGN1cnNvci5yb3cgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJzb3Iucm93LCBlZGl0b3Iuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSk7DQoNCiAgICAgICAgICAgIGlmIChfc2VsZi4kY2xpY2tTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICBpZiAoX3NlbGYuJGNsaWNrU2VsZWN0aW9uLmNvbnRhaW5zKGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoX3NlbGYuJGNsaWNrU2VsZWN0aW9uKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChfc2VsZi4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZShjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gX3NlbGYuJGNsaWNrU2VsZWN0aW9uLmVuZDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IF9zZWxmLiRjbGlja1NlbGVjdGlvbi5zdGFydDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcihhbmNob3Iucm93LCBhbmNob3IuY29sdW1uKTsNCiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGN1cnNvcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGN1cnNvcik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGVkaXRvci5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpOw0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBvbkRyYWdTZWxlY3Rpb25JbnRlcnZhbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgZHJhZ0N1cnNvciA9IGVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhtb3VzZVBhZ2VYLCBtb3VzZVBhZ2VZKTsNCiAgICAgICAgICAgIGRyYWdDdXJzb3Iucm93ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZHJhZ0N1cnNvci5yb3csIGVkaXRvci5zZXNzaW9uLmdldExlbmd0aCgpIC0gMSkpOw0KDQogICAgICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24oZHJhZ0N1cnNvcik7DQogICAgICAgIH07DQoNCiAgICAgICAgZXZlbnQuY2FwdHVyZShlZGl0b3IuY29udGFpbmVyLCBvbk1vdXNlU2VsZWN0aW9uLCBvbk1vdXNlU2VsZWN0aW9uRW5kKTsNCiAgICAgICAgdmFyIHRpbWVySWQgPSBzZXRJbnRlcnZhbChvblNlbGVjdGlvbkludGVydmFsLCAyMCk7DQoNCiAgICAgICAgcmV0dXJuIGV2LnByZXZlbnREZWZhdWx0KCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbihldikgew0KICAgICAgICB2YXIgcG9zID0gZXYuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOw0KICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7DQogICAgICAgIA0KICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24ocG9zKTsNCiAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7DQogICAgICAgIHRoaXMuJGNsaWNrU2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uVHJpcGxlQ2xpY2sgPSBmdW5jdGlvbihldikgew0KICAgICAgICB2YXIgcG9zID0gZXYuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOw0KICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7DQogICAgICAgIA0KICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24ocG9zKTsNCiAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZWxlY3RMaW5lKCk7DQogICAgICAgIHRoaXMuJGNsaWNrU2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uUXVhZENsaWNrID0gZnVuY3Rpb24oZXYpIHsNCiAgICAgICAgdmFyIGVkaXRvciA9IHRoaXMuZWRpdG9yOw0KICAgICAgICANCiAgICAgICAgZWRpdG9yLnNlbGVjdEFsbCgpOw0KICAgICAgICB0aGlzLiRjbGlja1NlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5vblNjcm9sbCA9IGZ1bmN0aW9uKGV2KSB7DQogICAgICAgIHZhciBlZGl0b3IgPSB0aGlzLmVkaXRvcjsNCiAgICAgICAgDQogICAgICAgIGVkaXRvci5yZW5kZXJlci5zY3JvbGxCeShldi53aGVlbFggKiBldi5zcGVlZCwgZXYud2hlZWxZICogZXYuc3BlZWQpOw0KICAgICAgICBpZiAoZWRpdG9yLnJlbmRlcmVyLmlzU2Nyb2xsYWJsZUJ5KGV2LndoZWVsWCAqIGV2LnNwZWVkLCBldi53aGVlbFkgKiBldi5zcGVlZCkpDQogICAgICAgICAgICByZXR1cm4gZXYucHJldmVudERlZmF1bHQoKTsNCiAgICB9Ow0KICAgIA0KfSkuY2FsbChEZWZhdWx0SGFuZGxlcnMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5EZWZhdWx0SGFuZGxlcnMgPSBEZWZhdWx0SGFuZGxlcnM7DQoNCmZ1bmN0aW9uIGNhbGNEaXN0YW5jZShheCwgYXksIGJ4LCBieSkgew0KICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coYnggLSBheCwgMikgKyBNYXRoLnBvdyhieSAtIGF5LCAyKSk7DQp9DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2Jyb3dzZXJfZm9jdXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnQnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9vb3AiKTsNCnZhciBldmVudCA9IHJlcXVpcmUoIi4vZXZlbnQiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCi8qKg0KICogVGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgZm9jdXMgc3RhdGUgb2YgdGhlIGdpdmVuIHdpbmRvdy4NCiAqIEZvY3VzIGNoYW5nZXMgZm9yIGV4YW1wbGUgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBhIGJyb3dzZXIgdGFiLA0KICogZ29lcyB0byB0aGUgbG9jYXRpb24gYmFyIG9yIHN3aXRjaGVzIHRvIGFub3RoZXIgYXBwbGljYXRpb24uDQogKi8gDQp2YXIgQnJvd3NlckZvY3VzID0gZnVuY3Rpb24od2luKSB7DQogICAgd2luID0gd2luIHx8IHdpbmRvdzsNCiAgICANCiAgICB0aGlzLmxhc3RGb2N1cyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIHRoaXMuX2lzRm9jdXNlZCA9IHRydWU7DQogICAgDQogICAgdmFyIF9zZWxmID0gdGhpczsNCg0KICAgIC8vIElFIDwgOSBzdXBwb3J0cyBmb2N1c2luIGFuZCBmb2N1c291dCBldmVudHMNCiAgICBpZiAoIm9uZm9jdXNpbiIgaW4gd2luLmRvY3VtZW50KSB7DQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHdpbi5kb2N1bWVudCwgImZvY3VzaW4iLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBfc2VsZi5fc2V0Rm9jdXNlZCh0cnVlKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIod2luLmRvY3VtZW50LCAiZm9jdXNvdXQiLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBfc2VsZi5fc2V0Rm9jdXNlZCghIWUudG9FbGVtZW50KTsNCiAgICAgICAgfSk7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih3aW4sICJibHVyIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgX3NlbGYuX3NldEZvY3VzZWQoZmFsc2UpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih3aW4sICJmb2N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIF9zZWxmLl9zZXRGb2N1c2VkKHRydWUpOw0KICAgICAgICB9KTsNCiAgICB9DQp9Ow0KDQooZnVuY3Rpb24oKXsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICANCiAgICB0aGlzLmlzRm9jdXNlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5faXNGb2N1c2VkOw0KICAgIH07DQogICAgDQogICAgdGhpcy5fc2V0Rm9jdXNlZCA9IGZ1bmN0aW9uKGlzRm9jdXNlZCkgew0KICAgICAgICBpZiAodGhpcy5faXNGb2N1c2VkID09IGlzRm9jdXNlZCkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAoaXNGb2N1c2VkKQ0KICAgICAgICAgICAgdGhpcy5sYXN0Rm9jdXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsNCiAgICAgICAgICAgIA0KICAgICAgICB0aGlzLl9pc0ZvY3VzZWQgPSBpc0ZvY3VzZWQ7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUZvY3VzIik7DQogICAgfTsNCg0KfSkuY2FsbChCcm93c2VyRm9jdXMucHJvdG90eXBlKTsNCg0KDQpleHBvcnRzLkJyb3dzZXJGb2N1cyA9IEJyb3dzZXJGb2N1czsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKiAgICAgIE1pa2UgZGUgQm9lciA8bWlrZSBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgRXZlbnRFbWl0dGVyID0ge307DQoNCkV2ZW50RW1pdHRlci5fZW1pdCA9DQpFdmVudEVtaXR0ZXIuX2Rpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbihldmVudE5hbWUsIGUpIHsNCiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsNCiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdIHx8IFtdOw0KICAgIHZhciBkZWZhdWx0SGFuZGxlciA9IHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzLmxlbmd0aCAmJiAhZGVmYXVsdEhhbmRsZXIpDQogICAgICAgIHJldHVybjsNCg0KICAgIGUgPSBlIHx8IHt9Ow0KICAgIGUudHlwZSA9IGV2ZW50TmFtZTsNCiAgICANCiAgICBpZiAoIWUuc3RvcFByb3BhZ2F0aW9uKSB7DQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KICAgIA0KICAgIGlmICghZS5wcmV2ZW50RGVmYXVsdCkgew0KICAgICAgICBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZvciAodmFyIGk9MDsgaTxsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgbGlzdGVuZXJzW2ldKGUpOw0KICAgICAgICBpZiAoZS5wcm9wYWdhdGlvblN0b3BwZWQpDQogICAgICAgICAgICBicmVhazsNCiAgICB9DQogICAgDQogICAgaWYgKGRlZmF1bHRIYW5kbGVyICYmICFlLmRlZmF1bHRQcmV2ZW50ZWQpDQogICAgICAgIGRlZmF1bHRIYW5kbGVyKGUpOw0KfTsNCg0KRXZlbnRFbWl0dGVyLnNldERlZmF1bHRIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgew0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCiAgICANCiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV0pDQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGRlZmF1bHQgaGFuZGxlciBmb3IgJyIgKyBldmVudE5hbWUgKyAiJyBpcyBhbHJlYWR5IHNldCIpOw0KICAgICAgICANCiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOw0KfTsNCg0KRXZlbnRFbWl0dGVyLm9uID0NCkV2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KDQogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsNCiAgICBpZiAoIWxpc3RlbmVycykNCiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KDQogICAgaWYgKGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSA9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOw0KfTsNCg0KRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0NCkV2ZW50RW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KDQogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsNCiAgICBpZiAoIWxpc3RlbmVycykNCiAgICAgICAgcmV0dXJuOw0KDQogICAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spOw0KICAgIGlmIChpbmRleCAhPT0gLTEpDQogICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpOw0KfTsNCg0KRXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50TmFtZSkgew0KICAgIGlmICh0aGlzLl9ldmVudFJlZ2lzdHJ5KSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSBbXTsNCn07DQoNCmV4cG9ydHMuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyOw0KDQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpmdW5jdGlvbiBHdXR0ZXJIYW5kbGVyKGVkaXRvcikgew0KICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVyY2xpY2siLCBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciByb3cgPSBlLmdldERvY3VtZW50UG9zaXRpb24oKS5yb3c7DQogICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3Iuc2Vzc2lvbi5zZWxlY3Rpb247DQogICAgICAgIA0KICAgICAgICBzZWxlY3Rpb24ubW92ZUN1cnNvclRvKHJvdywgMCk7DQogICAgICAgIHNlbGVjdGlvbi5zZWxlY3RMaW5lKCk7DQogICAgfSk7DQp9DQoNCmV4cG9ydHMuR3V0dGVySGFuZGxlciA9IEd1dHRlckhhbmRsZXI7DQoNCn0pOy8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW91c2UvbW91c2VfZXZlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBldmVudCA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudCIpOw0KDQovKioNCiAqIEN1c3RvbSBBY2UgbW91c2UgZXZlbnQNCiAqLw0KdmFyIE1vdXNlRXZlbnQgPSBleHBvcnRzLk1vdXNlRXZlbnQgPSBmdW5jdGlvbihkb21FdmVudCwgZWRpdG9yKSB7DQogICAgdGhpcy5kb21FdmVudCA9IGRvbUV2ZW50Ow0KICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOw0KICAgIA0KICAgIHRoaXMucGFnZVggPSBldmVudC5nZXREb2N1bWVudFgoZG9tRXZlbnQpOw0KICAgIHRoaXMucGFnZVkgPSBldmVudC5nZXREb2N1bWVudFkoZG9tRXZlbnQpOw0KICAgIA0KICAgIHRoaXMuY2xpZW50WCA9IGRvbUV2ZW50LmNsaWVudFg7DQogICAgdGhpcy5jbGllbnRZID0gZG9tRXZlbnQuY2xpZW50WTsNCg0KICAgIHRoaXMuJHBvcyA9IG51bGw7DQogICAgdGhpcy4kaW5TZWxlY3Rpb24gPSBudWxsOw0KICAgIA0KICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7DQogICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gZmFsc2U7DQp9Ow0KDQooZnVuY3Rpb24oKSB7ICANCiAgICANCiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24odGhpcy5kb21FdmVudCk7DQogICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQodGhpcy5kb21FdmVudCk7DQogICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBHZXQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIGJlbG93IHRoZSBtb3VzZSBjdXJzb3INCiAgICAgKiANCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICdyb3cnIGFuZCAnY29sdW1uJyBvZiB0aGUgZG9jdW1lbnQgcG9zaXRpb24NCiAgICAgKi8NCiAgICB0aGlzLmdldERvY3VtZW50UG9zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuJHBvcykNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRwb3M7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHBhZ2VYID0gZXZlbnQuZ2V0RG9jdW1lbnRYKHRoaXMuZG9tRXZlbnQpOw0KICAgICAgICB2YXIgcGFnZVkgPSBldmVudC5nZXREb2N1bWVudFkodGhpcy5kb21FdmVudCk7DQogICAgICAgIHRoaXMuJHBvcyA9IHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHBhZ2VYLCBwYWdlWSk7DQogICAgICAgIHRoaXMuJHBvcy5yb3cgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLiRwb3Mucm93LCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldExlbmd0aCgpLTEpKTsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHBvczsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIENoZWNrIGlmIHRoZSBtb3VzZSBjdXJzb3IgaXMgaW5zaWRlIG9mIHRoZSB0ZXh0IHNlbGVjdGlvbg0KICAgICAqIA0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgdGhlIG1vdXNlIGN1cnNvciBpcyBpbnNpZGUgb2YgdGhlIHNlbGVjdGlvbg0KICAgICAqLw0KICAgIHRoaXMuaW5TZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuJGluU2VsZWN0aW9uICE9PSBudWxsKQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGluU2VsZWN0aW9uOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBlZGl0b3IgPSB0aGlzLmVkaXRvcjsNCiAgICAgICAgDQogICAgICAgIGlmIChlZGl0b3IuZ2V0UmVhZE9ubHkoKSkgew0KICAgICAgICAgICAgdGhpcy4kaW5TZWxlY3Rpb24gPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25SYW5nZSA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGlvblJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgICAgICB0aGlzLiRpblNlbGVjdGlvbiA9IGZhbHNlOw0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHRoaXMuJGluU2VsZWN0aW9uID0gc2VsZWN0aW9uUmFuZ2UuY29udGFpbnMocG9zLnJvdywgcG9zLmNvbHVtbik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXMuJGluU2VsZWN0aW9uOw0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogR2V0IHRoZSBjbGlja2VkIG1vdXNlIGJ1dHRvbg0KICAgICAqIA0KICAgICAqIEByZXR1cm4ge051bWJlcn0gMCBmb3IgbGVmdCBidXR0b24sIDEgZm9yIG1pZGRsZSBidXR0b24sIDIgZm9yIHJpZ2h0IGJ1dHRvbg0KICAgICAqLw0KICAgIHRoaXMuZ2V0QnV0dG9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBldmVudC5nZXRCdXR0b24odGhpcy5kb21FdmVudCk7DQogICAgfTsNCiAgICANCiAgICAvKioNCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIHRoZSBzaGlmdCBrZXkgd2FzIHByZXNzZWQgd2hlbiB0aGUgZXZlbnQgd2FzIGVtaXR0ZWQNCiAgICAgKi8NCiAgICB0aGlzLmdldFNoaWZ0S2V5ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvbUV2ZW50LnNoaWZ0S2V5Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRBY2NlbEtleSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb21FdmVudC5jdHJsS2V5IHx8IHRoaXMuZG9tRXZlbnQubWV0YUtleSA7DQogICAgfTsNCiAgICANCn0pLmNhbGwoTW91c2VFdmVudC5wcm90b3R5cGUpOw0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW91c2UvZm9sZF9oYW5kbGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZnVuY3Rpb24gRm9sZEhhbmRsZXIoZWRpdG9yKSB7DQogICAgDQogICAgZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIHBvc2l0aW9uID0gZS5nZXREb2N1bWVudFBvc2l0aW9uKCk7DQogICAgICAgIHZhciBzZXNzaW9uID0gZWRpdG9yLnNlc3Npb247DQogICAgICAgIA0KICAgICAgICAvLyBJZiB0aGUgdXNlciBkY2xpY2tlZCBvbiBhIGZvbGQsIHRoZW4gZXhwYW5kIGl0Lg0KICAgICAgICB2YXIgZm9sZCA9IHNlc3Npb24uZ2V0Rm9sZEF0KHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uLCAxKTsNCiAgICAgICAgaWYgKGZvbGQpIHsNCiAgICAgICAgICAgIGlmIChlLmdldEFjY2VsS2V5KCkpDQogICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVGb2xkKGZvbGQpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwYW5kRm9sZChmb2xkKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGUuc3RvcCgpOw0KICAgICAgICB9DQogICAgfSk7DQogICAgDQogICAgZWRpdG9yLm9uKCJndXR0ZXJjbGljayIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgaWYgKGUuZG9tRXZlbnQudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCJhY2VfZm9sZC13aWRnZXQiKSAhPSAtMSkgew0KICAgICAgICAgICAgdmFyIHJvdyA9IGUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdzsNCiAgICAgICAgICAgIGVkaXRvci5zZXNzaW9uLm9uRm9sZFdpZGdldENsaWNrKHJvdywgZS5kb21FdmVudCk7DQogICAgICAgICAgICBlLnN0b3AoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KfQ0KDQpleHBvcnRzLkZvbGRIYW5kbGVyID0gRm9sZEhhbmRsZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4NCiAqICAgICAgSGFydXR5dW4gQW1pcmphbnlhbiA8YW1pcmphbnlhbkBnbWFpbC5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2Uva2V5Ym9hcmQva2V5YmluZGluZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9rZXlzJywgJ2FjZS9saWIvZXZlbnQnLCAnYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBrZXlVdGlsICA9IHJlcXVpcmUoIi4uL2xpYi9rZXlzIik7DQp2YXIgZXZlbnQgPSByZXF1aXJlKCIuLi9saWIvZXZlbnQiKTsNCnJlcXVpcmUoIi4uL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKTsNCg0KdmFyIEtleUJpbmRpbmcgPSBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICB0aGlzLiRlZGl0b3IgPSBlZGl0b3I7DQogICAgdGhpcy4kZGF0YSA9IHsgfTsNCiAgICB0aGlzLiRoYW5kbGVycyA9IFt0aGlzXTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICB0aGlzLnNldEtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKGtleWJvYXJkSGFuZGxlcikgew0KICAgICAgICBpZiAodGhpcy4kaGFuZGxlcnNbdGhpcy4kaGFuZGxlcnMubGVuZ3RoIC0gMV0gPT0ga2V5Ym9hcmRIYW5kbGVyKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB0aGlzLiRkYXRhID0geyB9Ow0KICAgICAgICB0aGlzLiRoYW5kbGVycyA9IGtleWJvYXJkSGFuZGxlciA/IFt0aGlzLCBrZXlib2FyZEhhbmRsZXJdIDogW3RoaXNdOw0KICAgIH07DQoNCiAgICB0aGlzLmFkZEtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKGtleWJvYXJkSGFuZGxlcikgew0KICAgICAgICB0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcihrZXlib2FyZEhhbmRsZXIpOw0KICAgICAgICB0aGlzLiRoYW5kbGVycy5wdXNoKGtleWJvYXJkSGFuZGxlcik7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyID0gZnVuY3Rpb24oa2V5Ym9hcmRIYW5kbGVyKSB7DQogICAgICAgIHZhciBpID0gdGhpcy4kaGFuZGxlcnMuaW5kZXhPZihrZXlib2FyZEhhbmRsZXIpOw0KICAgICAgICBpZiAoaSA9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgdGhpcy4kaGFuZGxlcnMuc3BsaWNlKGksIDEpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRLZXlib2FyZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aCAtIDFdOw0KICAgIH07DQoNCiAgICB0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycyA9IGZ1bmN0aW9uIChoYXNoSWQsIGtleVN0cmluZywga2V5Q29kZSwgZSkgew0KICAgICAgICB2YXIgdG9FeGVjdXRlOw0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy4kaGFuZGxlcnMubGVuZ3RoOyBpLS07KSB7DQogICAgICAgICAgICB0b0V4ZWN1dGUgPSB0aGlzLiRoYW5kbGVyc1tpXS5oYW5kbGVLZXlib2FyZCgNCiAgICAgICAgICAgICAgICB0aGlzLiRkYXRhLCBoYXNoSWQsIGtleVN0cmluZywga2V5Q29kZSwgZQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIGlmICh0b0V4ZWN1dGUgJiYgdG9FeGVjdXRlLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIXRvRXhlY3V0ZSB8fCAhdG9FeGVjdXRlLmNvbW1hbmQpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgdmFyIHN1Y2Nlc3MgPSBmYWxzZTsNCiAgICAgICAgdmFyIGNvbW1hbmRzID0gdGhpcy4kZWRpdG9yLmNvbW1hbmRzOw0KDQogICAgICAgIC8vIGFsbG93IGtleWJvYXJkSGFuZGxlciB0byBjb25zdW1lIGtleXMNCiAgICAgICAgaWYgKHRvRXhlY3V0ZS5jb21tYW5kICE9ICJudWxsIikNCiAgICAgICAgICAgIHN1Y2Nlc3MgPSBjb21tYW5kcy5leGVjKHRvRXhlY3V0ZS5jb21tYW5kLCB0aGlzLiRlZGl0b3IsIHRvRXhlY3V0ZS5hcmdzKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7DQoNCiAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgZSkNCiAgICAgICAgICAgIGV2ZW50LnN0b3BFdmVudChlKTsNCg0KICAgICAgICByZXR1cm4gc3VjY2VzczsNCiAgICB9Ow0KDQogICAgdGhpcy5oYW5kbGVLZXlib2FyZCA9IGZ1bmN0aW9uKGRhdGEsIGhhc2hJZCwga2V5U3RyaW5nKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBjb21tYW5kOiB0aGlzLiRlZGl0b3IuY29tbWFuZHMuZmluZEtleUNvbW1hbmQoaGFzaElkLCBrZXlTdHJpbmcpDQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHRoaXMub25Db21tYW5kS2V5ID0gZnVuY3Rpb24oZSwgaGFzaElkLCBrZXlDb2RlKSB7DQogICAgICAgIHZhciBrZXlTdHJpbmcgPSBrZXlVdGlsLmtleUNvZGVUb1N0cmluZyhrZXlDb2RlKTsNCiAgICAgICAgdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoaGFzaElkLCBrZXlTdHJpbmcsIGtleUNvZGUsIGUpOw0KICAgIH07DQoNCiAgICB0aGlzLm9uVGV4dElucHV0ID0gZnVuY3Rpb24odGV4dCwgcGFzdGVkKSB7DQogICAgICAgIHZhciBzdWNjZXNzID0gZmFsc2U7DQogICAgICAgIGlmICghcGFzdGVkICYmIHRleHQubGVuZ3RoID09IDEpDQogICAgICAgICAgICBzdWNjZXNzID0gdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoMCwgdGV4dCk7DQogICAgICAgIGlmICghc3VjY2VzcykNCiAgICAgICAgICAgIHRoaXMuJGVkaXRvci5jb21tYW5kcy5leGVjKCJpbnNlcnRzdHJpbmciLCB0aGlzLiRlZGl0b3IsIHRleHQpOw0KICAgIH07DQoNCn0pLmNhbGwoS2V5QmluZGluZy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLktleUJpbmRpbmcgPSBLZXlCaW5kaW5nOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkuc3VjYW5AZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvbGFuZyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KDQpmdW5jdGlvbiBiaW5kS2V5KHdpbiwgbWFjKSB7DQogICAgcmV0dXJuIHsNCiAgICAgICAgd2luOiB3aW4sDQogICAgICAgIG1hYzogbWFjDQogICAgfTsNCn0NCg0KZXhwb3J0cy5jb21tYW5kcyA9IFt7DQogICAgbmFtZTogInNlbGVjdGFsbCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1BIiwgIkNvbW1hbmQtQSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2VsZWN0QWxsKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiY2VudGVyc2VsZWN0aW9uIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KG51bGwsICJDdHJsLUwiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNlbnRlclNlbGVjdGlvbigpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG9saW5lIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUwiLCAiQ29tbWFuZC1MIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7DQogICAgICAgIHZhciBsaW5lID0gcGFyc2VJbnQocHJvbXB0KCJFbnRlciBsaW5lIG51bWJlcjoiKSwgMTApOw0KICAgICAgICBpZiAoIWlzTmFOKGxpbmUpKSB7DQogICAgICAgICAgICBlZGl0b3IuZ290b0xpbmUobGluZSk7DQogICAgICAgIH0NCiAgICB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImZvbGQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1MIiwgIkFsdC1MIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZXNzaW9uLnRvZ2dsZUZvbGQoZmFsc2UpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInVuZm9sZCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LVNoaWZ0LUwiLCAiQWx0LVNoaWZ0LUwiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNlc3Npb24udG9nZ2xlRm9sZCh0cnVlKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJmb2xkYWxsIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtMCIsICJBbHQtMCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2Vzc2lvbi5mb2xkQWxsKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAidW5mb2xkYWxsIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtU2hpZnQtMCIsICJBbHQtU2hpZnQtMCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2Vzc2lvbi51bmZvbGQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJmaW5kbmV4dCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1LIiwgIkNvbW1hbmQtRyIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZmluZE5leHQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJmaW5kcHJldmlvdXMiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtSyIsICJDb21tYW5kLVNoaWZ0LUciKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmZpbmRQcmV2aW91cygpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImZpbmQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtRiIsICJDb21tYW5kLUYiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICAgICAgdmFyIG5lZWRsZSA9IHByb21wdCgiRmluZDoiLCBlZGl0b3IuZ2V0Q29weVRleHQoKSk7DQogICAgICAgIGVkaXRvci5maW5kKG5lZWRsZSk7DQogICAgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJvdmVyd3JpdGUiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkluc2VydCIsICJJbnNlcnQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnRvZ2dsZU92ZXJ3cml0ZSgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdHRvc3RhcnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtSG9tZXxBbHQtU2hpZnQtVXAiLCAiQ29tbWFuZC1TaGlmdC1VcCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZVN0YXJ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b3N0YXJ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUhvbWV8Q3RybC1VcCIsICJDb21tYW5kLUhvbWV8Q29tbWFuZC1VcCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubmF2aWdhdGVGaWxlU3RhcnQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R1cCIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtVXAiLCAiU2hpZnQtVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdFVwKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ29saW5ldXAiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlVwIiwgIlVwfEN0cmwtUCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVVcChhcmdzLnRpbWVzKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R0b2VuZCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1TaGlmdC1FbmR8QWx0LVNoaWZ0LURvd24iLCAiQ29tbWFuZC1TaGlmdC1Eb3duIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlRW5kKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b2VuZCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1FbmR8Q3RybC1Eb3duIiwgIkNvbW1hbmQtRW5kfENvbW1hbmQtRG93biIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubmF2aWdhdGVGaWxlRW5kKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0ZG93biIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtRG93biIsICJTaGlmdC1Eb3duIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3REb3duKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ29saW5lZG93biIsDQogICAgYmluZEtleTogYmluZEtleSgiRG93biIsICJEb3dufEN0cmwtTiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVEb3duKGFyZ3MudGltZXMpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdHdvcmRsZWZ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LUxlZnQiLCAiT3B0aW9uLVNoaWZ0LUxlZnQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRMZWZ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b3dvcmRsZWZ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUxlZnQiLCAiT3B0aW9uLUxlZnQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlV29yZExlZnQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3R0b2xpbmVzdGFydCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LVNoaWZ0LUxlZnQiLCAiQ29tbWFuZC1TaGlmdC1MZWZ0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3RvbGluZXN0YXJ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtTGVmdHxIb21lIiwgIkNvbW1hbmQtTGVmdHxIb21lfEN0cmwtQSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubmF2aWdhdGVMaW5lU3RhcnQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3RsZWZ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1MZWZ0IiwgIlNoaWZ0LUxlZnQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdExlZnQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3RvbGVmdCIsDQogICAgYmluZEtleTogYmluZEtleSgiTGVmdCIsICJMZWZ0fEN0cmwtQiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVMZWZ0KGFyZ3MudGltZXMpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdHdvcmRyaWdodCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1TaGlmdC1SaWdodCIsICJPcHRpb24tU2hpZnQtUmlnaHQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRSaWdodCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG93b3JkcmlnaHQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtUmlnaHQiLCAiT3B0aW9uLVJpZ2h0IiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5uYXZpZ2F0ZVdvcmRSaWdodCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdHRvbGluZWVuZCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LVNoaWZ0LVJpZ2h0IiwgIkNvbW1hbmQtU2hpZnQtUmlnaHQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3RvbGluZWVuZCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LVJpZ2h0fEVuZCIsICJDb21tYW5kLVJpZ2h0fEVuZHxDdHJsLUUiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlTGluZUVuZCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInNlbGVjdHJpZ2h0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1SaWdodCIsICJTaGlmdC1SaWdodCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0UmlnaHQoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJnb3RvcmlnaHQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlJpZ2h0IiwgIlJpZ2h0fEN0cmwtRiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVSaWdodChhcmdzLnRpbWVzKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3RwYWdlZG93biIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtUGFnZURvd24iLCAiU2hpZnQtUGFnZURvd24iKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNlbGVjdFBhZ2VEb3duKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAicGFnZWRvd24iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkobnVsbCwgIlBhZ2VEb3duIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zY3JvbGxQYWdlRG93bigpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogImdvdG9wYWdlZG93biIsDQogICAgYmluZEtleTogYmluZEtleSgiUGFnZURvd24iLCAiT3B0aW9uLVBhZ2VEb3dufEN0cmwtViIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ290b1BhZ2VEb3duKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0cGFnZXVwIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1QYWdlVXAiLCAiU2hpZnQtUGFnZVVwIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZWxlY3RQYWdlVXAoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJwYWdldXAiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkobnVsbCwgIlBhZ2VVcCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2Nyb2xsUGFnZVVwKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAiZ290b3BhZ2V1cCIsDQogICAgYmluZEtleTogYmluZEtleSgiUGFnZVVwIiwgIk9wdGlvbi1QYWdlVXAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdvdG9QYWdlVXAoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJzZWxlY3RsaW5lc3RhcnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LUhvbWUiLCAiU2hpZnQtSG9tZSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAic2VsZWN0bGluZWVuZCIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtRW5kIiwgIlNoaWZ0LUVuZCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpOyB9LA0KICAgIHJlYWRPbmx5OiB0cnVlDQp9LCB7DQogICAgbmFtZTogInRvZ2dsZXJlY29yZGluZyIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1BbHQtRSIsICJDb21tYW5kLU9wdGlvbi1FIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5jb21tYW5kcy50b2dnbGVSZWNvcmRpbmcoKTsgfSwNCiAgICByZWFkT25seTogdHJ1ZQ0KfSwgew0KICAgIG5hbWU6ICJyZXBsYXltYWNybyIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1TaGlmdC1FIiwgIkNvbW1hbmQtU2hpZnQtRSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuY29tbWFuZHMucmVwbGF5KGVkaXRvcik7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIHsNCiAgICBuYW1lOiAianVtcHRvbWF0Y2hpbmciLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtUCIsICJDdHJsLVNoaWZ0LVAiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmp1bXBUb01hdGNoaW5nKCk7IH0sDQogICAgcmVhZE9ubHk6IHRydWUNCn0sIA0KDQovLyBjb21tYW5kcyBkaXNhYmxlZCBpbiByZWFkT25seSBtb2RlDQp7DQogICAgbmFtZTogInJlbW92ZWxpbmUiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtRCIsICJDb21tYW5kLUQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZUxpbmVzKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAidG9nZ2xlY29tbWVudCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC03IiwgIkNvbW1hbmQtNyIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IudG9nZ2xlQ29tbWVudExpbmVzKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAicmVwbGFjZSIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1SIiwgIkNvbW1hbmQtT3B0aW9uLUYiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICAgICAgdmFyIG5lZWRsZSA9IHByb21wdCgiRmluZDoiLCBlZGl0b3IuZ2V0Q29weVRleHQoKSk7DQogICAgICAgIGlmICghbmVlZGxlKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBwcm9tcHQoIlJlcGxhY2VtZW50OiIpOw0KICAgICAgICBpZiAoIXJlcGxhY2VtZW50KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICBlZGl0b3IucmVwbGFjZShyZXBsYWNlbWVudCwge25lZWRsZTogbmVlZGxlfSk7DQogICAgfQ0KfSwgew0KICAgIG5hbWU6ICJyZXBsYWNlYWxsIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVIiLCAiQ29tbWFuZC1TaGlmdC1PcHRpb24tRiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgew0KICAgICAgICB2YXIgbmVlZGxlID0gcHJvbXB0KCJGaW5kOiIpOw0KICAgICAgICBpZiAoIW5lZWRsZSkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gcHJvbXB0KCJSZXBsYWNlbWVudDoiKTsNCiAgICAgICAgaWYgKCFyZXBsYWNlbWVudCkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWRpdG9yLnJlcGxhY2VBbGwocmVwbGFjZW1lbnQsIHtuZWVkbGU6IG5lZWRsZX0pOw0KICAgIH0NCn0sIHsNCiAgICBuYW1lOiAidW5kbyIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1aIiwgIkNvbW1hbmQtWiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IudW5kbygpOyB9DQp9LCB7DQogICAgbmFtZTogInJlZG8iLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtWnxDdHJsLVkiLCAiQ29tbWFuZC1TaGlmdC1afENvbW1hbmQtWSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IucmVkbygpOyB9DQp9LCB7DQogICAgbmFtZTogImNvcHlsaW5lc3VwIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUFsdC1VcCIsICJDb21tYW5kLU9wdGlvbi1VcCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuY29weUxpbmVzVXAoKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJtb3ZlbGluZXN1cCIsDQogICAgYmluZEtleTogYmluZEtleSgiQWx0LVVwIiwgIk9wdGlvbi1VcCIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubW92ZUxpbmVzVXAoKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJjb3B5bGluZXNkb3duIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUFsdC1Eb3duIiwgIkNvbW1hbmQtT3B0aW9uLURvd24iKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNvcHlMaW5lc0Rvd24oKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJtb3ZlbGluZXNkb3duIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtRG93biIsICJPcHRpb24tRG93biIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubW92ZUxpbmVzRG93bigpOyB9DQp9LCB7DQogICAgbmFtZTogImRlbCIsDQogICAgYmluZEtleTogYmluZEtleSgiRGVsZXRlIiwgIkRlbGV0ZXxDdHJsLUQiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZSgicmlnaHQiKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJiYWNrc3BhY2UiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoDQogICAgICAgICJDdHJsLUJhY2tzcGFjZXxDb21tYW5kLUJhY2tzcGFjZXxPcHRpb24tQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2UiLA0KICAgICAgICAiQ3RybC1CYWNrc3BhY2V8Q29tbWFuZC1CYWNrc3BhY2V8U2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZXxDdHJsLUgiDQogICAgKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZSgibGVmdCIpOyB9DQp9LCB7DQogICAgbmFtZTogInJlbW92ZXRvbGluZXN0YXJ0IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtQmFja3NwYWNlIiwgIk9wdGlvbi1CYWNrc3BhY2UiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZVRvTGluZVN0YXJ0KCk7IH0NCn0sIHsNCiAgICBuYW1lOiAicmVtb3ZldG9saW5lZW5kIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtRGVsZXRlIiwgIkN0cmwtSyIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IucmVtb3ZlVG9MaW5lRW5kKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAicmVtb3Zld29yZGxlZnQiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtQmFja3NwYWNlIiwgIkFsdC1CYWNrc3BhY2V8Q3RybC1BbHQtQmFja3NwYWNlIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmVXb3JkTGVmdCgpOyB9DQp9LCB7DQogICAgbmFtZTogInJlbW92ZXdvcmRyaWdodCIsDQogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1EZWxldGUiLCAiQWx0LURlbGV0ZSIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IucmVtb3ZlV29yZFJpZ2h0KCk7IH0NCn0sIHsNCiAgICBuYW1lOiAib3V0ZGVudCIsDQogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtVGFiIiwgIlNoaWZ0LVRhYiIpLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuYmxvY2tPdXRkZW50KCk7IH0NCn0sIHsNCiAgICBuYW1lOiAiaW5kZW50IiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJUYWIiLCAiVGFiIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5pbmRlbnQoKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJpbnNlcnRzdHJpbmciLA0KICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgc3RyKSB7IGVkaXRvci5pbnNlcnQoc3RyKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJpbnNlcnR0ZXh0IiwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIGFyZ3MpIHsNCiAgICAgICAgZWRpdG9yLmluc2VydChsYW5nLnN0cmluZ1JlcGVhdChhcmdzLnRleHQgIHx8ICIiLCBhcmdzLnRpbWVzIHx8IDEpKTsNCiAgICB9DQp9LCB7DQogICAgbmFtZTogInNwbGl0bGluZSIsDQogICAgYmluZEtleTogYmluZEtleShudWxsLCAiQ3RybC1PIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zcGxpdExpbmUoKTsgfQ0KfSwgew0KICAgIG5hbWU6ICJ0cmFuc3Bvc2VsZXR0ZXJzIiwNCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVQiLCAiQ3RybC1UIiksDQogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50cmFuc3Bvc2VMZXR0ZXJzKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAidG91cHBlcmNhc2UiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtVSIsICJDdHJsLVUiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnRvVXBwZXJDYXNlKCk7IH0NCn0sIHsNCiAgICBuYW1lOiAidG9sb3dlcmNhc2UiLA0KICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtVSIsICJDdHJsLVNoaWZ0LVUiKSwNCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnRvTG93ZXJDYXNlKCk7IH0NCn1dOw0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbiBET1QgdmllcmVjayBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2VkaXRfc2Vzc2lvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2Uvc2VsZWN0aW9uJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3JhbmdlJywgJ2FjZS9kb2N1bWVudCcsICdhY2UvYmFja2dyb3VuZF90b2tlbml6ZXInLCAnYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nJywgJ2FjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuL2xpYi9sYW5nIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCnZhciBTZWxlY3Rpb24gPSByZXF1aXJlKCIuL3NlbGVjdGlvbiIpLlNlbGVjdGlvbjsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vbW9kZS90ZXh0IikuTW9kZTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBEb2N1bWVudCA9IHJlcXVpcmUoIi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsNCnZhciBCYWNrZ3JvdW5kVG9rZW5pemVyID0gcmVxdWlyZSgiLi9iYWNrZ3JvdW5kX3Rva2VuaXplciIpLkJhY2tncm91bmRUb2tlbml6ZXI7DQoNCnZhciBFZGl0U2Vzc2lvbiA9IGZ1bmN0aW9uKHRleHQsIG1vZGUpIHsNCiAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQogICAgdGhpcy4kYnJlYWtwb2ludHMgPSBbXTsNCiAgICB0aGlzLiRmcm9udE1hcmtlcnMgPSB7fTsNCiAgICB0aGlzLiRiYWNrTWFya2VycyA9IHt9Ow0KICAgIHRoaXMuJG1hcmtlcklkID0gMTsNCiAgICB0aGlzLiRyb3dDYWNoZSA9IFtdOw0KICAgIHRoaXMuJHdyYXBEYXRhID0gW107DQogICAgdGhpcy4kZm9sZERhdGEgPSBbXTsNCiAgICB0aGlzLiR1bmRvU2VsZWN0ID0gdHJ1ZTsNCiAgICB0aGlzLiRmb2xkRGF0YS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc3RyID0gIiI7DQogICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihmb2xkTGluZSkgew0KICAgICAgICAgICAgc3RyICs9ICJcbiIgKyBmb2xkTGluZS50b1N0cmluZygpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHN0cjsNCiAgICB9DQoNCiAgICBpZiAodGV4dCBpbnN0YW5jZW9mIERvY3VtZW50KSB7DQogICAgICAgIHRoaXMuc2V0RG9jdW1lbnQodGV4dCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5zZXREb2N1bWVudChuZXcgRG9jdW1lbnQodGV4dCkpOw0KICAgIH0NCg0KICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbih0aGlzKTsNCiAgICBpZiAobW9kZSkNCiAgICAgICAgdGhpcy5zZXRNb2RlKG1vZGUpOw0KICAgIGVsc2UNCiAgICAgICAgdGhpcy5zZXRNb2RlKG5ldyBUZXh0TW9kZSgpKTsNCn07DQoNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgew0KICAgICAgICBpZiAodGhpcy5kb2MpDQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRvY3VtZW50IGlzIGFscmVhZHkgc2V0Iik7DQoNCiAgICAgICAgdGhpcy5kb2MgPSBkb2M7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpKTsNCiAgICAgICAgdGhpcy5vbigiY2hhbmdlRm9sZCIsIHRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcykpOw0KDQogICAgICAgIGlmICh0aGlzLmJnVG9rZW5pemVyKSB7DQogICAgICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSk7DQogICAgICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jOw0KICAgIH07DQoNCiAgICB0aGlzLiRyZXNldFJvd0NhY2hlID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIGlmIChyb3cgPT0gMCkgew0KICAgICAgICAgICAgdGhpcy4kcm93Q2FjaGUgPSBbXTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgcm93Q2FjaGUgPSB0aGlzLiRyb3dDYWNoZTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDYWNoZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHJvd0NhY2hlW2ldLmRvY1JvdyA+PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3dDYWNoZS5zcGxpY2UoaSwgcm93Q2FjaGUubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vbkNoYW5nZUZvbGQgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBmb2xkID0gZS5kYXRhOw0KICAgICAgICB0aGlzLiRyZXNldFJvd0NhY2hlKGZvbGQuc3RhcnQucm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQoNCiAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZShkZWx0YS5yYW5nZS5zdGFydC5yb3cpOw0KDQogICAgICAgIHZhciByZW1vdmVkRm9sZHMgPSB0aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZShlKTsNCiAgICAgICAgaWYgKCF0aGlzLiRmcm9tVW5kbyAmJiB0aGlzLiR1bmRvTWFuYWdlciAmJiAhZGVsdGEuaWdub3JlKSB7DQogICAgICAgICAgICB0aGlzLiRkZWx0YXNEb2MucHVzaChkZWx0YSk7DQogICAgICAgICAgICBpZiAocmVtb3ZlZEZvbGRzICYmIHJlbW92ZWRGb2xkcy5sZW5ndGggIT0gMCkgew0KICAgICAgICAgICAgICAgIHRoaXMuJGRlbHRhc0ZvbGQucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZUZvbGRzIiwNCiAgICAgICAgICAgICAgICAgICAgZm9sZHM6ICByZW1vdmVkRm9sZHMNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuc2NoZWR1bGUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoZGVsdGEucmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHRoaXMuZG9jLnNldFZhbHVlKHRleHQpOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oMCwgMCk7DQogICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCk7DQoNCiAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTsNCiAgICAgICAgdGhpcy4kZGVsdGFzID0gW107DQogICAgICAgIHRoaXMuJGRlbHRhc0RvYyA9IFtdOw0KICAgICAgICB0aGlzLiRkZWx0YXNGb2xkID0gW107DQogICAgICAgIHRoaXMuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFZhbHVlID0NCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRWYWx1ZSgpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb247DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U3RhdGUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0U3RhdGUocm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUb2tlbnMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFRva2VuQXQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsNCiAgICAgICAgdmFyIHRva2VuLCBjID0gMDsNCiAgICAgICAgaWYgKGNvbHVtbiA9PSBudWxsKSB7DQogICAgICAgICAgICBpID0gdG9rZW5zLmxlbmd0aCAtIDE7DQogICAgICAgICAgICBjID0gdGhpcy5nZXRMaW5lKHJvdykubGVuZ3RoOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBjICs9IHRva2Vuc1tpXS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgaWYgKGMgPj0gY29sdW1uKQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB0b2tlbi5pbmRleCA9IGk7DQogICAgICAgIHRva2VuLnN0YXJ0ID0gYyAtIHRva2VuLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgcmV0dXJuIHRva2VuOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFVuZG9NYW5hZ2VyID0gZnVuY3Rpb24odW5kb01hbmFnZXIpIHsNCiAgICAgICAgdGhpcy4kdW5kb01hbmFnZXIgPSB1bmRvTWFuYWdlcjsNCiAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTsNCiAgICAgICAgdGhpcy4kZGVsdGFzID0gW107DQogICAgICAgIHRoaXMuJGRlbHRhc0RvYyA9IFtdOw0KICAgICAgICB0aGlzLiRkZWx0YXNGb2xkID0gW107DQoNCiAgICAgICAgaWYgKHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyKQ0KICAgICAgICAgICAgdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7DQoNCiAgICAgICAgaWYgKHVuZG9NYW5hZ2VyKSB7DQogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQogICAgICAgICAgICB0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICBzZWxmLiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKTsNCg0KICAgICAgICAgICAgICAgIGlmIChzZWxmLiRkZWx0YXNGb2xkLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICBncm91cDogImZvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFzOiBzZWxmLiRkZWx0YXNGb2xkDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXNGb2xkID0gW107DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHNlbGYuJGRlbHRhc0RvYy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgc2VsZi4kZGVsdGFzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICJkb2MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFzOiBzZWxmLiRkZWx0YXNEb2MNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIHNlbGYuJGRlbHRhc0RvYyA9IFtdOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChzZWxmLiRkZWx0YXMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB1bmRvTWFuYWdlci5leGVjdXRlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogImFjZXVwZGF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbc2VsZi4kZGVsdGFzLCBzZWxmXQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXMgPSBbXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyID0NCiAgICAgICAgICAgICAgICBsYW5nLmRlZmVycmVkQ2FsbCh0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlciA9IHsNCiAgICAgICAgdW5kbzogZnVuY3Rpb24oKSB7fSwNCiAgICAgICAgcmVkbzogZnVuY3Rpb24oKSB7fSwNCiAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5nZXRVbmRvTWFuYWdlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdW5kb01hbmFnZXIgfHwgdGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyOw0KICAgIH0sDQoNCiAgICB0aGlzLmdldFRhYlN0cmluZyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5nZXRVc2VTb2Z0VGFicygpKSB7DQogICAgICAgICAgICByZXR1cm4gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0aGlzLmdldFRhYlNpemUoKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gIlx0IjsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiR1c2VTb2Z0VGFicyA9IHRydWU7DQogICAgdGhpcy5zZXRVc2VTb2Z0VGFicyA9IGZ1bmN0aW9uKHVzZVNvZnRUYWJzKSB7DQogICAgICAgIGlmICh0aGlzLiR1c2VTb2Z0VGFicyA9PT0gdXNlU29mdFRhYnMpIHJldHVybjsNCg0KICAgICAgICB0aGlzLiR1c2VTb2Z0VGFicyA9IHVzZVNvZnRUYWJzOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFVzZVNvZnRUYWJzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR1c2VTb2Z0VGFiczsNCiAgICB9Ow0KDQogICAgdGhpcy4kdGFiU2l6ZSA9IDQ7DQogICAgdGhpcy5zZXRUYWJTaXplID0gZnVuY3Rpb24odGFiU2l6ZSkgew0KICAgICAgICBpZiAoaXNOYU4odGFiU2l6ZSkgfHwgdGhpcy4kdGFiU2l6ZSA9PT0gdGFiU2l6ZSkgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy4kdGFiU2l6ZSA9IHRhYlNpemU7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVRhYlNpemUiKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUYWJTaXplID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR0YWJTaXplOw0KICAgIH07DQoNCiAgICB0aGlzLmlzVGFiU3RvcCA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR1c2VTb2Z0VGFicyAmJiAocG9zaXRpb24uY29sdW1uICUgdGhpcy4kdGFiU2l6ZSA9PSAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kb3ZlcndyaXRlID0gZmFsc2U7DQogICAgdGhpcy5zZXRPdmVyd3JpdGUgPSBmdW5jdGlvbihvdmVyd3JpdGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJG92ZXJ3cml0ZSA9PSBvdmVyd3JpdGUpIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRvdmVyd3JpdGUgPSBvdmVyd3JpdGU7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZU92ZXJ3cml0ZSIpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE92ZXJ3cml0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3ZlcndyaXRlOw0KICAgIH07DQoNCiAgICB0aGlzLnRvZ2dsZU92ZXJ3cml0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNldE92ZXJ3cml0ZSghdGhpcy4kb3ZlcndyaXRlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRCcmVha3BvaW50cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kYnJlYWtwb2ludHM7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0QnJlYWtwb2ludHMgPSBmdW5jdGlvbihyb3dzKSB7DQogICAgICAgIHRoaXMuJGJyZWFrcG9pbnRzID0gW107DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLiRicmVha3BvaW50c1tyb3dzW2ldXSA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIsIHt9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jbGVhckJyZWFrcG9pbnRzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGJyZWFrcG9pbnRzID0gW107DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLCB7fSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0QnJlYWtwb2ludCA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB0aGlzLiRicmVha3BvaW50c1tyb3ddID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIsIHt9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jbGVhckJyZWFrcG9pbnQgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgZGVsZXRlIHRoaXMuJGJyZWFrcG9pbnRzW3Jvd107DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLCB7fSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0QnJlYWtwb2ludHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGJyZWFrcG9pbnRzOw0KICAgIH07DQoNCiAgICB0aGlzLmFkZE1hcmtlciA9IGZ1bmN0aW9uKHJhbmdlLCBjbGF6eiwgdHlwZSwgaW5Gcm9udCkgew0KICAgICAgICB2YXIgaWQgPSB0aGlzLiRtYXJrZXJJZCsrOw0KDQogICAgICAgIHZhciBtYXJrZXIgPSB7DQogICAgICAgICAgICByYW5nZSA6IHJhbmdlLA0KICAgICAgICAgICAgdHlwZSA6IHR5cGUgfHwgImxpbmUiLA0KICAgICAgICAgICAgcmVuZGVyZXI6IHR5cGVvZiB0eXBlID09ICJmdW5jdGlvbiIgPyB0eXBlIDogbnVsbCwNCiAgICAgICAgICAgIGNsYXp6IDogY2xhenosDQogICAgICAgICAgICBpbkZyb250OiAhIWluRnJvbnQNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChpbkZyb250KSB7DQogICAgICAgICAgICB0aGlzLiRmcm9udE1hcmtlcnNbaWRdID0gbWFya2VyOw0KICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlRnJvbnRNYXJrZXIiKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy4kYmFja01hcmtlcnNbaWRdID0gbWFya2VyOw0KICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQmFja01hcmtlciIpDQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaWQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTWFya2VyID0gZnVuY3Rpb24obWFya2VySWQpIHsNCiAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMuJGZyb250TWFya2Vyc1ttYXJrZXJJZF0gfHwgdGhpcy4kYmFja01hcmtlcnNbbWFya2VySWRdOw0KICAgICAgICBpZiAoIW1hcmtlcikNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgbWFya2VycyA9IG1hcmtlci5pbkZyb250ID8gdGhpcy4kZnJvbnRNYXJrZXJzIDogdGhpcy4kYmFja01hcmtlcnM7DQogICAgICAgIGlmIChtYXJrZXIpIHsNCiAgICAgICAgICAgIGRlbGV0ZSAobWFya2Vyc1ttYXJrZXJJZF0pOw0KICAgICAgICAgICAgdGhpcy5fZW1pdChtYXJrZXIuaW5Gcm9udCA/ICJjaGFuZ2VGcm9udE1hcmtlciIgOiAiY2hhbmdlQmFja01hcmtlciIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TWFya2VycyA9IGZ1bmN0aW9uKGluRnJvbnQpIHsNCiAgICAgICAgcmV0dXJuIGluRnJvbnQgPyB0aGlzLiRmcm9udE1hcmtlcnMgOiB0aGlzLiRiYWNrTWFya2VyczsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogRXJyb3I6DQogICAgICogIHsNCiAgICAgKiAgICByb3c6IDEyLA0KICAgICAqICAgIGNvbHVtbjogMiwgLy9jYW4gYmUgdW5kZWZpbmVkDQogICAgICogICAgdGV4dDogIk1pc3NpbmcgYXJndW1lbnQiLA0KICAgICAqICAgIHR5cGU6ICJlcnJvciIgLy8gb3IgIndhcm5pbmciIG9yICJpbmZvIg0KICAgICAqICB9DQogICAgICovDQogICAgdGhpcy5zZXRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKGFubm90YXRpb25zKSB7DQogICAgICAgIHRoaXMuJGFubm90YXRpb25zID0ge307DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsNCiAgICAgICAgICAgIHZhciByb3cgPSBhbm5vdGF0aW9uLnJvdzsNCiAgICAgICAgICAgIGlmICh0aGlzLiRhbm5vdGF0aW9uc1tyb3ddKQ0KICAgICAgICAgICAgICAgIHRoaXMuJGFubm90YXRpb25zW3Jvd10ucHVzaChhbm5vdGF0aW9uKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB0aGlzLiRhbm5vdGF0aW9uc1tyb3ddID0gW2Fubm90YXRpb25dOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUFubm90YXRpb24iLCB7fSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0QW5ub3RhdGlvbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGFubm90YXRpb25zIHx8IHt9Ow0KICAgIH07DQoNCiAgICB0aGlzLmNsZWFyQW5ub3RhdGlvbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kYW5ub3RhdGlvbnMgPSB7fTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQW5ub3RhdGlvbiIsIHt9KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZGV0ZWN0TmV3TGluZSA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhccj9cbikvbSk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSBtYXRjaFsxXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldFdvcmRSYW5nZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBsaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQoNCiAgICAgICAgdmFyIGluVG9rZW4gPSBmYWxzZTsNCiAgICAgICAgaWYgKGNvbHVtbiA+IDApIHsNCiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbiAtIDEpLm1hdGNoKHRoaXMudG9rZW5SZSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWluVG9rZW4pIHsNCiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbikubWF0Y2godGhpcy50b2tlblJlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByZSA9IGluVG9rZW4gPyB0aGlzLnRva2VuUmUgOiB0aGlzLm5vblRva2VuUmU7DQoNCiAgICAgICAgdmFyIHN0YXJ0ID0gY29sdW1uOw0KICAgICAgICBpZiAoc3RhcnQgPiAwKSB7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgc3RhcnQtLTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdoaWxlIChzdGFydCA+PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KS5tYXRjaChyZSkpOw0KICAgICAgICAgICAgc3RhcnQrKzsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBlbmQgPSBjb2x1bW47DQogICAgICAgIHdoaWxlIChlbmQgPCBsaW5lLmxlbmd0aCAmJiBsaW5lLmNoYXJBdChlbmQpLm1hdGNoKHJlKSkgew0KICAgICAgICAgICAgZW5kKys7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJvdywgc3RhcnQsIHJvdywgZW5kKTsNCiAgICB9Ow0KDQogICAgLy8gR2V0cyB0aGUgcmFuZ2Ugb2YgYSB3b3JkIGluY2x1ZGluZyBpdHMgcmlnaHQgd2hpdGVzcGFjZQ0KICAgIHRoaXMuZ2V0QVdvcmRSYW5nZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciB3b3JkUmFuZ2UgPSB0aGlzLmdldFdvcmRSYW5nZShyb3csIGNvbHVtbik7DQogICAgICAgIHZhciBsaW5lID0gdGhpcy5nZXRMaW5lKHdvcmRSYW5nZS5lbmQucm93KTsNCg0KICAgICAgICB3aGlsZSAobGluZS5jaGFyQXQod29yZFJhbmdlLmVuZC5jb2x1bW4pLm1hdGNoKC9bIFx0XS8pKSB7DQogICAgICAgICAgICB3b3JkUmFuZ2UuZW5kLmNvbHVtbiArPSAxOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB3b3JkUmFuZ2U7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbihuZXdMaW5lTW9kZSkgew0KICAgICAgICB0aGlzLmRvYy5zZXROZXdMaW5lTW9kZShuZXdMaW5lTW9kZSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCk7DQogICAgfTsNCg0KICAgIHRoaXMuJHVzZVdvcmtlciA9IHRydWU7DQogICAgdGhpcy5zZXRVc2VXb3JrZXIgPSBmdW5jdGlvbih1c2VXb3JrZXIpIHsNCiAgICAgICAgaWYgKHRoaXMuJHVzZVdvcmtlciA9PSB1c2VXb3JrZXIpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kdXNlV29ya2VyID0gdXNlV29ya2VyOw0KDQogICAgICAgIHRoaXMuJHN0b3BXb3JrZXIoKTsNCiAgICAgICAgaWYgKHVzZVdvcmtlcikNCiAgICAgICAgICAgIHRoaXMuJHN0YXJ0V29ya2VyKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VXNlV29ya2VyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR1c2VXb3JrZXI7DQogICAgfTsNCg0KICAgIHRoaXMub25SZWxvYWRUb2tlbml6ZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciByb3dzID0gZS5kYXRhOw0KICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KHJvd3MuZmlyc3QpOw0KICAgICAgICB0aGlzLl9lbWl0KCJ0b2tlbml6ZXJVcGRhdGUiLCBlKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kbW9kZSA9IG51bGw7DQogICAgdGhpcy5zZXRNb2RlID0gZnVuY3Rpb24obW9kZSkgew0KICAgICAgICBpZiAodGhpcy4kbW9kZSA9PT0gbW9kZSkgcmV0dXJuOw0KICAgICAgICB0aGlzLiRtb2RlID0gbW9kZTsNCg0KICAgICAgICB0aGlzLiRzdG9wV29ya2VyKCk7DQoNCiAgICAgICAgaWYgKHRoaXMuJHVzZVdvcmtlcikNCiAgICAgICAgICAgIHRoaXMuJHN0YXJ0V29ya2VyKCk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplciA9IG1vZGUuZ2V0VG9rZW5pemVyKCk7DQoNCiAgICAgICAgaWYodG9rZW5pemVyLmFkZEV2ZW50TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgdmFyIG9uUmVsb2FkVG9rZW5pemVyID0gdGhpcy5vblJlbG9hZFRva2VuaXplci5iaW5kKHRoaXMpOw0KICAgICAgICAgICAgdG9rZW5pemVyLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIsIG9uUmVsb2FkVG9rZW5pemVyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghdGhpcy5iZ1Rva2VuaXplcikgew0KICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplciA9IG5ldyBCYWNrZ3JvdW5kVG9rZW5pemVyKHRva2VuaXplcik7DQogICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQoInRva2VuaXplclVwZGF0ZSIsIGUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnNldFRva2VuaXplcih0b2tlbml6ZXIpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpOw0KICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApOw0KDQogICAgICAgIHRoaXMudG9rZW5SZSA9IG1vZGUudG9rZW5SZTsNCiAgICAgICAgdGhpcy5ub25Ub2tlblJlID0gbW9kZS5ub25Ub2tlblJlOw0KDQogICAgICAgIHRoaXMuJHNldEZvbGRpbmcobW9kZS5mb2xkaW5nUnVsZXMpOw0KDQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kc3RvcFdvcmtlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy4kd29ya2VyKQ0KICAgICAgICAgICAgdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpOw0KDQogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuJHN0YXJ0V29ya2VyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0eXBlb2YgV29ya2VyICE9PSAidW5kZWZpbmVkIiAmJiAhcmVxdWlyZS5ub1dvcmtlcikgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB0aGlzLiR3b3JrZXIgPSB0aGlzLiRtb2RlLmNyZWF0ZVdvcmtlcih0aGlzKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQ291bGQgbm90IGxvYWQgd29ya2VyIik7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgICAgICAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG1vZGU7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRzY3JvbGxUb3AgPSAwOw0KICAgIHRoaXMuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24oc2Nyb2xsVG9wKSB7DQogICAgICAgIHNjcm9sbFRvcCA9IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgc2Nyb2xsVG9wKSk7DQogICAgICAgIGlmICh0aGlzLiRzY3JvbGxUb3AgPT09IHNjcm9sbFRvcCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRzY3JvbGxUb3AgPSBzY3JvbGxUb3A7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNjcm9sbFRvcCIsIHNjcm9sbFRvcCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRzY3JvbGxUb3A7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRzY3JvbGxMZWZ0ID0gMDsNCiAgICB0aGlzLnNldFNjcm9sbExlZnQgPSBmdW5jdGlvbihzY3JvbGxMZWZ0KSB7DQogICAgICAgIHNjcm9sbExlZnQgPSBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIHNjcm9sbExlZnQpKTsNCiAgICAgICAgaWYgKHRoaXMuJHNjcm9sbExlZnQgPT09IHNjcm9sbExlZnQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNjcm9sbExlZnQiLCBzY3JvbGxMZWZ0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRzY3JvbGxMZWZ0Ow0KICAgIH07DQoNCiAgICB0aGlzLmdldFdpZHRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGNvbXB1dGVXaWR0aCgpOw0KICAgICAgICByZXR1cm4gdGhpcy53aWR0aDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTY3JlZW5XaWR0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRjb21wdXRlV2lkdGgoKTsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2NyZWVuV2lkdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGNvbXB1dGVXaWR0aCA9IGZ1bmN0aW9uKGZvcmNlKSB7DQogICAgICAgIGlmICh0aGlzLiRtb2RpZmllZCB8fCBmb3JjZSkgew0KICAgICAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSBmYWxzZTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5kb2MuZ2V0QWxsTGluZXMoKTsNCiAgICAgICAgICAgIHZhciBsb25nZXN0TGluZSA9IDA7DQogICAgICAgICAgICB2YXIgbG9uZ2VzdFNjcmVlbkxpbmUgPSAwOw0KDQogICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUoaSksDQogICAgICAgICAgICAgICAgICAgIGxpbmUsIGxlbjsNCg0KICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZCA9IGZvbGRMaW5lLnJhbmdlLmVuZDsNCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGZvbGRMaW5lKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgYWZ0ZXIgdGhlIGZvbGRMaW5lLmVuZC5yb3cuIEFsbCB0aGUgbGluZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBhcmUgZm9sZGVkLg0KICAgICAgICAgICAgICAgICAgICBpID0gZW5kLnJvdzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGVuID0gbGluZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgbG9uZ2VzdExpbmUgPSBNYXRoLm1heChsb25nZXN0TGluZSwgbGVuKTsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICAgICAgICAgIGxvbmdlc3RTY3JlZW5MaW5lID0gTWF0aC5tYXgoDQogICAgICAgICAgICAgICAgICAgICAgICBsb25nZXN0U2NyZWVuTGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKGxpbmUpWzBdDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy53aWR0aCA9IGxvbmdlc3RMaW5lOw0KDQogICAgICAgICAgICBpZiAodGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNjcmVlbldpZHRoID0gdGhpcy4kd3JhcExpbWl0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNjcmVlbldpZHRoID0gbG9uZ2VzdFNjcmVlbkxpbmU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogR2V0IGEgdmVyYmF0aW0gY29weSBvZiB0aGUgZ2l2ZW4gbGluZSBhcyBpdCBpcyBpbiB0aGUgZG9jdW1lbnQNCiAgICAgKi8NCiAgICB0aGlzLmdldExpbmUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldExpbmUocm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRMaW5lcyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRMZW5ndGgoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUZXh0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MuaW5zZXJ0KHBvc2l0aW9uLCB0ZXh0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MucmVtb3ZlKHJhbmdlKTsNCiAgICB9Ow0KDQogICAgdGhpcy51bmRvQ2hhbmdlcyA9IGZ1bmN0aW9uKGRlbHRhcywgZG9udFNlbGVjdCkgew0KICAgICAgICBpZiAoIWRlbHRhcy5sZW5ndGgpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kZnJvbVVuZG8gPSB0cnVlOw0KICAgICAgICB2YXIgbGFzdFVuZG9SYW5nZSA9IG51bGw7DQogICAgICAgIGZvciAodmFyIGkgPSBkZWx0YXMubGVuZ3RoIC0gMTsgaSAhPSAtMTsgaS0tKSB7DQogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07DQogICAgICAgICAgICBpZiAoZGVsdGEuZ3JvdXAgPT0gImRvYyIpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRvYy5yZXZlcnREZWx0YXMoZGVsdGEuZGVsdGFzKTsNCiAgICAgICAgICAgICAgICBsYXN0VW5kb1JhbmdlID0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihkZWx0YS5kZWx0YXMsIHRydWUsIGxhc3RVbmRvUmFuZ2UpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBkZWx0YS5kZWx0YXMuZm9yRWFjaChmdW5jdGlvbihmb2xkRGVsdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRGb2xkcyhmb2xkRGVsdGEuZm9sZHMpOw0KICAgICAgICAgICAgICAgIH0sIHRoaXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuJGZyb21VbmRvID0gZmFsc2U7DQogICAgICAgIGxhc3RVbmRvUmFuZ2UgJiYNCiAgICAgICAgICAgIHRoaXMuJHVuZG9TZWxlY3QgJiYNCiAgICAgICAgICAgICFkb250U2VsZWN0ICYmDQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShsYXN0VW5kb1JhbmdlKTsNCiAgICAgICAgcmV0dXJuIGxhc3RVbmRvUmFuZ2U7DQogICAgfTsNCg0KICAgIHRoaXMucmVkb0NoYW5nZXMgPSBmdW5jdGlvbihkZWx0YXMsIGRvbnRTZWxlY3QpIHsNCiAgICAgICAgaWYgKCFkZWx0YXMubGVuZ3RoKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJGZyb21VbmRvID0gdHJ1ZTsNCiAgICAgICAgdmFyIGxhc3RVbmRvUmFuZ2UgPSBudWxsOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KICAgICAgICAgICAgaWYgKGRlbHRhLmdyb3VwID09ICJkb2MiKSB7DQogICAgICAgICAgICAgICAgdGhpcy5kb2MuYXBwbHlEZWx0YXMoZGVsdGEuZGVsdGFzKTsNCiAgICAgICAgICAgICAgICBsYXN0VW5kb1JhbmdlID0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihkZWx0YS5kZWx0YXMsIGZhbHNlLCBsYXN0VW5kb1JhbmdlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRmcm9tVW5kbyA9IGZhbHNlOw0KICAgICAgICBsYXN0VW5kb1JhbmdlICYmDQogICAgICAgICAgICB0aGlzLiR1bmRvU2VsZWN0ICYmDQogICAgICAgICAgICAhZG9udFNlbGVjdCAmJg0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobGFzdFVuZG9SYW5nZSk7DQogICAgICAgIHJldHVybiBsYXN0VW5kb1JhbmdlOw0KICAgIH07DQogICAgDQogICAgdGhpcy5zZXRVbmRvU2VsZWN0ID0gZnVuY3Rpb24oZW5hYmxlKSB7DQogICAgICAgIHRoaXMuJHVuZG9TZWxlY3QgPSBlbmFibGU7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldFVuZG9TZWxlY3Rpb24gPSBmdW5jdGlvbihkZWx0YXMsIGlzVW5kbywgbGFzdFVuZG9SYW5nZSkgew0KICAgICAgICBmdW5jdGlvbiBpc0luc2VydChkZWx0YSkgew0KICAgICAgICAgICAgdmFyIGluc2VydCA9DQogICAgICAgICAgICAgICAgZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IiB8fCBkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIjsNCiAgICAgICAgICAgIHJldHVybiBpc1VuZG8gPyAhaW5zZXJ0IDogaW5zZXJ0Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzWzBdOw0KICAgICAgICB2YXIgcmFuZ2UsIHBvaW50Ow0KICAgICAgICB2YXIgbGFzdERlbHRhSXNJbnNlcnQgPSBmYWxzZTsNCiAgICAgICAgaWYgKGlzSW5zZXJ0KGRlbHRhKSkgew0KICAgICAgICAgICAgcmFuZ2UgPSBkZWx0YS5yYW5nZS5jbG9uZSgpOw0KICAgICAgICAgICAgbGFzdERlbHRhSXNJbnNlcnQgPSB0cnVlOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5zdGFydCk7DQogICAgICAgICAgICBsYXN0RGVsdGFJc0luc2VydCA9IGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGRlbHRhID0gZGVsdGFzW2ldOw0KICAgICAgICAgICAgaWYgKGlzSW5zZXJ0KGRlbHRhKSkgew0KICAgICAgICAgICAgICAgIHBvaW50ID0gZGVsdGEucmFuZ2Uuc3RhcnQ7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmUocG9pbnQucm93LCBwb2ludC5jb2x1bW4pID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGRlbHRhLnJhbmdlLnN0YXJ0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcG9pbnQgPSBkZWx0YS5yYW5nZS5lbmQ7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmUocG9pbnQucm93LCBwb2ludC5jb2x1bW4pID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGRlbHRhLnJhbmdlLmVuZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGxhc3REZWx0YUlzSW5zZXJ0ID0gdHJ1ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcG9pbnQgPSBkZWx0YS5yYW5nZS5zdGFydDsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29tcGFyZShwb2ludC5yb3csIHBvaW50LmNvbHVtbikgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPQ0KICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2Uuc3RhcnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsYXN0RGVsdGFJc0luc2VydCA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByYW5nZSBhbmQgdGhlIGxhc3QgdW5kbyByYW5nZSBoYXMgc29tZXRoaW5nIGluIGNvbW1vbi4NCiAgICAgICAgLy8gSWYgdHJ1ZSwgbWVyZ2UgdGhlIHJhbmdlcy4NCiAgICAgICAgaWYgKGxhc3RVbmRvUmFuZ2UgIT0gbnVsbCkgew0KICAgICAgICAgICAgdmFyIGNtcCA9IGxhc3RVbmRvUmFuZ2UuY29tcGFyZVJhbmdlKHJhbmdlKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGxhc3RVbmRvUmFuZ2Uuc3RhcnQpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQobGFzdFVuZG9SYW5nZS5lbmQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgIH0sDQoNCiAgICB0aGlzLnJlcGxhY2UgPSBmdW5jdGlvbihyYW5nZSwgdGV4dCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2MucmVwbGFjZShyYW5nZSwgdGV4dCk7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIE1vdmUgYSByYW5nZSBvZiB0ZXh0IGZyb20gdGhlIGdpdmVuIHJhbmdlIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBmcm9tUmFuZ2Uge1JhbmdlfSBUaGUgcmFuZ2Ugb2YgdGV4dCB5b3Ugd2FudCBtb3ZlZCB3aXRoaW4gdGhlDQogICAgICogZG9jdW1lbnQuDQogICAgICogQHBhcmFtIHRvUG9zaXRpb24ge09iamVjdH0gVGhlIGxvY2F0aW9uIChyb3cgYW5kIGNvbHVtbikgd2hlcmUgeW91IHdhbnQNCiAgICAgKiB0byBtb3ZlIHRoZSB0ZXh0IHRvLg0KICAgICAqIEByZXR1cm4ge1JhbmdlfSBUaGUgbmV3IHJhbmdlIHdoZXJlIHRoZSB0ZXh0IHdhcyBtb3ZlZCB0by4NCiAgICAgKi8NCiAgICB0aGlzLm1vdmVUZXh0ID0gZnVuY3Rpb24oZnJvbVJhbmdlLCB0b1Bvc2l0aW9uKSB7DQogICAgICAgIHZhciB0ZXh0ID0gdGhpcy5nZXRUZXh0UmFuZ2UoZnJvbVJhbmdlKTsNCiAgICAgICAgdGhpcy5yZW1vdmUoZnJvbVJhbmdlKTsNCg0KICAgICAgICB2YXIgdG9Sb3cgPSB0b1Bvc2l0aW9uLnJvdzsNCiAgICAgICAgdmFyIHRvQ29sdW1uID0gdG9Qb3NpdGlvbi5jb2x1bW47DQoNCiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgaW5zZXJ0IGxvY2F0aW9uLCB3aGVuIHRleHQgaXMgcmVtb3ZlZCBpbg0KICAgICAgICAvLyBmcm9udCBvZiB0aGUgY2hvc2VuIHBvaW50IG9mIGluc2VydGlvbi4NCiAgICAgICAgaWYgKCFmcm9tUmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBmcm9tUmFuZ2Uuc3RhcnQucm93ID09IHRvUm93ICYmDQogICAgICAgICAgICBmcm9tUmFuZ2UuZW5kLmNvbHVtbiA8IHRvQ29sdW1uKQ0KICAgICAgICAgICAgdG9Db2x1bW4gLT0gdGV4dC5sZW5ndGg7DQoNCiAgICAgICAgaWYgKGZyb21SYW5nZS5pc011bHRpTGluZSgpICYmIGZyb21SYW5nZS5lbmQucm93IDwgdG9Sb3cpIHsNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMuZG9jLiRzcGxpdCh0ZXh0KTsNCiAgICAgICAgICAgIHRvUm93IC09IGxpbmVzLmxlbmd0aCAtIDE7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZW5kUm93ID0gdG9Sb3cgKyBmcm9tUmFuZ2UuZW5kLnJvdyAtIGZyb21SYW5nZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBlbmRDb2x1bW4gPSBmcm9tUmFuZ2UuaXNNdWx0aUxpbmUoKSA/DQogICAgICAgICAgICAgICAgICAgICAgICBmcm9tUmFuZ2UuZW5kLmNvbHVtbiA6DQogICAgICAgICAgICAgICAgICAgICAgICB0b0NvbHVtbiArIGZyb21SYW5nZS5lbmQuY29sdW1uIC0gZnJvbVJhbmdlLnN0YXJ0LmNvbHVtbjsNCg0KICAgICAgICB2YXIgdG9SYW5nZSA9IG5ldyBSYW5nZSh0b1JvdywgdG9Db2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCg0KICAgICAgICB0aGlzLmluc2VydCh0b1JhbmdlLnN0YXJ0LCB0ZXh0KTsNCg0KICAgICAgICByZXR1cm4gdG9SYW5nZTsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRSb3dzID0gZnVuY3Rpb24oc3RhcnRSb3csIGVuZFJvdywgaW5kZW50U3RyaW5nKSB7DQogICAgICAgIGluZGVudFN0cmluZyA9IGluZGVudFN0cmluZy5yZXBsYWNlKC9cdC9nLCB0aGlzLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgZm9yICh2YXIgcm93PXN0YXJ0Um93OyByb3c8PWVuZFJvdzsgcm93KyspDQogICAgICAgICAgICB0aGlzLmluc2VydCh7cm93OiByb3csIGNvbHVtbjowfSwgaW5kZW50U3RyaW5nKTsNCiAgICB9Ow0KDQogICAgdGhpcy5vdXRkZW50Um93cyA9IGZ1bmN0aW9uIChyYW5nZSkgew0KICAgICAgICB2YXIgcm93UmFuZ2UgPSByYW5nZS5jb2xsYXBzZVJvd3MoKTsNCiAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0VGFiU2l6ZSgpOw0KDQogICAgICAgIGZvciAodmFyIGkgPSByb3dSYW5nZS5zdGFydC5yb3c7IGkgPD0gcm93UmFuZ2UuZW5kLnJvdzsgKytpKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShpKTsNCg0KICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOw0KICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyArK2opDQogICAgICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KGopICE9ICcgJykNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBpZiAoaiA8IHNpemUgJiYgbGluZS5jaGFyQXQoaikgPT0gJ1x0Jykgew0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LmNvbHVtbiA9IGo7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IGogKyAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5jb2x1bW4gPSAwOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBqOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5yZW1vdmUoZGVsZXRlUmFuZ2UpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUxpbmVzVXAgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICBpZiAoZmlyc3RSb3cgPD0gMCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIHJlbW92ZWQgPSB0aGlzLmRvYy5yZW1vdmVMaW5lcyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIHRoaXMuZG9jLmluc2VydExpbmVzKGZpcnN0Um93IC0gMSwgcmVtb3ZlZCk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlTGluZXNEb3duID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKGxhc3RSb3cgPj0gdGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIHJlbW92ZWQgPSB0aGlzLmRvYy5yZW1vdmVMaW5lcyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIHRoaXMuZG9jLmluc2VydExpbmVzKGZpcnN0Um93KzEsIHJlbW92ZWQpOw0KICAgICAgICByZXR1cm4gMTsNCiAgICB9Ow0KDQogICAgdGhpcy5kdXBsaWNhdGVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciBmaXJzdFJvdyA9IHRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KGZpcnN0Um93KTsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSB0aGlzLiRjbGlwUm93VG9Eb2N1bWVudChsYXN0Um93KTsNCg0KICAgICAgICB2YXIgbGluZXMgPSB0aGlzLmdldExpbmVzKGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICAgICAgdGhpcy5kb2MuaW5zZXJ0TGluZXMoZmlyc3RSb3csIGxpbmVzKTsNCg0KICAgICAgICB2YXIgYWRkZWRSb3dzID0gbGFzdFJvdyAtIGZpcnN0Um93ICsgMTsNCiAgICAgICAgcmV0dXJuIGFkZGVkUm93czsNCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHJvdywgdGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSkpOw0KICAgIH07DQoNCiAgICB0aGlzLiRjbGlwQ29sdW1uVG9Sb3cgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAoY29sdW1uIDwgMCkNCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShyb3cpLmxlbmd0aCwgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbik7DQoNCiAgICAgICAgaWYgKHJvdyA8IDApIHsNCiAgICAgICAgICAgIHJvdyA9IDA7DQogICAgICAgICAgICBjb2x1bW4gPSAwOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZG9jLmdldExlbmd0aCgpOw0KICAgICAgICAgICAgaWYgKHJvdyA+PSBsZW4pIHsNCiAgICAgICAgICAgICAgICByb3cgPSBsZW4gLSAxOw0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuZG9jLmdldExpbmUobGVuLTEpLmxlbmd0aDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShyb3cpLmxlbmd0aCwgY29sdW1uKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgIGNvbHVtbjogY29sdW1uDQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDwgMCkgew0KICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93ID0gMDsNCiAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbiA9IDANCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbiA9IHRoaXMuJGNsaXBDb2x1bW5Ub1JvdygNCiAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5yb3csDQogICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICB2YXIgbGVuID0gdGhpcy5kb2MuZ2V0TGVuZ3RoKCkgLSAxOw0KICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA+IGxlbikgew0KICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdyA9IGxlbjsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSB0aGlzLmRvYy5nZXRMaW5lKGxlbikubGVuZ3RoOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiA9IHRoaXMuJGNsaXBDb2x1bW5Ub1JvdygNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQucm93LA0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4NCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgIH07DQoNCiAgICAvLyBXUkFQTU9ERQ0KICAgIHRoaXMuJHdyYXBMaW1pdCA9IDgwOw0KICAgIHRoaXMuJHVzZVdyYXBNb2RlID0gZmFsc2U7DQogICAgdGhpcy4kd3JhcExpbWl0UmFuZ2UgPSB7DQogICAgICAgIG1pbiA6IG51bGwsDQogICAgICAgIG1heCA6IG51bGwNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRVc2VXcmFwTW9kZSA9IGZ1bmN0aW9uKHVzZVdyYXBNb2RlKSB7DQogICAgICAgIGlmICh1c2VXcmFwTW9kZSAhPSB0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgdGhpcy4kdXNlV3JhcE1vZGUgPSB1c2VXcmFwTW9kZTsNCiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMuJHJlc2V0Um93Q2FjaGUoMCk7DQoNCiAgICAgICAgICAgIC8vIElmIHdyYXBNb2RlIGlzIGFjdGl2YWVkLCB0aGUgd3JhcERhdGEgYXJyYXkgaGFzIHRvIGJlIGluaXRpYWxpemVkLg0KICAgICAgICAgICAgaWYgKHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgICAgICAgICAgdGhpcy4kd3JhcERhdGEgPSBbXTsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuJHdyYXBEYXRhLnB1c2goW10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLCBsZW4gLSAxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlV3JhcE1vZGUiKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldFVzZVdyYXBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR1c2VXcmFwTW9kZTsNCiAgICB9Ow0KDQogICAgLy8gQWxsb3cgdGhlIHdyYXAgbGltaXQgdG8gbW92ZSBmcmVlbHkgYmV0d2VlbiBtaW4gYW5kIG1heC4gRWl0aGVyDQogICAgLy8gcGFyYW1ldGVyIGNhbiBiZSBudWxsIHRvIGFsbG93IHRoZSB3cmFwIGxpbWl0IHRvIGJlIHVuY29uc3RyYWluZWQNCiAgICAvLyBpbiB0aGF0IGRpcmVjdGlvbi4gT3Igc2V0IGJvdGggcGFyYW1ldGVycyB0byB0aGUgc2FtZSBudW1iZXIgdG8gcGluDQogICAgLy8gdGhlIGxpbWl0IHRvIHRoYXQgdmFsdWUuDQogICAgdGhpcy5zZXRXcmFwTGltaXRSYW5nZSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7DQogICAgICAgIGlmICh0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4gIT09IG1pbiB8fCB0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXggIT09IG1heCkgew0KICAgICAgICAgICAgdGhpcy4kd3JhcExpbWl0UmFuZ2UubWluID0gbWluOw0KICAgICAgICAgICAgdGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4ID0gbWF4Ow0KICAgICAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOw0KICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIGEgcmVjYWxjdWxhdGlvbiBvZiB0aGUgd3JhcCBsaW1pdA0KICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlV3JhcE1vZGUiKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBUaGlzIHNob3VsZCBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgYnkgdGhlIHJlbmRlcmVyIHdoZW4gYSByZXNpemUNCiAgICAvLyBpcyBkZXRlY3RlZC4NCiAgICB0aGlzLmFkanVzdFdyYXBMaW1pdCA9IGZ1bmN0aW9uKGRlc2lyZWRMaW1pdCkgew0KICAgICAgICB2YXIgd3JhcExpbWl0ID0gdGhpcy4kY29uc3RyYWluV3JhcExpbWl0KGRlc2lyZWRMaW1pdCk7DQogICAgICAgIGlmICh3cmFwTGltaXQgIT0gdGhpcy4kd3JhcExpbWl0ICYmIHdyYXBMaW1pdCA+IDApIHsNCiAgICAgICAgICAgIHRoaXMuJHdyYXBMaW1pdCA9IHdyYXBMaW1pdDsNCiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsNCiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsNCiAgICAgICAgICAgICAgICB0aGlzLiRyZXNldFJvd0NhY2hlKDApDQogICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlV3JhcExpbWl0Iik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCg0KICAgIHRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdCA9IGZ1bmN0aW9uKHdyYXBMaW1pdCkgew0KICAgICAgICB2YXIgbWluID0gdGhpcy4kd3JhcExpbWl0UmFuZ2UubWluOw0KICAgICAgICBpZiAobWluKQ0KICAgICAgICAgICAgd3JhcExpbWl0ID0gTWF0aC5tYXgobWluLCB3cmFwTGltaXQpOw0KDQogICAgICAgIHZhciBtYXggPSB0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXg7DQogICAgICAgIGlmIChtYXgpDQogICAgICAgICAgICB3cmFwTGltaXQgPSBNYXRoLm1pbihtYXgsIHdyYXBMaW1pdCk7DQoNCiAgICAgICAgLy8gV2hhdCB3b3VsZCBhIGxpbWl0IG9mIDAgZXZlbiBtZWFuPw0KICAgICAgICByZXR1cm4gTWF0aC5tYXgoMSwgd3JhcExpbWl0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRXcmFwTGltaXQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHdyYXBMaW1pdDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRXcmFwTGltaXRSYW5nZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAvLyBBdm9pZCB1bmV4cGVjdGVkIG11dGF0aW9uIGJ5IHJldHVybmluZyBhIGNvcHkNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIG1pbiA6IHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbiwNCiAgICAgICAgICAgIG1heCA6IHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heA0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIHVzZVdyYXBNb2RlID0gdGhpcy4kdXNlV3JhcE1vZGU7DQogICAgICAgIHZhciBsZW47DQogICAgICAgIHZhciBhY3Rpb24gPSBlLmRhdGEuYWN0aW9uOw0KICAgICAgICB2YXIgZmlyc3RSb3cgPSBlLmRhdGEucmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICB2YXIgbGFzdFJvdyA9IGUuZGF0YS5yYW5nZS5lbmQucm93Ow0KICAgICAgICB2YXIgc3RhcnQgPSBlLmRhdGEucmFuZ2Uuc3RhcnQ7DQogICAgICAgIHZhciBlbmQgPSBlLmRhdGEucmFuZ2UuZW5kOw0KICAgICAgICB2YXIgcmVtb3ZlZEZvbGRzID0gbnVsbDsNCg0KICAgICAgICBpZiAoYWN0aW9uLmluZGV4T2YoIkxpbmVzIikgIT0gLTEpIHsNCiAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gImluc2VydExpbmVzIikgew0KICAgICAgICAgICAgICAgIGxhc3RSb3cgPSBmaXJzdFJvdyArIChlLmRhdGEubGluZXMubGVuZ3RoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbGFzdFJvdyA9IGZpcnN0Um93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGVuID0gZS5kYXRhLmxpbmVzID8gZS5kYXRhLmxpbmVzLmxlbmd0aCA6IGxhc3RSb3cgLSBmaXJzdFJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGxlbiA9IGxhc3RSb3cgLSBmaXJzdFJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChsZW4gIT0gMCkgew0KICAgICAgICAgICAgaWYgKGFjdGlvbi5pbmRleE9mKCJyZW1vdmUiKSAhPSAtMSkgew0KICAgICAgICAgICAgICAgIHVzZVdyYXBNb2RlICYmIHRoaXMuJHdyYXBEYXRhLnNwbGljZShmaXJzdFJvdywgbGVuKTsNCg0KICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsNCiAgICAgICAgICAgICAgICByZW1vdmVkRm9sZHMgPSB0aGlzLmdldEZvbGRzSW5SYW5nZShlLmRhdGEucmFuZ2UpOw0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9sZHMocmVtb3ZlZEZvbGRzKTsNCg0KICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUoZW5kLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7DQogICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lKSB7DQogICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lLmFkZFJlbW92ZUNoYXJzKGVuZC5yb3csIGVuZC5jb2x1bW4sIHN0YXJ0LmNvbHVtbiAtIGVuZC5jb2x1bW4pOw0KICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdygtbGVuKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmVCZWZvcmUgPSB0aGlzLmdldEZvbGRMaW5lKGZpcnN0Um93KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lQmVmb3JlICYmIGZvbGRMaW5lQmVmb3JlICE9PSBmb2xkTGluZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmVCZWZvcmUubWVyZ2UoZm9sZExpbmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUgPSBmb2xkTGluZUJlZm9yZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZHggPSBmb2xkTGluZXMuaW5kZXhPZihmb2xkTGluZSkgKyAxOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGZvciAoaWR4OyBpZHggPCBmb2xkTGluZXMubGVuZ3RoOyBpZHgrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkTGluZXNbaWR4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lLnN0YXJ0LnJvdyA+PSBlbmQucm93KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdygtbGVuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGxhc3RSb3cgPSBmaXJzdFJvdzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGFyZ3M7DQogICAgICAgICAgICAgICAgaWYgKHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbZmlyc3RSb3csIDBdOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzLnB1c2goW10pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLiR3cmFwRGF0YS5zcGxpY2UuYXBwbHkodGhpcy4kd3JhcERhdGEsIGFyZ3MpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIElmIHNvbWUgbmV3IGxpbmUgaXMgYWRkZWQgaW5zaWRlIG9mIGEgZm9sZExpbmUsIHRoZW4gc3BsaXQNCiAgICAgICAgICAgICAgICAvLyB0aGUgZm9sZCBsaW5lIHVwLg0KICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsNCiAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldEZvbGRMaW5lKGZpcnN0Um93KTsNCiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gMDsNCiAgICAgICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNtcCA9IGZvbGRMaW5lLnJhbmdlLmNvbXBhcmVJbnNpZGUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pDQogICAgICAgICAgICAgICAgICAgIC8vIEluc2lkZSBvZiB0aGUgZm9sZExpbmUgcmFuZ2UuIE5lZWQgdG8gc3BsaXQgc3R1ZmYgdXAuDQogICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUgPSBmb2xkTGluZS5zcGxpdChzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdyhsZW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJvdywgMCwgZW5kLmNvbHVtbiAtIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICAgICAvLyBJbmZyb250IG9mIHRoZSBmb2xkTGluZSBidXQgc2FtZSByb3cuIE5lZWQgdG8gc2hpZnQgY29sdW1uLg0KICAgICAgICAgICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5hZGRSZW1vdmVDaGFycyhmaXJzdFJvdywgMCwgZW5kLmNvbHVtbiAtIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdyhsZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGluc2VydCBpcyBhZnRlciB0aGUgZm9sZExpbmUuDQogICAgICAgICAgICAgICAgICAgIGlkeCA9IGZvbGRMaW5lcy5pbmRleE9mKGZvbGRMaW5lKSArIDE7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZm9yIChpZHg7IGlkeCA8IGZvbGRMaW5lcy5sZW5ndGg7IGlkeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGRMaW5lc1tpZHhdOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZExpbmUuc3RhcnQucm93ID49IGZpcnN0Um93KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdyhsZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgLy8gUmVhbGlnbiBmb2xkcy4gRS5nLiBpZiB5b3UgYWRkIHNvbWUgbmV3IGNoYXJzIGJlZm9yZSBhIGZvbGQsIHRoZQ0KICAgICAgICAgICAgLy8gZm9sZCBzaG91bGQgIm1vdmUiIHRvIHRoZSByaWdodC4NCiAgICAgICAgICAgIGxlbiA9IE1hdGguYWJzKGUuZGF0YS5yYW5nZS5zdGFydC5jb2x1bW4gLSBlLmRhdGEucmFuZ2UuZW5kLmNvbHVtbik7DQogICAgICAgICAgICBpZiAoYWN0aW9uLmluZGV4T2YoInJlbW92ZSIpICE9IC0xKSB7DQogICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgZm9sZHMgaW4gdGhlIGNoYW5nZSByYW5nZSBhbmQgcmVtb3ZlIHRoZW0uDQogICAgICAgICAgICAgICAgcmVtb3ZlZEZvbGRzID0gdGhpcy5nZXRGb2xkc0luUmFuZ2UoZS5kYXRhLnJhbmdlKTsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGRzKHJlbW92ZWRGb2xkcyk7DQoNCiAgICAgICAgICAgICAgICBsZW4gPSAtbGVuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShmaXJzdFJvdyk7DQogICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICBmb2xkTGluZS5hZGRSZW1vdmVDaGFycyhmaXJzdFJvdywgc3RhcnQuY29sdW1uLCBsZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHVzZVdyYXBNb2RlICYmIHRoaXMuJHdyYXBEYXRhLmxlbmd0aCAhPSB0aGlzLmRvYy5nZXRMZW5ndGgoKSkgew0KICAgICAgICAgICAgY29uc29sZS5lcnJvcigiZG9jLmdldExlbmd0aCgpIGFuZCAkd3JhcERhdGEubGVuZ3RoIGhhdmUgdG8gYmUgdGhlIHNhbWUhIik7DQogICAgICAgIH0NCg0KICAgICAgICB1c2VXcmFwTW9kZSAmJiB0aGlzLiR1cGRhdGVXcmFwRGF0YShmaXJzdFJvdywgbGFzdFJvdyk7DQoNCiAgICAgICAgcmV0dXJuIHJlbW92ZWRGb2xkczsNCiAgICB9Ow0KDQogICAgdGhpcy4kdXBkYXRlV3JhcERhdGEgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICB2YXIgbGluZXMgPSB0aGlzLmRvYy5nZXRBbGxMaW5lcygpOw0KICAgICAgICB2YXIgdGFiU2l6ZSA9IHRoaXMuZ2V0VGFiU2l6ZSgpOw0KICAgICAgICB2YXIgd3JhcERhdGEgPSB0aGlzLiR3cmFwRGF0YTsNCiAgICAgICAgdmFyIHdyYXBMaW1pdCA9IHRoaXMuJHdyYXBMaW1pdDsNCiAgICAgICAgdmFyIHRva2VuczsNCiAgICAgICAgdmFyIGZvbGRMaW5lOw0KDQogICAgICAgIHZhciByb3cgPSBmaXJzdFJvdzsNCiAgICAgICAgbGFzdFJvdyA9IE1hdGgubWluKGxhc3RSb3csIGxpbmVzLmxlbmd0aCAtIDEpOw0KICAgICAgICB3aGlsZSAocm93IDw9IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShyb3csIGZvbGRMaW5lKTsNCiAgICAgICAgICAgIGlmICghZm9sZExpbmUpIHsNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGlzLiRnZXREaXNwbGF5VG9rZW5zKGxhbmcuc3RyaW5nVHJpbVJpZ2h0KGxpbmVzW3Jvd10pKTsNCiAgICAgICAgICAgICAgICB3cmFwRGF0YVtyb3ddID0gdGhpcy4kY29tcHV0ZVdyYXBTcGxpdHModG9rZW5zLCB3cmFwTGltaXQsIHRhYlNpemUpOw0KICAgICAgICAgICAgICAgIHJvdyArKzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdG9rZW5zID0gW107DQogICAgICAgICAgICAgICAgZm9sZExpbmUud2FsaygNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ocGxhY2Vob2xkZXIsIHJvdywgY29sdW1uLCBsYXN0Q29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2Fsa1Rva2VuczsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtUb2tlbnMgPSB0aGlzLiRnZXREaXNwbGF5VG9rZW5zKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciwgdG9rZW5zLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1Rva2Vuc1swXSA9IFBMQUNFSE9MREVSX1NUQVJUOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgd2Fsa1Rva2Vucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrVG9rZW5zW2ldID0gUExBQ0VIT0xERVJfQk9EWTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtUb2tlbnMgPSB0aGlzLiRnZXREaXNwbGF5VG9rZW5zKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tyb3ddLnN1YnN0cmluZyhsYXN0Q29sdW1uLCBjb2x1bW4pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2Vucy5jb25jYXQod2Fsa1Rva2Vucyk7DQogICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwNCiAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuZW5kLnJvdywNCiAgICAgICAgICAgICAgICAgICAgbGluZXNbZm9sZExpbmUuZW5kLnJvd10ubGVuZ3RoICsgMQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHNwYWNlcy90YWJzIGZyb20gdGhlIGJhY2sgb2YgdGhlIHRva2VuIGFycmF5Lg0KICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoICE9IDAgJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSA+PSBTUEFDRSkNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgpOw0KDQogICAgICAgICAgICAgICAgd3JhcERhdGFbZm9sZExpbmUuc3RhcnQucm93XQ0KICAgICAgICAgICAgICAgICAgICA9IHRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKHRva2Vucywgd3JhcExpbWl0LCB0YWJTaXplKTsNCiAgICAgICAgICAgICAgICByb3cgPSBmb2xkTGluZS5lbmQucm93ICsgMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyAiVG9rZW5zIg0KICAgIHZhciBDSEFSID0gMSwNCiAgICAgICAgQ0hBUl9FWFQgPSAyLA0KICAgICAgICBQTEFDRUhPTERFUl9TVEFSVCA9IDMsDQogICAgICAgIFBMQUNFSE9MREVSX0JPRFkgPSAgNCwNCiAgICAgICAgUFVOQ1RVQVRJT04gPSA5LA0KICAgICAgICBTUEFDRSA9IDEwLA0KICAgICAgICBUQUIgPSAxMSwNCiAgICAgICAgVEFCX1NQQUNFID0gMTI7DQoNCiAgICB0aGlzLiRjb21wdXRlV3JhcFNwbGl0cyA9IGZ1bmN0aW9uKHRva2Vucywgd3JhcExpbWl0KSB7DQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgIHJldHVybiBbXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBzcGxpdHMgPSBbXTsNCiAgICAgICAgdmFyIGRpc3BsYXlMZW5ndGggPSB0b2tlbnMubGVuZ3RoOw0KICAgICAgICB2YXIgbGFzdFNwbGl0ID0gMCwgbGFzdERvY1NwbGl0ID0gMDsNCg0KICAgICAgICBmdW5jdGlvbiBhZGRTcGxpdChzY3JlZW5Qb3MpIHsNCiAgICAgICAgICAgIHZhciBkaXNwbGF5ZWQgPSB0b2tlbnMuc2xpY2UobGFzdFNwbGl0LCBzY3JlZW5Qb3MpOw0KDQogICAgICAgICAgICAvLyBUaGUgZG9jdW1lbnQgc2l6ZSBpcyB0aGUgY3VycmVudCBzaXplIC0gdGhlIGV4dHJhIHdpZHRoIGZvciB0YWJzDQogICAgICAgICAgICAvLyBhbmQgbXVsdGlwbGVXaWR0aCBjaGFyYWN0ZXJzLg0KICAgICAgICAgICAgdmFyIGxlbiA9IGRpc3BsYXllZC5sZW5ndGg7DQogICAgICAgICAgICBkaXNwbGF5ZWQuam9pbigiIikuDQogICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgVEFCX1NQQUNFcy4NCiAgICAgICAgICAgICAgICByZXBsYWNlKC8xMi9nLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgbGVuIC09IDE7DQogICAgICAgICAgICAgICAgfSkuDQogICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgQ0hBUl9FWFQvbXVsdGlwbGVXaWR0aCBjaGFyYWN0ZXJzLg0KICAgICAgICAgICAgICAgIHJlcGxhY2UoLzIvZywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIGxlbiAtPSAxOw0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBsYXN0RG9jU3BsaXQgKz0gbGVuOw0KICAgICAgICAgICAgc3BsaXRzLnB1c2gobGFzdERvY1NwbGl0KTsNCiAgICAgICAgICAgIGxhc3RTcGxpdCA9IHNjcmVlblBvczsNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChkaXNwbGF5TGVuZ3RoIC0gbGFzdFNwbGl0ID4gd3JhcExpbWl0KSB7DQogICAgICAgICAgICAvLyBUaGlzIGlzLCB3aGVyZSB0aGUgc3BsaXQgc2hvdWxkIGJlLg0KICAgICAgICAgICAgdmFyIHNwbGl0ID0gbGFzdFNwbGl0ICsgd3JhcExpbWl0Ow0KDQogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNlIG9yIHRhYiBhdCB0aGlzIHNwbGl0IHBvc2l0aW9uLCB0aGVuIG1ha2luZw0KICAgICAgICAgICAgLy8gYSBzcGxpdCBpcyBzaW1wbGUuDQogICAgICAgICAgICBpZiAodG9rZW5zW3NwbGl0XSA+PSBTUEFDRSkgew0KICAgICAgICAgICAgICAgIC8vIEluY2x1ZGUgYWxsIGZvbGxvd2luZyBzcGFjZXMgKyB0YWJzIGluIHRoaXMgc3BsaXQgYXMgd2VsbC4NCiAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5zW3NwbGl0XSA+PSBTUEFDRSkgew0KICAgICAgICAgICAgICAgICAgICBzcGxpdCArKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYWRkU3BsaXQoc3BsaXQpOw0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyA9PT0gRUxTRSA9PT0NCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNwbGl0IGlzIGluc2lkZSBvZiBhIHBsYWNlaG9sZGVyLiBQbGFjZWhvbGRlciBhcmUNCiAgICAgICAgICAgIC8vIG5vdCBzcGxpdGFibGUuIFRoZXJlZm9yZSwgc2VlayB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwbGFjZWhvbGRlcg0KICAgICAgICAgICAgLy8gYW5kIHRyeSB0byBwbGFjZSB0aGUgc3BsaXQgYmVvZnJlIHRoZSBwbGFjZWhvbGRlcidzIHN0YXJ0Lg0KICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gPT0gUExBQ0VIT0xERVJfU1RBUlQNCiAgICAgICAgICAgICAgICB8fCB0b2tlbnNbc3BsaXRdID09IFBMQUNFSE9MREVSX0JPRFkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gU2VlayB0aGUgc3RhcnQgb2YgdGhlIHBsYWNlaG9sZGVyIGFuZCBkbyB0aGUgc3BsaXQNCiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHBsYWNlaG9sZGVyLiBCeSBkZWZpbml0aW9uIHRoZXJlIGFsd2F5cw0KICAgICAgICAgICAgICAgIC8vIGEgUExBQ0VIT0xERVJfU1RBUlQgYmV0d2VlbiBzcGxpdCBhbmQgbGFzdFNwbGl0Lg0KICAgICAgICAgICAgICAgIGZvciAoc3BsaXQ7IHNwbGl0ICE9IGxhc3RTcGxpdCAtIDE7IHNwbGl0LS0pIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gPT0gUExBQ0VIT0xERVJfU1RBUlQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0Kys7IDw8IE5vIGluY3JlbWVudGFsIGhlcmUgYXMgd2Ugd2FudCB0bw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGhhdmUgdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgUGxhY2Vob2xkZXIuDQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBQTEFDRUhPTERFUl9TVEFSVCBpcyBub3QgdGhlIGluZGV4IG9mIHRoZQ0KICAgICAgICAgICAgICAgIC8vIGxhc3Qgc3BsaXQsIHRoZW4gd2UgY2FuIGRvIHRoZSBzcGxpdA0KICAgICAgICAgICAgICAgIGlmIChzcGxpdCA+IGxhc3RTcGxpdCkgew0KICAgICAgICAgICAgICAgICAgICBhZGRTcGxpdChzcGxpdCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBQTEFDRUhPTERFUl9TVEFSVCBJUyB0aGUgaW5kZXggb2YgdGhlIGxhc3QNCiAgICAgICAgICAgICAgICAvLyBzcGxpdCwgdGhlbiB3ZSBoYXZlIHRvIHBsYWNlIHRoZSBzcGxpdCBhZnRlciB0aGUNCiAgICAgICAgICAgICAgICAvLyBwbGFjZWhvbGRlci4gU28sIGxldCdzIHNlZWsgZm9yIHRoZSBlbmQgb2YgdGhlIHBsYWNlaG9sZGVyLg0KICAgICAgICAgICAgICAgIHNwbGl0ID0gbGFzdFNwbGl0ICsgd3JhcExpbWl0Ow0KICAgICAgICAgICAgICAgIGZvciAoc3BsaXQ7IHNwbGl0IDwgdG9rZW5zLmxlbmd0aDsgc3BsaXQrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zW3NwbGl0XSAhPSBQTEFDRUhPTERFUl9CT0RZKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIElmIHNwaWx0ID09IHRva2Vucy5sZW5ndGgsIHRoZW4gdGhlIHBsYWNlaG9sZGVyIGlzIHRoZSBsYXN0DQogICAgICAgICAgICAgICAgLy8gdGhpbmcgaW4gdGhlIGxpbmUgYW5kIGFkZGluZyBhIG5ldyBzcGxpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuDQogICAgICAgICAgICAgICAgaWYgKHNwbGl0ID09IHRva2Vucy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBCcmVha3MgdGhlIHdoaWxlLWxvb3AuDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluYWxseSwgYWRkIHRoZSBzcGxpdC4uLg0KICAgICAgICAgICAgICAgIGFkZFNwbGl0KHNwbGl0KTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gPT09IEVMU0UgPT09DQogICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBmaXJzdCBub24gc3BhY2UvdGFiL3BsYWNlaG9sZGVyL3B1bmN0dWF0aW9uIHRva2VuIGJhY2t3YXJkcy4NCiAgICAgICAgICAgIHZhciBtaW5TcGxpdCA9IE1hdGgubWF4KHNwbGl0IC0gMTAsIGxhc3RTcGxpdCAtIDEpOw0KICAgICAgICAgICAgd2hpbGUgKHNwbGl0ID4gbWluU3BsaXQgJiYgdG9rZW5zW3NwbGl0XSA8IFBMQUNFSE9MREVSX1NUQVJUKSB7DQogICAgICAgICAgICAgICAgc3BsaXQgLS07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3aGlsZSAoc3BsaXQgPiBtaW5TcGxpdCAmJiB0b2tlbnNbc3BsaXRdID09IFBVTkNUVUFUSU9OKSB7DQogICAgICAgICAgICAgICAgc3BsaXQgLS07DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBvbmUsIHRoZW4gYWRkIHRoZSBzcGxpdC4NCiAgICAgICAgICAgIGlmIChzcGxpdCA+IG1pblNwbGl0KSB7DQogICAgICAgICAgICAgICAgYWRkU3BsaXQoKytzcGxpdCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vID09PSBFTFNFID09PQ0KICAgICAgICAgICAgc3BsaXQgPSBsYXN0U3BsaXQgKyB3cmFwTGltaXQ7DQogICAgICAgICAgICAvLyBUaGUgc3BsaXQgaXMgaW5zaWRlIG9mIGEgQ0hBUiBvciBDSEFSX0VYVCB0b2tlbiBhbmQgbm8gc3BhY2UNCiAgICAgICAgICAgIC8vIGFyb3VuZCAtPiBmb3JjZSBhIHNwbGl0Lg0KICAgICAgICAgICAgYWRkU3BsaXQoc3BsaXQpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBzcGxpdHM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQHBhcmFtDQogICAgICogICBvZmZzZXQ6IFRoZSBvZmZzZXQgaW4gc2NyZWVuQ29sdW1uIGF0IHdoaWNoIHBvc2l0aW9uIHN0ciBzdGFydHMuDQogICAgICogICAgICAgICAgIEltcG9ydGFudCBmb3IgY2FsY3VsYXRpbmcgdGhlIHJlYWxUYWJTaXplLg0KICAgICAqLw0KICAgIHRoaXMuJGdldERpc3BsYXlUb2tlbnMgPSBmdW5jdGlvbihzdHIsIG9mZnNldCkgew0KICAgICAgICB2YXIgYXJyID0gW107DQogICAgICAgIHZhciB0YWJTaXplOw0KICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDsNCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTsNCiAgICAgICAgICAgIC8vIFRhYg0KICAgICAgICAgICAgaWYgKGMgPT0gOSkgew0KICAgICAgICAgICAgICAgIHRhYlNpemUgPSB0aGlzLmdldFNjcmVlblRhYlNpemUoYXJyLmxlbmd0aCArIG9mZnNldCk7DQogICAgICAgICAgICAgICAgYXJyLnB1c2goVEFCKTsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMTsgbiA8IHRhYlNpemU7IG4rKykgew0KICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChUQUJfU1BBQ0UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIFNwYWNlDQogICAgICAgICAgICBlbHNlIGlmIChjID09IDMyKSB7DQogICAgICAgICAgICAgICAgYXJyLnB1c2goU1BBQ0UpOw0KICAgICAgICAgICAgfSBlbHNlIGlmKChjID4gMzkgJiYgYyA8IDQ4KSB8fCAoYyA+IDU3ICYmIGMgPCA2NCkpIHsNCiAgICAgICAgICAgICAgICBhcnIucHVzaChQVU5DVFVBVElPTik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBmdWxsIHdpZHRoIGNoYXJhY3RlcnMNCiAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMHgxMTAwICYmIGlzRnVsbFdpZHRoKGMpKSB7DQogICAgICAgICAgICAgICAgYXJyLnB1c2goQ0hBUiwgQ0hBUl9FWFQpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBhcnIucHVzaChDSEFSKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gYXJyOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSBhIHN0cmluZyBvbiB0aGUgc2NyZWVuIHdoaWxlIGFzc3VtaW5nIHRoYXQNCiAgICAgKiB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgZmlyc3QgY29sdW1uIG9uIHRoZSBzY3JlZW4uDQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nIHN0ciBTdHJpbmcgdG8gY2FsY3VsYXRlIHRoZSBzY3JlZW4gd2lkdGggb2YNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICogICAgICBbMF06IG51bWJlciBvZiBjb2x1bW5zIGZvciBzdHIgb24gc2NyZWVuLg0KICAgICAqICAgICAgWzFdOiBkb2NDb2x1bW4gcG9zaXRpb24gdGhhdCB3YXMgcmVhZCB1bnRpbCAodXNlZnVsIHdpdGggc2NyZWVuQ29sdW1uKQ0KICAgICAqLw0KICAgIHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoID0gZnVuY3Rpb24oc3RyLCBtYXhTY3JlZW5Db2x1bW4sIHNjcmVlbkNvbHVtbikgew0KICAgICAgICBpZiAobWF4U2NyZWVuQ29sdW1uID09IDApIHsNCiAgICAgICAgICAgIHJldHVybiBbMCwgMF07DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1heFNjcmVlbkNvbHVtbiA9PSBudWxsKSB7DQogICAgICAgICAgICBtYXhTY3JlZW5Db2x1bW4gPSBzY3JlZW5Db2x1bW4gKw0KICAgICAgICAgICAgICAgIHN0ci5sZW5ndGggKiBNYXRoLm1heCh0aGlzLmdldFRhYlNpemUoKSwgMik7DQogICAgICAgIH0NCiAgICAgICAgc2NyZWVuQ29sdW1uID0gc2NyZWVuQ29sdW1uIHx8IDA7DQoNCiAgICAgICAgdmFyIGMsIGNvbHVtbjsNCiAgICAgICAgZm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCBzdHIubGVuZ3RoOyBjb2x1bW4rKykgew0KICAgICAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGNvbHVtbik7DQogICAgICAgICAgICAvLyB0YWINCiAgICAgICAgICAgIGlmIChjID09IDkpIHsNCiAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gdGhpcy5nZXRTY3JlZW5UYWJTaXplKHNjcmVlbkNvbHVtbik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBmdWxsIHdpZHRoIGNoYXJhY3RlcnMNCiAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMHgxMTAwICYmIGlzRnVsbFdpZHRoKGMpKSB7DQogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHNjcmVlbkNvbHVtbiA+IG1heFNjcmVlbkNvbHVtbikgew0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gW3NjcmVlbkNvbHVtbiwgY29sdW1uXTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyByZXF1aXJlZCB0byByZW5kZXIgdGhpcyByb3cgb24gdGhlIHNjcmVlbg0KICAgICAqLw0KICAgIHRoaXMuZ2V0Um93TGVuZ3RoID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIGlmICghdGhpcy4kdXNlV3JhcE1vZGUgfHwgIXRoaXMuJHdyYXBEYXRhW3Jvd10pIHsNCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHdyYXBEYXRhW3Jvd10ubGVuZ3RoICsgMTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBpbiBwaXhlbHMgcmVxdWlyZWQgdG8gcmVuZGVyIHRoaXMgcm93IG9uIHRoZSBzY3JlZW4NCiAgICAgKiovDQogICAgdGhpcy5nZXRSb3dIZWlnaHQgPSBmdW5jdGlvbihjb25maWcsIHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy5nZXRSb3dMZW5ndGgocm93KSAqIGNvbmZpZy5saW5lSGVpZ2h0Ow0KICAgIH0NCg0KICAgIHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbiA9IGZ1bmN0aW9uKHNjcmVlblJvdykgew0KICAgICAgICAvL3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW4oc2NyZWVuUm93LCBOdW1iZXIuTUFYX1ZBTFVFIC8gMTApDQogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oc2NyZWVuUm93LCB0aGlzLmRvYy5nZXRMaW5lKHNjcmVlblJvdykubGVuZ3RoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW4gPSBmdW5jdGlvbihkb2NSb3csIGRvY0NvbHVtbikgew0KICAgICAgICB2YXIgc2NyZWVuUm93ID0gdGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGRvY1JvdywgZG9jQ29sdW1uKTsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihzY3JlZW5Sb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uID0gZnVuY3Rpb24oZG9jUm93LCBkb2NDb2x1bW4pIHsNCiAgICAgICAgdmFyIHNjcmVlblJvdyA9IHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhkb2NSb3csIGRvY0NvbHVtbik7DQogICAgICAgIHJldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Sb3csIE51bWJlci5NQVhfVkFMVUUgLyAxMCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Um93U3BsaXREYXRhID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIGlmICghdGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kd3JhcERhdGFbcm93XTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiBhIHRhYiBjaGFyYWN0ZXIgYXQgc2NyZWVuQ29sdW1uLg0KICAgICAqLw0KICAgIHRoaXMuZ2V0U2NyZWVuVGFiU2l6ZSA9IGZ1bmN0aW9uKHNjcmVlbkNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy4kdGFiU2l6ZSAtIHNjcmVlbkNvbHVtbiAlIHRoaXMuJHRhYlNpemU7DQogICAgfTsNCg0KICAgIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFJvdyA9IGZ1bmN0aW9uKHNjcmVlblJvdywgc2NyZWVuQ29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikucm93Ow0KICAgIH07DQoNCiAgICB0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW4gPSBmdW5jdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oc2NyZWVuUm93LCBzY3JlZW5Db2x1bW4pLmNvbHVtbjsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24gPSBmdW5jdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikgew0KICAgICAgICBpZiAoc2NyZWVuUm93IDwgMCkgew0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICByb3c6IDAsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbGluZTsNCiAgICAgICAgdmFyIGRvY1JvdyA9IDA7DQogICAgICAgIHZhciBkb2NDb2x1bW4gPSAwOw0KICAgICAgICB2YXIgY29sdW1uOw0KICAgICAgICB2YXIgcm93ID0gMDsNCiAgICAgICAgdmFyIHJvd0xlbmd0aCA9IDA7DQoNCiAgICAgICAgdmFyIHJvd0NhY2hlID0gdGhpcy4kcm93Q2FjaGU7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93Q2FjaGUubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChyb3dDYWNoZVtpXS5zY3JlZW5Sb3cgPCBzY3JlZW5Sb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgPSByb3dDYWNoZVtpXS5zY3JlZW5Sb3c7DQogICAgICAgICAgICAgICAgZG9jUm93ID0gcm93Q2FjaGVbaV0uZG9jUm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdmFyIGRvQ2FjaGUgPSAhcm93Q2FjaGUubGVuZ3RoIHx8IGkgPT0gcm93Q2FjaGUubGVuZ3RoOw0KDQogICAgICAgIHZhciBtYXhSb3cgPSB0aGlzLmdldExlbmd0aCgpIC0gMTsNCiAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXROZXh0Rm9sZExpbmUoZG9jUm93KTsNCiAgICAgICAgdmFyIGZvbGRTdGFydCA9IGZvbGRMaW5lID8gZm9sZExpbmUuc3RhcnQucm93IDogSW5maW5pdHk7DQoNCiAgICAgICAgd2hpbGUgKHJvdyA8PSBzY3JlZW5Sb3cpIHsNCiAgICAgICAgICAgIHJvd0xlbmd0aCA9IHRoaXMuZ2V0Um93TGVuZ3RoKGRvY1Jvdyk7DQogICAgICAgICAgICBpZiAocm93ICsgcm93TGVuZ3RoIC0gMSA+PSBzY3JlZW5Sb3cgfHwgZG9jUm93ID49IG1heFJvdykgew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcm93TGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvY1JvdysrOw0KICAgICAgICAgICAgICAgIGlmIChkb2NSb3cgPiBmb2xkU3RhcnQpIHsNCiAgICAgICAgICAgICAgICAgICAgZG9jUm93ID0gZm9sZExpbmUuZW5kLnJvdysxOw0KICAgICAgICAgICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKGRvY1JvdywgZm9sZExpbmUpOw0KICAgICAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkTGluZSA/IGZvbGRMaW5lLnN0YXJ0LnJvdyA6IEluZmluaXR5Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChkb0NhY2hlKSB7DQogICAgICAgICAgICAgICAgcm93Q2FjaGUucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIGRvY1JvdzogZG9jUm93LA0KICAgICAgICAgICAgICAgICAgICBzY3JlZW5Sb3c6IHJvdw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRMaW5lICYmIGZvbGRMaW5lLnN0YXJ0LnJvdyA8PSBkb2NSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSB0aGlzLmdldEZvbGREaXNwbGF5TGluZShmb2xkTGluZSk7DQogICAgICAgICAgICBkb2NSb3cgPSBmb2xkTGluZS5zdGFydC5yb3c7DQogICAgICAgIH0gZWxzZSBpZiAocm93ICsgcm93TGVuZ3RoIDw9IHNjcmVlblJvdyB8fCBkb2NSb3cgPiBtYXhSb3cpIHsNCiAgICAgICAgICAgIC8vIGNsaXAgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgcm93OiBtYXhSb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmdldExpbmUobWF4Um93KS5sZW5ndGgNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGxpbmUgPSB0aGlzLmdldExpbmUoZG9jUm93KTsNCiAgICAgICAgICAgIGZvbGRMaW5lID0gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgdmFyIHNwbGl0cyA9IHRoaXMuJHdyYXBEYXRhW2RvY1Jvd107DQogICAgICAgICAgICBpZiAoc3BsaXRzKSB7DQogICAgICAgICAgICAgICAgY29sdW1uID0gc3BsaXRzW3NjcmVlblJvdyAtIHJvd107DQogICAgICAgICAgICAgICAgaWYoc2NyZWVuUm93ID4gcm93ICYmIHNwbGl0cy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgZG9jQ29sdW1uID0gc3BsaXRzW3NjcmVlblJvdyAtIHJvdyAtIDFdIHx8IHNwbGl0c1tzcGxpdHMubGVuZ3RoIC0gMV07DQogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhkb2NDb2x1bW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGRvY0NvbHVtbiArPSB0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChsaW5lLCBzY3JlZW5Db2x1bW4pWzFdOw0KDQogICAgICAgIC8vIE5lZWQgdG8gZG8gc29tZSBjbGFtcGluZyBhY3Rpb24gaGVyZS4NCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICBpZiAoZG9jQ29sdW1uID49IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIC8vIFdlIHJlbW92ZSBvbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgc3VjaCB0aGF0IHRoZSBkb2NDb2x1bW4NCiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiByZXR1cm5lZCBpcyBub3QgYXNzb2NpYXRlZCB0byB0aGUgbmV4dCByb3cgb24gdGhlDQogICAgICAgICAgICAgICAgLy8gc2NyZWVuLg0KICAgICAgICAgICAgICAgIGRvY0NvbHVtbiA9IGNvbHVtbiAtIDE7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkb2NDb2x1bW4gPSBNYXRoLm1pbihkb2NDb2x1bW4sIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkTGluZSkgew0KICAgICAgICAgICAgcmV0dXJuIGZvbGRMaW5lLmlkeFRvUG9zaXRpb24oZG9jQ29sdW1uKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICByb3c6IGRvY1JvdywNCiAgICAgICAgICAgIGNvbHVtbjogZG9jQ29sdW1uDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24gPSBmdW5jdGlvbihkb2NSb3csIGRvY0NvbHVtbikgew0KICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHBhc3NlZCBpbiBhcmd1bWVudHMuDQogICAgICAgIGlmICh0eXBlb2YgZG9jQ29sdW1uID09PSAidW5kZWZpbmVkIikNCiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGRvY1Jvdy5yb3csIGRvY1Jvdy5jb2x1bW4pOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGRvY1JvdywgZG9jQ29sdW1uKTsNCg0KICAgICAgICBkb2NSb3cgPSBwb3Mucm93Ow0KICAgICAgICBkb2NDb2x1bW4gPSBwb3MuY29sdW1uOw0KDQogICAgICAgIHZhciB3cmFwRGF0YTsNCiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGluIHdyYXBNb2RlIGlmIHRoZSBkb2MgaXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuDQogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgew0KICAgICAgICAgICAgd3JhcERhdGEgPSB0aGlzLiR3cmFwRGF0YTsNCiAgICAgICAgICAgIGlmIChkb2NSb3cgPiB3cmFwRGF0YS5sZW5ndGggLSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgcm93OiB0aGlzLmdldFNjcmVlbkxlbmd0aCgpLA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHdyYXBEYXRhLmxlbmd0aCA9PSAwDQogICAgICAgICAgICAgICAgICAgICAgICA/IDANCiAgICAgICAgICAgICAgICAgICAgICAgIDogKHdyYXBEYXRhW3dyYXBEYXRhLmxlbmd0aCAtIDFdLmxlbmd0aCAtIDEpDQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBzY3JlZW5Sb3cgPSAwOw0KICAgICAgICB2YXIgZm9sZFN0YXJ0Um93ID0gbnVsbDsNCiAgICAgICAgdmFyIGZvbGQgPSBudWxsOw0KDQogICAgICAgIC8vIENsYW1wIHRoZSBkb2NSb3cgcG9zaXRpb24gaW4gY2FzZSBpdCdzIGluc2lkZSBvZiBhIGZvbGRlZCBibG9jay4NCiAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KGRvY1JvdywgZG9jQ29sdW1uLCAxKTsNCiAgICAgICAgaWYgKGZvbGQpIHsNCiAgICAgICAgICAgIGRvY1JvdyA9IGZvbGQuc3RhcnQucm93Ow0KICAgICAgICAgICAgZG9jQ29sdW1uID0gZm9sZC5zdGFydC5jb2x1bW47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcm93RW5kLCByb3cgPSAwOw0KICAgICAgICB2YXIgcm93Q2FjaGUgPSB0aGlzLiRyb3dDYWNoZTsNCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd0NhY2hlLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAocm93Q2FjaGVbaV0uZG9jUm93IDwgZG9jUm93KSB7DQogICAgICAgICAgICAgICAgc2NyZWVuUm93ID0gcm93Q2FjaGVbaV0uc2NyZWVuUm93Ow0KICAgICAgICAgICAgICAgIHJvdyA9IHJvd0NhY2hlW2ldLmRvY1JvdzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdmFyIGRvQ2FjaGUgPSAhcm93Q2FjaGUubGVuZ3RoIHx8IGkgPT0gcm93Q2FjaGUubGVuZ3RoOw0KDQogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKHJvdyk7DQogICAgICAgIHZhciBmb2xkU3RhcnQgPSBmb2xkTGluZSA/Zm9sZExpbmUuc3RhcnQucm93IDpJbmZpbml0eTsNCg0KICAgICAgICB3aGlsZSAocm93IDwgZG9jUm93KSB7DQogICAgICAgICAgICBpZiAocm93ID49IGZvbGRTdGFydCkgew0KICAgICAgICAgICAgICAgIHJvd0VuZCA9IGZvbGRMaW5lLmVuZC5yb3cgKyAxOw0KICAgICAgICAgICAgICAgIGlmIChyb3dFbmQgPiBkb2NSb3cpDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGZvbGRMaW5lID0gdGhpcy5nZXROZXh0Rm9sZExpbmUocm93RW5kLCBmb2xkTGluZSk7DQogICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZExpbmUgP2ZvbGRMaW5lLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByb3dFbmQgPSByb3cgKyAxOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzY3JlZW5Sb3cgKz0gdGhpcy5nZXRSb3dMZW5ndGgocm93KTsNCiAgICAgICAgICAgIHJvdyA9IHJvd0VuZDsNCg0KICAgICAgICAgICAgaWYgKGRvQ2FjaGUpIHsNCiAgICAgICAgICAgICAgICByb3dDYWNoZS5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgZG9jUm93OiByb3csDQogICAgICAgICAgICAgICAgICAgIHNjcmVlblJvdzogc2NyZWVuUm93DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRleHQgbGluZSB0aGF0IGlzIGRpc3BsYXllZCBpbiBkb2NSb3cgb24gdGhlIHNjcmVlbi4NCiAgICAgICAgdmFyIHRleHRMaW5lID0gIiI7DQogICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaW5hbCByb3cgd2Ugd2FudCB0byByZWFjaCBpcyBpbnNpZGUgb2YgYSBmb2xkLg0KICAgICAgICBpZiAoZm9sZExpbmUgJiYgcm93ID49IGZvbGRTdGFydCkgew0KICAgICAgICAgICAgdGV4dExpbmUgPSB0aGlzLmdldEZvbGREaXNwbGF5TGluZShmb2xkTGluZSwgZG9jUm93LCBkb2NDb2x1bW4pOw0KICAgICAgICAgICAgZm9sZFN0YXJ0Um93ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGV4dExpbmUgPSB0aGlzLmdldExpbmUoZG9jUm93KS5zdWJzdHJpbmcoMCwgZG9jQ29sdW1uKTsNCiAgICAgICAgICAgIGZvbGRTdGFydFJvdyA9IGRvY1JvdzsNCiAgICAgICAgfQ0KICAgICAgICAvLyBDbGFtcCB0ZXh0TGluZSBpZiBpbiB3cmFwTW9kZS4NCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICB2YXIgd3JhcFJvdyA9IHdyYXBEYXRhW2ZvbGRTdGFydFJvd107DQogICAgICAgICAgICB2YXIgc2NyZWVuUm93T2Zmc2V0ID0gMDsNCiAgICAgICAgICAgIHdoaWxlICh0ZXh0TGluZS5sZW5ndGggPj0gd3JhcFJvd1tzY3JlZW5Sb3dPZmZzZXRdKSB7DQogICAgICAgICAgICAgICAgc2NyZWVuUm93ICsrOw0KICAgICAgICAgICAgICAgIHNjcmVlblJvd09mZnNldCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGV4dExpbmUgPSB0ZXh0TGluZS5zdWJzdHJpbmcoDQogICAgICAgICAgICAgICAgd3JhcFJvd1tzY3JlZW5Sb3dPZmZzZXQgLSAxXSB8fCAwLCB0ZXh0TGluZS5sZW5ndGgNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgcm93OiBzY3JlZW5Sb3csDQogICAgICAgICAgICBjb2x1bW46IHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKHRleHRMaW5lKVswXQ0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4gPSBmdW5jdGlvbihyb3csIGRvY0NvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24ocm93LCBkb2NDb2x1bW4pLmNvbHVtbjsNCiAgICB9Ow0KDQogICAgdGhpcy5kb2N1bWVudFRvU2NyZWVuUm93ID0gZnVuY3Rpb24oZG9jUm93LCBkb2NDb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGRvY1JvdywgZG9jQ29sdW1uKS5yb3c7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2NyZWVuTGVuZ3RoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzY3JlZW5Sb3dzID0gMDsNCiAgICAgICAgdmFyIGZvbGQgPSBudWxsOw0KICAgICAgICBpZiAoIXRoaXMuJHVzZVdyYXBNb2RlKSB7DQogICAgICAgICAgICBzY3JlZW5Sb3dzID0gdGhpcy5nZXRMZW5ndGgoKTsNCg0KICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmb2xkZWQgbGluZXMgYWdhaW4uDQogICAgICAgICAgICB2YXIgZm9sZERhdGEgPSB0aGlzLiRmb2xkRGF0YTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZERhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBmb2xkID0gZm9sZERhdGFbaV07DQogICAgICAgICAgICAgICAgc2NyZWVuUm93cyAtPSBmb2xkLmVuZC5yb3cgLSBmb2xkLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy4kd3JhcERhdGEubGVuZ3RoOw0KICAgICAgICAgICAgdmFyIHJvdyA9IDAsIGkgPSAwOw0KICAgICAgICAgICAgdmFyIGZvbGQgPSB0aGlzLiRmb2xkRGF0YVtpKytdOw0KICAgICAgICAgICAgdmFyIGZvbGRTdGFydCA9IGZvbGQgPyBmb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQoNCiAgICAgICAgICAgIHdoaWxlIChyb3cgPCBsYXN0Um93KSB7DQogICAgICAgICAgICAgICAgc2NyZWVuUm93cyArPSB0aGlzLiR3cmFwRGF0YVtyb3ddLmxlbmd0aCArIDE7DQogICAgICAgICAgICAgICAgcm93ICsrOw0KICAgICAgICAgICAgICAgIGlmIChyb3cgPiBmb2xkU3RhcnQpIHsNCiAgICAgICAgICAgICAgICAgICAgcm93ID0gZm9sZC5lbmQucm93KzE7DQogICAgICAgICAgICAgICAgICAgIGZvbGQgPSB0aGlzLiRmb2xkRGF0YVtpKytdOw0KICAgICAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHNjcmVlblJvd3M7DQogICAgfQ0KDQogICAgLy8gRm9yIGV2ZXJ5IGtleXN0cm9rZSB0aGlzIGdldHMgY2FsbGVkIG9uY2UgcGVyIGNoYXIgaW4gdGhlIHdob2xlIGRvYyEhDQogICAgLy8gV291bGRuJ3QgaHVydCB0byBtYWtlIGl0IGEgYml0IGZhc3RlciBmb3IgYyA+PSAweDExMDANCiAgICBmdW5jdGlvbiBpc0Z1bGxXaWR0aChjKSB7DQogICAgICAgIGlmIChjIDwgMHgxMTAwKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICByZXR1cm4gYyA+PSAweDExMDAgJiYgYyA8PSAweDExNUYgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgxMUEzICYmIGMgPD0gMHgxMUE3IHx8DQogICAgICAgICAgICAgICBjID49IDB4MTFGQSAmJiBjIDw9IDB4MTFGRiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDIzMjkgJiYgYyA8PSAweDIzMkEgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgyRTgwICYmIGMgPD0gMHgyRTk5IHx8DQogICAgICAgICAgICAgICBjID49IDB4MkU5QiAmJiBjIDw9IDB4MkVGMyB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDJGMDAgJiYgYyA8PSAweDJGRDUgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgyRkYwICYmIGMgPD0gMHgyRkZCIHx8DQogICAgICAgICAgICAgICBjID49IDB4MzAwMCAmJiBjIDw9IDB4MzAzRSB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMwNDEgJiYgYyA8PSAweDMwOTYgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMDk5ICYmIGMgPD0gMHgzMEZGIHx8DQogICAgICAgICAgICAgICBjID49IDB4MzEwNSAmJiBjIDw9IDB4MzEyRCB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMxMzEgJiYgYyA8PSAweDMxOEUgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMTkwICYmIGMgPD0gMHgzMUJBIHx8DQogICAgICAgICAgICAgICBjID49IDB4MzFDMCAmJiBjIDw9IDB4MzFFMyB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMxRjAgJiYgYyA8PSAweDMyMUUgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHgzMjIwICYmIGMgPD0gMHgzMjQ3IHx8DQogICAgICAgICAgICAgICBjID49IDB4MzI1MCAmJiBjIDw9IDB4MzJGRSB8fA0KICAgICAgICAgICAgICAgYyA+PSAweDMzMDAgJiYgYyA8PSAweDREQkYgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHg0RTAwICYmIGMgPD0gMHhBNDhDIHx8DQogICAgICAgICAgICAgICBjID49IDB4QTQ5MCAmJiBjIDw9IDB4QTRDNiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEE5NjAgJiYgYyA8PSAweEE5N0MgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhBQzAwICYmIGMgPD0gMHhEN0EzIHx8DQogICAgICAgICAgICAgICBjID49IDB4RDdCMCAmJiBjIDw9IDB4RDdDNiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEQ3Q0IgJiYgYyA8PSAweEQ3RkIgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhGOTAwICYmIGMgPD0gMHhGQUZGIHx8DQogICAgICAgICAgICAgICBjID49IDB4RkUxMCAmJiBjIDw9IDB4RkUxOSB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEZFMzAgJiYgYyA8PSAweEZFNTIgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhGRTU0ICYmIGMgPD0gMHhGRTY2IHx8DQogICAgICAgICAgICAgICBjID49IDB4RkU2OCAmJiBjIDw9IDB4RkU2QiB8fA0KICAgICAgICAgICAgICAgYyA+PSAweEZGMDEgJiYgYyA8PSAweEZGNjAgfHwNCiAgICAgICAgICAgICAgIGMgPj0gMHhGRkUwICYmIGMgPD0gMHhGRkU2Ow0KICAgIH07DQoNCn0pLmNhbGwoRWRpdFNlc3Npb24ucHJvdG90eXBlKTsNCg0KcmVxdWlyZSgiLi9lZGl0X3Nlc3Npb24vZm9sZGluZyIpLkZvbGRpbmcuY2FsbChFZGl0U2Vzc2lvbi5wcm90b3R5cGUpOw0KcmVxdWlyZSgiLi9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIpLkJyYWNrZXRNYXRjaC5jYWxsKEVkaXRTZXNzaW9uLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRWRpdFNlc3Npb24gPSBFZGl0U2Vzc2lvbjsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3NlbGVjdGlvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi9saWIvbGFuZyIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQoNCi8qKg0KICogS2VlcHMgY3Vyc29yIHBvc2l0aW9uIGFuZCB0aGUgdGV4dCBzZWxlY3Rpb24gb2YgYW4gZWRpdCBzZXNzaW9uLg0KICoNCiAqIFRoZSByb3cvY29sdW1ucyB1c2VkIGluIHRoZSBzZWxlY3Rpb24gYXJlIGluIGRvY3VtZW50IGNvb3JkaW5hdGVzDQogKiByZXByZXNlbnRpbmcgdGhzIGNvb3JkaW5hdGVzIGFzIHRoZXogYXBwZWFyIGluIHRoZSBkb2N1bWVudA0KICogYmVmb3JlIGFwcGx5aW5nIHNvZnQgd3JhcCBhbmQgZm9sZGluZy4NCiAqLw0KdmFyIFNlbGVjdGlvbiA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOw0KICAgIHRoaXMuZG9jID0gc2Vzc2lvbi5nZXREb2N1bWVudCgpOw0KDQogICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOw0KICAgIHRoaXMuc2VsZWN0aW9uTGVhZCA9IHRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLCAwKTsNCiAgICB0aGlzLnNlbGVjdGlvbkFuY2hvciA9IHRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLCAwKTsNCg0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgdGhpcy5zZWxlY3Rpb25MZWFkLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7DQogICAgICAgIF9zZWxmLl9lbWl0KCJjaGFuZ2VDdXJzb3IiKTsNCiAgICAgICAgaWYgKCFfc2VsZi4kaXNFbXB0eSkNCiAgICAgICAgICAgIF9zZWxmLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKTsNCiAgICAgICAgaWYgKCFfc2VsZi4kcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW5PbkNoYW5nZSAmJiBlLm9sZC5jb2x1bW4gIT0gZS52YWx1ZS5jb2x1bW4pDQogICAgICAgICAgICBfc2VsZi4kdXBkYXRlRGVzaXJlZENvbHVtbigpOw0KICAgIH0pOw0KDQogICAgdGhpcy5zZWxlY3Rpb25BbmNob3Iub24oImNoYW5nZSIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAoIV9zZWxmLiRpc0VtcHR5KQ0KICAgICAgICAgICAgX3NlbGYuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpOw0KICAgIH0pOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAodGhpcy4kaXNFbXB0eSB8fCAoDQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkFuY2hvci5yb3cgPT0gdGhpcy5zZWxlY3Rpb25MZWFkLnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25BbmNob3IuY29sdW1uID09IHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4NCiAgICAgICAgKSk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNNdWx0aUxpbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gdGhpcy5nZXRSYW5nZSgpLmlzTXVsdGlMaW5lKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Q3Vyc29yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB0aGlzLnNlbGVjdGlvbkFuY2hvci5zZXRQb3NpdGlvbihyb3csIGNvbHVtbik7DQoNCiAgICAgICAgaWYgKHRoaXMuJGlzRW1wdHkpIHsNCiAgICAgICAgICAgIHRoaXMuJGlzRW1wdHkgPSBmYWxzZTsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2VsZWN0aW9uQW5jaG9yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLiRpc0VtcHR5KQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpDQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkFuY2hvci5nZXRQb3NpdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFNlbGVjdGlvbkxlYWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpOw0KICAgIH07DQoNCiAgICB0aGlzLnNoaWZ0U2VsZWN0aW9uID0gZnVuY3Rpb24oY29sdW1ucykgew0KICAgICAgICBpZiAodGhpcy4kaXNFbXB0eSkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8odGhpcy5zZWxlY3Rpb25MZWFkLnJvdywgdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbiArIGNvbHVtbnMpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBhbmNob3IgPSB0aGlzLmdldFNlbGVjdGlvbkFuY2hvcigpOw0KICAgICAgICB2YXIgbGVhZCA9IHRoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpOw0KDQogICAgICAgIHZhciBpc0JhY2t3YXJkcyA9IHRoaXMuaXNCYWNrd2FyZHMoKTsNCg0KICAgICAgICBpZiAoIWlzQmFja3dhcmRzIHx8IGFuY2hvci5jb2x1bW4gIT09IDApDQogICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihhbmNob3Iucm93LCBhbmNob3IuY29sdW1uICsgY29sdW1ucyk7DQoNCiAgICAgICAgaWYgKGlzQmFja3dhcmRzIHx8IGxlYWQuY29sdW1uICE9PSAwKSB7DQogICAgICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGxlYWQucm93LCBsZWFkLmNvbHVtbiArIGNvbHVtbnMpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5pc0JhY2t3YXJkcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5zZWxlY3Rpb25BbmNob3I7DQogICAgICAgIHZhciBsZWFkID0gdGhpcy5zZWxlY3Rpb25MZWFkOw0KICAgICAgICByZXR1cm4gKGFuY2hvci5yb3cgPiBsZWFkLnJvdyB8fCAoYW5jaG9yLnJvdyA9PSBsZWFkLnJvdyAmJiBhbmNob3IuY29sdW1uID4gbGVhZC5jb2x1bW4pKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRSYW5nZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5zZWxlY3Rpb25BbmNob3I7DQogICAgICAgIHZhciBsZWFkID0gdGhpcy5zZWxlY3Rpb25MZWFkOw0KDQogICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKGxlYWQsIGxlYWQpOw0KDQogICAgICAgIGlmICh0aGlzLmlzQmFja3dhcmRzKCkpIHsNCiAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKGxlYWQsIGFuY2hvcik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhhbmNob3IsIGxlYWQpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKCF0aGlzLiRpc0VtcHR5KSB7DQogICAgICAgICAgICB0aGlzLiRpc0VtcHR5ID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0QWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy5kb2MuZ2V0TGVuZ3RoKCkgLSAxOw0KICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihsYXN0Um93LCB0aGlzLmRvYy5nZXRMaW5lKGxhc3RSb3cpLmxlbmd0aCk7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKDAsIDApOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNlbGVjdGlvblJhbmdlID0gZnVuY3Rpb24ocmFuZ2UsIHJldmVyc2UpIHsNCiAgICAgICAgaWYgKHJldmVyc2UpIHsNCiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKHJhbmdlLmVuZC5yb3csIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICAgICAgdGhpcy5zZWxlY3RUbyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICB0aGlzLnNlbGVjdFRvKHJhbmdlLmVuZC5yb3csIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuJHVwZGF0ZURlc2lyZWRDb2x1bW4oKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdXBkYXRlRGVzaXJlZENvbHVtbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3IoKTsNCiAgICAgICAgdGhpcy4kZGVzaXJlZENvbHVtbiA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uID0gZnVuY3Rpb24obW92ZXIpIHsNCiAgICAgICAgdmFyIGxlYWQgPSB0aGlzLnNlbGVjdGlvbkxlYWQ7DQogICAgICAgIGlmICh0aGlzLiRpc0VtcHR5KQ0KICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IobGVhZC5yb3csIGxlYWQuY29sdW1uKTsNCg0KICAgICAgICBtb3Zlci5jYWxsKHRoaXMpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFRvID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uKTsNCiAgICAgICAgfSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0VG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKHBvcykgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RVcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclVwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3REb3duID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRG93bik7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0UmlnaHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JSaWdodCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0TGVmdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxlZnQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdExpbmVTdGFydCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVTdGFydCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0TGluZUVuZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVFbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdEZpbGVFbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlRW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZWxlY3RGaWxlU3RhcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlU3RhcnQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbGVjdFdvcmRSaWdodCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRSaWdodCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0V29yZExlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0V29yZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3IoKTsNCiAgICAgICAgdmFyIHJhbmdlICA9IHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbik7DQogICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOw0KICAgIH07DQoNCiAgICAvLyBTZWxlY3RzIGEgd29yZCBpbmNsdWRpbmcgaXRzIHJpZ2h0IHdoaXRlc3BhY2UNCiAgICB0aGlzLnNlbGVjdEFXb3JkID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvcigpOw0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnNlc3Npb24uZ2V0QVdvcmRSYW5nZShjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKTsNCiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShyYW5nZSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2VsZWN0TGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93U3RhcnQgPSB0aGlzLnNlbGVjdGlvbkxlYWQucm93Ow0KICAgICAgICB2YXIgcm93RW5kOw0KDQogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShyb3dTdGFydCk7DQogICAgICAgIGlmIChmb2xkTGluZSkgew0KICAgICAgICAgICAgcm93U3RhcnQgPSBmb2xkTGluZS5zdGFydC5yb3c7DQogICAgICAgICAgICByb3dFbmQgPSBmb2xkTGluZS5lbmQucm93Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcm93RW5kID0gcm93U3RhcnQ7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3Iocm93U3RhcnQsIDApOw0KICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93RW5kICsgMSwgMCk7DQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JVcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JCeSgtMSwgMCk7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvckRvd24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yQnkoMSwgMCk7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvckxlZnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpLA0KICAgICAgICAgICAgZm9sZDsNCg0KICAgICAgICBpZiAoZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbiwgLTEpKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4pOw0KICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5jb2x1bW4gPT0gMCkgew0KICAgICAgICAgICAgLy8gY3Vyc29yIGlzIGEgbGluZSAoc3RhcnQNCiAgICAgICAgICAgIGlmIChjdXJzb3Iucm93ID4gMCkgew0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGN1cnNvci5yb3cgLSAxLCB0aGlzLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cgLSAxKS5sZW5ndGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIHRhYlNpemUgPSB0aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpOw0KICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5pc1RhYlN0b3AoY3Vyc29yKSAmJiB0aGlzLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpLnNsaWNlKGN1cnNvci5jb2x1bW4tdGFiU2l6ZSwgY3Vyc29yLmNvbHVtbikuc3BsaXQoIiAiKS5sZW5ndGgtMSA9PSB0YWJTaXplKQ0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvckJ5KDAsIC10YWJTaXplKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JCeSgwLCAtMSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yUmlnaHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpLA0KICAgICAgICAgICAgZm9sZDsNCiAgICAgICAgaWYgKGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4sIDEpKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhmb2xkLmVuZC5yb3csIGZvbGQuZW5kLmNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbiA9PSB0aGlzLmRvYy5nZXRMaW5lKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3cpLmxlbmd0aCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3cgPCB0aGlzLmRvYy5nZXRMZW5ndGgoKSAtIDEpIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyh0aGlzLnNlbGVjdGlvbkxlYWQucm93ICsgMSwgMCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgdGFiU2l6ZSA9IHRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5zZWxlY3Rpb25MZWFkOw0KICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5pc1RhYlN0b3AoY3Vyc29yKSAmJiB0aGlzLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpLnNsaWNlKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4rdGFiU2l6ZSkuc3BsaXQoIiAiKS5sZW5ndGgtMSA9PSB0YWJTaXplKQ0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvckJ5KDAsIHRhYlNpemUpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvckJ5KDAsIDEpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvckxpbmVTdGFydCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93ID0gdGhpcy5zZWxlY3Rpb25MZWFkLnJvdzsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW47DQogICAgICAgIHZhciBzY3JlZW5Sb3cgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhyb3csIGNvbHVtbik7DQoNCiAgICAgICAgLy8gRGV0ZXJtIHRoZSBkb2MtcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBhdCB0aGUgc2NyZWVuIGxpbmUuDQogICAgICAgIHZhciBmaXJzdENvbHVtblBvc2l0aW9uID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Sb3csIDApOw0KDQogICAgICAgIC8vIERldGVybSB0aGUgbGluZQ0KICAgICAgICB2YXIgYmVmb3JlQ3Vyc29yID0gdGhpcy5zZXNzaW9uLmdldERpc3BsYXlMaW5lKA0KICAgICAgICAgICAgcm93LCBudWxsLA0KICAgICAgICAgICAgZmlyc3RDb2x1bW5Qb3NpdGlvbi5yb3csIGZpcnN0Q29sdW1uUG9zaXRpb24uY29sdW1uDQogICAgICAgICk7DQoNCiAgICAgICAgdmFyIGxlYWRpbmdTcGFjZSA9IGJlZm9yZUN1cnNvci5tYXRjaCgvXlxzKi8pOw0KICAgICAgICBpZiAobGVhZGluZ1NwYWNlWzBdLmxlbmd0aCA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKA0KICAgICAgICAgICAgICAgIGZpcnN0Q29sdW1uUG9zaXRpb24ucm93LCBmaXJzdENvbHVtblBvc2l0aW9uLmNvbHVtbg0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKA0KICAgICAgICAgICAgICAgIGZpcnN0Q29sdW1uUG9zaXRpb24ucm93LA0KICAgICAgICAgICAgICAgIGZpcnN0Q29sdW1uUG9zaXRpb24uY29sdW1uICsgbGVhZGluZ1NwYWNlWzBdLmxlbmd0aA0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JMaW5lRW5kID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBsZWFkID0gdGhpcy5zZWxlY3Rpb25MZWFkOw0KICAgICAgICB2YXIgbGFzdFJvd0NvbHVtblBvc2l0aW9uID0NCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbihsZWFkLnJvdywgbGVhZC5jb2x1bW4pOw0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbygNCiAgICAgICAgICAgIGxhc3RSb3dDb2x1bW5Qb3NpdGlvbi5yb3csDQogICAgICAgICAgICBsYXN0Um93Q29sdW1uUG9zaXRpb24uY29sdW1uDQogICAgICAgICk7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvckZpbGVFbmQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZG9jLmdldExlbmd0aCgpIC0gMTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuZG9jLmdldExpbmUocm93KS5sZW5ndGg7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKDAsIDApOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJvdyA9IHRoaXMuc2VsZWN0aW9uTGVhZC5yb3c7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHJpZ2h0T2ZDdXJzb3IgPSBsaW5lLnN1YnN0cmluZyhjb2x1bW4pOw0KDQogICAgICAgIHZhciBtYXRjaDsNCiAgICAgICAgdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4ID0gMDsNCiAgICAgICAgdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICAvLyBza2lwIGZvbGRzDQogICAgICAgIHZhciBmb2xkID0gdGhpcy5zZXNzaW9uLmdldEZvbGRBdChyb3csIGNvbHVtbiwgMSk7DQogICAgICAgIGlmIChmb2xkKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhmb2xkLmVuZC5yb3csIGZvbGQuZW5kLmNvbHVtbik7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIGZpcnN0IHNraXAgc3BhY2UNCiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhyaWdodE9mQ3Vyc29yKSkgew0KICAgICAgICAgICAgY29sdW1uICs9IHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleDsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCA9IDA7DQogICAgICAgICAgICByaWdodE9mQ3Vyc29yID0gbGluZS5zdWJzdHJpbmcoY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gaWYgYXQgbGluZSBlbmQgcHJvY2VlZCB3aXRoIG5leHQgbGluZQ0KICAgICAgICBpZiAoY29sdW1uID49IGxpbmUubGVuZ3RoKSB7DQogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclJpZ2h0KCk7DQogICAgICAgICAgICBpZiAocm93IDwgdGhpcy5kb2MuZ2V0TGVuZ3RoKCkgLSAxKQ0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvcldvcmRSaWdodCgpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgdG9rZW4NCiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhyaWdodE9mQ3Vyc29yKSkgew0KICAgICAgICAgICAgY29sdW1uICs9IHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleDsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCA9IDA7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3cgPSB0aGlzLnNlbGVjdGlvbkxlYWQucm93Ow0KICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbjsNCg0KICAgICAgICAvLyBza2lwIGZvbGRzDQogICAgICAgIHZhciBmb2xkOw0KICAgICAgICBpZiAoZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQocm93LCBjb2x1bW4sIC0xKSkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZm9sZC5zdGFydC5yb3csIGZvbGQuc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBzdHIgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZFN0cmluZ0F0KHJvdywgY29sdW1uLCAtMSk7DQogICAgICAgIGlmIChzdHIgPT0gbnVsbCkgew0KICAgICAgICAgICAgc3RyID0gdGhpcy5kb2MuZ2V0TGluZShyb3cpLnN1YnN0cmluZygwLCBjb2x1bW4pDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHZhciBsZWZ0T2ZDdXJzb3IgPSBsYW5nLnN0cmluZ1JldmVyc2Uoc3RyKTsNCiAgICAgICAgdmFyIG1hdGNoOw0KICAgICAgICB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXggPSAwOw0KICAgICAgICB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXggPSAwOw0KICAgICAgICANCiAgICAgICAgLy8gc2tpcCB3aGl0ZXNwYWNlDQogICAgICAgIGlmIChtYXRjaCA9IHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMobGVmdE9mQ3Vyc29yKSkgew0KICAgICAgICAgICAgY29sdW1uIC09IHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleDsNCiAgICAgICAgICAgIGxlZnRPZkN1cnNvciA9IGxlZnRPZkN1cnNvci5zbGljZSh0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgpOw0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4ID0gMDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gaWYgYXQgYmVnaW4gb2YgdGhlIGxpbmUgcHJvY2VlZCBpbiBsaW5lIGFib3ZlDQogICAgICAgIGlmIChjb2x1bW4gPD0gMCkgew0KICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCAwKTsNCiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvckxlZnQoKTsNCiAgICAgICAgICAgIGlmIChyb3cgPiAwKQ0KICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAvLyBtb3ZlIHRvIHRoZSBiZWdpbiBvZiB0aGUgd29yZA0KICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKGxlZnRPZkN1cnNvcikpIHsNCiAgICAgICAgICAgIGNvbHVtbiAtPSB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXggPSAwOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVDdXJzb3JCeSA9IGZ1bmN0aW9uKHJvd3MsIGNoYXJzKSB7DQogICAgICAgIHZhciBzY3JlZW5Qb3MgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKA0KICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25MZWFkLnJvdywNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4NCiAgICAgICAgKTsNCg0KICAgICAgICB2YXIgc2NyZWVuQ29sID0gKGNoYXJzID09PSAwICYmIHRoaXMuJGRlc2lyZWRDb2x1bW4pIHx8IHNjcmVlblBvcy5jb2x1bW47DQogICAgICAgIHZhciBkb2NQb3MgPSB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHNjcmVlblBvcy5yb3cgKyByb3dzLCBzY3JlZW5Db2wpOw0KDQogICAgICAgIC8vIG1vdmUgdGhlIGN1cnNvciBhbmQgdXBkYXRlIHRoZSBkZXNpcmVkIGNvbHVtbg0KICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhkb2NQb3Mucm93LCBkb2NQb3MuY29sdW1uICsgY2hhcnMsIGNoYXJzID09PSAwKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5tb3ZlQ3Vyc29yVG8gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW4pIHsNCiAgICAgICAgLy8gRW5zdXJlIHRoZSByb3cvY29sdW1uIGlzIG5vdCBpbnNpZGUgb2YgYSBmb2xkLg0KICAgICAgICB2YXIgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQocm93LCBjb2x1bW4sIDEpOw0KICAgICAgICBpZiAoZm9sZCkgew0KICAgICAgICAgICAgcm93ID0gZm9sZC5zdGFydC5yb3c7DQogICAgICAgICAgICBjb2x1bW4gPSBmb2xkLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuJHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uT25DaGFuZ2UgPSB0cnVlOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbkxlYWQuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOw0KICAgICAgICB0aGlzLiRwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbk9uQ2hhbmdlID0gZmFsc2U7DQoNCiAgICAgICAgaWYgKCFwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbikNCiAgICAgICAgICAgIHRoaXMuJHVwZGF0ZURlc2lyZWRDb2x1bW4odGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMubW92ZUN1cnNvclRvU2NyZWVuID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uKSB7DQogICAgICAgIHZhciBwb3MgPSB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHJvdywgY29sdW1uKTsNCiAgICAgICAgcm93ID0gcG9zLnJvdzsNCiAgICAgICAgY29sdW1uID0gcG9zLmNvbHVtbjsNCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCBjb2x1bW4sIHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uKTsNCiAgICB9Ow0KDQp9KS5jYWxsKFNlbGVjdGlvbi5wcm90b3R5cGUpOw0KDQpleHBvcnRzLlNlbGVjdGlvbiA9IFNlbGVjdGlvbjsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3JhbmdlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gZnVuY3Rpb24oc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbikgew0KICAgIHRoaXMuc3RhcnQgPSB7DQogICAgICAgIHJvdzogc3RhcnRSb3csDQogICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4NCiAgICB9Ow0KDQogICAgdGhpcy5lbmQgPSB7DQogICAgICAgIHJvdzogZW5kUm93LA0KICAgICAgICBjb2x1bW46IGVuZENvbHVtbg0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgdGhpcy5pc0VlcXVhbCA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByYW5nZS5zdGFydC5yb3cgJiYNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9PSByYW5nZS5lbmQucm93ICYmDQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9PSByYW5nZS5zdGFydC5jb2x1bW4gJiYNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9PSByYW5nZS5lbmQuY29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICgiUmFuZ2U6IFsiICsgdGhpcy5zdGFydC5yb3cgKyAiLyIgKyB0aGlzLnN0YXJ0LmNvbHVtbiArDQogICAgICAgICAgICAiXSAtPiBbIiArIHRoaXMuZW5kLnJvdyArICIvIiArIHRoaXMuZW5kLmNvbHVtbiArICJdIik7DQogICAgfTsNCg0KICAgIHRoaXMuY29udGFpbnMgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBDb21wYXJlcyB0aGlzIHJhbmdlIChBKSB3aXRoIGFub3RoZXIgcmFuZ2UgKEIpLCB3aGVyZSBCIGlzIHRoZSBwYXNzZWQgaW4NCiAgICAgKiByYW5nZS4NCiAgICAgKg0KICAgICAqIFJldHVybiB2YWx1ZXM6DQogICAgICogIC0yOiAoQikgaXMgaW5mcm9udCBvZiAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpDQogICAgICogIC0xOiAoQikgYmVnaW5zIGJlZm9yZSAoQSkgYnV0IGVuZHMgaW5zaWRlIG9mIChBKQ0KICAgICAqICAgMDogKEIpIGlzIGNvbXBsZXRseSBpbnNpZGUgb2YgKEEpIE9SIChBKSBpcyBjb21wbGV0eSBpbnNpZGUgb2YgKEIpDQogICAgICogICsxOiAoQikgYmVnaW5zIGluc2lkZSBvZiAoQSkgYnV0IGVuZHMgb3V0c2lkZSBvZiAoQSkNCiAgICAgKiAgKzI6IChCKSBpcyBhZnRlciAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpDQogICAgICoNCiAgICAgKiAgNDI6IEZUVyBzdGF0ZTogKEIpIGVuZHMgaW4gKEEpIGJ1dCBzdGFydHMgb3V0c2lkZSBvZiAoQSkNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHZhciBjbXAsDQogICAgICAgICAgICBlbmQgPSByYW5nZS5lbmQsDQogICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbmQucm93LCBlbmQuY29sdW1uKTsNCiAgICAgICAgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgcmV0dXJuIC0yOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDQyOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZVBvaW50ID0gZnVuY3Rpb24ocCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHAucm93LCBwLmNvbHVtbik7DQogICAgfQ0KDQogICAgdGhpcy5jb250YWluc1JhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsNCiAgICB9DQoNCiAgICB0aGlzLmlzRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbjsNCiAgICB9DQoNCiAgICB0aGlzLmlzU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsNCiAgICB9DQoNCiAgICB0aGlzLnNldFN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHR5cGVvZiByb3cgPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93Ow0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLnNldEVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSByb3cuY29sdW1uOw0KICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gcm93LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGNvbHVtbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pIHx8IHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZVN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7DQogICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICghdGhpcy5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICBpZiAocm93ID09PSB0aGlzLnN0YXJ0LnJvdykgew0KICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPCB0aGlzLnN0YXJ0LmNvbHVtbiA/IC0xIDogKGNvbHVtbiA+IHRoaXMuZW5kLmNvbHVtbiA/IDEgOiAwKTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocm93IDwgdGhpcy5zdGFydC5yb3cpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgaWYgKHJvdyA+IHRoaXMuZW5kLnJvdykNCiAgICAgICAgICAgIHJldHVybiAxOw0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA+PSB0aGlzLnN0YXJ0LmNvbHVtbiA/IDAgOiAtMTsNCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09PSByb3cpDQogICAgICAgICAgICByZXR1cm4gY29sdW1uIDw9IHRoaXMuZW5kLmNvbHVtbiA/IDAgOiAxOw0KDQogICAgICAgIHJldHVybiAwOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc1N0YXJ0IGlzIHRydWUsIHJldHVybiAtMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzRW5kIGlzIHRydWUsIHJldHVybiAxOw0KICAgICAqLw0KICAgIHRoaXMuY29tcGFyZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVJbnNpZGUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY2xpcFJvd3MgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPiBsYXN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmV4dGVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KDQogICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICBlbHNlIGlmIChjbXAgPT0gLTEpDQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59Ow0KDQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09IHRoaXMuZW5kLnJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSB0aGlzLmVuZC5jb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGhpcy5zdGFydCwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbGxhcHNlUm93cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5lbmQuY29sdW1uID09IDApDQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCBNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdywgdGhpcy5lbmQucm93LTEpLCAwKQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCB0aGlzLmVuZC5yb3csIDApDQogICAgfTsNCg0KICAgIHRoaXMudG9TY3JlZW5SYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHNjcmVlblBvc1N0YXJ0ID0NCiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpOw0KICAgICAgICB2YXIgc2NyZWVuUG9zRW5kID0NCiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTsNCg0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlKA0KICAgICAgICAgICAgc2NyZWVuUG9zU3RhcnQucm93LCBzY3JlZW5Qb3NTdGFydC5jb2x1bW4sDQogICAgICAgICAgICBzY3JlZW5Qb3NFbmQucm93LCBzY3JlZW5Qb3NFbmQuY29sdW1uDQogICAgICAgICk7DQogICAgfTsNCg0KfSkuY2FsbChSYW5nZS5wcm90b3R5cGUpOw0KDQoNClJhbmdlLmZyb21Qb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbiwgZW5kLnJvdywgZW5kLmNvbHVtbik7DQp9Ow0KDQpleHBvcnRzLlJhbmdlID0gUmFuZ2U7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS90ZXh0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2JlaGF2aW91cicsICdhY2UvdW5pY29kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgVGV4dEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IEJlaGF2aW91cigpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2tlblJlID0gbmV3IFJlZ0V4cCgiXlsiDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSsiLCAiZyINCiAgICApOw0KICAgIA0KICAgIHRoaXMubm9uVG9rZW5SZSA9IG5ldyBSZWdFeHAoIl4oPzpbXiINCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLkwNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk1uICsgdW5pY29kZS5wYWNrYWdlcy5NYw0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTmQNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLlBjICsgIlxcJF9dfFxzXSkrIiwgImciDQogICAgKTsNCg0KICAgIHRoaXMuZ2V0VG9rZW5pemVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR0b2tlbml6ZXI7DQogICAgfTsNCg0KICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgew0KICAgIH07DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5oaWdobGlnaHRTZWxlY3Rpb24gPSBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICAgICAgdmFyIHNlc3Npb24gPSBlZGl0b3Iuc2Vzc2lvbjsNCiAgICAgICAgaWYgKCFzZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcykNCiAgICAgICAgICAgIHNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzID0gW107DQoNCiAgICAgICAgaWYgKHNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzLmxlbmd0aCkNCiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25IaWdobGlnaHQoZWRpdG9yKTsNCg0KICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHNlbGVjdGlvbi5pc011bHRpTGluZSgpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBzdGFydE91dGVyID0gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAtIDE7DQogICAgICAgIHZhciBlbmRPdXRlciA9IHNlbGVjdGlvbi5lbmQuY29sdW1uICsgMTsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUoc2VsZWN0aW9uLnN0YXJ0LnJvdyk7DQogICAgICAgIHZhciBsaW5lQ29scyA9IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgbmVlZGxlID0gbGluZS5zdWJzdHJpbmcoTWF0aC5tYXgoc3RhcnRPdXRlciwgMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihlbmRPdXRlciwgbGluZUNvbHMpKTsNCg0KICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG91dGVyIGNoYXJhY3RlcnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JkLg0KICAgICAgICBpZiAoKHN0YXJ0T3V0ZXIgPj0gMCAmJiAvXltcd1xkXS8udGVzdChuZWVkbGUpKSB8fA0KICAgICAgICAgICAgKGVuZE91dGVyIDw9IGxpbmVDb2xzICYmIC9bXHdcZF0kLy50ZXN0KG5lZWRsZSkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIG5lZWRsZSA9IGxpbmUuc3Vic3RyaW5nKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4sIHNlbGVjdGlvbi5lbmQuY29sdW1uKTsNCiAgICAgICAgaWYgKCEvXltcd1xkXSskLy50ZXN0KG5lZWRsZSkpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KDQogICAgICAgIHZhciBuZXdPcHRpb25zID0gew0KICAgICAgICAgICAgd3JhcDogdHJ1ZSwNCiAgICAgICAgICAgIHdob2xlV29yZDogdHJ1ZSwNCiAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IHRydWUsDQogICAgICAgICAgICBuZWVkbGU6IG5lZWRsZQ0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBjdXJyZW50T3B0aW9ucyA9IGVkaXRvci4kc2VhcmNoLmdldE9wdGlvbnMoKTsNCiAgICAgICAgZWRpdG9yLiRzZWFyY2guc2V0KG5ld09wdGlvbnMpOw0KDQogICAgICAgIHZhciByYW5nZXMgPSBlZGl0b3IuJHNlYXJjaC5maW5kQWxsKHNlc3Npb24pOw0KICAgICAgICByYW5nZXMuZm9yRWFjaChmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAgICAgaWYgKCFyYW5nZS5jb250YWlucyhjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBzZXNzaW9uLmFkZE1hcmtlcihyYW5nZSwgImFjZV9zZWxlY3RlZF93b3JkIiwgInRleHQiKTsNCiAgICAgICAgICAgICAgICBzZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5wdXNoKG1hcmtlcik7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGVkaXRvci4kc2VhcmNoLnNldChjdXJyZW50T3B0aW9ucyk7DQogICAgfTsNCg0KICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25IaWdobGlnaHQgPSBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICAgICAgaWYgKCFlZGl0b3Iuc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgZWRpdG9yLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzLmZvckVhY2goZnVuY3Rpb24obWFya2VyKSB7DQogICAgICAgICAgICBlZGl0b3Iuc2Vzc2lvbi5yZW1vdmVNYXJrZXIobWFya2VyKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZWRpdG9yLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzID0gW107DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMgPSBmdW5jdGlvbiAobWFwcGluZykgew0KICAgICAgICBpZiAoIXRoaXMuJGVtYmVkcykgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuJG1vZGVzID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy4kZW1iZWRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAobWFwcGluZ1t0aGlzLiRlbWJlZHNbaV1dKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2ldXSA9IG5ldyBtYXBwaW5nW3RoaXMuJGVtYmVkc1tpXV0oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdmFyIGRlbGVnYXRpb25zID0gWyd0b2dnbGVDb21tZW50TGluZXMnLCAnZ2V0TmV4dExpbmVJbmRlbnQnLCAnY2hlY2tPdXRkZW50JywgJ2F1dG9PdXRkZW50JywgJ3RyYW5zZm9ybUFjdGlvbiddOw0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZWdhdGlvbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIChmdW5jdGlvbihzY29wZSkgew0KICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gZGVsZWdhdGlvbnNbaV07DQogICAgICAgICAgICAgIHZhciBkZWZhdWx0SGFuZGxlciA9IHNjb3BlW2Z1bmN0aW9uTmFtZV07DQogICAgICAgICAgICAgIHNjb3BlW2RlbGVnYXRpb25zW2ldXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGRlbGVnYXRvcihmdW5jdGlvbk5hbWUsIGFyZ3VtZW50cywgZGVmYXVsdEhhbmRsZXIpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ICh0aGlzKSk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgdGhpcy4kZGVsZWdhdG9yID0gZnVuY3Rpb24obWV0aG9kLCBhcmdzLCBkZWZhdWx0SGFuZGxlcikgew0KICAgICAgICB2YXIgc3RhdGUgPSBhcmdzWzBdOw0KICAgICAgICANCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLiRlbWJlZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmICghdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2ldXSkgY29udGludWU7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHZhciBzcGxpdCA9IHN0YXRlLnNwbGl0KHRoaXMuJGVtYmVkc1tpXSk7DQogICAgICAgICAgICBpZiAoIXNwbGl0WzBdICYmIHNwbGl0WzFdKSB7DQogICAgICAgICAgICAgICAgYXJnc1swXSA9IHNwbGl0WzFdOw0KICAgICAgICAgICAgICAgIHZhciBtb2RlID0gdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2ldXTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZVttZXRob2RdLmFwcGx5KG1vZGUsIGFyZ3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciByZXQgPSBkZWZhdWx0SGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTsNCiAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyID8gcmV0IDogdW5kZWZpbmVkOw0KICAgIH07DQogICAgDQogICAgdGhpcy50cmFuc2Zvcm1BY3Rpb24gPSBmdW5jdGlvbihzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHBhcmFtKSB7DQogICAgICAgIGlmICh0aGlzLiRiZWhhdmlvdXIpIHsNCiAgICAgICAgICAgIHZhciBiZWhhdmlvdXJzID0gdGhpcy4kYmVoYXZpb3VyLmdldEJlaGF2aW91cnMoKTsNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBiZWhhdmlvdXJzKSB7DQogICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91cnNba2V5XVthY3Rpb25dKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBiZWhhdmlvdXJzW2tleV1bYWN0aW9uXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIA0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS90b2tlbml6ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgVG9rZW5pemVyID0gZnVuY3Rpb24ocnVsZXMsIGZsYWcpIHsNCiAgICBmbGFnID0gZmxhZyA/ICJnIiArIGZsYWcgOiAiZyI7DQogICAgdGhpcy5ydWxlcyA9IHJ1bGVzOw0KDQogICAgdGhpcy5yZWdFeHBzID0ge307DQogICAgdGhpcy5tYXRjaE1hcHBpbmdzID0ge307DQogICAgZm9yICggdmFyIGtleSBpbiB0aGlzLnJ1bGVzKSB7DQogICAgICAgIHZhciBydWxlID0gdGhpcy5ydWxlc1trZXldOw0KICAgICAgICB2YXIgc3RhdGUgPSBydWxlOw0KICAgICAgICB2YXIgcnVsZVJlZ0V4cHMgPSBbXTsNCiAgICAgICAgdmFyIG1hdGNoVG90YWwgPSAwOw0KICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMubWF0Y2hNYXBwaW5nc1trZXldID0ge307DQogICAgICAgIA0KICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBzdGF0ZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgLy8gQ291bnQgbnVtYmVyIG9mIG1hdGNoaW5nIGdyb3Vwcy4gMiBleHRyYSBncm91cHMgZnJvbSB0aGUgZnVsbCBtYXRjaA0KICAgICAgICAgICAgLy8gQW5kIHRoZSBjYXRjaC1hbGwgb24gdGhlIGVuZCAodXNlZCB0byBmb3JjZSBhIG1hdGNoKTsNCiAgICAgICAgICAgIHZhciBtYXRjaGNvdW50ID0gbmV3IFJlZ0V4cCgiKD86KCIgKyBzdGF0ZVtpXS5yZWdleCArICIpfCguKSkiKS5leGVjKCJhIikubGVuZ3RoIC0gMjsNCiAgICAgICAgDQogICAgICAgICAgICAvLyBSZXBsYWNlIGFueSBiYWNrcmVmZXJlbmNlcyBhbmQgb2Zmc2V0IGFwcHJvcHJpYXRlbHkuDQogICAgICAgICAgICB2YXIgYWRqdXN0ZWRyZWdleCA9IHN0YXRlW2ldLnJlZ2V4LnJlcGxhY2UoL1xcKFswLTldKykvZywgZnVuY3Rpb24gKG1hdGNoLCBkaWdpdCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiXFwiICsgKHBhcnNlSW50KGRpZ2l0LCAxMCkgKyBtYXRjaFRvdGFsICsgMSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgbWFwcGluZ1ttYXRjaFRvdGFsXSA9IHsNCiAgICAgICAgICAgICAgICBydWxlOiBpLA0KICAgICAgICAgICAgICAgIGxlbjogbWF0Y2hjb3VudA0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIG1hdGNoVG90YWwgKz0gbWF0Y2hjb3VudDsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcnVsZVJlZ0V4cHMucHVzaChhZGp1c3RlZHJlZ2V4KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMucmVnRXhwc1trZXldID0gbmV3IFJlZ0V4cCgiKD86KCIgKyBydWxlUmVnRXhwcy5qb2luKCIpfCgiKSArICIpfCguKSkiLCBmbGFnKTsNCiAgICB9DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldExpbmVUb2tlbnMgPSBmdW5jdGlvbihsaW5lLCBzdGFydFN0YXRlKSB7DQogICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBzdGFydFN0YXRlOw0KICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnJ1bGVzW2N1cnJlbnRTdGF0ZV07DQogICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5tYXRjaE1hcHBpbmdzW2N1cnJlbnRTdGF0ZV07DQogICAgICAgIHZhciByZSA9IHRoaXMucmVnRXhwc1tjdXJyZW50U3RhdGVdOw0KICAgICAgICByZS5sYXN0SW5kZXggPSAwOw0KICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoLCB0b2tlbnMgPSBbXTsNCiAgICAgICAgDQogICAgICAgIHZhciBsYXN0SW5kZXggPSAwOw0KICAgICAgICANCiAgICAgICAgdmFyIHRva2VuID0gew0KICAgICAgICAgICAgdHlwZTogbnVsbCwNCiAgICAgICAgICAgIHZhbHVlOiAiIg0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgd2hpbGUgKG1hdGNoID0gcmUuZXhlYyhsaW5lKSkgew0KICAgICAgICAgICAgdmFyIHR5cGUgPSAidGV4dCI7DQogICAgICAgICAgICB2YXIgcnVsZSA9IG51bGw7DQogICAgICAgICAgICB2YXIgdmFsdWUgPSBbbWF0Y2hbMF1dOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoLmxlbmd0aC0yOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbaSArIDFdICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHN0YXRlW21hcHBpbmdbaV0ucnVsZV07DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGluZ1tpXS5sZW4gPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdGNoLnNsaWNlKGkrMiwgaSsxK21hcHBpbmdbaV0ubGVuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0b2tlbiB0eXBlDQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS50b2tlbiA9PSAiZnVuY3Rpb24iKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHJ1bGUudG9rZW4uYXBwbHkodGhpcywgdmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gcnVsZS50b2tlbjsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IHJ1bGUubmV4dDsgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSBjdXJyZW50U3RhdGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IG5leHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoaXMucnVsZXNbY3VycmVudFN0YXRlXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLm1hdGNoTWFwcGluZ3NbY3VycmVudFN0YXRlXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHJlLmxhc3RJbmRleDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSB0aGlzLnJlZ0V4cHNbY3VycmVudFN0YXRlXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlLmxhc3RJbmRleCA9IGxhc3RJbmRleDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh2YWx1ZVswXSkgew0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZS5qb2luKCIiKV07DQogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBbdHlwZV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCghcnVsZSB8fCBydWxlLm1lcmdlIHx8IHR5cGVbaV0gPT09ICJ0ZXh0IikgJiYgdG9rZW4udHlwZSA9PT0gdHlwZVtpXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgKz0gdmFsdWVbaV07DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgbGFzdEluZGV4ID0gcmUubGFzdEluZGV4Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRva2VuLnR5cGUpDQogICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VucyA6IHRva2VucywNCiAgICAgICAgICAgIHN0YXRlIDogY3VycmVudFN0YXRlDQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChUb2tlbml6ZXIucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Ub2tlbml6ZXIgPSBUb2tlbml6ZXI7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAiZW1wdHlfbGluZSIsDQogICAgICAgICAgICByZWdleCA6ICdeJCcNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5hZGRSdWxlcyA9IGZ1bmN0aW9uKHJ1bGVzLCBwcmVmaXgpIHsNCiAgICAgICAgZm9yICh2YXIga2V5IGluIHJ1bGVzKSB7DQogICAgICAgICAgICB2YXIgc3RhdGUgPSBydWxlc1trZXldOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHN0YXRlLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIHJ1bGUgPSBzdGF0ZVtpXTsNCiAgICAgICAgICAgICAgICBpZiAocnVsZS5uZXh0KSB7DQogICAgICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9IHByZWZpeCArIHJ1bGUubmV4dDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBydWxlLm5leHQgPSBwcmVmaXggKyBrZXk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy4kcnVsZXNbcHJlZml4ICsga2V5XSA9IHN0YXRlOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0UnVsZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHJ1bGVzOw0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzID0gZnVuY3Rpb24gKEhpZ2hsaWdodFJ1bGVzLCBwcmVmaXgsIGVzY2FwZVJ1bGVzLCBzdGF0ZXMpIHsNCiAgICAgICAgdmFyIGVtYmVkUnVsZXMgPSBuZXcgSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpOw0KICAgICAgICBpZiAoc3RhdGVzKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHN0YXRlc1tpXSA9IHByZWZpeCArIHN0YXRlc1tpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHN0YXRlcyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGVtYmVkUnVsZXMpIHsNCiAgICAgICAgICAgICAgICBzdGF0ZXMucHVzaChwcmVmaXggKyBrZXkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuYWRkUnVsZXMoZW1iZWRSdWxlcywgcHJlZml4KTsNCiAgICAgICAgDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseSh0aGlzLiRydWxlc1tzdGF0ZXNbaV1dLCBsYW5nLmRlZXBDb3B5KGVzY2FwZVJ1bGVzKSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICghdGhpcy4kZW1iZWRzKSB7DQogICAgICAgICAgICB0aGlzLiRlbWJlZHMgPSBbXTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRlbWJlZHMucHVzaChwcmVmaXgpOw0KICAgIH0NCiAgICANCiAgICB0aGlzLmdldEVtYmVkcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kZW1iZWRzOw0KICAgIH0NCg0KfSkuY2FsbChUZXh0SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5UZXh0SGlnaGxpZ2h0UnVsZXMgPSBUZXh0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIEJlaGF2aW91ciA9IGZ1bmN0aW9uKCkgew0KICAgdGhpcy4kYmVoYXZpb3VycyA9IHt9Ow0KfTsNCg0KKGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkID0gZnVuY3Rpb24gKG5hbWUsIGFjdGlvbiwgY2FsbGJhY2spIHsNCiAgICAgICAgc3dpdGNoICh1bmRlZmluZWQpIHsNCiAgICAgICAgICBjYXNlIHRoaXMuJGJlaGF2aW91cnM6DQogICAgICAgICAgICAgIHRoaXMuJGJlaGF2aW91cnMgPSB7fTsNCiAgICAgICAgICBjYXNlIHRoaXMuJGJlaGF2aW91cnNbbmFtZV06DQogICAgICAgICAgICAgIHRoaXMuJGJlaGF2aW91cnNbbmFtZV0gPSB7fTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRiZWhhdmlvdXJzW25hbWVdW2FjdGlvbl0gPSBjYWxsYmFjazsNCiAgICB9DQogICAgDQogICAgdGhpcy5hZGRCZWhhdmlvdXJzID0gZnVuY3Rpb24gKGJlaGF2aW91cnMpIHsNCiAgICAgICAgZm9yICh2YXIga2V5IGluIGJlaGF2aW91cnMpIHsNCiAgICAgICAgICAgIGZvciAodmFyIGFjdGlvbiBpbiBiZWhhdmlvdXJzW2tleV0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmFkZChrZXksIGFjdGlvbiwgYmVoYXZpb3Vyc1trZXldW2FjdGlvbl0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKG5hbWUpIHsNCiAgICAgICAgaWYgKHRoaXMuJGJlaGF2aW91cnMgJiYgdGhpcy4kYmVoYXZpb3Vyc1tuYW1lXSkgew0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuJGJlaGF2aW91cnNbbmFtZV07DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgdGhpcy5pbmhlcml0ID0gZnVuY3Rpb24gKG1vZGUsIGZpbHRlcikgew0KICAgICAgICBpZiAodHlwZW9mIG1vZGUgPT09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgIHZhciBiZWhhdmlvdXJzID0gbmV3IG1vZGUoKS5nZXRCZWhhdmlvdXJzKGZpbHRlcik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YXIgYmVoYXZpb3VycyA9IG1vZGUuZ2V0QmVoYXZpb3VycyhmaWx0ZXIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKTsNCiAgICB9DQogICAgDQogICAgdGhpcy5nZXRCZWhhdmlvdXJzID0gZnVuY3Rpb24gKGZpbHRlcikgew0KICAgICAgICBpZiAoIWZpbHRlcikgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGJlaGF2aW91cnM7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YXIgcmV0ID0ge30NCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsdGVyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuJGJlaGF2aW91cnNbZmlsdGVyW2ldXSkgew0KICAgICAgICAgICAgICAgICAgICByZXRbZmlsdGVyW2ldXSA9IHRoaXMuJGJlaGF2aW91cnNbZmlsdGVyW2ldXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmV0Ow0KICAgICAgICB9DQogICAgfQ0KDQp9KS5jYWxsKEJlaGF2aW91ci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkJlaGF2aW91ciA9IEJlaGF2aW91cjsNCn0pO2RlZmluZSgnYWNlL3VuaWNvZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQovKg0KWFJlZ0V4cCBVbmljb2RlIHBsdWdpbiBwYWNrOiBDYXRlZ29yaWVzIDEuMA0KKGMpIDIwMTAgU3RldmVuIExldml0aGFuDQpNSVQgTGljZW5zZQ0KPGh0dHA6Ly94cmVnZXhwLmNvbT4NClVzZXMgdGhlIFVuaWNvZGUgNS4yIGNoYXJhY3RlciBkYXRhYmFzZQ0KDQpUaGlzIHBhY2thZ2UgZm9yIHRoZSBYUmVnRXhwIFVuaWNvZGUgcGx1Z2luIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBVbmljb2RlIGNhdGVnb3JpZXMgKGFrYSBwcm9wZXJ0aWVzKToNCg0KTCAtIExldHRlciAodGhlIHRvcC1sZXZlbCBMZXR0ZXIgY2F0ZWdvcnkgaXMgaW5jbHVkZWQgaW4gdGhlIFVuaWNvZGUgcGx1Z2luIGJhc2Ugc2NyaXB0KQ0KICAgIExsIC0gTG93ZXJjYXNlIGxldHRlcg0KICAgIEx1IC0gVXBwZXJjYXNlIGxldHRlcg0KICAgIEx0IC0gVGl0bGVjYXNlIGxldHRlcg0KICAgIExtIC0gTW9kaWZpZXIgbGV0dGVyDQogICAgTG8gLSBMZXR0ZXIgd2l0aG91dCBjYXNlDQpNIC0gTWFyaw0KICAgIE1uIC0gTm9uLXNwYWNpbmcgbWFyaw0KICAgIE1jIC0gU3BhY2luZyBjb21iaW5pbmcgbWFyaw0KICAgIE1lIC0gRW5jbG9zaW5nIG1hcmsNCk4gLSBOdW1iZXINCiAgICBOZCAtIERlY2ltYWwgZGlnaXQNCiAgICBObCAtIExldHRlciBudW1iZXINCiAgICBObyAtICBPdGhlciBudW1iZXINClAgLSBQdW5jdHVhdGlvbg0KICAgIFBkIC0gRGFzaCBwdW5jdHVhdGlvbg0KICAgIFBzIC0gT3BlbiBwdW5jdHVhdGlvbg0KICAgIFBlIC0gQ2xvc2UgcHVuY3R1YXRpb24NCiAgICBQaSAtIEluaXRpYWwgcHVuY3R1YXRpb24NCiAgICBQZiAtIEZpbmFsIHB1bmN0dWF0aW9uDQogICAgUGMgLSBDb25uZWN0b3IgcHVuY3R1YXRpb24NCiAgICBQbyAtIE90aGVyIHB1bmN0dWF0aW9uDQpTIC0gU3ltYm9sDQogICAgU20gLSBNYXRoIHN5bWJvbA0KICAgIFNjIC0gQ3VycmVuY3kgc3ltYm9sDQogICAgU2sgLSBNb2RpZmllciBzeW1ib2wNCiAgICBTbyAtIE90aGVyIHN5bWJvbA0KWiAtIFNlcGFyYXRvcg0KICAgIFpzIC0gU3BhY2Ugc2VwYXJhdG9yDQogICAgWmwgLSBMaW5lIHNlcGFyYXRvcg0KICAgIFpwIC0gUGFyYWdyYXBoIHNlcGFyYXRvcg0KQyAtIE90aGVyDQogICAgQ2MgLSBDb250cm9sDQogICAgQ2YgLSBGb3JtYXQNCiAgICBDbyAtIFByaXZhdGUgdXNlDQogICAgQ3MgLSBTdXJyb2dhdGUNCiAgICBDbiAtIFVuYXNzaWduZWQNCg0KRXhhbXBsZSB1c2FnZToNCg0KICAgIFxwe059DQogICAgXHB7Q259DQoqLw0KDQoNCi8vIHdpbGwgYmUgcG9wdWxhdGVkIGJ5IGFkZFVuaWNvZGVQYWNrYWdlDQpleHBvcnRzLnBhY2thZ2VzID0ge307DQoNCmFkZFVuaWNvZGVQYWNrYWdlKHsNCiAgICBMOiAgIjAwNDEtMDA1QTAwNjEtMDA3QTAwQUEwMEI1MDBCQTAwQzAtMDBENjAwRDgtMDBGNjAwRjgtMDJDMTAyQzYtMDJEMTAyRTAtMDJFNDAyRUMwMkVFMDM3MC0wMzc0MDM3NjAzNzcwMzdBLTAzN0QwMzg2MDM4OC0wMzhBMDM4QzAzOEUtMDNBMTAzQTMtMDNGNTAzRjctMDQ4MTA0OEEtMDUyNTA1MzEtMDU1NjA1NTkwNTYxLTA1ODcwNUQwLTA1RUEwNUYwLTA1RjIwNjIxLTA2NEEwNjZFMDY2RjA2NzEtMDZEMzA2RDUwNkU1MDZFNjA2RUUwNkVGMDZGQS0wNkZDMDZGRjA3MTAwNzEyLTA3MkYwNzRELTA3QTUwN0IxMDdDQS0wN0VBMDdGNDA3RjUwN0ZBMDgwMC0wODE1MDgxQTA4MjQwODI4MDkwNC0wOTM5MDkzRDA5NTAwOTU4LTA5NjEwOTcxMDk3MjA5NzktMDk3RjA5ODUtMDk4QzA5OEYwOTkwMDk5My0wOUE4MDlBQS0wOUIwMDlCMjA5QjYtMDlCOTA5QkQwOUNFMDlEQzA5REQwOURGLTA5RTEwOUYwMDlGMTBBMDUtMEEwQTBBMEYwQTEwMEExMy0wQTI4MEEyQS0wQTMwMEEzMjBBMzMwQTM1MEEzNjBBMzgwQTM5MEE1OS0wQTVDMEE1RTBBNzItMEE3NDBBODUtMEE4RDBBOEYtMEE5MTBBOTMtMEFBODBBQUEtMEFCMDBBQjIwQUIzMEFCNS0wQUI5MEFCRDBBRDAwQUUwMEFFMTBCMDUtMEIwQzBCMEYwQjEwMEIxMy0wQjI4MEIyQS0wQjMwMEIzMjBCMzMwQjM1LTBCMzkwQjNEMEI1QzBCNUQwQjVGLTBCNjEwQjcxMEI4MzBCODUtMEI4QTBCOEUtMEI5MDBCOTItMEI5NTBCOTkwQjlBMEI5QzBCOUUwQjlGMEJBMzBCQTQwQkE4LTBCQUEwQkFFLTBCQjkwQkQwMEMwNS0wQzBDMEMwRS0wQzEwMEMxMi0wQzI4MEMyQS0wQzMzMEMzNS0wQzM5MEMzRDBDNTgwQzU5MEM2MDBDNjEwQzg1LTBDOEMwQzhFLTBDOTAwQzkyLTBDQTgwQ0FBLTBDQjMwQ0I1LTBDQjkwQ0JEMENERTBDRTAwQ0UxMEQwNS0wRDBDMEQwRS0wRDEwMEQxMi0wRDI4MEQyQS0wRDM5MEQzRDBENjAwRDYxMEQ3QS0wRDdGMEQ4NS0wRDk2MEQ5QS0wREIxMERCMy0wREJCMERCRDBEQzAtMERDNjBFMDEtMEUzMDBFMzIwRTMzMEU0MC0wRTQ2MEU4MTBFODIwRTg0MEU4NzBFODgwRThBMEU4RDBFOTQtMEU5NzBFOTktMEU5RjBFQTEtMEVBMzBFQTUwRUE3MEVBQTBFQUIwRUFELTBFQjAwRUIyMEVCMzBFQkQwRUMwLTBFQzQwRUM2MEVEQzBFREQwRjAwMEY0MC0wRjQ3MEY0OS0wRjZDMEY4OC0wRjhCMTAwMC0xMDJBMTAzRjEwNTAtMTA1NTEwNUEtMTA1RDEwNjExMDY1MTA2NjEwNkUtMTA3MDEwNzUtMTA4MTEwOEUxMEEwLTEwQzUxMEQwLTEwRkExMEZDMTEwMC0xMjQ4MTI0QS0xMjREMTI1MC0xMjU2MTI1ODEyNUEtMTI1RDEyNjAtMTI4ODEyOEEtMTI4RDEyOTAtMTJCMDEyQjItMTJCNTEyQjgtMTJCRTEyQzAxMkMyLTEyQzUxMkM4LTEyRDYxMkQ4LTEzMTAxMzEyLTEzMTUxMzE4LTEzNUExMzgwLTEzOEYxM0EwLTEzRjQxNDAxLTE2NkMxNjZGLTE2N0YxNjgxLTE2OUExNkEwLTE2RUExNzAwLTE3MEMxNzBFLTE3MTExNzIwLTE3MzExNzQwLTE3NTExNzYwLTE3NkMxNzZFLTE3NzAxNzgwLTE3QjMxN0Q3MTdEQzE4MjAtMTg3NzE4ODAtMThBODE4QUExOEIwLTE4RjUxOTAwLTE5MUMxOTUwLTE5NkQxOTcwLTE5NzQxOTgwLTE5QUIxOUMxLTE5QzcxQTAwLTFBMTYxQTIwLTFBNTQxQUE3MUIwNS0xQjMzMUI0NS0xQjRCMUI4My0xQkEwMUJBRTFCQUYxQzAwLTFDMjMxQzRELTFDNEYxQzVBLTFDN0QxQ0U5LTFDRUMxQ0VFLTFDRjExRDAwLTFEQkYxRTAwLTFGMTUxRjE4LTFGMUQxRjIwLTFGNDUxRjQ4LTFGNEQxRjUwLTFGNTcxRjU5MUY1QjFGNUQxRjVGLTFGN0QxRjgwLTFGQjQxRkI2LTFGQkMxRkJFMUZDMi0xRkM0MUZDNi0xRkNDMUZEMC0xRkQzMUZENi0xRkRCMUZFMC0xRkVDMUZGMi0xRkY0MUZGNi0xRkZDMjA3MTIwN0YyMDkwLTIwOTQyMTAyMjEwNzIxMEEtMjExMzIxMTUyMTE5LTIxMUQyMTI0MjEyNjIxMjgyMTJBLTIxMkQyMTJGLTIxMzkyMTNDLTIxM0YyMTQ1LTIxNDkyMTRFMjE4MzIxODQyQzAwLTJDMkUyQzMwLTJDNUUyQzYwLTJDRTQyQ0VCLTJDRUUyRDAwLTJEMjUyRDMwLTJENjUyRDZGMkQ4MC0yRDk2MkRBMC0yREE2MkRBOC0yREFFMkRCMC0yREI2MkRCOC0yREJFMkRDMC0yREM2MkRDOC0yRENFMkREMC0yREQ2MkREOC0yRERFMkUyRjMwMDUzMDA2MzAzMS0zMDM1MzAzQjMwM0MzMDQxLTMwOTYzMDlELTMwOUYzMEExLTMwRkEzMEZDLTMwRkYzMTA1LTMxMkQzMTMxLTMxOEUzMUEwLTMxQjczMUYwLTMxRkYzNDAwLTREQjU0RTAwLTlGQ0JBMDAwLUE0OENBNEQwLUE0RkRBNTAwLUE2MENBNjEwLUE2MUZBNjJBQTYyQkE2NDAtQTY1RkE2NjItQTY2RUE2N0YtQTY5N0E2QTAtQTZFNUE3MTctQTcxRkE3MjItQTc4OEE3OEJBNzhDQTdGQi1BODAxQTgwMy1BODA1QTgwNy1BODBBQTgwQy1BODIyQTg0MC1BODczQTg4Mi1BOEIzQThGMi1BOEY3QThGQkE5MEEtQTkyNUE5MzAtQTk0NkE5NjAtQTk3Q0E5ODQtQTlCMkE5Q0ZBQTAwLUFBMjhBQTQwLUFBNDJBQTQ0LUFBNEJBQTYwLUFBNzZBQTdBQUE4MC1BQUFGQUFCMUFBQjVBQUI2QUFCOS1BQUJEQUFDMEFBQzJBQURCLUFBRERBQkMwLUFCRTJBQzAwLUQ3QTNEN0IwLUQ3QzZEN0NCLUQ3RkJGOTAwLUZBMkRGQTMwLUZBNkRGQTcwLUZBRDlGQjAwLUZCMDZGQjEzLUZCMTdGQjFERkIxRi1GQjI4RkIyQS1GQjM2RkIzOC1GQjNDRkIzRUZCNDBGQjQxRkI0M0ZCNDRGQjQ2LUZCQjFGQkQzLUZEM0RGRDUwLUZEOEZGRDkyLUZEQzdGREYwLUZERkJGRTcwLUZFNzRGRTc2LUZFRkNGRjIxLUZGM0FGRjQxLUZGNUFGRjY2LUZGQkVGRkMyLUZGQzdGRkNBLUZGQ0ZGRkQyLUZGRDdGRkRBLUZGREMiLA0KICAgIExsOiAiMDA2MS0wMDdBMDBBQTAwQjUwMEJBMDBERi0wMEY2MDBGOC0wMEZGMDEwMTAxMDMwMTA1MDEwNzAxMDkwMTBCMDEwRDAxMEYwMTExMDExMzAxMTUwMTE3MDExOTAxMUIwMTFEMDExRjAxMjEwMTIzMDEyNTAxMjcwMTI5MDEyQjAxMkQwMTJGMDEzMTAxMzMwMTM1MDEzNzAxMzgwMTNBMDEzQzAxM0UwMTQwMDE0MjAxNDQwMTQ2MDE0ODAxNDkwMTRCMDE0RDAxNEYwMTUxMDE1MzAxNTUwMTU3MDE1OTAxNUIwMTVEMDE1RjAxNjEwMTYzMDE2NTAxNjcwMTY5MDE2QjAxNkQwMTZGMDE3MTAxNzMwMTc1MDE3NzAxN0EwMTdDMDE3RS0wMTgwMDE4MzAxODUwMTg4MDE4QzAxOEQwMTkyMDE5NTAxOTktMDE5QjAxOUUwMUExMDFBMzAxQTUwMUE4MDFBQTAxQUIwMUFEMDFCMDAxQjQwMUI2MDFCOTAxQkEwMUJELTAxQkYwMUM2MDFDOTAxQ0MwMUNFMDFEMDAxRDIwMUQ0MDFENjAxRDgwMURBMDFEQzAxREQwMURGMDFFMTAxRTMwMUU1MDFFNzAxRTkwMUVCMDFFRDAxRUYwMUYwMDFGMzAxRjUwMUY5MDFGQjAxRkQwMUZGMDIwMTAyMDMwMjA1MDIwNzAyMDkwMjBCMDIwRDAyMEYwMjExMDIxMzAyMTUwMjE3MDIxOTAyMUIwMjFEMDIxRjAyMjEwMjIzMDIyNTAyMjcwMjI5MDIyQjAyMkQwMjJGMDIzMTAyMzMtMDIzOTAyM0MwMjNGMDI0MDAyNDIwMjQ3MDI0OTAyNEIwMjREMDI0Ri0wMjkzMDI5NS0wMkFGMDM3MTAzNzMwMzc3MDM3Qi0wMzdEMDM5MDAzQUMtMDNDRTAzRDAwM0QxMDNENS0wM0Q3MDNEOTAzREIwM0REMDNERjAzRTEwM0UzMDNFNTAzRTcwM0U5MDNFQjAzRUQwM0VGLTAzRjMwM0Y1MDNGODAzRkIwM0ZDMDQzMC0wNDVGMDQ2MTA0NjMwNDY1MDQ2NzA0NjkwNDZCMDQ2RDA0NkYwNDcxMDQ3MzA0NzUwNDc3MDQ3OTA0N0IwNDdEMDQ3RjA0ODEwNDhCMDQ4RDA0OEYwNDkxMDQ5MzA0OTUwNDk3MDQ5OTA0OUIwNDlEMDQ5RjA0QTEwNEEzMDRBNTA0QTcwNEE5MDRBQjA0QUQwNEFGMDRCMTA0QjMwNEI1MDRCNzA0QjkwNEJCMDRCRDA0QkYwNEMyMDRDNDA0QzYwNEM4MDRDQTA0Q0MwNENFMDRDRjA0RDEwNEQzMDRENTA0RDcwNEQ5MDREQjA0REQwNERGMDRFMTA0RTMwNEU1MDRFNzA0RTkwNEVCMDRFRDA0RUYwNEYxMDRGMzA0RjUwNEY3MDRGOTA0RkIwNEZEMDRGRjA1MDEwNTAzMDUwNTA1MDcwNTA5MDUwQjA1MEQwNTBGMDUxMTA1MTMwNTE1MDUxNzA1MTkwNTFCMDUxRDA1MUYwNTIxMDUyMzA1MjUwNTYxLTA1ODcxRDAwLTFEMkIxRDYyLTFENzcxRDc5LTFEOUExRTAxMUUwMzFFMDUxRTA3MUUwOTFFMEIxRTBEMUUwRjFFMTExRTEzMUUxNTFFMTcxRTE5MUUxQjFFMUQxRTFGMUUyMTFFMjMxRTI1MUUyNzFFMjkxRTJCMUUyRDFFMkYxRTMxMUUzMzFFMzUxRTM3MUUzOTFFM0IxRTNEMUUzRjFFNDExRTQzMUU0NTFFNDcxRTQ5MUU0QjFFNEQxRTRGMUU1MTFFNTMxRTU1MUU1NzFFNTkxRTVCMUU1RDFFNUYxRTYxMUU2MzFFNjUxRTY3MUU2OTFFNkIxRTZEMUU2RjFFNzExRTczMUU3NTFFNzcxRTc5MUU3QjFFN0QxRTdGMUU4MTFFODMxRTg1MUU4NzFFODkxRThCMUU4RDFFOEYxRTkxMUU5MzFFOTUtMUU5RDFFOUYxRUExMUVBMzFFQTUxRUE3MUVBOTFFQUIxRUFEMUVBRjFFQjExRUIzMUVCNTFFQjcxRUI5MUVCQjFFQkQxRUJGMUVDMTFFQzMxRUM1MUVDNzFFQzkxRUNCMUVDRDFFQ0YxRUQxMUVEMzFFRDUxRUQ3MUVEOTFFREIxRUREMUVERjFFRTExRUUzMUVFNTFFRTcxRUU5MUVFQjFFRUQxRUVGMUVGMTFFRjMxRUY1MUVGNzFFRjkxRUZCMUVGRDFFRkYtMUYwNzFGMTAtMUYxNTFGMjAtMUYyNzFGMzAtMUYzNzFGNDAtMUY0NTFGNTAtMUY1NzFGNjAtMUY2NzFGNzAtMUY3RDFGODAtMUY4NzFGOTAtMUY5NzFGQTAtMUZBNzFGQjAtMUZCNDFGQjYxRkI3MUZCRTFGQzItMUZDNDFGQzYxRkM3MUZEMC0xRkQzMUZENjFGRDcxRkUwLTFGRTcxRkYyLTFGRjQxRkY2MUZGNzIxMEEyMTBFMjEwRjIxMTMyMTJGMjEzNDIxMzkyMTNDMjEzRDIxNDYtMjE0OTIxNEUyMTg0MkMzMC0yQzVFMkM2MTJDNjUyQzY2MkM2ODJDNkEyQzZDMkM3MTJDNzMyQzc0MkM3Ni0yQzdDMkM4MTJDODMyQzg1MkM4NzJDODkyQzhCMkM4RDJDOEYyQzkxMkM5MzJDOTUyQzk3MkM5OTJDOUIyQzlEMkM5RjJDQTEyQ0EzMkNBNTJDQTcyQ0E5MkNBQjJDQUQyQ0FGMkNCMTJDQjMyQ0I1MkNCNzJDQjkyQ0JCMkNCRDJDQkYyQ0MxMkNDMzJDQzUyQ0M3MkNDOTJDQ0IyQ0NEMkNDRjJDRDEyQ0QzMkNENTJDRDcyQ0Q5MkNEQjJDREQyQ0RGMkNFMTJDRTMyQ0U0MkNFQzJDRUUyRDAwLTJEMjVBNjQxQTY0M0E2NDVBNjQ3QTY0OUE2NEJBNjREQTY0RkE2NTFBNjUzQTY1NUE2NTdBNjU5QTY1QkE2NURBNjVGQTY2M0E2NjVBNjY3QTY2OUE2NkJBNjZEQTY4MUE2ODNBNjg1QTY4N0E2ODlBNjhCQTY4REE2OEZBNjkxQTY5M0E2OTVBNjk3QTcyM0E3MjVBNzI3QTcyOUE3MkJBNzJEQTcyRi1BNzMxQTczM0E3MzVBNzM3QTczOUE3M0JBNzNEQTczRkE3NDFBNzQzQTc0NUE3NDdBNzQ5QTc0QkE3NERBNzRGQTc1MUE3NTNBNzU1QTc1N0E3NTlBNzVCQTc1REE3NUZBNzYxQTc2M0E3NjVBNzY3QTc2OUE3NkJBNzZEQTc2RkE3NzEtQTc3OEE3N0FBNzdDQTc3RkE3ODFBNzgzQTc4NUE3ODdBNzhDRkIwMC1GQjA2RkIxMy1GQjE3RkY0MS1GRjVBIiwNCiAgICBMdTogIjAwNDEtMDA1QTAwQzAtMDBENjAwRDgtMDBERTAxMDAwMTAyMDEwNDAxMDYwMTA4MDEwQTAxMEMwMTBFMDExMDAxMTIwMTE0MDExNjAxMTgwMTFBMDExQzAxMUUwMTIwMDEyMjAxMjQwMTI2MDEyODAxMkEwMTJDMDEyRTAxMzAwMTMyMDEzNDAxMzYwMTM5MDEzQjAxM0QwMTNGMDE0MTAxNDMwMTQ1MDE0NzAxNEEwMTRDMDE0RTAxNTAwMTUyMDE1NDAxNTYwMTU4MDE1QTAxNUMwMTVFMDE2MDAxNjIwMTY0MDE2NjAxNjgwMTZBMDE2QzAxNkUwMTcwMDE3MjAxNzQwMTc2MDE3ODAxNzkwMTdCMDE3RDAxODEwMTgyMDE4NDAxODYwMTg3MDE4OS0wMThCMDE4RS0wMTkxMDE5MzAxOTQwMTk2LTAxOTgwMTlDMDE5RDAxOUYwMUEwMDFBMjAxQTQwMUE2MDFBNzAxQTkwMUFDMDFBRTAxQUYwMUIxLTAxQjMwMUI1MDFCNzAxQjgwMUJDMDFDNDAxQzcwMUNBMDFDRDAxQ0YwMUQxMDFEMzAxRDUwMUQ3MDFEOTAxREIwMURFMDFFMDAxRTIwMUU0MDFFNjAxRTgwMUVBMDFFQzAxRUUwMUYxMDFGNDAxRjYtMDFGODAxRkEwMUZDMDFGRTAyMDAwMjAyMDIwNDAyMDYwMjA4MDIwQTAyMEMwMjBFMDIxMDAyMTIwMjE0MDIxNjAyMTgwMjFBMDIxQzAyMUUwMjIwMDIyMjAyMjQwMjI2MDIyODAyMkEwMjJDMDIyRTAyMzAwMjMyMDIzQTAyM0IwMjNEMDIzRTAyNDEwMjQzLTAyNDYwMjQ4MDI0QTAyNEMwMjRFMDM3MDAzNzIwMzc2MDM4NjAzODgtMDM4QTAzOEMwMzhFMDM4RjAzOTEtMDNBMTAzQTMtMDNBQjAzQ0YwM0QyLTAzRDQwM0Q4MDNEQTAzREMwM0RFMDNFMDAzRTIwM0U0MDNFNjAzRTgwM0VBMDNFQzAzRUUwM0Y0MDNGNzAzRjkwM0ZBMDNGRC0wNDJGMDQ2MDA0NjIwNDY0MDQ2NjA0NjgwNDZBMDQ2QzA0NkUwNDcwMDQ3MjA0NzQwNDc2MDQ3ODA0N0EwNDdDMDQ3RTA0ODAwNDhBMDQ4QzA0OEUwNDkwMDQ5MjA0OTQwNDk2MDQ5ODA0OUEwNDlDMDQ5RTA0QTAwNEEyMDRBNDA0QTYwNEE4MDRBQTA0QUMwNEFFMDRCMDA0QjIwNEI0MDRCNjA0QjgwNEJBMDRCQzA0QkUwNEMwMDRDMTA0QzMwNEM1MDRDNzA0QzkwNENCMDRDRDA0RDAwNEQyMDRENDA0RDYwNEQ4MDREQTA0REMwNERFMDRFMDA0RTIwNEU0MDRFNjA0RTgwNEVBMDRFQzA0RUUwNEYwMDRGMjA0RjQwNEY2MDRGODA0RkEwNEZDMDRGRTA1MDAwNTAyMDUwNDA1MDYwNTA4MDUwQTA1MEMwNTBFMDUxMDA1MTIwNTE0MDUxNjA1MTgwNTFBMDUxQzA1MUUwNTIwMDUyMjA1MjQwNTMxLTA1NTYxMEEwLTEwQzUxRTAwMUUwMjFFMDQxRTA2MUUwODFFMEExRTBDMUUwRTFFMTAxRTEyMUUxNDFFMTYxRTE4MUUxQTFFMUMxRTFFMUUyMDFFMjIxRTI0MUUyNjFFMjgxRTJBMUUyQzFFMkUxRTMwMUUzMjFFMzQxRTM2MUUzODFFM0ExRTNDMUUzRTFFNDAxRTQyMUU0NDFFNDYxRTQ4MUU0QTFFNEMxRTRFMUU1MDFFNTIxRTU0MUU1NjFFNTgxRTVBMUU1QzFFNUUxRTYwMUU2MjFFNjQxRTY2MUU2ODFFNkExRTZDMUU2RTFFNzAxRTcyMUU3NDFFNzYxRTc4MUU3QTFFN0MxRTdFMUU4MDFFODIxRTg0MUU4NjFFODgxRThBMUU4QzFFOEUxRTkwMUU5MjFFOTQxRTlFMUVBMDFFQTIxRUE0MUVBNjFFQTgxRUFBMUVBQzFFQUUxRUIwMUVCMjFFQjQxRUI2MUVCODFFQkExRUJDMUVCRTFFQzAxRUMyMUVDNDFFQzYxRUM4MUVDQTFFQ0MxRUNFMUVEMDFFRDIxRUQ0MUVENjFFRDgxRURBMUVEQzFFREUxRUUwMUVFMjFFRTQxRUU2MUVFODFFRUExRUVDMUVFRTFFRjAxRUYyMUVGNDFFRjYxRUY4MUVGQTFFRkMxRUZFMUYwOC0xRjBGMUYxOC0xRjFEMUYyOC0xRjJGMUYzOC0xRjNGMUY0OC0xRjREMUY1OTFGNUIxRjVEMUY1RjFGNjgtMUY2RjFGQjgtMUZCQjFGQzgtMUZDQjFGRDgtMUZEQjFGRTgtMUZFQzFGRjgtMUZGQjIxMDIyMTA3MjEwQi0yMTBEMjExMC0yMTEyMjExNTIxMTktMjExRDIxMjQyMTI2MjEyODIxMkEtMjEyRDIxMzAtMjEzMzIxM0UyMTNGMjE0NTIxODMyQzAwLTJDMkUyQzYwMkM2Mi0yQzY0MkM2NzJDNjkyQzZCMkM2RC0yQzcwMkM3MjJDNzUyQzdFLTJDODAyQzgyMkM4NDJDODYyQzg4MkM4QTJDOEMyQzhFMkM5MDJDOTIyQzk0MkM5NjJDOTgyQzlBMkM5QzJDOUUyQ0EwMkNBMjJDQTQyQ0E2MkNBODJDQUEyQ0FDMkNBRTJDQjAyQ0IyMkNCNDJDQjYyQ0I4MkNCQTJDQkMyQ0JFMkNDMDJDQzIyQ0M0MkNDNjJDQzgyQ0NBMkNDQzJDQ0UyQ0QwMkNEMjJDRDQyQ0Q2MkNEODJDREEyQ0RDMkNERTJDRTAyQ0UyMkNFQjJDRURBNjQwQTY0MkE2NDRBNjQ2QTY0OEE2NEFBNjRDQTY0RUE2NTBBNjUyQTY1NEE2NTZBNjU4QTY1QUE2NUNBNjVFQTY2MkE2NjRBNjY2QTY2OEE2NkFBNjZDQTY4MEE2ODJBNjg0QTY4NkE2ODhBNjhBQTY4Q0E2OEVBNjkwQTY5MkE2OTRBNjk2QTcyMkE3MjRBNzI2QTcyOEE3MkFBNzJDQTcyRUE3MzJBNzM0QTczNkE3MzhBNzNBQTczQ0E3M0VBNzQwQTc0MkE3NDRBNzQ2QTc0OEE3NEFBNzRDQTc0RUE3NTBBNzUyQTc1NEE3NTZBNzU4QTc1QUE3NUNBNzVFQTc2MEE3NjJBNzY0QTc2NkE3NjhBNzZBQTc2Q0E3NkVBNzc5QTc3QkE3N0RBNzdFQTc4MEE3ODJBNzg0QTc4NkE3OEJGRjIxLUZGM0EiLA0KICAgIEx0OiAiMDFDNTAxQzgwMUNCMDFGMjFGODgtMUY4RjFGOTgtMUY5RjFGQTgtMUZBRjFGQkMxRkNDMUZGQyIsDQogICAgTG06ICIwMkIwLTAyQzEwMkM2LTAyRDEwMkUwLTAyRTQwMkVDMDJFRTAzNzQwMzdBMDU1OTA2NDAwNkU1MDZFNjA3RjQwN0Y1MDdGQTA4MUEwODI0MDgyODA5NzEwRTQ2MEVDNjEwRkMxN0Q3MTg0MzFBQTcxQzc4LTFDN0QxRDJDLTFENjExRDc4MUQ5Qi0xREJGMjA3MTIwN0YyMDkwLTIwOTQyQzdEMkQ2RjJFMkYzMDA1MzAzMS0zMDM1MzAzQjMwOUQzMDlFMzBGQy0zMEZFQTAxNUE0RjgtQTRGREE2MENBNjdGQTcxNy1BNzFGQTc3MEE3ODhBOUNGQUE3MEFBRERGRjcwRkY5RUZGOUYiLA0KICAgIExvOiAiMDFCQjAxQzAtMDFDMzAyOTQwNUQwLTA1RUEwNUYwLTA1RjIwNjIxLTA2M0YwNjQxLTA2NEEwNjZFMDY2RjA2NzEtMDZEMzA2RDUwNkVFMDZFRjA2RkEtMDZGQzA2RkYwNzEwMDcxMi0wNzJGMDc0RC0wN0E1MDdCMTA3Q0EtMDdFQTA4MDAtMDgxNTA5MDQtMDkzOTA5M0QwOTUwMDk1OC0wOTYxMDk3MjA5NzktMDk3RjA5ODUtMDk4QzA5OEYwOTkwMDk5My0wOUE4MDlBQS0wOUIwMDlCMjA5QjYtMDlCOTA5QkQwOUNFMDlEQzA5REQwOURGLTA5RTEwOUYwMDlGMTBBMDUtMEEwQTBBMEYwQTEwMEExMy0wQTI4MEEyQS0wQTMwMEEzMjBBMzMwQTM1MEEzNjBBMzgwQTM5MEE1OS0wQTVDMEE1RTBBNzItMEE3NDBBODUtMEE4RDBBOEYtMEE5MTBBOTMtMEFBODBBQUEtMEFCMDBBQjIwQUIzMEFCNS0wQUI5MEFCRDBBRDAwQUUwMEFFMTBCMDUtMEIwQzBCMEYwQjEwMEIxMy0wQjI4MEIyQS0wQjMwMEIzMjBCMzMwQjM1LTBCMzkwQjNEMEI1QzBCNUQwQjVGLTBCNjEwQjcxMEI4MzBCODUtMEI4QTBCOEUtMEI5MDBCOTItMEI5NTBCOTkwQjlBMEI5QzBCOUUwQjlGMEJBMzBCQTQwQkE4LTBCQUEwQkFFLTBCQjkwQkQwMEMwNS0wQzBDMEMwRS0wQzEwMEMxMi0wQzI4MEMyQS0wQzMzMEMzNS0wQzM5MEMzRDBDNTgwQzU5MEM2MDBDNjEwQzg1LTBDOEMwQzhFLTBDOTAwQzkyLTBDQTgwQ0FBLTBDQjMwQ0I1LTBDQjkwQ0JEMENERTBDRTAwQ0UxMEQwNS0wRDBDMEQwRS0wRDEwMEQxMi0wRDI4MEQyQS0wRDM5MEQzRDBENjAwRDYxMEQ3QS0wRDdGMEQ4NS0wRDk2MEQ5QS0wREIxMERCMy0wREJCMERCRDBEQzAtMERDNjBFMDEtMEUzMDBFMzIwRTMzMEU0MC0wRTQ1MEU4MTBFODIwRTg0MEU4NzBFODgwRThBMEU4RDBFOTQtMEU5NzBFOTktMEU5RjBFQTEtMEVBMzBFQTUwRUE3MEVBQTBFQUIwRUFELTBFQjAwRUIyMEVCMzBFQkQwRUMwLTBFQzQwRURDMEVERDBGMDAwRjQwLTBGNDcwRjQ5LTBGNkMwRjg4LTBGOEIxMDAwLTEwMkExMDNGMTA1MC0xMDU1MTA1QS0xMDVEMTA2MTEwNjUxMDY2MTA2RS0xMDcwMTA3NS0xMDgxMTA4RTEwRDAtMTBGQTExMDAtMTI0ODEyNEEtMTI0RDEyNTAtMTI1NjEyNTgxMjVBLTEyNUQxMjYwLTEyODgxMjhBLTEyOEQxMjkwLTEyQjAxMkIyLTEyQjUxMkI4LTEyQkUxMkMwMTJDMi0xMkM1MTJDOC0xMkQ2MTJEOC0xMzEwMTMxMi0xMzE1MTMxOC0xMzVBMTM4MC0xMzhGMTNBMC0xM0Y0MTQwMS0xNjZDMTY2Ri0xNjdGMTY4MS0xNjlBMTZBMC0xNkVBMTcwMC0xNzBDMTcwRS0xNzExMTcyMC0xNzMxMTc0MC0xNzUxMTc2MC0xNzZDMTc2RS0xNzcwMTc4MC0xN0IzMTdEQzE4MjAtMTg0MjE4NDQtMTg3NzE4ODAtMThBODE4QUExOEIwLTE4RjUxOTAwLTE5MUMxOTUwLTE5NkQxOTcwLTE5NzQxOTgwLTE5QUIxOUMxLTE5QzcxQTAwLTFBMTYxQTIwLTFBNTQxQjA1LTFCMzMxQjQ1LTFCNEIxQjgzLTFCQTAxQkFFMUJBRjFDMDAtMUMyMzFDNEQtMUM0RjFDNUEtMUM3NzFDRTktMUNFQzFDRUUtMUNGMTIxMzUtMjEzODJEMzAtMkQ2NTJEODAtMkQ5NjJEQTAtMkRBNjJEQTgtMkRBRTJEQjAtMkRCNjJEQjgtMkRCRTJEQzAtMkRDNjJEQzgtMkRDRTJERDAtMkRENjJERDgtMkRERTMwMDYzMDNDMzA0MS0zMDk2MzA5RjMwQTEtMzBGQTMwRkYzMTA1LTMxMkQzMTMxLTMxOEUzMUEwLTMxQjczMUYwLTMxRkYzNDAwLTREQjU0RTAwLTlGQ0JBMDAwLUEwMTRBMDE2LUE0OENBNEQwLUE0RjdBNTAwLUE2MEJBNjEwLUE2MUZBNjJBQTYyQkE2NkVBNkEwLUE2RTVBN0ZCLUE4MDFBODAzLUE4MDVBODA3LUE4MEFBODBDLUE4MjJBODQwLUE4NzNBODgyLUE4QjNBOEYyLUE4RjdBOEZCQTkwQS1BOTI1QTkzMC1BOTQ2QTk2MC1BOTdDQTk4NC1BOUIyQUEwMC1BQTI4QUE0MC1BQTQyQUE0NC1BQTRCQUE2MC1BQTZGQUE3MS1BQTc2QUE3QUFBODAtQUFBRkFBQjFBQUI1QUFCNkFBQjktQUFCREFBQzBBQUMyQUFEQkFBRENBQkMwLUFCRTJBQzAwLUQ3QTNEN0IwLUQ3QzZEN0NCLUQ3RkJGOTAwLUZBMkRGQTMwLUZBNkRGQTcwLUZBRDlGQjFERkIxRi1GQjI4RkIyQS1GQjM2RkIzOC1GQjNDRkIzRUZCNDBGQjQxRkI0M0ZCNDRGQjQ2LUZCQjFGQkQzLUZEM0RGRDUwLUZEOEZGRDkyLUZEQzdGREYwLUZERkJGRTcwLUZFNzRGRTc2LUZFRkNGRjY2LUZGNkZGRjcxLUZGOURGRkEwLUZGQkVGRkMyLUZGQzdGRkNBLUZGQ0ZGRkQyLUZGRDdGRkRBLUZGREMiLA0KICAgIE06ICAiMDMwMC0wMzZGMDQ4My0wNDg5MDU5MS0wNUJEMDVCRjA1QzEwNUMyMDVDNDA1QzUwNUM3MDYxMC0wNjFBMDY0Qi0wNjVFMDY3MDA2RDYtMDZEQzA2REUtMDZFNDA2RTcwNkU4MDZFQS0wNkVEMDcxMTA3MzAtMDc0QTA3QTYtMDdCMDA3RUItMDdGMzA4MTYtMDgxOTA4MUItMDgyMzA4MjUtMDgyNzA4MjktMDgyRDA5MDAtMDkwMzA5M0MwOTNFLTA5NEUwOTUxLTA5NTUwOTYyMDk2MzA5ODEtMDk4MzA5QkMwOUJFLTA5QzQwOUM3MDlDODA5Q0ItMDlDRDA5RDcwOUUyMDlFMzBBMDEtMEEwMzBBM0MwQTNFLTBBNDIwQTQ3MEE0ODBBNEItMEE0RDBBNTEwQTcwMEE3MTBBNzUwQTgxLTBBODMwQUJDMEFCRS0wQUM1MEFDNy0wQUM5MEFDQi0wQUNEMEFFMjBBRTMwQjAxLTBCMDMwQjNDMEIzRS0wQjQ0MEI0NzBCNDgwQjRCLTBCNEQwQjU2MEI1NzBCNjIwQjYzMEI4MjBCQkUtMEJDMjBCQzYtMEJDODBCQ0EtMEJDRDBCRDcwQzAxLTBDMDMwQzNFLTBDNDQwQzQ2LTBDNDgwQzRBLTBDNEQwQzU1MEM1NjBDNjIwQzYzMEM4MjBDODMwQ0JDMENCRS0wQ0M0MENDNi0wQ0M4MENDQS0wQ0NEMENENTBDRDYwQ0UyMENFMzBEMDIwRDAzMEQzRS0wRDQ0MEQ0Ni0wRDQ4MEQ0QS0wRDREMEQ1NzBENjIwRDYzMEQ4MjBEODMwRENBMERDRi0wREQ0MERENjBERDgtMERERjBERjIwREYzMEUzMTBFMzQtMEUzQTBFNDctMEU0RTBFQjEwRUI0LTBFQjkwRUJCMEVCQzBFQzgtMEVDRDBGMTgwRjE5MEYzNTBGMzcwRjM5MEYzRTBGM0YwRjcxLTBGODQwRjg2MEY4NzBGOTAtMEY5NzBGOTktMEZCQzBGQzYxMDJCLTEwM0UxMDU2LTEwNTkxMDVFLTEwNjAxMDYyLTEwNjQxMDY3LTEwNkQxMDcxLTEwNzQxMDgyLTEwOEQxMDhGMTA5QS0xMDlEMTM1RjE3MTItMTcxNDE3MzItMTczNDE3NTIxNzUzMTc3MjE3NzMxN0I2LTE3RDMxN0REMTgwQi0xODBEMThBOTE5MjAtMTkyQjE5MzAtMTkzQjE5QjAtMTlDMDE5QzgxOUM5MUExNy0xQTFCMUE1NS0xQTVFMUE2MC0xQTdDMUE3RjFCMDAtMUIwNDFCMzQtMUI0NDFCNkItMUI3MzFCODAtMUI4MjFCQTEtMUJBQTFDMjQtMUMzNzFDRDAtMUNEMjFDRDQtMUNFODFDRUQxQ0YyMURDMC0xREU2MURGRC0xREZGMjBEMC0yMEYwMkNFRi0yQ0YxMkRFMC0yREZGMzAyQS0zMDJGMzA5OTMwOUFBNjZGLUE2NzJBNjdDQTY3REE2RjBBNkYxQTgwMkE4MDZBODBCQTgyMy1BODI3QTg4MEE4ODFBOEI0LUE4QzRBOEUwLUE4RjFBOTI2LUE5MkRBOTQ3LUE5NTNBOTgwLUE5ODNBOUIzLUE5QzBBQTI5LUFBMzZBQTQzQUE0Q0FBNERBQTdCQUFCMEFBQjItQUFCNEFBQjdBQUI4QUFCRUFBQkZBQUMxQUJFMy1BQkVBQUJFQ0FCRURGQjFFRkUwMC1GRTBGRkUyMC1GRTI2IiwNCiAgICBNbjogIjAzMDAtMDM2RjA0ODMtMDQ4NzA1OTEtMDVCRDA1QkYwNUMxMDVDMjA1QzQwNUM1MDVDNzA2MTAtMDYxQTA2NEItMDY1RTA2NzAwNkQ2LTA2REMwNkRGLTA2RTQwNkU3MDZFODA2RUEtMDZFRDA3MTEwNzMwLTA3NEEwN0E2LTA3QjAwN0VCLTA3RjMwODE2LTA4MTkwODFCLTA4MjMwODI1LTA4MjcwODI5LTA4MkQwOTAwLTA5MDIwOTNDMDk0MS0wOTQ4MDk0RDA5NTEtMDk1NTA5NjIwOTYzMDk4MTA5QkMwOUMxLTA5QzQwOUNEMDlFMjA5RTMwQTAxMEEwMjBBM0MwQTQxMEE0MjBBNDcwQTQ4MEE0Qi0wQTREMEE1MTBBNzAwQTcxMEE3NTBBODEwQTgyMEFCQzBBQzEtMEFDNTBBQzcwQUM4MEFDRDBBRTIwQUUzMEIwMTBCM0MwQjNGMEI0MS0wQjQ0MEI0RDBCNTYwQjYyMEI2MzBCODIwQkMwMEJDRDBDM0UtMEM0MDBDNDYtMEM0ODBDNEEtMEM0RDBDNTUwQzU2MEM2MjBDNjMwQ0JDMENCRjBDQzYwQ0NDMENDRDBDRTIwQ0UzMEQ0MS0wRDQ0MEQ0RDBENjIwRDYzMERDQTBERDItMERENDBERDYwRTMxMEUzNC0wRTNBMEU0Ny0wRTRFMEVCMTBFQjQtMEVCOTBFQkIwRUJDMEVDOC0wRUNEMEYxODBGMTkwRjM1MEYzNzBGMzkwRjcxLTBGN0UwRjgwLTBGODQwRjg2MEY4NzBGOTAtMEY5NzBGOTktMEZCQzBGQzYxMDJELTEwMzAxMDMyLTEwMzcxMDM5MTAzQTEwM0QxMDNFMTA1ODEwNTkxMDVFLTEwNjAxMDcxLTEwNzQxMDgyMTA4NTEwODYxMDhEMTA5RDEzNUYxNzEyLTE3MTQxNzMyLTE3MzQxNzUyMTc1MzE3NzIxNzczMTdCNy0xN0JEMTdDNjE3QzktMTdEMzE3REQxODBCLTE4MEQxOEE5MTkyMC0xOTIyMTkyNzE5MjgxOTMyMTkzOS0xOTNCMUExNzFBMTgxQTU2MUE1OC0xQTVFMUE2MDFBNjIxQTY1LTFBNkMxQTczLTFBN0MxQTdGMUIwMC0xQjAzMUIzNDFCMzYtMUIzQTFCM0MxQjQyMUI2Qi0xQjczMUI4MDFCODExQkEyLTFCQTUxQkE4MUJBOTFDMkMtMUMzMzFDMzYxQzM3MUNEMC0xQ0QyMUNENC0xQ0UwMUNFMi0xQ0U4MUNFRDFEQzAtMURFNjFERkQtMURGRjIwRDAtMjBEQzIwRTEyMEU1LTIwRjAyQ0VGLTJDRjEyREUwLTJERkYzMDJBLTMwMkYzMDk5MzA5QUE2NkZBNjdDQTY3REE2RjBBNkYxQTgwMkE4MDZBODBCQTgyNUE4MjZBOEM0QThFMC1BOEYxQTkyNi1BOTJEQTk0Ny1BOTUxQTk4MC1BOTgyQTlCM0E5QjYtQTlCOUE5QkNBQTI5LUFBMkVBQTMxQUEzMkFBMzVBQTM2QUE0M0FBNENBQUIwQUFCMi1BQUI0QUFCN0FBQjhBQUJFQUFCRkFBQzFBQkU1QUJFOEFCRURGQjFFRkUwMC1GRTBGRkUyMC1GRTI2IiwNCiAgICBNYzogIjA5MDMwOTNFLTA5NDAwOTQ5LTA5NEMwOTRFMDk4MjA5ODMwOUJFLTA5QzAwOUM3MDlDODA5Q0IwOUNDMDlENzBBMDMwQTNFLTBBNDAwQTgzMEFCRS0wQUMwMEFDOTBBQ0IwQUNDMEIwMjBCMDMwQjNFMEI0MDBCNDcwQjQ4MEI0QjBCNEMwQjU3MEJCRTBCQkYwQkMxMEJDMjBCQzYtMEJDODBCQ0EtMEJDQzBCRDcwQzAxLTBDMDMwQzQxLTBDNDQwQzgyMEM4MzBDQkUwQ0MwLTBDQzQwQ0M3MENDODBDQ0EwQ0NCMENENTBDRDYwRDAyMEQwMzBEM0UtMEQ0MDBENDYtMEQ0ODBENEEtMEQ0QzBENTcwRDgyMEQ4MzBEQ0YtMEREMTBERDgtMERERjBERjIwREYzMEYzRTBGM0YwRjdGMTAyQjEwMkMxMDMxMTAzODEwM0IxMDNDMTA1NjEwNTcxMDYyLTEwNjQxMDY3LTEwNkQxMDgzMTA4NDEwODctMTA4QzEwOEYxMDlBLTEwOUMxN0I2MTdCRS0xN0M1MTdDNzE3QzgxOTIzLTE5MjYxOTI5LTE5MkIxOTMwMTkzMTE5MzMtMTkzODE5QjAtMTlDMDE5QzgxOUM5MUExOS0xQTFCMUE1NTFBNTcxQTYxMUE2MzFBNjQxQTZELTFBNzIxQjA0MUIzNTFCM0IxQjNELTFCNDExQjQzMUI0NDFCODIxQkExMUJBNjFCQTcxQkFBMUMyNC0xQzJCMUMzNDFDMzUxQ0UxMUNGMkE4MjNBODI0QTgyN0E4ODBBODgxQThCNC1BOEMzQTk1MkE5NTNBOTgzQTlCNEE5QjVBOUJBQTlCQkE5QkQtQTlDMEFBMkZBQTMwQUEzM0FBMzRBQTREQUE3QkFCRTNBQkU0QUJFNkFCRTdBQkU5QUJFQUFCRUMiLA0KICAgIE1lOiAiMDQ4ODA0ODkwNkRFMjBERC0yMEUwMjBFMi0yMEU0QTY3MC1BNjcyIiwNCiAgICBOOiAgIjAwMzAtMDAzOTAwQjIwMEIzMDBCOTAwQkMtMDBCRTA2NjAtMDY2OTA2RjAtMDZGOTA3QzAtMDdDOTA5NjYtMDk2RjA5RTYtMDlFRjA5RjQtMDlGOTBBNjYtMEE2RjBBRTYtMEFFRjBCNjYtMEI2RjBCRTYtMEJGMjBDNjYtMEM2RjBDNzgtMEM3RTBDRTYtMENFRjBENjYtMEQ3NTBFNTAtMEU1OTBFRDAtMEVEOTBGMjAtMEYzMzEwNDAtMTA0OTEwOTAtMTA5OTEzNjktMTM3QzE2RUUtMTZGMDE3RTAtMTdFOTE3RjAtMTdGOTE4MTAtMTgxOTE5NDYtMTk0RjE5RDAtMTlEQTFBODAtMUE4OTFBOTAtMUE5OTFCNTAtMUI1OTFCQjAtMUJCOTFDNDAtMUM0OTFDNTAtMUM1OTIwNzAyMDc0LTIwNzkyMDgwLTIwODkyMTUwLTIxODIyMTg1LTIxODkyNDYwLTI0OUIyNEVBLTI0RkYyNzc2LTI3OTMyQ0ZEMzAwNzMwMjEtMzAyOTMwMzgtMzAzQTMxOTItMzE5NTMyMjAtMzIyOTMyNTEtMzI1RjMyODAtMzI4OTMyQjEtMzJCRkE2MjAtQTYyOUE2RTYtQTZFRkE4MzAtQTgzNUE4RDAtQThEOUE5MDAtQTkwOUE5RDAtQTlEOUFBNTAtQUE1OUFCRjAtQUJGOUZGMTAtRkYxOSIsDQogICAgTmQ6ICIwMDMwLTAwMzkwNjYwLTA2NjkwNkYwLTA2RjkwN0MwLTA3QzkwOTY2LTA5NkYwOUU2LTA5RUYwQTY2LTBBNkYwQUU2LTBBRUYwQjY2LTBCNkYwQkU2LTBCRUYwQzY2LTBDNkYwQ0U2LTBDRUYwRDY2LTBENkYwRTUwLTBFNTkwRUQwLTBFRDkwRjIwLTBGMjkxMDQwLTEwNDkxMDkwLTEwOTkxN0UwLTE3RTkxODEwLTE4MTkxOTQ2LTE5NEYxOUQwLTE5REExQTgwLTFBODkxQTkwLTFBOTkxQjUwLTFCNTkxQkIwLTFCQjkxQzQwLTFDNDkxQzUwLTFDNTlBNjIwLUE2MjlBOEQwLUE4RDlBOTAwLUE5MDlBOUQwLUE5RDlBQTUwLUFBNTlBQkYwLUFCRjlGRjEwLUZGMTkiLA0KICAgIE5sOiAiMTZFRS0xNkYwMjE2MC0yMTgyMjE4NS0yMTg4MzAwNzMwMjEtMzAyOTMwMzgtMzAzQUE2RTYtQTZFRiIsDQogICAgTm86ICIwMEIyMDBCMzAwQjkwMEJDLTAwQkUwOUY0LTA5RjkwQkYwLTBCRjIwQzc4LTBDN0UwRDcwLTBENzUwRjJBLTBGMzMxMzY5LTEzN0MxN0YwLTE3RjkyMDcwMjA3NC0yMDc5MjA4MC0yMDg5MjE1MC0yMTVGMjE4OTI0NjAtMjQ5QjI0RUEtMjRGRjI3NzYtMjc5MzJDRkQzMTkyLTMxOTUzMjIwLTMyMjkzMjUxLTMyNUYzMjgwLTMyODkzMkIxLTMyQkZBODMwLUE4MzUiLA0KICAgIFA6ICAiMDAyMS0wMDIzMDAyNS0wMDJBMDAyQy0wMDJGMDAzQTAwM0IwMDNGMDA0MDAwNUItMDA1RDAwNUYwMDdCMDA3RDAwQTEwMEFCMDBCNzAwQkIwMEJGMDM3RTAzODcwNTVBLTA1NUYwNTg5MDU4QTA1QkUwNUMwMDVDMzA1QzYwNUYzMDVGNDA2MDkwNjBBMDYwQzA2MEQwNjFCMDYxRTA2MUYwNjZBLTA2NkQwNkQ0MDcwMC0wNzBEMDdGNy0wN0Y5MDgzMC0wODNFMDk2NDA5NjUwOTcwMERGNDBFNEYwRTVBMEU1QjBGMDQtMEYxMjBGM0EtMEYzRDBGODUwRkQwLTBGRDQxMDRBLTEwNEYxMEZCMTM2MS0xMzY4MTQwMDE2NkQxNjZFMTY5QjE2OUMxNkVCLTE2RUQxNzM1MTczNjE3RDQtMTdENjE3RDgtMTdEQTE4MDAtMTgwQTE5NDQxOTQ1MTlERTE5REYxQTFFMUExRjFBQTAtMUFBNjFBQTgtMUFBRDFCNUEtMUI2MDFDM0ItMUMzRjFDN0UxQzdGMUNEMzIwMTAtMjAyNzIwMzAtMjA0MzIwNDUtMjA1MTIwNTMtMjA1RTIwN0QyMDdFMjA4RDIwOEUyMzI5MjMyQTI3NjgtMjc3NTI3QzUyN0M2MjdFNi0yN0VGMjk4My0yOTk4MjlEOC0yOURCMjlGQzI5RkQyQ0Y5LTJDRkMyQ0ZFMkNGRjJFMDAtMkUyRTJFMzAyRTMxMzAwMS0zMDAzMzAwOC0zMDExMzAxNC0zMDFGMzAzMDMwM0QzMEEwMzBGQkE0RkVBNEZGQTYwRC1BNjBGQTY3M0E2N0VBNkYyLUE2RjdBODc0LUE4NzdBOENFQThDRkE4RjgtQThGQUE5MkVBOTJGQTk1RkE5QzEtQTlDREE5REVBOURGQUE1Qy1BQTVGQUFERUFBREZBQkVCRkQzRUZEM0ZGRTEwLUZFMTlGRTMwLUZFNTJGRTU0LUZFNjFGRTYzRkU2OEZFNkFGRTZCRkYwMS1GRjAzRkYwNS1GRjBBRkYwQy1GRjBGRkYxQUZGMUJGRjFGRkYyMEZGM0ItRkYzREZGM0ZGRjVCRkY1REZGNUYtRkY2NSIsDQogICAgUGQ6ICIwMDJEMDU4QTA1QkUxNDAwMTgwNjIwMTAtMjAxNTJFMTcyRTFBMzAxQzMwMzAzMEEwRkUzMUZFMzJGRTU4RkU2M0ZGMEQiLA0KICAgIFBzOiAiMDAyODAwNUIwMDdCMEYzQTBGM0MxNjlCMjAxQTIwMUUyMDQ1MjA3RDIwOEQyMzI5Mjc2ODI3NkEyNzZDMjc2RTI3NzAyNzcyMjc3NDI3QzUyN0U2MjdFODI3RUEyN0VDMjdFRTI5ODMyOTg1Mjk4NzI5ODkyOThCMjk4RDI5OEYyOTkxMjk5MzI5OTUyOTk3MjlEODI5REEyOUZDMkUyMjJFMjQyRTI2MkUyODMwMDgzMDBBMzAwQzMwMEUzMDEwMzAxNDMwMTYzMDE4MzAxQTMwMURGRDNFRkUxN0ZFMzVGRTM3RkUzOUZFM0JGRTNERkUzRkZFNDFGRTQzRkU0N0ZFNTlGRTVCRkU1REZGMDhGRjNCRkY1QkZGNUZGRjYyIiwNCiAgICBQZTogIjAwMjkwMDVEMDA3RDBGM0IwRjNEMTY5QzIwNDYyMDdFMjA4RTIzMkEyNzY5Mjc2QjI3NkQyNzZGMjc3MTI3NzMyNzc1MjdDNjI3RTcyN0U5MjdFQjI3RUQyN0VGMjk4NDI5ODYyOTg4Mjk4QTI5OEMyOThFMjk5MDI5OTIyOTk0Mjk5NjI5OTgyOUQ5MjlEQjI5RkQyRTIzMkUyNTJFMjcyRTI5MzAwOTMwMEIzMDBEMzAwRjMwMTEzMDE1MzAxNzMwMTkzMDFCMzAxRTMwMUZGRDNGRkUxOEZFMzZGRTM4RkUzQUZFM0NGRTNFRkU0MEZFNDJGRTQ0RkU0OEZFNUFGRTVDRkU1RUZGMDlGRjNERkY1REZGNjBGRjYzIiwNCiAgICBQaTogIjAwQUIyMDE4MjAxQjIwMUMyMDFGMjAzOTJFMDIyRTA0MkUwOTJFMEMyRTFDMkUyMCIsDQogICAgUGY6ICIwMEJCMjAxOTIwMUQyMDNBMkUwMzJFMDUyRTBBMkUwRDJFMUQyRTIxIiwNCiAgICBQYzogIjAwNUYyMDNGMjA0MDIwNTRGRTMzRkUzNEZFNEQtRkU0RkZGM0YiLA0KICAgIFBvOiAiMDAyMS0wMDIzMDAyNS0wMDI3MDAyQTAwMkMwMDJFMDAyRjAwM0EwMDNCMDAzRjAwNDAwMDVDMDBBMTAwQjcwMEJGMDM3RTAzODcwNTVBLTA1NUYwNTg5MDVDMDA1QzMwNUM2MDVGMzA1RjQwNjA5MDYwQTA2MEMwNjBEMDYxQjA2MUUwNjFGMDY2QS0wNjZEMDZENDA3MDAtMDcwRDA3RjctMDdGOTA4MzAtMDgzRTA5NjQwOTY1MDk3MDBERjQwRTRGMEU1QTBFNUIwRjA0LTBGMTIwRjg1MEZEMC0wRkQ0MTA0QS0xMDRGMTBGQjEzNjEtMTM2ODE2NkQxNjZFMTZFQi0xNkVEMTczNTE3MzYxN0Q0LTE3RDYxN0Q4LTE3REExODAwLTE4MDUxODA3LTE4MEExOTQ0MTk0NTE5REUxOURGMUExRTFBMUYxQUEwLTFBQTYxQUE4LTFBQUQxQjVBLTFCNjAxQzNCLTFDM0YxQzdFMUM3RjFDRDMyMDE2MjAxNzIwMjAtMjAyNzIwMzAtMjAzODIwM0ItMjAzRTIwNDEtMjA0MzIwNDctMjA1MTIwNTMyMDU1LTIwNUUyQ0Y5LTJDRkMyQ0ZFMkNGRjJFMDAyRTAxMkUwNi0yRTA4MkUwQjJFMEUtMkUxNjJFMTgyRTE5MkUxQjJFMUUyRTFGMkUyQS0yRTJFMkUzMDJFMzEzMDAxLTMwMDMzMDNEMzBGQkE0RkVBNEZGQTYwRC1BNjBGQTY3M0E2N0VBNkYyLUE2RjdBODc0LUE4NzdBOENFQThDRkE4RjgtQThGQUE5MkVBOTJGQTk1RkE5QzEtQTlDREE5REVBOURGQUE1Qy1BQTVGQUFERUFBREZBQkVCRkUxMC1GRTE2RkUxOUZFMzBGRTQ1RkU0NkZFNDktRkU0Q0ZFNTAtRkU1MkZFNTQtRkU1N0ZFNUYtRkU2MUZFNjhGRTZBRkU2QkZGMDEtRkYwM0ZGMDUtRkYwN0ZGMEFGRjBDRkYwRUZGMEZGRjFBRkYxQkZGMUZGRjIwRkYzQ0ZGNjFGRjY0RkY2NSIsDQogICAgUzogICIwMDI0MDAyQjAwM0MtMDAzRTAwNUUwMDYwMDA3QzAwN0UwMEEyLTAwQTkwMEFDMDBBRS0wMEIxMDBCNDAwQjYwMEI4MDBENzAwRjcwMkMyLTAyQzUwMkQyLTAyREYwMkU1LTAyRUIwMkVEMDJFRi0wMkZGMDM3NTAzODQwMzg1MDNGNjA0ODIwNjA2LTA2MDgwNjBCMDYwRTA2MEYwNkU5MDZGRDA2RkUwN0Y2MDlGMjA5RjMwOUZBMDlGQjBBRjEwQjcwMEJGMy0wQkZBMEM3RjBDRjEwQ0YyMEQ3OTBFM0YwRjAxLTBGMDMwRjEzLTBGMTcwRjFBLTBGMUYwRjM0MEYzNjBGMzgwRkJFLTBGQzUwRkM3LTBGQ0MwRkNFMEZDRjBGRDUtMEZEODEwOUUxMDlGMTM2MDEzOTAtMTM5OTE3REIxOTQwMTlFMC0xOUZGMUI2MS0xQjZBMUI3NC0xQjdDMUZCRDFGQkYtMUZDMTFGQ0QtMUZDRjFGREQtMUZERjFGRUQtMUZFRjFGRkQxRkZFMjA0NDIwNTIyMDdBLTIwN0MyMDhBLTIwOEMyMEEwLTIwQjgyMTAwMjEwMTIxMDMtMjEwNjIxMDgyMTA5MjExNDIxMTYtMjExODIxMUUtMjEyMzIxMjUyMTI3MjEyOTIxMkUyMTNBMjEzQjIxNDAtMjE0NDIxNEEtMjE0RDIxNEYyMTkwLTIzMjgyMzJCLTIzRTgyNDAwLTI0MjYyNDQwLTI0NEEyNDlDLTI0RTkyNTAwLTI2Q0QyNkNGLTI2RTEyNkUzMjZFOC0yNkZGMjcwMS0yNzA0MjcwNi0yNzA5MjcwQy0yNzI3MjcyOS0yNzRCMjc0RDI3NEYtMjc1MjI3NTYtMjc1RTI3NjEtMjc2NzI3OTQyNzk4LTI3QUYyN0IxLTI3QkUyN0MwLTI3QzQyN0M3LTI3Q0EyN0NDMjdEMC0yN0U1MjdGMC0yOTgyMjk5OS0yOUQ3MjlEQy0yOUZCMjlGRS0yQjRDMkI1MC0yQjU5MkNFNS0yQ0VBMkU4MC0yRTk5MkU5Qi0yRUYzMkYwMC0yRkQ1MkZGMC0yRkZCMzAwNDMwMTIzMDEzMzAyMDMwMzYzMDM3MzAzRTMwM0YzMDlCMzA5QzMxOTAzMTkxMzE5Ni0zMTlGMzFDMC0zMUUzMzIwMC0zMjFFMzIyQS0zMjUwMzI2MC0zMjdGMzI4QS0zMkIwMzJDMC0zMkZFMzMwMC0zM0ZGNERDMC00REZGQTQ5MC1BNEM2QTcwMC1BNzE2QTcyMEE3MjFBNzg5QTc4QUE4MjgtQTgyQkE4MzYtQTgzOUFBNzctQUE3OUZCMjlGREZDRkRGREZFNjJGRTY0LUZFNjZGRTY5RkYwNEZGMEJGRjFDLUZGMUVGRjNFRkY0MEZGNUNGRjVFRkZFMC1GRkU2RkZFOC1GRkVFRkZGQ0ZGRkQiLA0KICAgIFNtOiAiMDAyQjAwM0MtMDAzRTAwN0MwMDdFMDBBQzAwQjEwMEQ3MDBGNzAzRjYwNjA2LTA2MDgyMDQ0MjA1MjIwN0EtMjA3QzIwOEEtMjA4QzIxNDAtMjE0NDIxNEIyMTkwLTIxOTQyMTlBMjE5QjIxQTAyMUEzMjFBNjIxQUUyMUNFMjFDRjIxRDIyMUQ0MjFGNC0yMkZGMjMwOC0yMzBCMjMyMDIzMjEyMzdDMjM5Qi0yM0IzMjNEQy0yM0UxMjVCNzI1QzEyNUY4LTI1RkYyNjZGMjdDMC0yN0M0MjdDNy0yN0NBMjdDQzI3RDAtMjdFNTI3RjAtMjdGRjI5MDAtMjk4MjI5OTktMjlENzI5REMtMjlGQjI5RkUtMkFGRjJCMzAtMkI0NDJCNDctMkI0Q0ZCMjlGRTYyRkU2NC1GRTY2RkYwQkZGMUMtRkYxRUZGNUNGRjVFRkZFMkZGRTktRkZFQyIsDQogICAgU2M6ICIwMDI0MDBBMi0wMEE1MDYwQjA5RjIwOUYzMDlGQjBBRjEwQkY5MEUzRjE3REIyMEEwLTIwQjhBODM4RkRGQ0ZFNjlGRjA0RkZFMEZGRTFGRkU1RkZFNiIsDQogICAgU2s6ICIwMDVFMDA2MDAwQTgwMEFGMDBCNDAwQjgwMkMyLTAyQzUwMkQyLTAyREYwMkU1LTAyRUIwMkVEMDJFRi0wMkZGMDM3NTAzODQwMzg1MUZCRDFGQkYtMUZDMTFGQ0QtMUZDRjFGREQtMUZERjFGRUQtMUZFRjFGRkQxRkZFMzA5QjMwOUNBNzAwLUE3MTZBNzIwQTcyMUE3ODlBNzhBRkYzRUZGNDBGRkUzIiwNCiAgICBTbzogIjAwQTYwMEE3MDBBOTAwQUUwMEIwMDBCNjA0ODIwNjBFMDYwRjA2RTkwNkZEMDZGRTA3RjYwOUZBMEI3MDBCRjMtMEJGODBCRkEwQzdGMENGMTBDRjIwRDc5MEYwMS0wRjAzMEYxMy0wRjE3MEYxQS0wRjFGMEYzNDBGMzYwRjM4MEZCRS0wRkM1MEZDNy0wRkNDMEZDRTBGQ0YwRkQ1LTBGRDgxMDlFMTA5RjEzNjAxMzkwLTEzOTkxOTQwMTlFMC0xOUZGMUI2MS0xQjZBMUI3NC0xQjdDMjEwMDIxMDEyMTAzLTIxMDYyMTA4MjEwOTIxMTQyMTE2LTIxMTgyMTFFLTIxMjMyMTI1MjEyNzIxMjkyMTJFMjEzQTIxM0IyMTRBMjE0QzIxNEQyMTRGMjE5NS0yMTk5MjE5Qy0yMTlGMjFBMTIxQTIyMUE0MjFBNTIxQTctMjFBRDIxQUYtMjFDRDIxRDAyMUQxMjFEMzIxRDUtMjFGMzIzMDAtMjMwNzIzMEMtMjMxRjIzMjItMjMyODIzMkItMjM3QjIzN0QtMjM5QTIzQjQtMjNEQjIzRTItMjNFODI0MDAtMjQyNjI0NDAtMjQ0QTI0OUMtMjRFOTI1MDAtMjVCNjI1QjgtMjVDMDI1QzItMjVGNzI2MDAtMjY2RTI2NzAtMjZDRDI2Q0YtMjZFMTI2RTMyNkU4LTI2RkYyNzAxLTI3MDQyNzA2LTI3MDkyNzBDLTI3MjcyNzI5LTI3NEIyNzREMjc0Ri0yNzUyMjc1Ni0yNzVFMjc2MS0yNzY3Mjc5NDI3OTgtMjdBRjI3QjEtMjdCRTI4MDAtMjhGRjJCMDAtMkIyRjJCNDUyQjQ2MkI1MC0yQjU5MkNFNS0yQ0VBMkU4MC0yRTk5MkU5Qi0yRUYzMkYwMC0yRkQ1MkZGMC0yRkZCMzAwNDMwMTIzMDEzMzAyMDMwMzYzMDM3MzAzRTMwM0YzMTkwMzE5MTMxOTYtMzE5RjMxQzAtMzFFMzMyMDAtMzIxRTMyMkEtMzI1MDMyNjAtMzI3RjMyOEEtMzJCMDMyQzAtMzJGRTMzMDAtMzNGRjREQzAtNERGRkE0OTAtQTRDNkE4MjgtQTgyQkE4MzZBODM3QTgzOUFBNzctQUE3OUZERkRGRkU0RkZFOEZGRURGRkVFRkZGQ0ZGRkQiLA0KICAgIFo6ICAiMDAyMDAwQTAxNjgwMTgwRTIwMDAtMjAwQTIwMjgyMDI5MjAyRjIwNUYzMDAwIiwNCiAgICBaczogIjAwMjAwMEEwMTY4MDE4MEUyMDAwLTIwMEEyMDJGMjA1RjMwMDAiLA0KICAgIFpsOiAiMjAyOCIsDQogICAgWnA6ICIyMDI5IiwNCiAgICBDOiAgIjAwMDAtMDAxRjAwN0YtMDA5RjAwQUQwMzc4MDM3OTAzN0YtMDM4MzAzOEIwMzhEMDNBMjA1MjYtMDUzMDA1NTcwNTU4MDU2MDA1ODgwNThCLTA1OTAwNUM4LTA1Q0YwNUVCLTA1RUYwNUY1LTA2MDUwNjFDMDYxRDA2MjAwNjVGMDZERDA3MEUwNzBGMDc0QjA3NEMwN0IyLTA3QkYwN0ZCLTA3RkYwODJFMDgyRjA4M0YtMDhGRjA5M0EwOTNCMDk0RjA5NTYwOTU3MDk3My0wOTc4MDk4MDA5ODQwOThEMDk4RTA5OTEwOTkyMDlBOTA5QjEwOUIzLTA5QjUwOUJBMDlCQjA5QzUwOUM2MDlDOTA5Q0EwOUNGLTA5RDYwOUQ4LTA5REIwOURFMDlFNDA5RTUwOUZDLTBBMDAwQTA0MEEwQi0wQTBFMEExMTBBMTIwQTI5MEEzMTBBMzQwQTM3MEEzQTBBM0IwQTNEMEE0My0wQTQ2MEE0OTBBNEEwQTRFLTBBNTAwQTUyLTBBNTgwQTVEMEE1Ri0wQTY1MEE3Ni0wQTgwMEE4NDBBOEUwQTkyMEFBOTBBQjEwQUI0MEFCQTBBQkIwQUM2MEFDQTBBQ0UwQUNGMEFEMS0wQURGMEFFNDBBRTUwQUYwMEFGMi0wQjAwMEIwNDBCMEQwQjBFMEIxMTBCMTIwQjI5MEIzMTBCMzQwQjNBMEIzQjBCNDUwQjQ2MEI0OTBCNEEwQjRFLTBCNTUwQjU4LTBCNUIwQjVFMEI2NDBCNjUwQjcyLTBCODEwQjg0MEI4Qi0wQjhEMEI5MTBCOTYtMEI5ODBCOUIwQjlEMEJBMC0wQkEyMEJBNS0wQkE3MEJBQi0wQkFEMEJCQS0wQkJEMEJDMy0wQkM1MEJDOTBCQ0UwQkNGMEJEMS0wQkQ2MEJEOC0wQkU1MEJGQi0wQzAwMEMwNDBDMEQwQzExMEMyOTBDMzQwQzNBLTBDM0MwQzQ1MEM0OTBDNEUtMEM1NDBDNTcwQzVBLTBDNUYwQzY0MEM2NTBDNzAtMEM3NzBDODAwQzgxMEM4NDBDOEQwQzkxMENBOTBDQjQwQ0JBMENCQjBDQzUwQ0M5MENDRS0wQ0Q0MENENy0wQ0REMENERjBDRTQwQ0U1MENGMDBDRjMtMEQwMTBEMDQwRDBEMEQxMTBEMjkwRDNBLTBEM0MwRDQ1MEQ0OTBENEUtMEQ1NjBENTgtMEQ1RjBENjQwRDY1MEQ3Ni0wRDc4MEQ4MDBEODEwRDg0MEQ5Ny0wRDk5MERCMjBEQkMwREJFMERCRjBEQzctMERDOTBEQ0ItMERDRTBERDUwREQ3MERFMC0wREYxMERGNS0wRTAwMEUzQi0wRTNFMEU1Qy0wRTgwMEU4MzBFODUwRTg2MEU4OTBFOEIwRThDMEU4RS0wRTkzMEU5ODBFQTAwRUE0MEVBNjBFQTgwRUE5MEVBQzBFQkEwRUJFMEVCRjBFQzUwRUM3MEVDRTBFQ0YwRURBMEVEQjBFREUtMEVGRjBGNDgwRjZELTBGNzAwRjhDLTBGOEYwRjk4MEZCRDBGQ0QwRkQ5LTBGRkYxMEM2LTEwQ0YxMEZELTEwRkYxMjQ5MTI0RTEyNEYxMjU3MTI1OTEyNUUxMjVGMTI4OTEyOEUxMjhGMTJCMTEyQjYxMkI3MTJCRjEyQzExMkM2MTJDNzEyRDcxMzExMTMxNjEzMTcxMzVCLTEzNUUxMzdELTEzN0YxMzlBLTEzOUYxM0Y1LTEzRkYxNjlELTE2OUYxNkYxLTE2RkYxNzBEMTcxNS0xNzFGMTczNy0xNzNGMTc1NC0xNzVGMTc2RDE3NzExNzc0LTE3N0YxN0I0MTdCNTE3REUxN0RGMTdFQS0xN0VGMTdGQS0xN0ZGMTgwRjE4MUEtMTgxRjE4NzgtMTg3RjE4QUItMThBRjE4RjYtMThGRjE5MUQtMTkxRjE5MkMtMTkyRjE5M0MtMTkzRjE5NDEtMTk0MzE5NkUxOTZGMTk3NS0xOTdGMTlBQy0xOUFGMTlDQS0xOUNGMTlEQi0xOUREMUExQzFBMUQxQTVGMUE3RDFBN0UxQThBLTFBOEYxQTlBLTFBOUYxQUFFLTFBRkYxQjRDLTFCNEYxQjdELTFCN0YxQkFCLTFCQUQxQkJBLTFCRkYxQzM4LTFDM0ExQzRBLTFDNEMxQzgwLTFDQ0YxQ0YzLTFDRkYxREU3LTFERkMxRjE2MUYxNzFGMUUxRjFGMUY0NjFGNDcxRjRFMUY0RjFGNTgxRjVBMUY1QzFGNUUxRjdFMUY3RjFGQjUxRkM1MUZENDFGRDUxRkRDMUZGMDFGRjExRkY1MUZGRjIwMEItMjAwRjIwMkEtMjAyRTIwNjAtMjA2RjIwNzIyMDczMjA4RjIwOTUtMjA5RjIwQjktMjBDRjIwRjEtMjBGRjIxOEEtMjE4RjIzRTktMjNGRjI0MjctMjQzRjI0NEItMjQ1RjI2Q0UyNkUyMjZFNC0yNkU3MjcwMDI3MDUyNzBBMjcwQjI3MjgyNzRDMjc0RTI3NTMtMjc1NTI3NUYyNzYwMjc5NS0yNzk3MjdCMDI3QkYyN0NCMjdDRC0yN0NGMkI0RC0yQjRGMkI1QS0yQkZGMkMyRjJDNUYyQ0YyLTJDRjgyRDI2LTJEMkYyRDY2LTJENkUyRDcwLTJEN0YyRDk3LTJEOUYyREE3MkRBRjJEQjcyREJGMkRDNzJEQ0YyREQ3MkRERjJFMzItMkU3RjJFOUEyRUY0LTJFRkYyRkQ2LTJGRUYyRkZDLTJGRkYzMDQwMzA5NzMwOTgzMTAwLTMxMDQzMTJFLTMxMzAzMThGMzFCOC0zMUJGMzFFNC0zMUVGMzIxRjMyRkY0REI2LTREQkY5RkNDLTlGRkZBNDhELUE0OEZBNEM3LUE0Q0ZBNjJDLUE2M0ZBNjYwQTY2MUE2NzQtQTY3QkE2OTgtQTY5RkE2RjgtQTZGRkE3OEQtQTdGQUE4MkMtQTgyRkE4M0EtQTgzRkE4NzgtQTg3RkE4QzUtQThDREE4REEtQThERkE4RkMtQThGRkE5NTQtQTk1RUE5N0QtQTk3RkE5Q0VBOURBLUE5RERBOUUwLUE5RkZBQTM3LUFBM0ZBQTRFQUE0RkFBNUFBQTVCQUE3Qy1BQTdGQUFDMy1BQURBQUFFMC1BQkJGQUJFRUFCRUZBQkZBLUFCRkZEN0E0LUQ3QUZEN0M3LUQ3Q0FEN0ZDLUY4RkZGQTJFRkEyRkZBNkVGQTZGRkFEQS1GQUZGRkIwNy1GQjEyRkIxOC1GQjFDRkIzN0ZCM0RGQjNGRkI0MkZCNDVGQkIyLUZCRDJGRDQwLUZENEZGRDkwRkQ5MUZEQzgtRkRFRkZERkVGREZGRkUxQS1GRTFGRkUyNy1GRTJGRkU1M0ZFNjdGRTZDLUZFNkZGRTc1RkVGRC1GRjAwRkZCRi1GRkMxRkZDOEZGQzlGRkQwRkZEMUZGRDhGRkQ5RkZERC1GRkRGRkZFN0ZGRUYtRkZGQkZGRkVGRkZGIiwNCiAgICBDYzogIjAwMDAtMDAxRjAwN0YtMDA5RiIsDQogICAgQ2Y6ICIwMEFEMDYwMC0wNjAzMDZERDA3MEYxN0I0MTdCNTIwMEItMjAwRjIwMkEtMjAyRTIwNjAtMjA2NDIwNkEtMjA2RkZFRkZGRkY5LUZGRkIiLA0KICAgIENvOiAiRTAwMC1GOEZGIiwNCiAgICBDczogIkQ4MDAtREZGRiIsDQogICAgQ246ICIwMzc4MDM3OTAzN0YtMDM4MzAzOEIwMzhEMDNBMjA1MjYtMDUzMDA1NTcwNTU4MDU2MDA1ODgwNThCLTA1OTAwNUM4LTA1Q0YwNUVCLTA1RUYwNUY1LTA1RkYwNjA0MDYwNTA2MUMwNjFEMDYyMDA2NUYwNzBFMDc0QjA3NEMwN0IyLTA3QkYwN0ZCLTA3RkYwODJFMDgyRjA4M0YtMDhGRjA5M0EwOTNCMDk0RjA5NTYwOTU3MDk3My0wOTc4MDk4MDA5ODQwOThEMDk4RTA5OTEwOTkyMDlBOTA5QjEwOUIzLTA5QjUwOUJBMDlCQjA5QzUwOUM2MDlDOTA5Q0EwOUNGLTA5RDYwOUQ4LTA5REIwOURFMDlFNDA5RTUwOUZDLTBBMDAwQTA0MEEwQi0wQTBFMEExMTBBMTIwQTI5MEEzMTBBMzQwQTM3MEEzQTBBM0IwQTNEMEE0My0wQTQ2MEE0OTBBNEEwQTRFLTBBNTAwQTUyLTBBNTgwQTVEMEE1Ri0wQTY1MEE3Ni0wQTgwMEE4NDBBOEUwQTkyMEFBOTBBQjEwQUI0MEFCQTBBQkIwQUM2MEFDQTBBQ0UwQUNGMEFEMS0wQURGMEFFNDBBRTUwQUYwMEFGMi0wQjAwMEIwNDBCMEQwQjBFMEIxMTBCMTIwQjI5MEIzMTBCMzQwQjNBMEIzQjBCNDUwQjQ2MEI0OTBCNEEwQjRFLTBCNTUwQjU4LTBCNUIwQjVFMEI2NDBCNjUwQjcyLTBCODEwQjg0MEI4Qi0wQjhEMEI5MTBCOTYtMEI5ODBCOUIwQjlEMEJBMC0wQkEyMEJBNS0wQkE3MEJBQi0wQkFEMEJCQS0wQkJEMEJDMy0wQkM1MEJDOTBCQ0UwQkNGMEJEMS0wQkQ2MEJEOC0wQkU1MEJGQi0wQzAwMEMwNDBDMEQwQzExMEMyOTBDMzQwQzNBLTBDM0MwQzQ1MEM0OTBDNEUtMEM1NDBDNTcwQzVBLTBDNUYwQzY0MEM2NTBDNzAtMEM3NzBDODAwQzgxMEM4NDBDOEQwQzkxMENBOTBDQjQwQ0JBMENCQjBDQzUwQ0M5MENDRS0wQ0Q0MENENy0wQ0REMENERjBDRTQwQ0U1MENGMDBDRjMtMEQwMTBEMDQwRDBEMEQxMTBEMjkwRDNBLTBEM0MwRDQ1MEQ0OTBENEUtMEQ1NjBENTgtMEQ1RjBENjQwRDY1MEQ3Ni0wRDc4MEQ4MDBEODEwRDg0MEQ5Ny0wRDk5MERCMjBEQkMwREJFMERCRjBEQzctMERDOTBEQ0ItMERDRTBERDUwREQ3MERFMC0wREYxMERGNS0wRTAwMEUzQi0wRTNFMEU1Qy0wRTgwMEU4MzBFODUwRTg2MEU4OTBFOEIwRThDMEU4RS0wRTkzMEU5ODBFQTAwRUE0MEVBNjBFQTgwRUE5MEVBQzBFQkEwRUJFMEVCRjBFQzUwRUM3MEVDRTBFQ0YwRURBMEVEQjBFREUtMEVGRjBGNDgwRjZELTBGNzAwRjhDLTBGOEYwRjk4MEZCRDBGQ0QwRkQ5LTBGRkYxMEM2LTEwQ0YxMEZELTEwRkYxMjQ5MTI0RTEyNEYxMjU3MTI1OTEyNUUxMjVGMTI4OTEyOEUxMjhGMTJCMTEyQjYxMkI3MTJCRjEyQzExMkM2MTJDNzEyRDcxMzExMTMxNjEzMTcxMzVCLTEzNUUxMzdELTEzN0YxMzlBLTEzOUYxM0Y1LTEzRkYxNjlELTE2OUYxNkYxLTE2RkYxNzBEMTcxNS0xNzFGMTczNy0xNzNGMTc1NC0xNzVGMTc2RDE3NzExNzc0LTE3N0YxN0RFMTdERjE3RUEtMTdFRjE3RkEtMTdGRjE4MEYxODFBLTE4MUYxODc4LTE4N0YxOEFCLTE4QUYxOEY2LTE4RkYxOTFELTE5MUYxOTJDLTE5MkYxOTNDLTE5M0YxOTQxLTE5NDMxOTZFMTk2RjE5NzUtMTk3RjE5QUMtMTlBRjE5Q0EtMTlDRjE5REItMTlERDFBMUMxQTFEMUE1RjFBN0QxQTdFMUE4QS0xQThGMUE5QS0xQTlGMUFBRS0xQUZGMUI0Qy0xQjRGMUI3RC0xQjdGMUJBQi0xQkFEMUJCQS0xQkZGMUMzOC0xQzNBMUM0QS0xQzRDMUM4MC0xQ0NGMUNGMy0xQ0ZGMURFNy0xREZDMUYxNjFGMTcxRjFFMUYxRjFGNDYxRjQ3MUY0RTFGNEYxRjU4MUY1QTFGNUMxRjVFMUY3RTFGN0YxRkI1MUZDNTFGRDQxRkQ1MUZEQzFGRjAxRkYxMUZGNTFGRkYyMDY1LTIwNjkyMDcyMjA3MzIwOEYyMDk1LTIwOUYyMEI5LTIwQ0YyMEYxLTIwRkYyMThBLTIxOEYyM0U5LTIzRkYyNDI3LTI0M0YyNDRCLTI0NUYyNkNFMjZFMjI2RTQtMjZFNzI3MDAyNzA1MjcwQTI3MEIyNzI4Mjc0QzI3NEUyNzUzLTI3NTUyNzVGMjc2MDI3OTUtMjc5NzI3QjAyN0JGMjdDQjI3Q0QtMjdDRjJCNEQtMkI0RjJCNUEtMkJGRjJDMkYyQzVGMkNGMi0yQ0Y4MkQyNi0yRDJGMkQ2Ni0yRDZFMkQ3MC0yRDdGMkQ5Ny0yRDlGMkRBNzJEQUYyREI3MkRCRjJEQzcyRENGMkRENzJEREYyRTMyLTJFN0YyRTlBMkVGNC0yRUZGMkZENi0yRkVGMkZGQy0yRkZGMzA0MDMwOTczMDk4MzEwMC0zMTA0MzEyRS0zMTMwMzE4RjMxQjgtMzFCRjMxRTQtMzFFRjMyMUYzMkZGNERCNi00REJGOUZDQy05RkZGQTQ4RC1BNDhGQTRDNy1BNENGQTYyQy1BNjNGQTY2MEE2NjFBNjc0LUE2N0JBNjk4LUE2OUZBNkY4LUE2RkZBNzhELUE3RkFBODJDLUE4MkZBODNBLUE4M0ZBODc4LUE4N0ZBOEM1LUE4Q0RBOERBLUE4REZBOEZDLUE4RkZBOTU0LUE5NUVBOTdELUE5N0ZBOUNFQTlEQS1BOUREQTlFMC1BOUZGQUEzNy1BQTNGQUE0RUFBNEZBQTVBQUE1QkFBN0MtQUE3RkFBQzMtQUFEQUFBRTAtQUJCRkFCRUVBQkVGQUJGQS1BQkZGRDdBNC1EN0FGRDdDNy1EN0NBRDdGQy1EN0ZGRkEyRUZBMkZGQTZFRkE2RkZBREEtRkFGRkZCMDctRkIxMkZCMTgtRkIxQ0ZCMzdGQjNERkIzRkZCNDJGQjQ1RkJCMi1GQkQyRkQ0MC1GRDRGRkQ5MEZEOTFGREM4LUZERUZGREZFRkRGRkZFMUEtRkUxRkZFMjctRkUyRkZFNTNGRTY3RkU2Qy1GRTZGRkU3NUZFRkRGRUZFRkYwMEZGQkYtRkZDMUZGQzhGRkM5RkZEMEZGRDFGRkQ4RkZEOUZGREQtRkZERkZGRTdGRkVGLUZGRjhGRkZFRkZGRiINCn0pOw0KDQpmdW5jdGlvbiBhZGRVbmljb2RlUGFja2FnZSAocGFjaykgew0KICAgIHZhciBjb2RlUG9pbnQgPSAvXHd7NH0vZzsNCiAgICBmb3IgKHZhciBuYW1lIGluIHBhY2spDQogICAgICAgIGV4cG9ydHMucGFja2FnZXNbbmFtZV0gPSBwYWNrW25hbWVdLnJlcGxhY2UoY29kZVBvaW50LCAiXFx1JCYiKTsNCn07DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9kb2N1bWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgJ2FjZS9yYW5nZScsICdhY2UvYW5jaG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBBbmNob3IgPSByZXF1aXJlKCIuL2FuY2hvciIpLkFuY2hvcjsNCg0KdmFyIERvY3VtZW50ID0gZnVuY3Rpb24odGV4dCkgew0KICAgIHRoaXMuJGxpbmVzID0gW107DQoNCiAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZXh0KSkgew0KICAgICAgICB0aGlzLmluc2VydExpbmVzKDAsIHRleHQpOw0KICAgIH0NCiAgICAvLyBUaGVyZSBoYXMgdG8gYmUgb25lIGxpbmUgYXQgbGVhc3QgaW4gdGhlIGRvY3VtZW50LiBJZiB5b3UgcGFzcyBhbiBlbXB0eQ0KICAgIC8vIHN0cmluZyB0byB0aGUgaW5zZXJ0IGZ1bmN0aW9uLCBub3RoaW5nIHdpbGwgaGFwcGVuLiBXb3JrYXJvdW5kLg0KICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7DQogICAgfQ0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZSgwLCAwLCBsZW4sIHRoaXMuZ2V0TGluZShsZW4tMSkubGVuZ3RoKSk7DQogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jcmVhdGVBbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gbmV3IEFuY2hvcih0aGlzLCByb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIC8vIGNoZWNrIGZvciBJRSBzcGxpdCBidWcNCiAgICBpZiAoImFhYSIuc3BsaXQoL2EvKS5sZW5ndGggPT0gMCkNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cclxufFxyL2csICJcbiIpLnNwbGl0KCJcbiIpOw0KICAgICAgICB9DQogICAgZWxzZQ0KICAgICAgICB0aGlzLiRzcGxpdCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cclxufFxyfFxuLyk7DQogICAgICAgIH07DQoNCg0KICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSBtYXRjaFsxXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgIHN3aXRjaCAodGhpcy4kbmV3TGluZU1vZGUpIHsNCiAgICAgICAgICBjYXNlICJ3aW5kb3dzIjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsNCg0KICAgICAgICAgIGNhc2UgInVuaXgiOg0KICAgICAgICAgICAgICByZXR1cm4gIlxuIjsNCg0KICAgICAgICAgIGNhc2UgImF1dG8iOg0KICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kYXV0b05ld0xpbmU7DQogICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICB0aGlzLiRuZXdMaW5lTW9kZSA9ICJhdXRvIjsNCiAgICB0aGlzLnNldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24obmV3TGluZU1vZGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJG5ld0xpbmVNb2RlID09PSBuZXdMaW5lTW9kZSkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRuZXdMaW5lTW9kZSA9IG5ld0xpbmVNb2RlOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc05ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHJldHVybiAodGV4dCA9PSAiXHJcbiIgfHwgdGV4dCA9PSAiXHIiIHx8IHRleHQgPT0gIlxuIik7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIEdldCBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGdpdmVuIGxpbmUgYXMgaXQgaXMgaW4gdGhlIGRvY3VtZW50DQogICAgICovDQogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGZpcnN0Um93LCBsYXN0Um93ICsgMSk7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgYWxsIGxpbmVzIGluIHRoZSBkb2N1bWVudCBhcyBzdHJpbmcgYXJyYXkuIFdhcm5pbmc6IFRoZSBjYWxsZXINCiAgICAgKiBzaG91bGQgbm90IG1vZGlmeSB0aGlzIGFycmF5IQ0KICAgICAqLw0KICAgIHRoaXMuZ2V0QWxsTGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXMoMCwgdGhpcy5nZXRMZW5ndGgoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGV4dFJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgbGluZXMgPSBbXTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoLmFwcGx5KGxpbmVzLCB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdysxLCByYW5nZS5lbmQucm93LTEpKTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2UuZW5kLnJvd10uc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pKTsNCiAgICAgICAgICAgIHJldHVybiBsaW5lcy5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRjbGlwUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsNCiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uLnJvdyA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIDEpOw0KICAgICAgICAgICAgcG9zaXRpb24uY29sdW1uID0gdGhpcy5nZXRMaW5lKGxlbmd0aC0xKS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KDQogICAgICAgIHBvc2l0aW9uID0gdGhpcy4kY2xpcFBvc2l0aW9uKHBvc2l0aW9uKTsNCg0KICAgICAgICBpZiAodGhpcy5nZXRMZW5ndGgoKSA8PSAxKQ0KICAgICAgICAgICAgdGhpcy4kZGV0ZWN0TmV3TGluZSh0ZXh0KTsNCg0KICAgICAgICB2YXIgbGluZXMgPSB0aGlzLiRzcGxpdCh0ZXh0KTsNCiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzLnNwbGljZSgwLCAxKVswXTsNCiAgICAgICAgdmFyIGxhc3RMaW5lID0gbGluZXMubGVuZ3RoID09IDAgPyBudWxsIDogbGluZXMuc3BsaWNlKGxpbmVzLmxlbmd0aCAtIDEsIDEpWzBdOw0KDQogICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGZpcnN0TGluZSk7DQogICAgICAgIGlmIChsYXN0TGluZSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydE5ld0xpbmUocG9zaXRpb24pOyAvLyB0ZXJtaW5hdGUgZmlyc3QgbGluZQ0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydExpbmVzKHBvc2l0aW9uLnJvdywgbGluZXMpOw0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgbGFzdExpbmUgfHwgIiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRMaW5lcyA9IGZ1bmN0aW9uKHJvdywgbGluZXMpIHsNCiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHtyb3c6IHJvdywgY29sdW1uOiAwfTsNCg0KICAgICAgICB2YXIgYXJncyA9IFtyb3csIDBdOw0KICAgICAgICBhcmdzLnB1c2guYXBwbHkoYXJncywgbGluZXMpOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UuYXBwbHkodGhpcy4kbGluZXMsIGFyZ3MpOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIDAsIHJvdyArIGxpbmVzLmxlbmd0aCwgMCk7DQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydExpbmVzIiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydE5ld0xpbmUgPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsNCg0KICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHBvc2l0aW9uLnJvdyArIDEsIDAsIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbiwgbGluZS5sZW5ndGgpKTsNCg0KICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93ICsgMSwNCiAgICAgICAgICAgIGNvbHVtbiA6IDANCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLA0KICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydEluTGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KDQogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsNCg0KICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKSArIHRleHQNCiAgICAgICAgICAgICAgICArIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbik7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdywNCiAgICAgICAgICAgIGNvbHVtbiA6IHBvc2l0aW9uLmNvbHVtbiArIHRleHQubGVuZ3RoDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRleHQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIC8vIGNsaXAgdG8gZG9jdW1lbnQNCiAgICAgICAgcmFuZ2Uuc3RhcnQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2Uuc3RhcnQpOw0KICAgICAgICByYW5nZS5lbmQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2UuZW5kKTsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIHZhciBmaXJzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSByYW5nZS5lbmQucm93Ow0KDQogICAgICAgIGlmIChyYW5nZS5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICB2YXIgZmlyc3RGdWxsUm93ID0gcmFuZ2Uuc3RhcnQuY29sdW1uID09IDAgPyBmaXJzdFJvdyA6IGZpcnN0Um93ICsgMTsNCiAgICAgICAgICAgIHZhciBsYXN0RnVsbFJvdyA9IGxhc3RSb3cgLSAxOw0KDQogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+IDApDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUobGFzdFJvdywgMCwgcmFuZ2UuZW5kLmNvbHVtbik7DQoNCiAgICAgICAgICAgIGlmIChsYXN0RnVsbFJvdyA+PSBmaXJzdEZ1bGxSb3cpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhmaXJzdEZ1bGxSb3csIGxhc3RGdWxsUm93KTsNCg0KICAgICAgICAgICAgaWYgKGZpcnN0RnVsbFJvdyAhPSBmaXJzdFJvdykgew0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHRoaXMuZ2V0TGluZShmaXJzdFJvdykubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5ld0xpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVJbkxpbmUgPSBmdW5jdGlvbihyb3csIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pIHsNCiAgICAgICAgaWYgKHN0YXJ0Q29sdW1uID09IGVuZENvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBzdGFydENvbHVtbiwgcm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pOw0KICAgICAgICB2YXIgbmV3TGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGxpbmUuc3Vic3RyaW5nKGVuZENvbHVtbiwgbGluZS5sZW5ndGgpOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAxLCBuZXdMaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZW1vdmVzIGEgcmFuZ2Ugb2YgZnVsbCBsaW5lcw0KICAgICAqDQogICAgICogQHBhcmFtIGZpcnN0Um93IHtJbnRlZ2VyfSBUaGUgZmlyc3Qgcm93IHRvIGJlIHJlbW92ZWQNCiAgICAgKiBAcGFyYW0gbGFzdFJvdyB7SW50ZWdlcn0gVGhlIGxhc3Qgcm93IHRvIGJlIHJlbW92ZWQNCiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX0gVGhlIHJlbW92ZWQgbGluZXMNCiAgICAgKi8NCiAgICB0aGlzLnJlbW92ZUxpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKGZpcnN0Um93LCAwLCBsYXN0Um93ICsgMSwgMCk7DQogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy4kbGluZXMuc3BsaWNlKGZpcnN0Um93LCBsYXN0Um93IC0gZmlyc3RSb3cgKyAxKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBubDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksDQogICAgICAgICAgICBsaW5lczogcmVtb3ZlZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmVtb3ZlZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVOZXdMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHNlY29uZExpbmUgPSB0aGlzLmdldExpbmUocm93KzEpOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIGZpcnN0TGluZS5sZW5ndGgsIHJvdysxLCAwKTsNCiAgICAgICAgdmFyIGxpbmUgPSBmaXJzdExpbmUgKyBzZWNvbmRMaW5lOw0KDQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDIsIGxpbmUpOw0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24ocmFuZ2UsIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIC8vIFNob3J0Y3V0OiBJZiB0aGUgdGV4dCB3ZSB3YW50IHRvIGluc2VydCBpcyB0aGUgc2FtZSBhcyBpdCBpcyBhbHJlYWR5DQogICAgICAgIC8vIGluIHRoZSBkb2N1bWVudCwgd2UgZG9uJ3QgaGF2ZSB0byByZXBsYWNlIGFueXRoaW5nLg0KICAgICAgICBpZiAodGV4dCA9PSB0aGlzLmdldFRleHRSYW5nZShyYW5nZSkpDQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOw0KDQogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgaWYgKHRleHQpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgdGV4dCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBlbmQgPSByYW5nZS5zdGFydDsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBlbmQ7DQogICAgfTsNCg0KICAgIHRoaXMuYXBwbHlEZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRlbHRhcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KICAgICAgICAgICAgdmFyIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2UuZW5kKTsNCg0KICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gMSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgew0KICAgICAgICBmb3IgKHZhciBpPWRlbHRhcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7DQogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgIH0NCiAgICB9Ow0KDQp9KS5jYWxsKERvY3VtZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jdW1lbnQgPSBEb2N1bWVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2FuY2hvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KLyoqDQogKiBBbiBBbmNob3IgaXMgYSBmbG9hdGluZyBwb2ludGVyIGluIHRoZSBkb2N1bWVudC4gV2hlbmV2ZXIgdGV4dCBpcyBpbnNlcnRlZCBvcg0KICogZGVsZXRlZCBiZWZvcmUgdGhlIGN1cnNvciwgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgaXMgdXBkYXRlZA0KICovDQp2YXIgQW5jaG9yID0gZXhwb3J0cy5BbmNob3IgPSBmdW5jdGlvbihkb2MsIHJvdywgY29sdW1uKSB7DQogICAgdGhpcy5kb2N1bWVudCA9IGRvYzsNCiAgICANCiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PSAidW5kZWZpbmVkIikNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3cucm93LCByb3cuY29sdW1uKTsNCiAgICBlbHNlDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOw0KDQogICAgdGhpcy4kb25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7DQogICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQogICAgDQogICAgdGhpcy5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCh0aGlzLnJvdywgdGhpcy5jb2x1bW4pOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXREb2N1bWVudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBkZWx0YSA9IGUuZGF0YTsNCiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyAhPSB0aGlzLnJvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID4gdGhpcy5yb3cpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSB0aGlzLnJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPiB0aGlzLmNvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICANCiAgICAgICAgdmFyIHJvdyA9IHRoaXMucm93Ow0KICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW47DQogICAgICAgIA0KICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0VGV4dCIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPD0gY29sdW1uKSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gKz0gcmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiAtPSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRMaW5lcyIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7DQogICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0Iikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDwgY29sdW1uKSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPj0gY29sdW1uKQ0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSAocmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByb3cgLT0gKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSByYW5nZS5lbmQuY29sdW1uKSArIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA8PSByb3cpDQogICAgICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbiwgdHJ1ZSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0UG9zaXRpb24gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgbm9DbGlwKSB7DQogICAgICAgIHZhciBwb3M7DQogICAgICAgIGlmIChub0NsaXApIHsNCiAgICAgICAgICAgIHBvcyA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHBvcyA9IHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBvbGQgPSB7DQogICAgICAgICAgICByb3c6IHRoaXMucm93LA0KICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbg0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgdGhpcy5yb3cgPSBwb3Mucm93Ow0KICAgICAgICB0aGlzLmNvbHVtbiA9IHBvcy5jb2x1bW47DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsNCiAgICAgICAgICAgIG9sZDogb2xkLA0KICAgICAgICAgICAgdmFsdWU6IHBvcw0KICAgICAgICB9KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZGV0YWNoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBwb3MgPSB7fTsNCiAgICANCiAgICAgICAgaWYgKHJvdyA+PSB0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpKSB7DQogICAgICAgICAgICBwb3Mucm93ID0gTWF0aC5tYXgoMCwgdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOw0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAocm93IDwgMCkgew0KICAgICAgICAgICAgcG9zLnJvdyA9IDA7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSByb3c7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gTWF0aC5taW4odGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aCwgTWF0aC5tYXgoMCwgY29sdW1uKSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChjb2x1bW4gPCAwKQ0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7DQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIHBvczsNCiAgICB9Ow0KICAgIA0KfSkuY2FsbChBbmNob3IucHJvdG90eXBlKTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvYmFja2dyb3VuZF90b2tlbml6ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCnZhciBCYWNrZ3JvdW5kVG9rZW5pemVyID0gZnVuY3Rpb24odG9rZW5pemVyLCBlZGl0b3IpIHsNCiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsgICAgDQogICAgdGhpcy5saW5lcyA9IFtdOw0KICAgIHRoaXMuY3VycmVudExpbmUgPSAwOw0KICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyOw0KDQogICAgdmFyIHNlbGYgPSB0aGlzOw0KDQogICAgdGhpcy4kd29ya2VyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICghc2VsZi5ydW5uaW5nKSB7IHJldHVybjsgfQ0KDQogICAgICAgIHZhciB3b3JrZXJTdGFydCA9IG5ldyBEYXRlKCk7DQogICAgICAgIHZhciBzdGFydExpbmUgPSBzZWxmLmN1cnJlbnRMaW5lOw0KICAgICAgICB2YXIgZG9jID0gc2VsZi5kb2M7DQoNCiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmVzID0gMDsNCg0KICAgICAgICB2YXIgbGVuID0gZG9jLmdldExlbmd0aCgpOw0KICAgICAgICB3aGlsZSAoc2VsZi5jdXJyZW50TGluZSA8IGxlbikgew0KICAgICAgICAgICAgc2VsZi5saW5lc1tzZWxmLmN1cnJlbnRMaW5lXSA9IHNlbGYuJHRva2VuaXplUm93cyhzZWxmLmN1cnJlbnRMaW5lLCBzZWxmLmN1cnJlbnRMaW5lKVswXTsNCiAgICAgICAgICAgIHNlbGYuY3VycmVudExpbmUrKzsNCg0KICAgICAgICAgICAgLy8gb25seSBjaGVjayBldmVyeSA1IGxpbmVzDQogICAgICAgICAgICBwcm9jZXNzZWRMaW5lcyArPSAxOw0KICAgICAgICAgICAgaWYgKChwcm9jZXNzZWRMaW5lcyAlIDUgPT0gMCkgJiYgKG5ldyBEYXRlKCkgLSB3b3JrZXJTdGFydCkgPiAyMCkgew0KICAgICAgICAgICAgICAgIHNlbGYuZmlyZVVwZGF0ZUV2ZW50KHN0YXJ0TGluZSwgc2VsZi5jdXJyZW50TGluZS0xKTsNCiAgICAgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSBzZXRUaW1lb3V0KHNlbGYuJHdvcmtlciwgMjApOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHNlbGYucnVubmluZyA9IGZhbHNlOw0KDQogICAgICAgIHNlbGYuZmlyZVVwZGF0ZUV2ZW50KHN0YXJ0TGluZSwgbGVuIC0gMSk7DQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5zZXRUb2tlbml6ZXIgPSBmdW5jdGlvbih0b2tlbml6ZXIpIHsNCiAgICAgICAgdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7DQogICAgICAgIHRoaXMubGluZXMgPSBbXTsNCg0KICAgICAgICB0aGlzLnN0YXJ0KDApOw0KICAgIH07DQoNCiAgICB0aGlzLnNldERvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIHRoaXMuZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmxpbmVzID0gW107DQoNCiAgICAgICAgdGhpcy5zdG9wKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZmlyZVVwZGF0ZUV2ZW50ID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdmFyIGRhdGEgPSB7DQogICAgICAgICAgICBmaXJzdDogZmlyc3RSb3csDQogICAgICAgICAgICBsYXN0OiBsYXN0Um93DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoInVwZGF0ZSIsIHtkYXRhOiBkYXRhfSk7DQogICAgfTsNCg0KICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbihzdGFydFJvdykgew0KICAgICAgICB0aGlzLmN1cnJlbnRMaW5lID0gTWF0aC5taW4oc3RhcnRSb3cgfHwgMCwgdGhpcy5jdXJyZW50TGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmdldExlbmd0aCgpKTsNCg0KICAgICAgICAvLyByZW1vdmUgYWxsIGNhY2hlZCBpdGVtcyBiZWxvdyB0aGlzIGxpbmUNCiAgICAgICAgdGhpcy5saW5lcy5zcGxpY2UodGhpcy5jdXJyZW50TGluZSwgdGhpcy5saW5lcy5sZW5ndGgpOw0KDQogICAgICAgIHRoaXMuc3RvcCgpOw0KICAgICAgICAvLyBwcmV0dHkgbG9uZyBkZWxheSB0byBwcmV2ZW50IHRoZSB0b2tlbml6ZXIgZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRoZSB1c2VyDQogICAgICAgIHRoaXMucnVubmluZyA9IHNldFRpbWVvdXQodGhpcy4kd29ya2VyLCA3MDApOw0KICAgIH07DQoNCiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMucnVubmluZykNCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJ1bm5pbmcpOw0KICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUb2tlbnMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kdG9rZW5pemVSb3dzKGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTdGF0ZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kdG9rZW5pemVSb3dzKHJvdywgcm93KVswXS5zdGF0ZTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdG9rZW5pemVSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKCF0aGlzLmRvYyB8fCBpc05hTihmaXJzdFJvdykgfHwgaXNOYU4obGFzdFJvdykpDQogICAgICAgICAgICByZXR1cm4gW3snc3RhdGUnOidzdGFydCcsJ3Rva2Vucyc6W119XTsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgcm93cyA9IFtdOw0KDQogICAgICAgIC8vIGRldGVybWluZSBzdGFydCBzdGF0ZQ0KICAgICAgICB2YXIgc3RhdGUgPSAic3RhcnQiOw0KICAgICAgICB2YXIgZG9DYWNoZSA9IGZhbHNlOw0KICAgICAgICBpZiAoZmlyc3RSb3cgPiAwICYmIHRoaXMubGluZXNbZmlyc3RSb3cgLSAxXSkgew0KICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmxpbmVzW2ZpcnN0Um93IC0gMV0uc3RhdGU7DQogICAgICAgICAgICBkb0NhY2hlID0gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIGlmIChmaXJzdFJvdyA9PSAwKSB7DQogICAgICAgICAgICBzdGF0ZSA9ICJzdGFydCI7DQogICAgICAgICAgICBkb0NhY2hlID0gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIC8vIEd1ZXNzIHRoYXQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHN0YXRlLg0KICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoLTFdLnN0YXRlOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5kb2MuZ2V0TGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICBmb3IgKHZhciByb3c9Zmlyc3RSb3c7IHJvdzw9bGFzdFJvdzsgcm93KyspIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5saW5lc1tyb3ddKSB7DQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMudG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZXNbcm93LWZpcnN0Um93XSB8fCAiIiwgc3RhdGUpOw0KICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHRva2Vucy5zdGF0ZTsNCiAgICAgICAgICAgICAgICByb3dzLnB1c2godG9rZW5zKTsNCg0KICAgICAgICAgICAgICAgIGlmIChkb0NhY2hlKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXNbcm93XSA9IHRva2VuczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5saW5lc1tyb3ddOw0KICAgICAgICAgICAgICAgIHN0YXRlID0gdG9rZW5zLnN0YXRlOw0KICAgICAgICAgICAgICAgIHJvd3MucHVzaCh0b2tlbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByb3dzOw0KICAgIH07DQoNCn0pLmNhbGwoQmFja2dyb3VuZFRva2VuaXplci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkJhY2tncm91bmRUb2tlbml6ZXIgPSBCYWNrZ3JvdW5kVG9rZW5pemVyOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZScsICdhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZScsICdhY2UvZWRpdF9zZXNzaW9uL2ZvbGQnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEZvbGRMaW5lID0gcmVxdWlyZSgiLi9mb2xkX2xpbmUiKS5Gb2xkTGluZTsNCnZhciBGb2xkID0gcmVxdWlyZSgiLi9mb2xkIikuRm9sZDsNCnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOw0KDQpmdW5jdGlvbiBGb2xkaW5nKCkgew0KICAgIC8qKg0KICAgICAqIExvb2tzIHVwIGEgZm9sZCBhdCBhIGdpdmVuIHJvdy9jb2x1bW4uIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lkZToNCiAgICAgKiAgIC0xOiBpZ25vcmUgYSBmb2xkIGlmIGZvbGQuc3RhcnQgPSByb3cvY29sdW1uDQogICAgICogICArMTogaWdub3JlIGEgZm9sZCBpZiBmb2xkLmVuZCA9IHJvdy9jb2x1bW4NCiAgICAgKi8NCiAgICB0aGlzLmdldEZvbGRBdCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBzaWRlKSB7DQogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUocm93KTsNCiAgICAgICAgaWYgKCFmb2xkTGluZSkNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgIHZhciBmb2xkcyA9IGZvbGRMaW5lLmZvbGRzOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZm9sZCA9IGZvbGRzW2ldOw0KICAgICAgICAgICAgaWYgKGZvbGQucmFuZ2UuY29udGFpbnMocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgaWYgKHNpZGUgPT0gMSAmJiBmb2xkLnJhbmdlLmlzRW5kKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpZGUgPT0gLTEgJiYgZm9sZC5yYW5nZS5pc1N0YXJ0KHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGZvbGQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmV0dXJucyBhbGwgZm9sZHMgaW4gdGhlIGdpdmVuIHJhbmdlLiBOb3RlLCB0aGF0IHRoaXMgd2lsbCByZXR1cm4gZm9sZHMNCiAgICAgKg0KICAgICAqLw0KICAgIHRoaXMuZ2V0Rm9sZHNJblJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmFuZ2UgPSByYW5nZS5jbG9uZSgpOw0KICAgICAgICB2YXIgc3RhcnQgPSByYW5nZS5zdGFydDsNCiAgICAgICAgdmFyIGVuZCA9IHJhbmdlLmVuZDsNCiAgICAgICAgdmFyIGZvbGRMaW5lcyA9IHRoaXMuJGZvbGREYXRhOw0KICAgICAgICB2YXIgZm91bmRGb2xkcyA9IFtdOw0KDQogICAgICAgIHN0YXJ0LmNvbHVtbiArPSAxOw0KICAgICAgICBlbmQuY29sdW1uIC09IDE7DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkTGluZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjbXAgPSBmb2xkTGluZXNbaV0ucmFuZ2UuY29tcGFyZVJhbmdlKHJhbmdlKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMikgew0KICAgICAgICAgICAgICAgIC8vIFJhbmdlIGlzIGJlZm9yZSBmb2xkTGluZS4gTm8gaW50ZXJzZWN0aW9uLiBUaGlzIG1lYW5zLA0KICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG90aGVyIGZvbGRMaW5lcyB0aGF0IGludGVyc2VjdC4NCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA9PSAtMikgew0KICAgICAgICAgICAgICAgIC8vIFJhbmdlIGlzIGFmdGVyIGZvbGRMaW5lLiBUaGVyZSBjYW4ndCBiZSBhbnkgb3RoZXIgZm9sZExpbmVzIHRoZW4sDQogICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgZ2l2ZSB1cC4NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmVzW2ldLmZvbGRzOw0KICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmb2xkcy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgIHZhciBmb2xkID0gZm9sZHNbal07DQogICAgICAgICAgICAgICAgY21wID0gZm9sZC5yYW5nZS5jb21wYXJlUmFuZ2UocmFuZ2UpOw0KICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gLTIpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMikgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAvLyBXVEYtc3RhdGU6IENhbiBoYXBwZW4gZHVlIHRvIC0xLysxIHRvIHN0YXJ0L2VuZCBjb2x1bW4uDQogICAgICAgICAgICAgICAgaWYgKGNtcCA9PSA0Mikgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm91bmRGb2xkcy5wdXNoKGZvbGQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmb3VuZEZvbGRzOw0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJucyBhbGwgZm9sZHMgaW4gdGhlIGRvY3VtZW50DQogICAgICovDQogICAgdGhpcy5nZXRBbGxGb2xkcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgZm9sZHMgPSBbXTsNCiAgICAgICAgdmFyIGZvbGRMaW5lcyA9IHRoaXMuJGZvbGREYXRhOw0KICAgICAgICANCiAgICAgICAgZnVuY3Rpb24gYWRkRm9sZChmb2xkKSB7DQogICAgICAgICAgICBmb2xkcy5wdXNoKGZvbGQpOw0KICAgICAgICAgICAgaWYgKCFmb2xkLnN1YkZvbGRzKQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZC5zdWJGb2xkcy5sZW5ndGg7IGkrKykNCiAgICAgICAgICAgICAgICBhZGRGb2xkKGZvbGQuc3ViRm9sZHNbaV0pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRMaW5lcy5sZW5ndGg7IGkrKykNCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm9sZExpbmVzW2ldLmZvbGRzLmxlbmd0aDsgaisrKQ0KICAgICAgICAgICAgICAgIGFkZEZvbGQoZm9sZExpbmVzW2ldLmZvbGRzW2pdKTsNCg0KICAgICAgICByZXR1cm4gZm9sZHM7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBiZXR3ZWVuIGZvbGRzIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4NCiAgICAgKiBFLmcuDQogICAgICogIGZvbzxmb2xkPmJ8YXI8Zm9sZD53b2xyZCAtPiAiYmFyIg0KICAgICAqICBmb288Zm9sZD5iYXI8Zm9sZD53b2x8cmQgLT4gIndvcmxkIg0KICAgICAqICBmb288Zm9sZD5iYXI8Zm98bGQ+d29scmQgLT4gPG51bGw+DQogICAgICoNCiAgICAgKiB3aGVyZSB8IG1lYW5zIHRoZSBwb3NpdGlvbiBvZiByb3cvY29sdW1uDQogICAgICoNCiAgICAgKiBUaGUgdHJpbSBvcHRpb24gZGV0ZXJtcyBpZiB0aGUgcmV0dXJuIHN0cmluZyBzaG91bGQgYmUgdHJpbWVkIGFjY29yZGluZw0KICAgICAqIHRvIHRoZSAic2lkZSIgcGFzc2VkIHdpdGggdGhlIHRyaW0gdmFsdWU6DQogICAgICoNCiAgICAgKiBFLmcuDQogICAgICogIGZvbzxmb2xkPmJ8YXI8Zm9sZD53b2xyZCAtdHJpbT0tMT4gImIiDQogICAgICogIGZvbzxmb2xkPmJhcjxmb2xkPndvbHxyZCAtdHJpbT0rMT4gInJsZCINCiAgICAgKiAgZm98bzxmb2xkPmJhcjxmb2xkPndvbHJkIC10cmltPTAwPiAiZm9vIg0KICAgICAqLw0KICAgIHRoaXMuZ2V0Rm9sZFN0cmluZ0F0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIHRyaW0sIGZvbGRMaW5lKSB7DQogICAgICAgIGZvbGRMaW5lID0gZm9sZExpbmUgfHwgdGhpcy5nZXRGb2xkTGluZShyb3cpOw0KICAgICAgICBpZiAoIWZvbGRMaW5lKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgdmFyIGxhc3RGb2xkID0gew0KICAgICAgICAgICAgZW5kOiB7IGNvbHVtbjogMCB9DQogICAgICAgIH07DQogICAgICAgIC8vIFRPRE86IFJlZmFjdG9yIHRvIHVzZSBnZXROZXh0Rm9sZFRvIGZ1bmN0aW9uLg0KICAgICAgICB2YXIgc3RyLCBmb2xkOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRMaW5lLmZvbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBmb2xkID0gZm9sZExpbmUuZm9sZHNbaV07DQogICAgICAgICAgICB2YXIgY21wID0gZm9sZC5yYW5nZS5jb21wYXJlRW5kKHJvdywgY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzDQogICAgICAgICAgICAgICAgICAgIC5nZXRMaW5lKGZvbGQuc3RhcnQucm93KQ0KICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGxhc3RGb2xkLmVuZC5jb2x1bW4sIGZvbGQuc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA9PT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGFzdEZvbGQgPSBmb2xkOw0KICAgICAgICB9DQogICAgICAgIGlmICghc3RyKQ0KICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRMaW5lKGZvbGQuc3RhcnQucm93KS5zdWJzdHJpbmcobGFzdEZvbGQuZW5kLmNvbHVtbik7DQoNCiAgICAgICAgaWYgKHRyaW0gPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBjb2x1bW4gLSBsYXN0Rm9sZC5lbmQuY29sdW1uKTsNCiAgICAgICAgZWxzZSBpZiAodHJpbSA9PSAxKQ0KICAgICAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoY29sdW1uIC0gbGFzdEZvbGQuZW5kLmNvbHVtbik7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHJldHVybiBzdHI7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZExpbmUgPSBmdW5jdGlvbihkb2NSb3csIHN0YXJ0Rm9sZExpbmUpIHsNCiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy4kZm9sZERhdGE7DQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgaWYgKHN0YXJ0Rm9sZExpbmUpDQogICAgICAgICAgICBpID0gZm9sZERhdGEuaW5kZXhPZihzdGFydEZvbGRMaW5lKTsNCiAgICAgICAgaWYgKGkgPT0gLTEpDQogICAgICAgICAgICBpID0gMDsNCiAgICAgICAgZm9yIChpOyBpIDwgZm9sZERhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGREYXRhW2ldOw0KICAgICAgICAgICAgaWYgKGZvbGRMaW5lLnN0YXJ0LnJvdyA8PSBkb2NSb3cgJiYgZm9sZExpbmUuZW5kLnJvdyA+PSBkb2NSb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZm9sZExpbmU7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGZvbGRMaW5lLmVuZC5yb3cgPiBkb2NSb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgLy8gcmV0dXJucyB0aGUgZm9sZCB3aGljaCBzdGFydHMgYWZ0ZXIgb3IgY29udGFpbnMgZG9jUm93DQogICAgdGhpcy5nZXROZXh0Rm9sZExpbmUgPSBmdW5jdGlvbihkb2NSb3csIHN0YXJ0Rm9sZExpbmUpIHsNCiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy4kZm9sZERhdGE7DQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgaWYgKHN0YXJ0Rm9sZExpbmUpDQogICAgICAgICAgICBpID0gZm9sZERhdGEuaW5kZXhPZihzdGFydEZvbGRMaW5lKTsNCiAgICAgICAgaWYgKGkgPT0gLTEpDQogICAgICAgICAgICBpID0gMDsNCiAgICAgICAgZm9yIChpOyBpIDwgZm9sZERhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGREYXRhW2ldOw0KICAgICAgICAgICAgaWYgKGZvbGRMaW5lLmVuZC5yb3cgPj0gZG9jUm93KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZvbGRMaW5lOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEZvbGRlZFJvd0NvdW50ID0gZnVuY3Rpb24oZmlyc3QsIGxhc3QpIHsNCiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy4kZm9sZERhdGEsIHJvd0NvdW50ID0gbGFzdC1maXJzdCsxOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkRGF0YVtpXSwNCiAgICAgICAgICAgICAgICBlbmQgPSBmb2xkTGluZS5lbmQucm93LA0KICAgICAgICAgICAgICAgIHN0YXJ0ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICAgICAgaWYgKGVuZCA+PSBsYXN0KSB7DQogICAgICAgICAgICAgICAgaWYoc3RhcnQgPCBsYXN0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmKHN0YXJ0ID49IGZpcnN0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQgLT0gbGFzdC1zdGFydDsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQgPSAwOy8vaW4gb25lIGZvbGQNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9IGVsc2UgaWYoZW5kID49IGZpcnN0KXsNCiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gZmlyc3QpIC8vZm9sZCBpbnNpZGUgcmFuZ2UNCiAgICAgICAgICAgICAgICAgICAgcm93Q291bnQgLT0gIGVuZC1zdGFydDsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHJvd0NvdW50IC09ICBlbmQtZmlyc3QrMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcm93Q291bnQ7DQogICAgfTsNCg0KICAgIHRoaXMuJGFkZEZvbGRMaW5lID0gZnVuY3Rpb24oZm9sZExpbmUpIHsNCiAgICAgICAgdGhpcy4kZm9sZERhdGEucHVzaChmb2xkTGluZSk7DQogICAgICAgIHRoaXMuJGZvbGREYXRhLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgICAgICAgICAgcmV0dXJuIGEuc3RhcnQucm93IC0gYi5zdGFydC5yb3c7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gZm9sZExpbmU7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIEFkZHMgYSBuZXcgZm9sZC4NCiAgICAgKg0KICAgICAqIEByZXR1cm5zDQogICAgICogICAgICBUaGUgbmV3IGNyZWF0ZWQgRm9sZCBvYmplY3Qgb3IgYW4gZXhpc3RpbmcgZm9sZCBvYmplY3QgaW4gY2FzZSB0aGUNCiAgICAgKiAgICAgIHBhc3NlZCBpbiByYW5nZSBmaXRzIGFuIGV4aXN0aW5nIGZvbGQgZXhhY3RseS4NCiAgICAgKi8NCiAgICB0aGlzLmFkZEZvbGQgPSBmdW5jdGlvbihwbGFjZWhvbGRlciwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy4kZm9sZERhdGE7DQogICAgICAgIHZhciBhZGRlZCA9IGZhbHNlOw0KICAgICAgICB2YXIgZm9sZDsNCiAgICAgICAgDQogICAgICAgIGlmIChwbGFjZWhvbGRlciBpbnN0YW5jZW9mIEZvbGQpDQogICAgICAgICAgICBmb2xkID0gcGxhY2Vob2xkZXI7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGZvbGQgPSBuZXcgRm9sZChyYW5nZSwgcGxhY2Vob2xkZXIpOw0KDQogICAgICAgIHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQoZm9sZC5yYW5nZSk7DQoNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gZm9sZC5zdGFydC5yb3c7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGZvbGQuc3RhcnQuY29sdW1uOw0KICAgICAgICB2YXIgZW5kUm93ID0gZm9sZC5lbmQucm93Ow0KICAgICAgICB2YXIgZW5kQ29sdW1uID0gZm9sZC5lbmQuY29sdW1uOw0KDQogICAgICAgIC8vIC0tLSBTb21lIGNoZWNraW5nIC0tLQ0KICAgICAgICBpZiAoZm9sZC5wbGFjZWhvbGRlci5sZW5ndGggPCAyKQ0KICAgICAgICAgICAgdGhyb3cgIlBsYWNlaG9sZGVyIGhhcyB0byBiZSBhdCBsZWFzdCAyIGNoYXJhY3RlcnMiOw0KDQogICAgICAgIGlmIChzdGFydFJvdyA9PSBlbmRSb3cgJiYgZW5kQ29sdW1uIC0gc3RhcnRDb2x1bW4gPCAyKQ0KICAgICAgICAgICAgdGhyb3cgIlRoZSByYW5nZSBoYXMgdG8gYmUgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIHdpZHRoIjsNCg0KICAgICAgICB2YXIgc3RhcnRGb2xkID0gdGhpcy5nZXRGb2xkQXQoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCAxKTsNCiAgICAgICAgdmFyIGVuZEZvbGQgPSB0aGlzLmdldEZvbGRBdChlbmRSb3csIGVuZENvbHVtbiwgLTEpOw0KICAgICAgICBpZiAoc3RhcnRGb2xkICYmIGVuZEZvbGQgPT0gc3RhcnRGb2xkKQ0KICAgICAgICAgICAgcmV0dXJuIHN0YXJ0Rm9sZC5hZGRTdWJGb2xkKGZvbGQpOw0KDQogICAgICAgIGlmICgNCiAgICAgICAgICAgIChzdGFydEZvbGQgJiYgIXN0YXJ0Rm9sZC5yYW5nZS5pc1N0YXJ0KHN0YXJ0Um93LCBzdGFydENvbHVtbikpDQogICAgICAgICAgICB8fCAoZW5kRm9sZCAmJiAhZW5kRm9sZC5yYW5nZS5pc0VuZChlbmRSb3csIGVuZENvbHVtbikpDQogICAgICAgICkgew0KICAgICAgICAgICAgdGhyb3cgIkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIiArIGZvbGQucmFuZ2UgKyBzdGFydEZvbGQucmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgZm9sZHMgaW4gdGhlIHJhbmdlIHdlIGNyZWF0ZSB0aGUgbmV3IGZvbGQgZm9yLg0KICAgICAgICB2YXIgZm9sZHMgPSB0aGlzLmdldEZvbGRzSW5SYW5nZShmb2xkLnJhbmdlKTsNCiAgICAgICAgaWYgKGZvbGRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZHMgZnJvbSBmb2xkIGRhdGEuDQogICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGRzKGZvbGRzKTsNCiAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVtb3ZlZCBmb2xkcyBhcyBzdWJmb2xkcyBvbiB0aGUgbmV3IGZvbGQuDQogICAgICAgICAgICBmb2xkLnN1YkZvbGRzID0gZm9sZHM7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkRGF0YVtpXTsNCiAgICAgICAgICAgIGlmIChlbmRSb3cgPT0gZm9sZExpbmUuc3RhcnQucm93KSB7DQogICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkRm9sZChmb2xkKTsNCiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChzdGFydFJvdyA9PSBmb2xkTGluZS5lbmQucm93KSB7DQogICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkRm9sZChmb2xkKTsNCiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgaWYgKCFmb2xkLnNhbWVSb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbWlnaHQgaGF2ZSB0byBtZXJnZSB0d28gRm9sZExpbmVzLg0KICAgICAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmVOZXh0ID0gZm9sZERhdGFbaSArIDFdOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZExpbmVOZXh0ICYmIGZvbGRMaW5lTmV4dC5zdGFydC5yb3cgPT0gZW5kUm93KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1lcmdlIQ0KICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUubWVyZ2UoZm9sZExpbmVOZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZW5kUm93IDw9IGZvbGRMaW5lLnN0YXJ0LnJvdykgew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFhZGRlZCkNCiAgICAgICAgICAgIGZvbGRMaW5lID0gdGhpcy4kYWRkRm9sZExpbmUobmV3IEZvbGRMaW5lKHRoaXMuJGZvbGREYXRhLCBmb2xkKSk7DQoNCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKQ0KICAgICAgICAgICAgdGhpcy4kdXBkYXRlV3JhcERhdGEoZm9sZExpbmUuc3RhcnQucm93LCBmb2xkTGluZS5zdGFydC5yb3cpOw0KDQogICAgICAgIC8vIE5vdGlmeSB0aGF0IGZvbGQgZGF0YSBoYXMgY2hhbmdlZC4NCiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VGb2xkIiwgeyBkYXRhOiBmb2xkIH0pOw0KDQogICAgICAgIHJldHVybiBmb2xkOw0KICAgIH07DQoNCiAgICB0aGlzLmFkZEZvbGRzID0gZnVuY3Rpb24oZm9sZHMpIHsNCiAgICAgICAgZm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7DQogICAgICAgICAgICB0aGlzLmFkZEZvbGQoZm9sZCk7DQogICAgICAgIH0sIHRoaXMpOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZUZvbGQgPSBmdW5jdGlvbihmb2xkKSB7DQogICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGQuZm9sZExpbmU7DQogICAgICAgIHZhciBzdGFydFJvdyA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IGZvbGRMaW5lLmVuZC5yb3c7DQoNCiAgICAgICAgdmFyIGZvbGRMaW5lcyA9IHRoaXMuJGZvbGREYXRhOw0KICAgICAgICB2YXIgZm9sZHMgPSBmb2xkTGluZS5mb2xkczsNCiAgICAgICAgLy8gU2ltcGxlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25seSBvbmUgZm9sZCBpbiB0aGUgRm9sZExpbmUgc3VjaCB0aGF0DQogICAgICAgIC8vIHRoZSBlbnRpcmUgZm9sZCBsaW5lIGNhbiBnZXQgcmVtb3ZlZCBkaXJlY3RseS4NCiAgICAgICAgaWYgKGZvbGRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgICAgICBmb2xkTGluZXMuc3BsaWNlKGZvbGRMaW5lcy5pbmRleE9mKGZvbGRMaW5lKSwgMSk7DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAvLyBJZiB0aGUgZm9sZCBpcyB0aGUgbGFzdCBmb2xkIG9mIHRoZSBmb2xkTGluZSwganVzdCByZW1vdmUgaXQuDQogICAgICAgIGlmIChmb2xkTGluZS5yYW5nZS5pc0VuZChmb2xkLmVuZC5yb3csIGZvbGQuZW5kLmNvbHVtbikpIHsNCiAgICAgICAgICAgIGZvbGRzLnBvcCgpOw0KICAgICAgICAgICAgZm9sZExpbmUuZW5kLnJvdyA9IGZvbGRzW2ZvbGRzLmxlbmd0aCAtIDFdLmVuZC5yb3c7DQogICAgICAgICAgICBmb2xkTGluZS5lbmQuY29sdW1uID0gZm9sZHNbZm9sZHMubGVuZ3RoIC0gMV0uZW5kLmNvbHVtbjsNCiAgICAgICAgfSBlbHNlDQogICAgICAgIC8vIElmIHRoZSBmb2xkIGlzIHRoZSBmaXJzdCBmb2xkIG9mIHRoZSBmb2xkTGluZSwganVzdCByZW1vdmUgaXQuDQogICAgICAgIGlmIChmb2xkTGluZS5yYW5nZS5pc1N0YXJ0KGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbikpIHsNCiAgICAgICAgICAgIGZvbGRzLnNoaWZ0KCk7DQogICAgICAgICAgICBmb2xkTGluZS5zdGFydC5yb3cgPSBmb2xkc1swXS5zdGFydC5yb3c7DQogICAgICAgICAgICBmb2xkTGluZS5zdGFydC5jb2x1bW4gPSBmb2xkc1swXS5zdGFydC5jb2x1bW47DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAvLyBXZSBrbm93IHRoZXJlIGFyZSBtb3JlIHRoZW4gMiBmb2xkcyBhbmQgdGhlIGZvbGQgaXMgbm90IGF0IHRoZSBlZGdlLg0KICAgICAgICAvLyBUaGlzIG1lYW5zLCB0aGUgZm9sZCBpcyBzb21ld2hlcmUgaW4gYmV0d2Vlbi4NCiAgICAgICAgLy8NCiAgICAgICAgLy8gSWYgdGhlIGZvbGQgaXMgaW4gb25lIHJvdywgd2UganVzdCBjYW4gcmVtb3ZlIGl0Lg0KICAgICAgICBpZiAoZm9sZC5zYW1lUm93KSB7DQogICAgICAgICAgICBmb2xkcy5zcGxpY2UoZm9sZHMuaW5kZXhPZihmb2xkKSwgMSk7DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAvLyBUaGUgZm9sZCBnb2VzIG92ZXIgbW9yZSB0aGVuIG9uZSByb3cuIFRoaXMgbWVhbnMgcmVtdm9pbmcgdGhpcyBmb2xkDQogICAgICAgIC8vIHdpbGwgY2F1c2UgdGhlIGZvbGQgbGluZSB0byBnZXQgc3BsaXR0ZWQgdXAuIG5ld0ZvbGRMaW5lIGlzIHRoZSBzZWNvbmQgcGFydA0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgbmV3Rm9sZExpbmUgPSBmb2xkTGluZS5zcGxpdChmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgZm9sZHMgPSBuZXdGb2xkTGluZS5mb2xkczsNCiAgICAgICAgICAgIGZvbGRzLnNoaWZ0KCk7DQogICAgICAgICAgICBuZXdGb2xkTGluZS5zdGFydC5yb3cgPSBmb2xkc1swXS5zdGFydC5yb3c7DQogICAgICAgICAgICBuZXdGb2xkTGluZS5zdGFydC5jb2x1bW4gPSBmb2xkc1swXS5zdGFydC5jb2x1bW47DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy4kdXNlV3JhcE1vZGUpIHsNCiAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVdyYXBEYXRhKHN0YXJ0Um93LCBlbmRSb3cpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gTm90aWZ5IHRoYXQgZm9sZCBkYXRhIGhhcyBjaGFuZ2VkLg0KICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUZvbGQiLCB7IGRhdGE6IGZvbGQgfSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlRm9sZHMgPSBmdW5jdGlvbihmb2xkcykgew0KICAgICAgICAvLyBXZSBuZWVkIHRvIGNsb25lIHRoZSBmb2xkcyBhcnJheSBwYXNzZWQgaW4gYXMgaXQgbWlnaHQgYmUgdGhlIGZvbGRzDQogICAgICAgIC8vIGFycmF5IG9mIGEgZm9sZCBsaW5lIGFuZCBhcyB3ZSBjYWxsIHRoaXMucmVtb3ZlRm9sZChmb2xkKSwgZm9sZHMNCiAgICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSBmb2xkcyBhbmQgY2hhbmdlcyB0aGUgY3VycmVudCBpbmRleC4NCiAgICAgICAgdmFyIGNsb25lRm9sZHMgPSBbXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgY2xvbmVGb2xkcy5wdXNoKGZvbGRzW2ldKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNsb25lRm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGQoZm9sZCk7DQogICAgICAgIH0sIHRoaXMpOw0KICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7DQogICAgfTsNCg0KICAgIHRoaXMuZXhwYW5kRm9sZCA9IGZ1bmN0aW9uKGZvbGQpIHsNCiAgICAgICAgdGhpcy5yZW1vdmVGb2xkKGZvbGQpOw0KICAgICAgICBmb2xkLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgdGhpcy5hZGRGb2xkKGZvbGQpOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICAgICAgZm9sZC5zdWJGb2xkcyA9IFtdOw0KICAgIH07DQoNCiAgICB0aGlzLmV4cGFuZEZvbGRzID0gZnVuY3Rpb24oZm9sZHMpIHsNCiAgICAgICAgZm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7DQogICAgICAgICAgICB0aGlzLmV4cGFuZEZvbGQoZm9sZCk7DQogICAgICAgIH0sIHRoaXMpOw0KICAgIH07DQoNCiAgICB0aGlzLnVuZm9sZCA9IGZ1bmN0aW9uKGxvY2F0aW9uLCBleHBhbmRJbm5lcikgew0KICAgICAgICB2YXIgcmFuZ2UsIGZvbGRzOw0KICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkNCiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIHRoaXMuZ2V0TGVuZ3RoKCksIDApOw0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG9jYXRpb24gPT0gIm51bWJlciIpDQogICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShsb2NhdGlvbiwgMCwgbG9jYXRpb24sIHRoaXMuZ2V0TGluZShsb2NhdGlvbikubGVuZ3RoKTsNCiAgICAgICAgZWxzZSBpZiAoInJvdyIgaW4gbG9jYXRpb24pDQogICAgICAgICAgICByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMobG9jYXRpb24sIGxvY2F0aW9uKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmFuZ2UgPSBsb2NhdGlvbjsNCg0KICAgICAgICBmb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKGV4cGFuZElubmVyKSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGRzKGZvbGRzKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgdG8gcmVtb3ZlIGFuZCBhZGQgZm9sZHMgaW4gb25lIGdvIGluc3RlYWQgb2YgdXNpbmcNCiAgICAgICAgICAgIC8vIGV4cGFuZEZvbGRzIHNldmVyYWwgdGltZXMuDQogICAgICAgICAgICB3aGlsZSAoZm9sZHMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkcyhmb2xkcyk7DQogICAgICAgICAgICAgICAgZm9sZHMgPSB0aGlzLmdldEZvbGRzSW5SYW5nZShyYW5nZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gZG9jdW1lbnRSb3cgaXMgZm9sZGVkLiBUaGlzIGlzIHRydWUgaWYgdGhlcmUgYXJlIHNvbWUNCiAgICAgKiBmb2xkZWQgcGFydHMgc3VjaCB0aGF0IHNvbWUgcGFydHMgb2YgdGhlIGxpbmUgaXMgc3RpbGwgdmlzaWJsZS4NCiAgICAgKiovDQogICAgdGhpcy5pc1Jvd0ZvbGRlZCA9IGZ1bmN0aW9uKGRvY1Jvdywgc3RhcnRGb2xkUm93KSB7DQogICAgICAgIHJldHVybiAhIXRoaXMuZ2V0Rm9sZExpbmUoZG9jUm93LCBzdGFydEZvbGRSb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFJvd0ZvbGRFbmQgPSBmdW5jdGlvbihkb2NSb3csIHN0YXJ0Rm9sZFJvdykgew0KICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldEZvbGRMaW5lKGRvY1Jvdywgc3RhcnRGb2xkUm93KTsNCiAgICAgICAgcmV0dXJuIChmb2xkTGluZQ0KICAgICAgICAgICAgPyBmb2xkTGluZS5lbmQucm93DQogICAgICAgICAgICA6IGRvY1Jvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lID0gZnVuY3Rpb24oZm9sZExpbmUsIGVuZFJvdywgZW5kQ29sdW1uLCBzdGFydFJvdywgc3RhcnRDb2x1bW4pIHsNCiAgICAgICAgaWYgKHN0YXJ0Um93ID09IG51bGwpIHsNCiAgICAgICAgICAgIHN0YXJ0Um93ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICAgICAgc3RhcnRDb2x1bW4gPSAwOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA9PSBudWxsKSB7DQogICAgICAgICAgICBlbmRSb3cgPSBmb2xkTGluZS5lbmQucm93Ow0KICAgICAgICAgICAgZW5kQ29sdW1uID0gdGhpcy5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQnVpbGQgdGhlIHRleHRsaW5lIHVzaW5nIHRoZSBGb2xkTGluZSB3YWxrZXIuDQogICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYzsNCiAgICAgICAgdmFyIHRleHRMaW5lID0gIiI7DQoNCiAgICAgICAgZm9sZExpbmUud2FsayhmdW5jdGlvbihwbGFjZWhvbGRlciwgcm93LCBjb2x1bW4sIGxhc3RDb2x1bW4pIHsNCiAgICAgICAgICAgIGlmIChyb3cgPCBzdGFydFJvdykgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAocm93ID09IHN0YXJ0Um93KSB7DQogICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA8IHN0YXJ0Q29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGFzdENvbHVtbiA9IE1hdGgubWF4KHN0YXJ0Q29sdW1uLCBsYXN0Q29sdW1uKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcikgew0KICAgICAgICAgICAgICAgIHRleHRMaW5lICs9IHBsYWNlaG9sZGVyOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0ZXh0TGluZSArPSBkb2MuZ2V0TGluZShyb3cpLnN1YnN0cmluZyhsYXN0Q29sdW1uLCBjb2x1bW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LmJpbmQodGhpcyksIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgcmV0dXJuIHRleHRMaW5lOw0KICAgIH07DQoNCiAgICB0aGlzLmdldERpc3BsYXlMaW5lID0gZnVuY3Rpb24ocm93LCBlbmRDb2x1bW4sIHN0YXJ0Um93LCBzdGFydENvbHVtbikgew0KICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLmdldEZvbGRMaW5lKHJvdyk7DQoNCiAgICAgICAgaWYgKCFmb2xkTGluZSkgew0KICAgICAgICAgICAgdmFyIGxpbmU7DQogICAgICAgICAgICBsaW5lID0gdGhpcy5kb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uIHx8IDAsIGVuZENvbHVtbiB8fCBsaW5lLmxlbmd0aCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoDQogICAgICAgICAgICAgICAgZm9sZExpbmUsIHJvdywgZW5kQ29sdW1uLCBzdGFydFJvdywgc3RhcnRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGNsb25lRm9sZERhdGEgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGZkID0gW107DQogICAgICAgIGZkID0gdGhpcy4kZm9sZERhdGEubWFwKGZ1bmN0aW9uKGZvbGRMaW5lKSB7DQogICAgICAgICAgICB2YXIgZm9sZHMgPSBmb2xkTGluZS5mb2xkcy5tYXAoZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmb2xkLmNsb25lKCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRm9sZExpbmUoZmQsIGZvbGRzKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmV0dXJuIGZkOw0KICAgIH07DQoNCiAgICB0aGlzLnRvZ2dsZUZvbGQgPSBmdW5jdGlvbih0cnlUb1VuZm9sZCkgew0KICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247DQogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZSgpOw0KICAgICAgICB2YXIgZm9sZDsNCiAgICAgICAgdmFyIGJyYWNrZXRQb3M7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IHJhbmdlLnN0YXJ0Ow0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICBpZiAoZm9sZCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kRm9sZChmb2xkKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChicmFja2V0UG9zID0gdGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0KGN1cnNvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29tcGFyZVBvaW50KGJyYWNrZXRQb3MpID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kID0gYnJhY2tldFBvczsNCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydCA9IGJyYWNrZXRQb3M7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uLS07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoYnJhY2tldFBvcyA9IHRoaXMuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSkpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29tcGFyZVBvaW50KGJyYWNrZXRQb3MpID09IDEpDQogICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZCA9IGJyYWNrZXRQb3M7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydCA9IGJyYWNrZXRQb3M7DQoNCiAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5nZXRDb21tZW50Rm9sZFJhbmdlKGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pIHx8IHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIGZvbGRzID0gdGhpcy5nZXRGb2xkc0luUmFuZ2UocmFuZ2UpOw0KICAgICAgICAgICAgaWYgKHRyeVRvVW5mb2xkICYmIGZvbGRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kRm9sZHMoZm9sZHMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBlbHNlIGlmIChmb2xkcy5sZW5ndGggPT0gMSApIHsNCiAgICAgICAgICAgICAgICBmb2xkID0gZm9sZHNbMF07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWZvbGQpDQogICAgICAgICAgICBmb2xkID0gdGhpcy5nZXRGb2xkQXQocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4pOw0KDQogICAgICAgIGlmIChmb2xkICYmIGZvbGQucmFuZ2UudG9TdHJpbmcoKSA9PSByYW5nZS50b1N0cmluZygpKSB7DQogICAgICAgICAgICB0aGlzLmV4cGFuZEZvbGQoZm9sZCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSAiLi4uIjsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgICAgIGlmKHBsYWNlaG9sZGVyLmxlbmd0aCA8IDQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlci50cmltKCkuc3Vic3RyaW5nKDAsIDIpICsgIi4uIjsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuYWRkRm9sZChwbGFjZWhvbGRlciwgcmFuZ2UpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldENvbW1lbnRGb2xkUmFuZ2UgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcih0aGlzLCByb3csIGNvbHVtbik7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAodG9rZW4gJiYgL15jb21tZW50fHN0cmluZy8udGVzdCh0b2tlbi50eXBlKSkgew0KICAgICAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKCk7DQogICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRva2VuLnR5cGUucmVwbGFjZSgvXC4uKi8sICJcXC4iKSk7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgIH0gd2hpbGUodG9rZW4gJiYgcmUudGVzdCh0b2tlbi50eXBlKSk7DQoNCiAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICByYW5nZS5zdGFydC5yb3cgPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKTsNCiAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgMjsNCg0KICAgICAgICAgICAgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcih0aGlzLCByb3csIGNvbHVtbik7DQoNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICB9IHdoaWxlKHRva2VuICYmIHJlLnRlc3QodG9rZW4udHlwZSkpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpOw0KDQogICAgICAgICAgICByYW5nZS5lbmQucm93ID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyB0b2tlbi52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5mb2xkQWxsID0gZnVuY3Rpb24oc3RhcnRSb3csIGVuZFJvdykgew0KICAgICAgICB2YXIgZm9sZFdpZGdldHMgPSB0aGlzLmZvbGRXaWRnZXRzOw0KICAgICAgICBlbmRSb3cgPSBlbmRSb3cgfHwgdGhpcy5nZXRMZW5ndGgoKTsNCiAgICAgICAgZm9yICh2YXIgcm93ID0gc3RhcnRSb3cgfHwgMDsgcm93IDwgZW5kUm93OyByb3crKykgew0KICAgICAgICAgICAgaWYgKGZvbGRXaWRnZXRzW3Jvd10gPT0gbnVsbCkNCiAgICAgICAgICAgICAgICBmb2xkV2lkZ2V0c1tyb3ddID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHJvdyk7DQogICAgICAgICAgICBpZiAoZm9sZFdpZGdldHNbcm93XSAhPSAic3RhcnQiKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZShyb3cpOw0KICAgICAgICAgICAgLy8gc29tZXRpbWVzIHJhbmdlIGNhbiBiZSBpbmNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBmb2xkDQogICAgICAgICAgICAvLyB3b3VsZG4ndCBpdCBiZSBiZXR0ZXIgZm9yIGFkZEZvbGQgdG8gcmV0dXJuIG51bGwgaXN0ZWFkIG9mIHRocm93aW5nPw0KICAgICAgICAgICAgaWYgKHJhbmdlICYmIHJhbmdlLmVuZC5yb3cgPCBlbmRSb3cpIHRyeSB7DQogICAgICAgICAgICAgICAgdGhpcy5hZGRGb2xkKCIuLi4iLCByYW5nZSk7DQogICAgICAgICAgICB9IGNhdGNoKGUpIHt9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuJGZvbGRTdHlsZXMgPSB7DQogICAgICAgICJtYW51YWwiOiAxLA0KICAgICAgICAibWFya2JlZ2luIjogMSwNCiAgICAgICAgIm1hcmtiZWdpbmVuZCI6IDENCiAgICB9Ow0KICAgIHRoaXMuJGZvbGRTdHlsZSA9ICJtYXJrYmVnaW4iOw0KICAgIHRoaXMuc2V0Rm9sZFN0eWxlID0gZnVuY3Rpb24oc3R5bGUpIHsNCiAgICAgICAgaWYgKCF0aGlzLiRmb2xkU3R5bGVzW3N0eWxlXSkNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb2xkIHN0eWxlOiAiICsgc3R5bGUgKyAiWyIgKyBPYmplY3Qua2V5cyh0aGlzLiRmb2xkU3R5bGVzKS5qb2luKCIsICIpICsgIl0iKTsNCiAgICAgICAgDQogICAgICAgIGlmICh0aGlzLiRmb2xkU3R5bGUgPT0gc3R5bGUpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kZm9sZFN0eWxlID0gc3R5bGU7DQogICAgICAgIA0KICAgICAgICBpZiAoc3R5bGUgPT0gIm1hbnVhbCIpDQogICAgICAgICAgICB0aGlzLnVuZm9sZCgpOw0KICAgICAgICANCiAgICAgICAgLy8gcmVzZXQgZm9sZGluZw0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGZvbGRNb2RlOw0KICAgICAgICB0aGlzLiRzZXRGb2xkaW5nKG51bGwpOw0KICAgICAgICB0aGlzLiRzZXRGb2xkaW5nKG1vZGUpOw0KICAgIH07DQoNCiAgICAvLyBzdHJ1Y3R1cmVkIGZvbGRpbmcNCiAgICB0aGlzLiRzZXRGb2xkaW5nID0gZnVuY3Rpb24oZm9sZE1vZGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJGZvbGRNb2RlID09IGZvbGRNb2RlKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHRoaXMuJGZvbGRNb2RlID0gZm9sZE1vZGU7DQogICAgICAgIA0KICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyk7DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUFubm90YXRpb24iKTsNCiAgICAgICAgDQogICAgICAgIGlmICghZm9sZE1vZGUgfHwgdGhpcy4kZm9sZFN0eWxlID09ICJtYW51YWwiKSB7DQogICAgICAgICAgICB0aGlzLmZvbGRXaWRnZXRzID0gbnVsbDsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdGhpcy5mb2xkV2lkZ2V0cyA9IFtdOw0KICAgICAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmb2xkTW9kZS5nZXRGb2xkV2lkZ2V0LmJpbmQoZm9sZE1vZGUsIHRoaXMsIHRoaXMuJGZvbGRTdHlsZSk7DQogICAgICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZm9sZE1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlLmJpbmQoZm9sZE1vZGUsIHRoaXMsIHRoaXMuJGZvbGRTdHlsZSk7DQogICAgICAgIA0KICAgICAgICB0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyA9IHRoaXMudXBkYXRlRm9sZFdpZGdldHMuYmluZCh0aGlzKTsNCiAgICAgICAgdGhpcy5vbignY2hhbmdlJywgdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpOw0KICAgICAgICANCiAgICB9Ow0KDQogICAgdGhpcy5vbkZvbGRXaWRnZXRDbGljayA9IGZ1bmN0aW9uKHJvdywgZSkgew0KICAgICAgICB2YXIgdHlwZSA9IHRoaXMuZ2V0Rm9sZFdpZGdldChyb3cpOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgb25seVN1YmZvbGRzID0gZS5zaGlmdEtleTsNCiAgICAgICAgdmFyIGFkZFN1YmZvbGRzID0gb25seVN1YmZvbGRzIHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSB8fCBlLm1ldGFLZXk7DQogICAgICAgIHZhciBmb2xkOw0KDQogICAgICAgIGlmICh0eXBlID09ICJlbmQiKQ0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KHJvdywgMCwgLTEpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBmb2xkID0gdGhpcy5nZXRGb2xkQXQocm93LCBsaW5lLmxlbmd0aCwgMSk7DQoNCiAgICAgICAgaWYgKGZvbGQpIHsNCiAgICAgICAgICAgIGlmIChhZGRTdWJmb2xkcykNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGQoZm9sZCk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkKGZvbGQpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2Uocm93KTsNCiAgICAgICAgaWYgKHJhbmdlKSB7DQogICAgICAgICAgICAvLyBzb21ldGltZXMgc2luZ2xlbGluZSBmb2xkcyBjYW4gYmUgbWlzc2VkIGJ5IHRoZSBjb2RlIGFib3ZlDQogICAgICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkpIHsNCiAgICAgICAgICAgICAgICBmb2xkID0gdGhpcy5nZXRGb2xkQXQocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4sIDEpOw0KICAgICAgICAgICAgICAgIGlmIChmb2xkICYmIHJhbmdlLmlzRWVxdWFsKGZvbGQucmFuZ2UpKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9sZChmb2xkKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFvbmx5U3ViZm9sZHMpDQogICAgICAgICAgICAgICAgdGhpcy5hZGRGb2xkKCIuLi4iLCByYW5nZSk7DQoNCiAgICAgICAgICAgIGlmIChhZGRTdWJmb2xkcykNCiAgICAgICAgICAgICAgICB0aGlzLmZvbGRBbGwocmFuZ2Uuc3RhcnQucm93ICsgMSwgcmFuZ2UuZW5kLnJvdyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoYWRkU3ViZm9sZHMpDQogICAgICAgICAgICAgICAgdGhpcy5mb2xkQWxsKHJvdyArIDEsIHRoaXMuZ2V0TGVuZ3RoKCkpOw0KICAgICAgICAgICAgZS50YXJnZXQuY2xhc3NOYW1lICs9ICIgaW52YWxpZCINCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdGhpcy51cGRhdGVGb2xkV2lkZ2V0cyA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB2YXIgcmFuZ2UgPSBkZWx0YS5yYW5nZTsNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICB2YXIgbGVuID0gcmFuZ2UuZW5kLnJvdyAtIGZpcnN0Um93Ow0KDQogICAgICAgIGlmIChsZW4gPT09IDApIHsNCiAgICAgICAgICAgIHRoaXMuZm9sZFdpZGdldHNbZmlyc3RSb3ddID0gbnVsbDsNCiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiIHx8IGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKSB7DQogICAgICAgICAgICB0aGlzLmZvbGRXaWRnZXRzLnNwbGljZShmaXJzdFJvdywgbGVuICsgMSwgbnVsbCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5KGxlbiArIDEpOw0KICAgICAgICAgICAgYXJncy51bnNoaWZ0KGZpcnN0Um93LCAxKTsNCiAgICAgICAgICAgIHRoaXMuZm9sZFdpZGdldHMuc3BsaWNlLmFwcGx5KHRoaXMuZm9sZFdpZGdldHMsIGFyZ3MpOw0KICAgICAgICB9DQogICAgfTsNCg0KfQ0KDQpleHBvcnRzLkZvbGRpbmcgPSBGb2xkaW5nOw0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4gRE9UIHZpZXJlY2sgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCi8qKg0KICogSWYgYW4gYXJyYXkgaXMgcGFzc2VkIGluLCB0aGUgZm9sZHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNvcnRlZCBhbHJlYWR5Lg0KICovDQpmdW5jdGlvbiBGb2xkTGluZShmb2xkRGF0YSwgZm9sZHMpIHsNCiAgICB0aGlzLmZvbGREYXRhID0gZm9sZERhdGE7DQogICAgaWYgKEFycmF5LmlzQXJyYXkoZm9sZHMpKSB7DQogICAgICAgIHRoaXMuZm9sZHMgPSBmb2xkczsNCiAgICB9IGVsc2Ugew0KICAgICAgICBmb2xkcyA9IHRoaXMuZm9sZHMgPSBbIGZvbGRzIF07DQogICAgfQ0KDQogICAgdmFyIGxhc3QgPSBmb2xkc1tmb2xkcy5sZW5ndGggLSAxXQ0KICAgIHRoaXMucmFuZ2UgPSBuZXcgUmFuZ2UoZm9sZHNbMF0uc3RhcnQucm93LCBmb2xkc1swXS5zdGFydC5jb2x1bW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0LmVuZC5yb3csIGxhc3QuZW5kLmNvbHVtbik7DQogICAgdGhpcy5zdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnQ7DQogICAgdGhpcy5lbmQgICA9IHRoaXMucmFuZ2UuZW5kOw0KDQogICAgdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGZvbGQpIHsNCiAgICAgICAgZm9sZC5zZXRGb2xkTGluZSh0aGlzKTsNCiAgICB9LCB0aGlzKTsNCn0NCg0KKGZ1bmN0aW9uKCkgew0KICAgIC8qKg0KICAgICAqIE5vdGU6IFRoaXMgZG9lc24ndCB1cGRhdGUgd3JhcERhdGEhDQogICAgICovDQogICAgdGhpcy5zaGlmdFJvdyA9IGZ1bmN0aW9uKHNoaWZ0KSB7DQogICAgICAgIHRoaXMuc3RhcnQucm93ICs9IHNoaWZ0Ow0KICAgICAgICB0aGlzLmVuZC5yb3cgKz0gc2hpZnQ7DQogICAgICAgIHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7DQogICAgICAgICAgICBmb2xkLnN0YXJ0LnJvdyArPSBzaGlmdDsNCiAgICAgICAgICAgIGZvbGQuZW5kLnJvdyArPSBzaGlmdDsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgdGhpcy5hZGRGb2xkID0gZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICBpZiAoZm9sZC5zYW1lUm93KSB7DQogICAgICAgICAgICBpZiAoZm9sZC5zdGFydC5yb3cgPCB0aGlzLnN0YXJ0Um93IHx8IGZvbGQuZW5kUm93ID4gdGhpcy5lbmRSb3cpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAiQ2FuJ3QgYWRkIGEgZm9sZCB0byB0aGlzIEZvbGRMaW5lIGFzIGl0IGhhcyBubyBjb25uZWN0aW9uIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZm9sZHMucHVzaChmb2xkKTsNCiAgICAgICAgICAgIHRoaXMuZm9sZHMuc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC1hLnJhbmdlLmNvbXBhcmVFbmQoYi5zdGFydC5yb3csIGIuc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2UuY29tcGFyZUVuZChmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4pID4gMCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IGZvbGQuZW5kLnJvdzsNCiAgICAgICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSAgZm9sZC5lbmQuY29sdW1uOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJhbmdlLmNvbXBhcmVTdGFydChmb2xkLmVuZC5yb3csIGZvbGQuZW5kLmNvbHVtbikgPCAwKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zdGFydC5yb3cgPSBmb2xkLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGZvbGQuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGZvbGQuc3RhcnQucm93ID09IHRoaXMuZW5kLnJvdykgew0KICAgICAgICAgICAgdGhpcy5mb2xkcy5wdXNoKGZvbGQpOw0KICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gZm9sZC5lbmQucm93Ow0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gZm9sZC5lbmQuY29sdW1uOw0KICAgICAgICB9IGVsc2UgaWYgKGZvbGQuZW5kLnJvdyA9PSB0aGlzLnN0YXJ0LnJvdykgew0KICAgICAgICAgICAgdGhpcy5mb2xkcy51bnNoaWZ0KGZvbGQpOw0KICAgICAgICAgICAgdGhpcy5zdGFydC5yb3cgPSBmb2xkLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gZm9sZC5zdGFydC5jb2x1bW47DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aHJvdyAiVHJ5aW5nIHRvIGFkZCBmb2xkIHRvIEZvbGRSb3cgdGhhdCBkb2Vzbid0IGhhdmUgYSBtYXRjaGluZyByb3ciOw0KICAgICAgICB9DQogICAgICAgIGZvbGQuZm9sZExpbmUgPSB0aGlzOw0KICAgIH0NCg0KICAgIHRoaXMuY29udGFpbnNSb3cgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIHJvdyA+PSB0aGlzLnN0YXJ0LnJvdyAmJiByb3cgPD0gdGhpcy5lbmQucm93Ow0KICAgIH0NCg0KICAgIHRoaXMud2FsayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBlbmRSb3csIGVuZENvbHVtbikgew0KICAgICAgICB2YXIgbGFzdEVuZCA9IDAsDQogICAgICAgICAgICBmb2xkcyA9IHRoaXMuZm9sZHMsDQogICAgICAgICAgICBmb2xkLA0KICAgICAgICAgICAgY29tcCwgc3RvcCwgaXNOZXdSb3cgPSB0cnVlOw0KDQogICAgICAgIGlmIChlbmRSb3cgPT0gbnVsbCkgew0KICAgICAgICAgICAgZW5kUm93ID0gdGhpcy5lbmQucm93Ow0KICAgICAgICAgICAgZW5kQ29sdW1uID0gdGhpcy5lbmQuY29sdW1uOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgZm9sZCA9IGZvbGRzW2ldOw0KDQogICAgICAgICAgICBjb21wID0gZm9sZC5yYW5nZS5jb21wYXJlU3RhcnQoZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICAgICAgLy8gVGhpcyBmb2xkIGlzIGFmdGVyIHRoZSBlbmRSb3cvQ29sdW1uLg0KICAgICAgICAgICAgaWYgKGNvbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBlbmRSb3csIGVuZENvbHVtbiwgbGFzdEVuZCwgaXNOZXdSb3cpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc3RvcCA9IGNhbGxiYWNrKG51bGwsIGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbiwgbGFzdEVuZCwgaXNOZXdSb3cpOw0KICAgICAgICAgICAgc3RvcCA9ICFzdG9wICYmIGNhbGxiYWNrKGZvbGQucGxhY2Vob2xkZXIsIGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbiwgbGFzdEVuZCk7DQoNCiAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHJlcXVlc3RlZCB0byBzdG9wIHRoZSB3YWxrIG9yIGVuZFJvdy9lbmRDb2x1bW4gaXMNCiAgICAgICAgICAgIC8vIGluc2lkZSBvZiB0aGlzIGZvbGQgKGNvbXAgPT0gMCksIHRoZW4gZW5kIGhlcmUuDQogICAgICAgICAgICBpZiAoc3RvcCB8fCBjb21wID09IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIE5vdGUgdGhlIG5ldyBsYXN0RW5kIG1pZ2h0IG5vdCBiZSBvbiB0aGUgc2FtZSBsaW5lLiBIb3dldmVyLA0KICAgICAgICAgICAgLy8gaXQncyB0aGUgY2FsbGJhY2sncyBqb2IgdG8gcmVjb2duaXplIHRoaXMuDQogICAgICAgICAgICBpc05ld1JvdyA9ICFmb2xkLnNhbWVSb3c7DQogICAgICAgICAgICBsYXN0RW5kID0gZm9sZC5lbmQuY29sdW1uOw0KICAgICAgICB9DQogICAgICAgIGNhbGxiYWNrKG51bGwsIGVuZFJvdywgZW5kQ29sdW1uLCBsYXN0RW5kLCBpc05ld1Jvdyk7DQogICAgfQ0KDQogICAgdGhpcy5nZXROZXh0Rm9sZFRvID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIGZvbGQsIGNtcDsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBmb2xkID0gdGhpcy5mb2xkc1tpXTsNCiAgICAgICAgICAgIGNtcCA9IGZvbGQucmFuZ2UuY29tcGFyZUVuZChyb3csIGNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgZm9sZDogZm9sZCwNCiAgICAgICAgICAgICAgICAgICAga2luZDogImFmdGVyIg0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgZm9sZDogZm9sZCwNCiAgICAgICAgICAgICAgICAgICAga2luZDogImluc2lkZSINCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KDQogICAgdGhpcy5hZGRSZW1vdmVDaGFycyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBsZW4pIHsNCiAgICAgICAgdmFyIHJldCA9IHRoaXMuZ2V0TmV4dEZvbGRUbyhyb3csIGNvbHVtbiksDQogICAgICAgICAgICBmb2xkLCBmb2xkczsNCiAgICAgICAgaWYgKHJldCkgew0KICAgICAgICAgICAgZm9sZCA9IHJldC5mb2xkOw0KICAgICAgICAgICAgaWYgKHJldC5raW5kID09ICJpbnNpZGUiDQogICAgICAgICAgICAgICAgJiYgZm9sZC5zdGFydC5jb2x1bW4gIT0gY29sdW1uDQogICAgICAgICAgICAgICAgJiYgZm9sZC5zdGFydC5yb3cgIT0gcm93KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICJNb3ZpbmcgY2hhcmFjdGVycyBpbnNpZGUgb2YgYSBmb2xkIHNob3VsZCBuZXZlciBiZSByZWFjaGVkIjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9sZC5zdGFydC5yb3cgPT0gcm93KSB7DQogICAgICAgICAgICAgICAgZm9sZHMgPSB0aGlzLmZvbGRzOw0KICAgICAgICAgICAgICAgIHZhciBpID0gZm9sZHMuaW5kZXhPZihmb2xkKTsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uICs9IGxlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgZm9sZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgZm9sZCA9IGZvbGRzW2ldOw0KICAgICAgICAgICAgICAgICAgICBmb2xkLnN0YXJ0LmNvbHVtbiArPSBsZW47DQogICAgICAgICAgICAgICAgICAgIGlmICghZm9sZC5zYW1lUm93KSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9sZC5lbmQuY29sdW1uICs9IGxlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uICs9IGxlbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuc3BsaXQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgZm9sZCA9IHRoaXMuZ2V0TmV4dEZvbGRUbyhyb3csIGNvbHVtbikuZm9sZCwNCiAgICAgICAgICAgIGZvbGRzID0gdGhpcy5mb2xkczsNCiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy5mb2xkRGF0YTsNCg0KICAgICAgICBpZiAoIWZvbGQpIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIHZhciBpID0gZm9sZHMuaW5kZXhPZihmb2xkKTsNCiAgICAgICAgdmFyIGZvbGRCZWZvcmUgPSBmb2xkc1tpIC0gMV07DQogICAgICAgIHRoaXMuZW5kLnJvdyA9IGZvbGRCZWZvcmUuZW5kLnJvdzsNCiAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gZm9sZEJlZm9yZS5lbmQuY29sdW1uOw0KDQogICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZHMgYWZ0ZXIgcm93L2NvbHVtbiBhbmQgY3JlYXRlIGEgbmV3IEZvbGRMaW5lDQogICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlc2UgcmVtb3ZlZCBmb2xkcy4NCiAgICAgICAgZm9sZHMgPSBmb2xkcy5zcGxpY2UoaSwgZm9sZHMubGVuZ3RoIC0gaSk7DQoNCiAgICAgICAgdmFyIG5ld0ZvbGRMaW5lID0gbmV3IEZvbGRMaW5lKGZvbGREYXRhLCBmb2xkcyk7DQogICAgICAgIGZvbGREYXRhLnNwbGljZShmb2xkRGF0YS5pbmRleE9mKHRoaXMpICsgMSwgMCwgbmV3Rm9sZExpbmUpOw0KICAgICAgICByZXR1cm4gbmV3Rm9sZExpbmU7DQogICAgfQ0KDQogICAgdGhpcy5tZXJnZSA9IGZ1bmN0aW9uKGZvbGRMaW5lTmV4dCkgew0KICAgICAgICB2YXIgZm9sZHMgPSBmb2xkTGluZU5leHQuZm9sZHM7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRoaXMuYWRkRm9sZChmb2xkc1tpXSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gUmVtb3ZlIHRoZSBmb2xkTGluZU5leHQgLSBubyBsb25nZXIgbmVlZGVkLCBhcw0KICAgICAgICAvLyBpdCdzIG1lcmdlZCBub3cgd2l0aCBmb2xkTGluZU5leHQuDQogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuZm9sZERhdGE7DQogICAgICAgIGZvbGREYXRhLnNwbGljZShmb2xkRGF0YS5pbmRleE9mKGZvbGRMaW5lTmV4dCksIDEpOw0KICAgIH0NCg0KICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHJldCA9IFt0aGlzLnJhbmdlLnRvU3RyaW5nKCkgKyAiOiBbIiBdOw0KDQogICAgICAgIHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7DQogICAgICAgICAgICByZXQucHVzaCgiICAiICsgZm9sZC50b1N0cmluZygpKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldC5wdXNoKCJdIikNCiAgICAgICAgcmV0dXJuIHJldC5qb2luKCJcbiIpOw0KICAgIH0NCg0KICAgIHRoaXMuaWR4VG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKGlkeCkgew0KICAgICAgICB2YXIgbGFzdEZvbGRFbmRDb2x1bW4gPSAwOw0KICAgICAgICB2YXIgZm9sZDsNCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZm9sZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBmb2xkID0gdGhpcy5mb2xkc1tpXTsNCg0KICAgICAgICAgICAgaWR4IC09IGZvbGQuc3RhcnQuY29sdW1uIC0gbGFzdEZvbGRFbmRDb2x1bW47DQogICAgICAgICAgICBpZiAoaWR4IDwgMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHJvdzogZm9sZC5zdGFydC5yb3csDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZm9sZC5zdGFydC5jb2x1bW4gKyBpZHgNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZHggLT0gZm9sZC5wbGFjZWhvbGRlci5sZW5ndGg7DQogICAgICAgICAgICBpZiAoaWR4IDwgMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmb2xkLnN0YXJ0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsYXN0Rm9sZEVuZENvbHVtbiA9IGZvbGQuZW5kLmNvbHVtbjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICByb3c6IHRoaXMuZW5kLnJvdywNCiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5lbmQuY29sdW1uICsgaWR4DQogICAgICAgIH07DQogICAgfQ0KfSkuY2FsbChGb2xkTGluZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkZvbGRMaW5lID0gRm9sZExpbmU7DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZWRpdF9zZXNzaW9uL2ZvbGQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQovKioNCiAqIFNpbXBsZSBmb2xkLWRhdGEgc3RydWN0Lg0KICoqLw0KdmFyIEZvbGQgPSBleHBvcnRzLkZvbGQgPSBmdW5jdGlvbihyYW5nZSwgcGxhY2Vob2xkZXIpIHsNCiAgICB0aGlzLmZvbGRMaW5lID0gbnVsbDsNCiAgICB0aGlzLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7DQogICAgdGhpcy5yYW5nZSA9IHJhbmdlOw0KICAgIHRoaXMuc3RhcnQgPSByYW5nZS5zdGFydDsNCiAgICB0aGlzLmVuZCA9IHJhbmdlLmVuZDsNCg0KICAgIHRoaXMuc2FtZVJvdyA9IHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93Ow0KICAgIHRoaXMuc3ViRm9sZHMgPSBbXTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICciJyArIHRoaXMucGxhY2Vob2xkZXIgKyAnIiAnICsgdGhpcy5yYW5nZS50b1N0cmluZygpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEZvbGRMaW5lID0gZnVuY3Rpb24oZm9sZExpbmUpIHsNCiAgICAgICAgdGhpcy5mb2xkTGluZSA9IGZvbGRMaW5lOw0KICAgICAgICB0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgew0KICAgICAgICAgICAgZm9sZC5zZXRGb2xkTGluZShmb2xkTGluZSk7DQogICAgICAgIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2UuY2xvbmUoKTsNCiAgICAgICAgdmFyIGZvbGQgPSBuZXcgRm9sZChyYW5nZSwgdGhpcy5wbGFjZWhvbGRlcik7DQogICAgICAgIHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihzdWJGb2xkKSB7DQogICAgICAgICAgICBmb2xkLnN1YkZvbGRzLnB1c2goc3ViRm9sZC5jbG9uZSgpKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiBmb2xkOw0KICAgIH07DQoNCiAgICB0aGlzLmFkZFN1YkZvbGQgPSBmdW5jdGlvbihmb2xkKSB7DQogICAgICAgIGlmICh0aGlzLnJhbmdlLmlzRWVxdWFsKGZvbGQpKQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQoNCiAgICAgICAgaWYgKCF0aGlzLnJhbmdlLmNvbnRhaW5zUmFuZ2UoZm9sZCkpDQogICAgICAgICAgICB0aHJvdyAiQSBmb2xkIGNhbid0IGludGVyc2VjdCBhbHJlYWR5IGV4aXN0aW5nIGZvbGQiICsgZm9sZC5yYW5nZSArIHRoaXMucmFuZ2U7DQoNCiAgICAgICAgdmFyIHJvdyA9IGZvbGQucmFuZ2Uuc3RhcnQucm93LCBjb2x1bW4gPSBmb2xkLnJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGNtcCA9IC0xOyBpIDwgdGhpcy5zdWJGb2xkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgY21wID0gdGhpcy5zdWJGb2xkc1tpXS5yYW5nZS5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgIT0gMSkNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYWZ0ZXJTdGFydCA9IHRoaXMuc3ViRm9sZHNbaV07DQoNCiAgICAgICAgaWYgKGNtcCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIGFmdGVyU3RhcnQuYWRkU3ViRm9sZChmb2xkKQ0KDQogICAgICAgIC8vIGNtcCA9PSAtMQ0KICAgICAgICB2YXIgcm93ID0gZm9sZC5yYW5nZS5lbmQucm93LCBjb2x1bW4gPSBmb2xkLnJhbmdlLmVuZC5jb2x1bW47DQogICAgICAgIGZvciAodmFyIGogPSBpLCBjbXAgPSAtMTsgaiA8IHRoaXMuc3ViRm9sZHMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuc3ViRm9sZHNbal0ucmFuZ2UuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wICE9IDEpDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGFmdGVyRW5kID0gdGhpcy5zdWJGb2xkc1tqXTsNCg0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICB0aHJvdyAiQSBmb2xkIGNhbid0IGludGVyc2VjdCBhbHJlYWR5IGV4aXN0aW5nIGZvbGQiICsgZm9sZC5yYW5nZSArIHRoaXMucmFuZ2U7DQoNCiAgICAgICAgdmFyIGNvbnN1bWVkRm9sZHMgPSB0aGlzLnN1YkZvbGRzLnNwbGljZShpLCBqIC0gaSwgZm9sZCkNCiAgICAgICAgZm9sZC5zZXRGb2xkTGluZSh0aGlzLmZvbGRMaW5lKTsNCg0KICAgICAgICByZXR1cm4gZm9sZDsNCiAgICB9DQoNCn0pLmNhbGwoRm9sZC5wcm90b3R5cGUpOw0KDQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3Rva2VuX2l0ZXJhdG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFRva2VuSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uLCBpbml0aWFsUm93LCBpbml0aWFsQ29sdW1uKSB7DQogICAgdGhpcy4kc2Vzc2lvbiA9IHNlc3Npb247DQogICAgdGhpcy4kcm93ID0gaW5pdGlhbFJvdzsNCiAgICB0aGlzLiRyb3dUb2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhpbml0aWFsUm93LCBpbml0aWFsUm93KVswXS50b2tlbnM7DQoNCiAgICB2YXIgdG9rZW4gPSBzZXNzaW9uLmdldFRva2VuQXQoaW5pdGlhbFJvdywgaW5pdGlhbENvbHVtbik7DQogICAgdGhpcy4kdG9rZW5JbmRleCA9IHRva2VuID8gdG9rZW4uaW5kZXggOiAtMTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLnN0ZXBCYWNrd2FyZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiR0b2tlbkluZGV4IC09IDE7DQogICAgICAgIA0KICAgICAgICB3aGlsZSAodGhpcy4kdG9rZW5JbmRleCA8IDApIHsNCiAgICAgICAgICAgIHRoaXMuJHJvdyAtPSAxOw0KICAgICAgICAgICAgaWYgKHRoaXMuJHJvdyA8IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRyb3cgPSAwOw0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy4kcm93VG9rZW5zID0gdGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93LCB0aGlzLiRyb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgIHRoaXMuJHRva2VuSW5kZXggPSB0aGlzLiRyb3dUb2tlbnMubGVuZ3RoIC0gMTsNCiAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF07DQogICAgfTsNCiAgICANCiAgICB0aGlzLnN0ZXBGb3J3YXJkID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciByb3dDb3VudCA9IHRoaXMuJHNlc3Npb24uZ2V0TGVuZ3RoKCk7DQogICAgICAgIHRoaXMuJHRva2VuSW5kZXggKz0gMTsNCiAgICAgICAgDQogICAgICAgIHdoaWxlICh0aGlzLiR0b2tlbkluZGV4ID49IHRoaXMuJHJvd1Rva2Vucy5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRoaXMuJHJvdyArPSAxOw0KICAgICAgICAgICAgaWYgKHRoaXMuJHJvdyA+PSByb3dDb3VudCkgew0KICAgICAgICAgICAgICAgIHRoaXMuJHJvdyA9IHJvd0NvdW50IC0gMTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy4kcm93VG9rZW5zID0gdGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93LCB0aGlzLiRyb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgIHRoaXMuJHRva2VuSW5kZXggPSAwOw0KICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Q3VycmVudFRva2VuID0gZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRDdXJyZW50VG9rZW5Sb3cgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRyb3c7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgcm93VG9rZW5zID0gdGhpcy4kcm93VG9rZW5zOw0KICAgICAgICB2YXIgdG9rZW5JbmRleCA9IHRoaXMuJHRva2VuSW5kZXg7DQogICAgICAgIA0KICAgICAgICAvLyBJZiBhIGNvbHVtbiB3YXMgY2FjaGVkIGJ5IEVkaXRTZXNzaW9uLmdldFRva2VuQXQsIHRoZW4gdXNlIGl0DQogICAgICAgIHZhciBjb2x1bW4gPSByb3dUb2tlbnNbdG9rZW5JbmRleF0uc3RhcnQ7DQogICAgICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCkNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW47DQogICAgICAgICAgICANCiAgICAgICAgY29sdW1uID0gMDsNCiAgICAgICAgd2hpbGUgKHRva2VuSW5kZXggPiAwKSB7DQogICAgICAgICAgICB0b2tlbkluZGV4IC09IDE7DQogICAgICAgICAgICBjb2x1bW4gKz0gcm93VG9rZW5zW3Rva2VuSW5kZXhdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIGNvbHVtbjsgIA0KICAgIH07DQogICAgICAgICAgICANCn0pLmNhbGwoVG9rZW5JdGVyYXRvci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLlRva2VuSXRlcmF0b3IgPSBUb2tlbkl0ZXJhdG9yOw0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvdG9rZW5faXRlcmF0b3InXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOw0KDQpmdW5jdGlvbiBCcmFja2V0TWF0Y2goKSB7DQoNCiAgICB0aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQgPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICBpZiAocG9zaXRpb24uY29sdW1uID09IDApIHJldHVybiBudWxsOw0KDQogICAgICAgIHZhciBjaGFyQmVmb3JlQ3Vyc29yID0gdGhpcy5nZXRMaW5lKHBvc2l0aW9uLnJvdykuY2hhckF0KHBvc2l0aW9uLmNvbHVtbi0xKTsNCiAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT0gIiIpIHJldHVybiBudWxsOw0KDQogICAgICAgIHZhciBtYXRjaCA9IGNoYXJCZWZvcmVDdXJzb3IubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pOw0KICAgICAgICBpZiAoIW1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGZpbmRDbG9zaW5nQnJhY2tldChtYXRjaFsxXSwgcG9zaXRpb24pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsyXSwgcG9zaXRpb24pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGJyYWNrZXRzID0gew0KICAgICAgICAiKSI6ICIoIiwNCiAgICAgICAgIigiOiAiKSIsDQogICAgICAgICJdIjogIlsiLA0KICAgICAgICAiWyI6ICJdIiwNCiAgICAgICAgInsiOiAifSIsDQogICAgICAgICJ9IjogInsiDQogICAgfTsNCg0KICAgIHRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldCA9IGZ1bmN0aW9uKGJyYWNrZXQsIHBvc2l0aW9uKSB7DQogICAgICAgIHZhciBvcGVuQnJhY2tldCA9IHRoaXMuJGJyYWNrZXRzW2JyYWNrZXRdOw0KICAgICAgICB2YXIgZGVwdGggPSAxOw0KDQogICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHRoaXMsIHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsNCiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7DQogICAgICAgIGlmICghdG9rZW4pIHJldHVybiBudWxsOw0KICAgICAgICANCiAgICAgICAgLy8gdG9rZW4udHlwZSBjb250YWlucyBhIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiB0b2tlbiBpZGVudGlmaWVycw0KICAgICAgICAvLyAoZS5nLjogImNvbnN0YW50Lm51bWVyaWMiIG9yICJwYXJlbi5scGFyZW4iKS4gIENyZWF0ZSBhIHBhdHRlcm4gdGhhdA0KICAgICAgICAvLyBtYXRjaGVzIGFueSB0b2tlbiBjb250YWluaW5nIHRoZSBzYW1lIGlkZW50aWZpZXJzIG9yIGEgc3Vic2V0LiAgSW4NCiAgICAgICAgLy8gYWRkaXRpb24sIGlmIHRva2VuLnR5cGUgaW5jbHVkZXMgInJwYXJlbiIsIHRoZW4gYWxzbyBtYXRjaCAibHBhcmVuIi4NCiAgICAgICAgLy8gU28gaWYgdHlwZS50b2tlbiBpcyAicGFyZW4ucnBhcmVuIiwgdGhlbiB0eXBlUmUgd2lsbCBtYXRjaCAibHBhcmVuLnBhcmVuIi4NCiAgICAgICAgdmFyIHR5cGVSZSA9IG5ldyBSZWdFeHAoIihcXC4/IiArDQogICAgICAgICAgICB0b2tlbi50eXBlLnJlcGxhY2UoIi4iLCAifCIpLnJlcGxhY2UoInJwYXJlbiIsICJscGFyZW58cnBhcmVuIikgKyAiKSsiKTsNCiAgICAgICAgDQogICAgICAgIC8vIFN0YXJ0IHNlYXJjaGluZyBpbiB0b2tlbiwganVzdCBiZWZvcmUgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbi5jb2x1bW4NCiAgICAgICAgdmFyIHZhbHVlSW5kZXggPSBwb3NpdGlvbi5jb2x1bW4gLSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSAtIDI7DQogICAgICAgIHZhciB2YWx1ZSA9IHRva2VuLnZhbHVlOw0KICAgICAgICANCiAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodmFsdWVJbmRleCA+PSAwKSB7DQogICAgICAgICAgICAgICAgdmFyIGNociA9IHZhbHVlLmNoYXJBdCh2YWx1ZUluZGV4KTsNCiAgICAgICAgICAgICAgICBpZiAoY2hyID09IG9wZW5CcmFja2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGRlcHRoIC09IDE7DQogICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3JvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB2YWx1ZUluZGV4ICsgaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNociA9PSBicmFja2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlSW5kZXggLT0gMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gU2NhbiBiYWNrd2FyZCB0aHJvdWdoIHRoZSBkb2N1bWVudCwgbG9va2luZyBmb3IgdGhlIG5leHQgdG9rZW4NCiAgICAgICAgICAgIC8vIHdob3NlIHR5cGUgbWF0Y2hlcyB0eXBlUmUNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpOw0KICAgICAgICAgICAgfSB3aGlsZSAodG9rZW4gJiYgIXR5cGVSZS50ZXN0KHRva2VuLnR5cGUpKTsNCg0KICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgdmFsdWVJbmRleCA9IHZhbHVlLmxlbmd0aCAtIDE7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQgPSBmdW5jdGlvbihicmFja2V0LCBwb3NpdGlvbikgew0KICAgICAgICB2YXIgY2xvc2luZ0JyYWNrZXQgPSB0aGlzLiRicmFja2V0c1ticmFja2V0XTsNCiAgICAgICAgdmFyIGRlcHRoID0gMTsNCg0KICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcih0aGlzLCBwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDsNCg0KICAgICAgICAvLyB0b2tlbi50eXBlIGNvbnRhaW5zIGEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIHRva2VuIGlkZW50aWZpZXJzDQogICAgICAgIC8vIChlLmcuOiAiY29uc3RhbnQubnVtZXJpYyIgb3IgInBhcmVuLmxwYXJlbiIpLiAgQ3JlYXRlIGEgcGF0dGVybiB0aGF0DQogICAgICAgIC8vIG1hdGNoZXMgYW55IHRva2VuIGNvbnRhaW5pbmcgdGhlIHNhbWUgaWRlbnRpZmllcnMgb3IgYSBzdWJzZXQuICBJbg0KICAgICAgICAvLyBhZGRpdGlvbiwgaWYgdG9rZW4udHlwZSBpbmNsdWRlcyAibHBhcmVuIiwgdGhlbiBhbHNvIG1hdGNoICJycGFyZW4iLg0KICAgICAgICAvLyBTbyBpZiB0eXBlLnRva2VuIGlzICJscGFyZW4ucGFyZW4iLCB0aGVuIHR5cGVSZSB3aWxsIG1hdGNoICJwYXJlbi5ycGFyZW4iLg0KICAgICAgICB2YXIgdHlwZVJlID0gbmV3IFJlZ0V4cCgiKFxcLj8iICsNCiAgICAgICAgICAgIHRva2VuLnR5cGUucmVwbGFjZSgiLiIsICJ8IikucmVwbGFjZSgibHBhcmVuIiwgImxwYXJlbnxycGFyZW4iKSArICIpKyIpOw0KDQogICAgICAgIC8vIFN0YXJ0IHNlYXJjaGluZyBpbiB0b2tlbiwgYWZ0ZXIgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbi5jb2x1bW4NCiAgICAgICAgdmFyIHZhbHVlSW5kZXggPSBwb3NpdGlvbi5jb2x1bW4gLSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKTsNCg0KICAgICAgICB3aGlsZSAodHJ1ZSkgew0KDQogICAgICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgIHZhciB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgIHdoaWxlICh2YWx1ZUluZGV4IDwgdmFsdWVMZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hyID0gdmFsdWUuY2hhckF0KHZhbHVlSW5kZXgpOw0KICAgICAgICAgICAgICAgIGlmIChjaHIgPT0gY2xvc2luZ0JyYWNrZXQpIHsNCiAgICAgICAgICAgICAgICAgICAgZGVwdGggLT0gMTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7cm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHZhbHVlSW5kZXggKyBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hyID09IGJyYWNrZXQpIHsNCiAgICAgICAgICAgICAgICAgICAgZGVwdGggKz0gMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFsdWVJbmRleCArPSAxOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBTY2FuIGZvcndhcmQgdGhyb3VnaCB0aGUgZG9jdW1lbnQsIGxvb2tpbmcgZm9yIHRoZSBuZXh0IHRva2VuDQogICAgICAgICAgICAvLyB3aG9zZSB0eXBlIG1hdGNoZXMgdHlwZVJlDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdG9rZW4gPSBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgfSB3aGlsZSAodG9rZW4gJiYgIXR5cGVSZS50ZXN0KHRva2VuLnR5cGUpKTsNCg0KICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIHZhbHVlSW5kZXggPSAwOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KfQ0KZXhwb3J0cy5CcmFja2V0TWF0Y2ggPSBCcmFja2V0TWF0Y2g7DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3NlYXJjaCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGxhbmcgPSByZXF1aXJlKCIuL2xpYi9sYW5nIik7DQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBTZWFyY2ggPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiRvcHRpb25zID0gew0KICAgICAgICBuZWVkbGU6ICIiLA0KICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLA0KICAgICAgICB3cmFwOiBmYWxzZSwNCiAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsDQogICAgICAgIHdob2xlV29yZDogZmFsc2UsDQogICAgICAgIHNjb3BlOiBTZWFyY2guQUxMLA0KICAgICAgICByZWdFeHA6IGZhbHNlDQogICAgfTsNCn07DQoNClNlYXJjaC5BTEwgPSAxOw0KU2VhcmNoLlNFTEVDVElPTiA9IDI7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuc2V0ID0gZnVuY3Rpb24ob3B0aW9ucykgew0KICAgICAgICBvb3AubWl4aW4odGhpcy4kb3B0aW9ucywgb3B0aW9ucyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBsYW5nLmNvcHlPYmplY3QodGhpcy4kb3B0aW9ucyk7DQogICAgfTsNCg0KICAgIHRoaXMuZmluZCA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLm5lZWRsZSkNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgIGlmICh0aGlzLiRvcHRpb25zLmJhY2t3YXJkcykgew0KICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy4kYmFja3dhcmRNYXRjaEl0ZXJhdG9yKHNlc3Npb24pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaXRlcmF0b3IgPSB0aGlzLiRmb3J3YXJkTWF0Y2hJdGVyYXRvcihzZXNzaW9uKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBmaXJzdFJhbmdlID0gbnVsbDsNCiAgICAgICAgaXRlcmF0b3IuZm9yRWFjaChmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAgICAgZmlyc3RSYW5nZSA9IHJhbmdlOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldHVybiBmaXJzdFJhbmdlOw0KICAgIH07DQoNCiAgICB0aGlzLmZpbmRBbGwgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBvcHRpb25zID0gdGhpcy4kb3B0aW9uczsNCiAgICAgICAgaWYgKCFvcHRpb25zLm5lZWRsZSkNCiAgICAgICAgICAgIHJldHVybiBbXTsNCg0KICAgICAgICBpZiAob3B0aW9ucy5iYWNrd2FyZHMpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuJGJhY2t3YXJkTWF0Y2hJdGVyYXRvcihzZXNzaW9uKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGl0ZXJhdG9yID0gdGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3Ioc2Vzc2lvbik7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgaWdub3JlQ3Vyc29yID0gIW9wdGlvbnMuc3RhcnQgJiYgb3B0aW9ucy53cmFwICYmIG9wdGlvbnMuc2NvcGUgPT0gU2VhcmNoLkFMTDsNCiAgICAgICAgaWYgKGlnbm9yZUN1cnNvcikNCiAgICAgICAgICAgIG9wdGlvbnMuc3RhcnQgPSB7cm93OiAwLCBjb2x1bW46IDB9Ow0KDQogICAgICAgIHZhciByYW5nZXMgPSBbXTsNCiAgICAgICAgaXRlcmF0b3IuZm9yRWFjaChmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAoaWdub3JlQ3Vyc29yKQ0KICAgICAgICAgICAgb3B0aW9ucy5zdGFydCA9IG51bGw7DQoNCiAgICAgICAgcmV0dXJuIHJhbmdlczsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24oaW5wdXQsIHJlcGxhY2VtZW50KSB7DQogICAgICAgIHZhciByZSA9IHRoaXMuJGFzc2VtYmxlUmVnRXhwKCk7DQogICAgICAgIHZhciBtYXRjaCA9IHJlLmV4ZWMoaW5wdXQpOw0KICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoID09IGlucHV0Lmxlbmd0aCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuJG9wdGlvbnMucmVnRXhwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHJlcGxhY2VtZW50KTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciByZSA9IHRoaXMuJGFzc2VtYmxlUmVnRXhwKCk7DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICBzZWxmLiRmb3J3YXJkTGluZUl0ZXJhdG9yKHNlc3Npb24pLmZvckVhY2goZnVuY3Rpb24obGluZSwgc3RhcnRJbmRleCwgcm93KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoc3RhcnRJbmRleCk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdOw0KDQogICAgICAgICAgICAgICAgICAgIGxpbmUucmVwbGFjZShyZSwgZnVuY3Rpb24oc3RyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMl07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogc3RyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogc3RhcnRJbmRleCArIG9mZnNldA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bWF0Y2hlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlbGYuJHJhbmdlRnJvbU1hdGNoKHJvdywgbWF0Y2gub2Zmc2V0LCBtYXRjaC5zdHIubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayhyYW5nZSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLiRiYWNrd2FyZE1hdGNoSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciByZSA9IHRoaXMuJGFzc2VtYmxlUmVnRXhwKCk7DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICBzZWxmLiRiYWNrd2FyZExpbmVJdGVyYXRvcihzZXNzaW9uKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRJbmRleCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsNCg0KICAgICAgICAgICAgICAgICAgICBsaW5lLnJlcGxhY2UocmUsIGZ1bmN0aW9uKHN0ciwgb2Zmc2V0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogc3RyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogc3RhcnRJbmRleCArIG9mZnNldA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPW1hdGNoZXMubGVuZ3RoLTE7IGk+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG1hdGNoZXNbaV07DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWxmLiRyYW5nZUZyb21NYXRjaChyb3csIG1hdGNoLm9mZnNldCwgbWF0Y2guc3RyLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2socmFuZ2UpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHRoaXMuJHJhbmdlRnJvbU1hdGNoID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIGxlbmd0aCkgew0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJvdywgY29sdW1uLCByb3csIGNvbHVtbitsZW5ndGgpOw0KICAgIH07DQoNCiAgICB0aGlzLiRhc3NlbWJsZVJlZ0V4cCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy4kb3B0aW9ucy5yZWdFeHApIHsNCiAgICAgICAgICAgIHZhciBuZWVkbGUgPSB0aGlzLiRvcHRpb25zLm5lZWRsZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG5lZWRsZSA9IGxhbmcuZXNjYXBlUmVnRXhwKHRoaXMuJG9wdGlvbnMubmVlZGxlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLiRvcHRpb25zLndob2xlV29yZCkgew0KICAgICAgICAgICAgbmVlZGxlID0gIlxcYiIgKyBuZWVkbGUgKyAiXFxiIjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBtb2RpZmllciA9ICJnIjsNCiAgICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmNhc2VTZW5zaXRpdmUpIHsNCiAgICAgICAgICAgIG1vZGlmaWVyICs9ICJpIjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAobmVlZGxlLCBtb2RpZmllcik7DQogICAgICAgIHJldHVybiByZTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZm9yd2FyZExpbmVJdGVyYXRvciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHNlYXJjaFNlbGVjdGlvbiA9IHRoaXMuJG9wdGlvbnMuc2NvcGUgPT0gU2VhcmNoLlNFTEVDVElPTjsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLiRvcHRpb25zLnJhbmdlIHx8IHNlc3Npb24uZ2V0U2VsZWN0aW9uKCkuZ2V0UmFuZ2UoKTsNCiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy4kb3B0aW9ucy5zdGFydCB8fCByYW5nZVtzZWFyY2hTZWxlY3Rpb24gPyAic3RhcnQiIDogImVuZCJdOw0KDQogICAgICAgIHZhciBmaXJzdFJvdyA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLnN0YXJ0LnJvdyA6IDA7DQogICAgICAgIHZhciBmaXJzdENvbHVtbiA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLnN0YXJ0LmNvbHVtbiA6IDA7DQogICAgICAgIHZhciBsYXN0Um93ID0gc2VhcmNoU2VsZWN0aW9uID8gcmFuZ2UuZW5kLnJvdyA6IHNlc3Npb24uZ2V0TGVuZ3RoKCkgLSAxOw0KDQogICAgICAgIHZhciB3cmFwID0gdGhpcy4kb3B0aW9ucy53cmFwOw0KICAgICAgICB2YXIgaW5XcmFwID0gZmFsc2U7DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZShyb3cpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICBpZiAoc2VhcmNoU2VsZWN0aW9uICYmIHJvdyA9PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGluV3JhcCAmJiByb3cgPT0gc3RhcnQucm93KSB7DQogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbGluZTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihjYWxsYmFjaykgew0KICAgICAgICAgICAgICAgIHZhciByb3cgPSBzdGFydC5yb3c7DQoNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGdldExpbmUocm93KTsNCiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IHN0YXJ0LmNvbHVtbjsNCg0KICAgICAgICAgICAgICAgIHZhciBzdG9wID0gZmFsc2U7DQogICAgICAgICAgICAgICAgaW5XcmFwID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbGxiYWNrKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykpIHsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcm93Kys7DQogICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPiBsYXN0Um93KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JhcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IGZpcnN0Um93Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBmaXJzdENvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldyYXAgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAocm93ID09IHN0YXJ0LnJvdykNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlOw0KDQogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKHJvdyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLiRiYWNrd2FyZExpbmVJdGVyYXRvciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHNlYXJjaFNlbGVjdGlvbiA9IHRoaXMuJG9wdGlvbnMuc2NvcGUgPT0gU2VhcmNoLlNFTEVDVElPTjsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLiRvcHRpb25zLnJhbmdlIHx8IHNlc3Npb24uZ2V0U2VsZWN0aW9uKCkuZ2V0UmFuZ2UoKTsNCiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy4kb3B0aW9ucy5zdGFydCB8fCByYW5nZVtzZWFyY2hTZWxlY3Rpb24gPyAiZW5kIiA6ICJzdGFydCJdOw0KDQogICAgICAgIHZhciBmaXJzdFJvdyA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLnN0YXJ0LnJvdyA6IDA7DQogICAgICAgIHZhciBmaXJzdENvbHVtbiA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLnN0YXJ0LmNvbHVtbiA6IDA7DQogICAgICAgIHZhciBsYXN0Um93ID0gc2VhcmNoU2VsZWN0aW9uID8gcmFuZ2UuZW5kLnJvdyA6IHNlc3Npb24uZ2V0TGVuZ3RoKCkgLSAxOw0KDQogICAgICAgIHZhciB3cmFwID0gdGhpcy4kb3B0aW9ucy53cmFwOw0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBmb3JFYWNoIDogZnVuY3Rpb24oY2FsbGJhY2spIHsNCiAgICAgICAgICAgICAgICB2YXIgcm93ID0gc3RhcnQucm93Ow0KDQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KS5zdWJzdHJpbmcoMCwgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7DQogICAgICAgICAgICAgICAgdmFyIHN0b3AgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB2YXIgaW5XcmFwID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbGxiYWNrKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykpIHsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICByb3ctLTsNCiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JhcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IGxhc3RSb3c7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBzdGFydC5yb3cpDQogICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTsNCg0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gZmlyc3RSb3cpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGZpcnN0Q29sdW1uOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocm93ID09IGxhc3RSb3cpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGluV3JhcCAmJiByb3cgPT0gc3RhcnQucm93KQ0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChTZWFyY2gucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5TZWFyY2ggPSBTZWFyY2g7DQp9KTsNCmRlZmluZSgnYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9rZXlzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIga2V5VXRpbCA9IHJlcXVpcmUoIi4uL2xpYi9rZXlzIik7DQoNCnZhciBDb21tYW5kTWFuYWdlciA9IGZ1bmN0aW9uKHBsYXRmb3JtLCBjb21tYW5kcykgew0KICAgIGlmICh0eXBlb2YgcGxhdGZvcm0gIT09ICJzdHJpbmciKQ0KICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCIncGxhdGZvcm0nIGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyICdtYWMnIG9yICd3aW4nIik7DQoNCiAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07DQogICAgdGhpcy5jb21tYW5kcyA9IHt9Ow0KICAgIHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nID0ge307DQoNCiAgICBpZiAoY29tbWFuZHMpDQogICAgICAgIGNvbW1hbmRzLmZvckVhY2godGhpcy5hZGRDb21tYW5kLCB0aGlzKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuYWRkQ29tbWFuZCA9IGZ1bmN0aW9uKGNvbW1hbmQpIHsNCiAgICAgICAgaWYgKHRoaXMuY29tbWFuZHNbY29tbWFuZC5uYW1lXSkNCiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ29tbWFuZChjb21tYW5kKTsNCg0KICAgICAgICB0aGlzLmNvbW1hbmRzW2NvbW1hbmQubmFtZV0gPSBjb21tYW5kOw0KDQogICAgICAgIGlmIChjb21tYW5kLmJpbmRLZXkpIHsNCiAgICAgICAgICAgIHRoaXMuX2J1aWxkS2V5SGFzaChjb21tYW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZUNvbW1hbmQgPSBmdW5jdGlvbihjb21tYW5kKSB7DQogICAgICAgIHZhciBuYW1lID0gKHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJyA/IGNvbW1hbmQgOiBjb21tYW5kLm5hbWUpOw0KICAgICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1tuYW1lXTsNCiAgICAgICAgZGVsZXRlIHRoaXMuY29tbWFuZHNbbmFtZV07DQoNCiAgICAgICAgLy8gZXhhdXN0aXZlIHNlYXJjaCBpcyBicnV0ZSBmb3JjZSBidXQgc2luY2UgcmVtb3ZlQ29tbWFuZCBpcw0KICAgICAgICAvLyBub3QgYSBwZXJmb3JtYW5jZSBjcml0aWNhbCBvcGVyYXRpb24gdGhpcyBzaG91bGQgYmUgT0sNCiAgICAgICAgdmFyIGNrYiA9IHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nOw0KICAgICAgICBmb3IgKHZhciBoYXNoSWQgaW4gY2tiKSB7DQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY2tiW2hhc2hJZF0pIHsNCiAgICAgICAgICAgICAgICBpZiAoY2tiW2hhc2hJZF1ba2V5XSA9PSBjb21tYW5kKQ0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2tiW2hhc2hJZF1ba2V5XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmFkZENvbW1hbmRzID0gZnVuY3Rpb24oY29tbWFuZHMpIHsNCiAgICAgICAgT2JqZWN0LmtleXMoY29tbWFuZHMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSBjb21tYW5kc1tuYW1lXTsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gInN0cmluZyIpDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmluZEtleShjb21tYW5kLCBuYW1lKTsNCg0KICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSAiZnVuY3Rpb24iKQ0KICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB7IGV4ZWM6IGNvbW1hbmQgfTsNCg0KICAgICAgICAgICAgaWYgKCFjb21tYW5kLm5hbWUpDQogICAgICAgICAgICAgICAgY29tbWFuZC5uYW1lID0gbmFtZTsNCg0KICAgICAgICAgICAgdGhpcy5hZGRDb21tYW5kKGNvbW1hbmQpOw0KICAgICAgICB9LCB0aGlzKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVDb21tYW5kcyA9IGZ1bmN0aW9uKGNvbW1hbmRzKSB7DQogICAgICAgIE9iamVjdC5rZXlzKGNvbW1hbmRzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ29tbWFuZChjb21tYW5kc1tuYW1lXSk7DQogICAgICAgIH0sIHRoaXMpOw0KICAgIH07DQoNCiAgICB0aGlzLmJpbmRLZXkgPSBmdW5jdGlvbihrZXksIGNvbW1hbmQpIHsNCiAgICAgICAgaWYoIWtleSkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgY2tiID0gdGhpcy5jb21tbWFuZEtleUJpbmRpbmc7DQogICAgICAgIGtleS5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oa2V5UGFydCkgew0KICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBwYXJzZUtleXMoa2V5UGFydCwgY29tbWFuZCk7DQogICAgICAgICAgICB2YXIgaGFzaElkID0gYmluZGluZy5oYXNoSWQ7DQogICAgICAgICAgICAoY2tiW2hhc2hJZF0gfHwgKGNrYltoYXNoSWRdID0ge30pKVtiaW5kaW5nLmtleV0gPSBjb21tYW5kOw0KICAgICAgICB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5iaW5kS2V5cyA9IGZ1bmN0aW9uKGtleUxpc3QpIHsNCiAgICAgICAgT2JqZWN0LmtleXMoa2V5TGlzdCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsNCiAgICAgICAgICAgIHRoaXMuYmluZEtleShrZXksIGtleUxpc3Rba2V5XSk7DQogICAgICAgIH0sIHRoaXMpOw0KICAgIH07DQoNCiAgICB0aGlzLl9idWlsZEtleUhhc2ggPSBmdW5jdGlvbihjb21tYW5kKSB7DQogICAgICAgIHZhciBiaW5kaW5nID0gY29tbWFuZC5iaW5kS2V5Ow0KICAgICAgICBpZiAoIWJpbmRpbmcpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGtleSA9IHR5cGVvZiBiaW5kaW5nID09ICJzdHJpbmciID8gYmluZGluZzogYmluZGluZ1t0aGlzLnBsYXRmb3JtXTsNCiAgICAgICAgdGhpcy5iaW5kS2V5KGtleSwgY29tbWFuZCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcGFyc2VLZXlzKGtleXMsIHZhbCwgcmV0KSB7DQogICAgICAgIHZhciBrZXk7DQogICAgICAgIHZhciBoYXNoSWQgPSAwOw0KICAgICAgICB2YXIgcGFydHMgPSBzcGxpdFNhZmUoa2V5cyk7DQoNCiAgICAgICAgZm9yICh2YXIgaT0wLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoa2V5VXRpbC5LRVlfTU9EU1twYXJ0c1tpXV0pDQogICAgICAgICAgICAgICAgaGFzaElkID0gaGFzaElkIHwga2V5VXRpbC5LRVlfTU9EU1twYXJ0c1tpXV07DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAga2V5ID0gcGFydHNbaV0gfHwgIi0iOyAvL3doZW4gZW1wdHksIHRoZSBzcGxpdFNhZmUgcmVtb3ZlZCBhICctJw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGtleToga2V5LA0KICAgICAgICAgICAgaGFzaElkOiBoYXNoSWQNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNwbGl0U2FmZShzLCBzZXBhcmF0b3IpIHsNCiAgICAgICAgcmV0dXJuIChzLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgIC50cmltKCkNCiAgICAgICAgICAgIC5zcGxpdChuZXcgUmVnRXhwKCJbXFxzIF0qXFwtW1xccyBdKiIsICJnIiksIDk5OSkpOw0KICAgIH0NCg0KICAgIHRoaXMuZmluZEtleUNvbW1hbmQgPSBmdW5jdGlvbiBmaW5kS2V5Q29tbWFuZChoYXNoSWQsIHRleHRPcktleSkgew0KICAgICAgICAvLyBDb252ZXJ0IGtleUNvZGUgdG8gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3JLZXkgPT0gIm51bWJlciIpIHsNCiAgICAgICAgICAgIHRleHRPcktleSA9IGtleVV0aWwua2V5Q29kZVRvU3RyaW5nKHRleHRPcktleSk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgY2ticiA9IHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nOw0KICAgICAgICByZXR1cm4gY2ticltoYXNoSWRdICYmIGNrYnJbaGFzaElkXVt0ZXh0T3JLZXkudG9Mb3dlckNhc2UoKV07DQogICAgfQ0KDQogICAgdGhpcy5leGVjID0gZnVuY3Rpb24oY29tbWFuZCwgZWRpdG9yLCBhcmdzKSB7DQogICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpDQogICAgICAgICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1tjb21tYW5kXTsNCg0KICAgICAgICBpZiAoIWNvbW1hbmQpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgaWYgKGVkaXRvciAmJiBlZGl0b3IuJHJlYWRPbmx5ICYmICFjb21tYW5kLnJlYWRPbmx5KQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIGNvbW1hbmQuZXhlYyhlZGl0b3IsIGFyZ3MgfHwge30pOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9Ow0KDQogICAgdGhpcy50b2dnbGVSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuJGluUmVwbGF5KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmcpIHsNCiAgICAgICAgICAgIHRoaXMubWFjcm8ucG9wKCk7DQogICAgICAgICAgICB0aGlzLmV4ZWMgPSB0aGlzLm5vcm1hbF9leGVjOw0KDQogICAgICAgICAgICBpZiAoIXRoaXMubWFjcm8ubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIHRoaXMubWFjcm8gPSB0aGlzLm9sZE1hY3JvOw0KDQogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRpbmcgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLm9sZE1hY3JvID0gdGhpcy5tYWNybzsNCiAgICAgICAgdGhpcy5tYWNybyA9IFtdOw0KICAgICAgICB0aGlzLm5vcm1hbF9leGVjID0gdGhpcy5leGVjOw0KICAgICAgICB0aGlzLmV4ZWMgPSBmdW5jdGlvbihjb21tYW5kLCBlZGl0b3IsIGFyZ3MpIHsNCiAgICAgICAgICAgIHRoaXMubWFjcm8ucHVzaChbY29tbWFuZCwgYXJnc10pOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsX2V4ZWMoY29tbWFuZCwgZWRpdG9yLCBhcmdzKTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkaW5nID0gdHJ1ZTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXBsYXkgPSBmdW5jdGlvbihlZGl0b3IpIHsNCiAgICAgICAgaWYgKHRoaXMuJGluUmVwbGF5IHx8ICF0aGlzLm1hY3JvKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIGlmICh0aGlzLnJlY29yZGluZykNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvZ2dsZVJlY29yZGluZygpOw0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICB0aGlzLiRpblJlcGxheSA9IHRydWU7DQogICAgICAgICAgICB0aGlzLm1hY3JvLmZvckVhY2goZnVuY3Rpb24oeCkgew0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgeCA9PSAic3RyaW5nIikNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjKHgsIGVkaXRvcik7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWMoeFswXSwgZWRpdG9yLCB4WzFdKTsNCiAgICAgICAgICAgIH0sIHRoaXMpDQogICAgICAgIH0gZmluYWxseSB7DQogICAgICAgICAgICB0aGlzLiRpblJlcGxheSA9IGZhbHNlOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMudHJpbU1hY3JvID0gZnVuY3Rpb24obSkgew0KICAgICAgICByZXR1cm4gbS5tYXAoZnVuY3Rpb24oeCl7DQogICAgICAgICAgICBpZiAodHlwZW9mIHhbMF0gIT0gInN0cmluZyIpDQogICAgICAgICAgICAgICAgeFswXSA9IHhbMF0ubmFtZTsNCiAgICAgICAgICAgIGlmICgheFsxXSkNCiAgICAgICAgICAgICAgICB4ID0geFswXTsNCiAgICAgICAgICAgIHJldHVybiB4DQogICAgICAgIH0pDQogICAgfQ0KDQp9KS5jYWxsKENvbW1hbmRNYW5hZ2VyLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuQ29tbWFuZE1hbmFnZXIgPSBDb21tYW5kTWFuYWdlcjsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvdW5kb21hbmFnZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgVW5kb01hbmFnZXIgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnJlc2V0KCk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmV4ZWN1dGUgPSBmdW5jdGlvbihvcHRpb25zKSB7DQogICAgICAgIHZhciBkZWx0YXMgPSBvcHRpb25zLmFyZ3NbMF07DQogICAgICAgIHRoaXMuJGRvYyAgPSBvcHRpb25zLmFyZ3NbMV07DQogICAgICAgIHRoaXMuJHVuZG9TdGFjay5wdXNoKGRlbHRhcyk7DQogICAgICAgIHRoaXMuJHJlZG9TdGFjayA9IFtdOw0KICAgIH07DQoNCiAgICB0aGlzLnVuZG8gPSBmdW5jdGlvbihkb250U2VsZWN0KSB7DQogICAgICAgIHZhciBkZWx0YXMgPSB0aGlzLiR1bmRvU3RhY2sucG9wKCk7DQogICAgICAgIHZhciB1bmRvU2VsZWN0aW9uUmFuZ2UgPSBudWxsOw0KICAgICAgICBpZiAoZGVsdGFzKSB7DQogICAgICAgICAgICB1bmRvU2VsZWN0aW9uUmFuZ2UgPQ0KICAgICAgICAgICAgICAgIHRoaXMuJGRvYy51bmRvQ2hhbmdlcyhkZWx0YXMsIGRvbnRTZWxlY3QpOw0KICAgICAgICAgICAgdGhpcy4kcmVkb1N0YWNrLnB1c2goZGVsdGFzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdW5kb1NlbGVjdGlvblJhbmdlOw0KICAgIH07DQoNCiAgICB0aGlzLnJlZG8gPSBmdW5jdGlvbihkb250U2VsZWN0KSB7DQogICAgICAgIHZhciBkZWx0YXMgPSB0aGlzLiRyZWRvU3RhY2sucG9wKCk7DQogICAgICAgIHZhciByZWRvU2VsZWN0aW9uUmFuZ2UgPSBudWxsOw0KICAgICAgICBpZiAoZGVsdGFzKSB7DQogICAgICAgICAgICByZWRvU2VsZWN0aW9uUmFuZ2UgPQ0KICAgICAgICAgICAgICAgIHRoaXMuJGRvYy5yZWRvQ2hhbmdlcyhkZWx0YXMsIGRvbnRTZWxlY3QpOw0KICAgICAgICAgICAgdGhpcy4kdW5kb1N0YWNrLnB1c2goZGVsdGFzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVkb1NlbGVjdGlvblJhbmdlOw0KICAgIH07DQoNCiAgICB0aGlzLnJlc2V0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJHVuZG9TdGFjayA9IFtdOw0KICAgICAgICB0aGlzLiRyZWRvU3RhY2sgPSBbXTsNCiAgICB9Ow0KDQogICAgdGhpcy5oYXNVbmRvID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiR1bmRvU3RhY2subGVuZ3RoID4gMDsNCiAgICB9Ow0KDQogICAgdGhpcy5oYXNSZWRvID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRyZWRvU3RhY2subGVuZ3RoID4gMDsNCiAgICB9Ow0KDQp9KS5jYWxsKFVuZG9NYW5hZ2VyLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuVW5kb01hbmFnZXIgPSBVbmRvTWFuYWdlcjsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuQGFqYXgub3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS92aXJ0dWFsX3JlbmRlcmVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2RvbScsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9saWIvdXNlcmFnZW50JywgJ2FjZS9sYXllci9ndXR0ZXInLCAnYWNlL2xheWVyL21hcmtlcicsICdhY2UvbGF5ZXIvdGV4dCcsICdhY2UvbGF5ZXIvY3Vyc29yJywgJ2FjZS9zY3JvbGxiYXInLCAnYWNlL3JlbmRlcmxvb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgJ3RleHQhYWNlL2Nzcy9lZGl0b3IuY3NzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgZG9tID0gcmVxdWlyZSgiLi9saWIvZG9tIik7DQp2YXIgZXZlbnQgPSByZXF1aXJlKCIuL2xpYi9ldmVudCIpOw0KdmFyIHVzZXJhZ2VudCA9IHJlcXVpcmUoIi4vbGliL3VzZXJhZ2VudCIpOw0KdmFyIEd1dHRlckxheWVyID0gcmVxdWlyZSgiLi9sYXllci9ndXR0ZXIiKS5HdXR0ZXI7DQp2YXIgTWFya2VyTGF5ZXIgPSByZXF1aXJlKCIuL2xheWVyL21hcmtlciIpLk1hcmtlcjsNCnZhciBUZXh0TGF5ZXIgPSByZXF1aXJlKCIuL2xheWVyL3RleHQiKS5UZXh0Ow0KdmFyIEN1cnNvckxheWVyID0gcmVxdWlyZSgiLi9sYXllci9jdXJzb3IiKS5DdXJzb3I7DQp2YXIgU2Nyb2xsQmFyID0gcmVxdWlyZSgiLi9zY3JvbGxiYXIiKS5TY3JvbGxCYXI7DQp2YXIgUmVuZGVyTG9vcCA9IHJlcXVpcmUoIi4vcmVuZGVybG9vcCIpLlJlbmRlckxvb3A7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCnZhciBlZGl0b3JDc3MgPSByZXF1aXJlKCJ0ZXh0IS4vY3NzL2VkaXRvci5jc3MiKTsNCg0KZG9tLmltcG9ydENzc1N0cmluZyhlZGl0b3JDc3MsICJhY2VfZWRpdG9yIik7DQoNCnZhciBWaXJ0dWFsUmVuZGVyZXIgPSBmdW5jdGlvbihjb250YWluZXIsIHRoZW1lKSB7DQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICANCiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsNCg0KICAgIC8vIFRPRE86IHRoaXMgYnJlYWtzIHJlbmRlcmluZyBpbiBDbG91ZDkgd2l0aCBtdWx0aXBsZSBhY2UgaW5zdGFuY2VzDQovLyAgICAvLyBJbXBvcnRzIENTUyBvbmNlIHBlciBET00gZG9jdW1lbnQgKCdhY2VfZWRpdG9yJyBzZXJ2ZXMgYXMgYW4gaWRlbnRpZmllcikuDQovLyAgICBkb20uaW1wb3J0Q3NzU3RyaW5nKGVkaXRvckNzcywgImFjZV9lZGl0b3IiLCBjb250YWluZXIub3duZXJEb2N1bWVudCk7DQogICAgDQogICAgZG9tLmFkZENzc0NsYXNzKGNvbnRhaW5lciwgImFjZV9lZGl0b3IiKTsNCg0KICAgIHRoaXMuc2V0VGhlbWUodGhlbWUpOw0KDQogICAgdGhpcy4kZ3V0dGVyID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuJGd1dHRlci5jbGFzc05hbWUgPSAiYWNlX2d1dHRlciI7DQogICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy4kZ3V0dGVyKTsNCg0KICAgIHRoaXMuc2Nyb2xsZXIgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdGhpcy5zY3JvbGxlci5jbGFzc05hbWUgPSAiYWNlX3Njcm9sbGVyIjsNCiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbGVyKTsNCg0KICAgIHRoaXMuY29udGVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmNvbnRlbnQuY2xhc3NOYW1lID0gImFjZV9jb250ZW50IjsNCiAgICB0aGlzLnNjcm9sbGVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudCk7DQoNCiAgICB0aGlzLiRndXR0ZXJMYXllciA9IG5ldyBHdXR0ZXJMYXllcih0aGlzLiRndXR0ZXIpOw0KICAgIHRoaXMuJGd1dHRlckxheWVyLm9uKCJjaGFuZ2VHdXR0ZXJXaWR0aCIsIHRoaXMub25SZXNpemUuYmluZCh0aGlzLCB0cnVlKSk7ICAgIA0KICAgIA0KICAgIHRoaXMuJG1hcmtlckJhY2sgPSBuZXcgTWFya2VyTGF5ZXIodGhpcy5jb250ZW50KTsNCg0KICAgIHZhciB0ZXh0TGF5ZXIgPSB0aGlzLiR0ZXh0TGF5ZXIgPSBuZXcgVGV4dExheWVyKHRoaXMuY29udGVudCk7DQogICAgdGhpcy5jYW52YXMgPSB0ZXh0TGF5ZXIuZWxlbWVudDsNCg0KICAgIHRoaXMuJG1hcmtlckZyb250ID0gbmV3IE1hcmtlckxheWVyKHRoaXMuY29udGVudCk7DQoNCiAgICB0aGlzLmNoYXJhY3RlcldpZHRoID0gdGV4dExheWVyLmdldENoYXJhY3RlcldpZHRoKCk7DQogICAgdGhpcy5saW5lSGVpZ2h0ID0gdGV4dExheWVyLmdldExpbmVIZWlnaHQoKTsNCg0KICAgIHRoaXMuJGN1cnNvckxheWVyID0gbmV3IEN1cnNvckxheWVyKHRoaXMuY29udGVudCk7DQogICAgdGhpcy4kY3Vyc29yUGFkZGluZyA9IDg7DQoNCiAgICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaXMgdmlzaWJsZQ0KICAgIHRoaXMuJGhvcml6U2Nyb2xsID0gdHJ1ZTsNCiAgICB0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUgPSB0cnVlOw0KDQogICAgdGhpcy5zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFyKGNvbnRhaW5lcik7DQogICAgdGhpcy5zY3JvbGxCYXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICBfc2VsZi5zZXNzaW9uLnNldFNjcm9sbFRvcChlLmRhdGEpOw0KICAgIH0pOw0KDQogICAgdGhpcy5zY3JvbGxUb3AgPSAwOw0KICAgIHRoaXMuc2Nyb2xsTGVmdCA9IDA7DQogICAgDQogICAgZXZlbnQuYWRkTGlzdGVuZXIodGhpcy5zY3JvbGxlciwgInNjcm9sbCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IF9zZWxmLnNjcm9sbGVyLnNjcm9sbExlZnQ7DQogICAgICAgIF9zZWxmLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0Ow0KICAgICAgICBfc2VsZi5zZXNzaW9uLnNldFNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7DQogICAgfSk7DQoNCiAgICB0aGlzLmN1cnNvclBvcyA9IHsNCiAgICAgICAgcm93IDogMCwNCiAgICAgICAgY29sdW1uIDogMA0KICAgIH07DQoNCiAgICB0aGlzLiR0ZXh0TGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBfc2VsZi5jaGFyYWN0ZXJXaWR0aCA9IHRleHRMYXllci5nZXRDaGFyYWN0ZXJXaWR0aCgpOw0KICAgICAgICBfc2VsZi5saW5lSGVpZ2h0ID0gdGV4dExheWVyLmdldExpbmVIZWlnaHQoKTsNCiAgICAgICAgX3NlbGYuJHVwZGF0ZVByaW50TWFyZ2luKCk7DQogICAgICAgIF9zZWxmLm9uUmVzaXplKHRydWUpOw0KDQogICAgICAgIF9zZWxmLiRsb29wLnNjaGVkdWxlKF9zZWxmLkNIQU5HRV9GVUxMKTsNCiAgICB9KTsNCg0KICAgIHRoaXMuJHNpemUgPSB7DQogICAgICAgIHdpZHRoOiAwLA0KICAgICAgICBoZWlnaHQ6IDAsDQogICAgICAgIHNjcm9sbGVySGVpZ2h0OiAwLA0KICAgICAgICBzY3JvbGxlcldpZHRoOiAwDQogICAgfTsNCg0KICAgIHRoaXMubGF5ZXJDb25maWcgPSB7DQogICAgICAgIHdpZHRoIDogMSwNCiAgICAgICAgcGFkZGluZyA6IDAsDQogICAgICAgIGZpcnN0Um93IDogMCwNCiAgICAgICAgZmlyc3RSb3dTY3JlZW46IDAsDQogICAgICAgIGxhc3RSb3cgOiAwLA0KICAgICAgICBsaW5lSGVpZ2h0IDogMSwNCiAgICAgICAgY2hhcmFjdGVyV2lkdGggOiAxLA0KICAgICAgICBtaW5IZWlnaHQgOiAxLA0KICAgICAgICBtYXhIZWlnaHQgOiAxLA0KICAgICAgICBvZmZzZXQgOiAwLA0KICAgICAgICBoZWlnaHQgOiAxDQogICAgfTsNCg0KICAgIHRoaXMuJGxvb3AgPSBuZXcgUmVuZGVyTG9vcCgNCiAgICAgICAgdGhpcy4kcmVuZGVyQ2hhbmdlcy5iaW5kKHRoaXMpLA0KICAgICAgICB0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3DQogICAgKTsNCiAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpOw0KDQogICAgdGhpcy5zZXRQYWRkaW5nKDQpOw0KICAgIHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zaG93R3V0dGVyID0gdHJ1ZTsNCg0KICAgIHRoaXMuQ0hBTkdFX0NVUlNPUiA9IDE7DQogICAgdGhpcy5DSEFOR0VfTUFSS0VSID0gMjsNCiAgICB0aGlzLkNIQU5HRV9HVVRURVIgPSA0Ow0KICAgIHRoaXMuQ0hBTkdFX1NDUk9MTCA9IDg7DQogICAgdGhpcy5DSEFOR0VfTElORVMgPSAxNjsNCiAgICB0aGlzLkNIQU5HRV9URVhUID0gMzI7DQogICAgdGhpcy5DSEFOR0VfU0laRSA9IDY0Ow0KICAgIHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLID0gMTI4Ow0KICAgIHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCA9IDI1NjsNCiAgICB0aGlzLkNIQU5HRV9GVUxMID0gNTEyOw0KICAgIHRoaXMuQ0hBTkdFX0hfU0NST0xMID0gMTAyNDsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0U2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsNCiAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIuc2V0U2Vzc2lvbihzZXNzaW9uKTsNCiAgICAgICAgdGhpcy4kbWFya2VyQmFjay5zZXRTZXNzaW9uKHNlc3Npb24pOw0KICAgICAgICB0aGlzLiRtYXJrZXJGcm9udC5zZXRTZXNzaW9uKHNlc3Npb24pOw0KICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5zZXRTZXNzaW9uKHNlc3Npb24pOw0KICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIuc2V0U2Vzc2lvbihzZXNzaW9uKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogVHJpZ2dlcnMgcGFydGlhbCB1cGRhdGUgb2YgdGhlIHRleHQgbGF5ZXINCiAgICAgKi8NCiAgICB0aGlzLnVwZGF0ZUxpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKGxhc3RSb3cgPT09IHVuZGVmaW5lZCkNCiAgICAgICAgICAgIGxhc3RSb3cgPSBJbmZpbml0eTsNCg0KICAgICAgICBpZiAoIXRoaXMuJGNoYW5nZWRMaW5lcykgew0KICAgICAgICAgICAgdGhpcy4kY2hhbmdlZExpbmVzID0gew0KICAgICAgICAgICAgICAgIGZpcnN0Um93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBsYXN0Um93OiBsYXN0Um93DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgaWYgKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdyA+IGZpcnN0Um93KQ0KICAgICAgICAgICAgICAgIHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdyA9IGZpcnN0Um93Ow0KDQogICAgICAgICAgICBpZiAodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3cgPCBsYXN0Um93KQ0KICAgICAgICAgICAgICAgIHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93ID0gbGFzdFJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTElORVMpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBUcmlnZ2VycyBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCBsYXllcg0KICAgICAqLw0KICAgIHRoaXMudXBkYXRlVGV4dCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBUcmlnZ2VycyBhIGZ1bGwgdXBkYXRlIG9mIGFsbCBsYXllcnMNCiAgICAgKi8NCiAgICB0aGlzLnVwZGF0ZUZ1bGwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTsNCiAgICB9Ow0KDQogICAgdGhpcy51cGRhdGVGb250U2l6ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBUcmlnZ2VycyByZXNpemUgb2YgdGhlIGVkaXRvcg0KICAgICAqLw0KICAgIHRoaXMub25SZXNpemUgPSBmdW5jdGlvbihmb3JjZSkgew0KICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuQ0hBTkdFX1NJWkU7DQogICAgICAgIHZhciBzaXplID0gdGhpcy4kc2l6ZTsNCg0KICAgICAgICB2YXIgaGVpZ2h0ID0gZG9tLmdldElubmVySGVpZ2h0KHRoaXMuY29udGFpbmVyKTsNCiAgICAgICAgaWYgKGZvcmNlIHx8IHNpemUuaGVpZ2h0ICE9IGhlaWdodCkgew0KICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSBoZWlnaHQ7DQoNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgInB4IjsNCiAgICAgICAgICAgIHNpemUuc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLnNjcm9sbGVyLmNsaWVudEhlaWdodDsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQmFyLnNldEhlaWdodChzaXplLnNjcm9sbGVySGVpZ2h0KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbikgew0KICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5nZXRTY3JvbGxUb3AoKSk7DQogICAgICAgICAgICAgICAgY2hhbmdlcyA9IGNoYW5nZXMgfCB0aGlzLkNIQU5HRV9GVUxMOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHdpZHRoID0gZG9tLmdldElubmVyV2lkdGgodGhpcy5jb250YWluZXIpOw0KICAgICAgICBpZiAoZm9yY2UgfHwgc2l6ZS53aWR0aCAhPSB3aWR0aCkgew0KICAgICAgICAgICAgc2l6ZS53aWR0aCA9IHdpZHRoOw0KDQogICAgICAgICAgICB2YXIgZ3V0dGVyV2lkdGggPSB0aGlzLnNob3dHdXR0ZXIgPyB0aGlzLiRndXR0ZXIub2Zmc2V0V2lkdGggOiAwOw0KICAgICAgICAgICAgdGhpcy5zY3JvbGxlci5zdHlsZS5sZWZ0ID0gZ3V0dGVyV2lkdGggKyAicHgiOw0KICAgICAgICAgICAgc2l6ZS5zY3JvbGxlcldpZHRoID0gTWF0aC5tYXgoMCwgd2lkdGggLSBndXR0ZXJXaWR0aCAtIHRoaXMuc2Nyb2xsQmFyLmdldFdpZHRoKCkpOw0KICAgICAgICAgICAgdGhpcy5zY3JvbGxlci5zdHlsZS53aWR0aCA9IHNpemUuc2Nyb2xsZXJXaWR0aCArICJweCI7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSAmJiB0aGlzLmFkanVzdFdyYXBMaW1pdCgpIHx8IGZvcmNlKQ0KICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzIHwgdGhpcy5DSEFOR0VfRlVMTDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUoY2hhbmdlcyk7DQogICAgfTsNCg0KICAgIHRoaXMuYWRqdXN0V3JhcExpbWl0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBhdmFpbGFibGVXaWR0aCA9IHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCAtIHRoaXMuJHBhZGRpbmcgKiAyOw0KICAgICAgICB2YXIgbGltaXQgPSBNYXRoLmZsb29yKGF2YWlsYWJsZVdpZHRoIC8gdGhpcy5jaGFyYWN0ZXJXaWR0aCk7DQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uYWRqdXN0V3JhcExpbWl0KGxpbWl0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTaG93SW52aXNpYmxlcyA9IGZ1bmN0aW9uKHNob3dJbnZpc2libGVzKSB7DQogICAgICAgIGlmICh0aGlzLiR0ZXh0TGF5ZXIuc2V0U2hvd0ludmlzaWJsZXMoc2hvd0ludmlzaWJsZXMpKQ0KICAgICAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTaG93SW52aXNpYmxlcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdGV4dExheWVyLnNob3dJbnZpc2libGVzOw0KICAgIH07DQoNCiAgICB0aGlzLiRzaG93UHJpbnRNYXJnaW4gPSB0cnVlOw0KICAgIHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luID0gZnVuY3Rpb24oc2hvd1ByaW50TWFyZ2luKSB7DQogICAgICAgIHRoaXMuJHNob3dQcmludE1hcmdpbiA9IHNob3dQcmludE1hcmdpbjsNCiAgICAgICAgdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTaG93UHJpbnRNYXJnaW4gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHNob3dQcmludE1hcmdpbjsNCiAgICB9Ow0KDQogICAgdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW4gPSA4MDsNCiAgICB0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uID0gZnVuY3Rpb24oc2hvd1ByaW50TWFyZ2luKSB7DQogICAgICAgIHRoaXMuJHByaW50TWFyZ2luQ29sdW1uID0gc2hvd1ByaW50TWFyZ2luOw0KICAgICAgICB0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRwcmludE1hcmdpbkNvbHVtbjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTaG93R3V0dGVyID0gZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0d1dHRlcjsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRTaG93R3V0dGVyID0gZnVuY3Rpb24oc2hvdyl7DQogICAgICAgIGlmKHRoaXMuc2hvd0d1dHRlciA9PT0gc2hvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgdGhpcy4kZ3V0dGVyLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gImJsb2NrIiA6ICJub25lIjsNCiAgICAgICAgdGhpcy5zaG93R3V0dGVyID0gc2hvdzsNCiAgICAgICAgdGhpcy5vblJlc2l6ZSh0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIGNvbnRhaW5lckVsOw0KDQogICAgICAgIGlmICghdGhpcy4kc2hvd1ByaW50TWFyZ2luICYmICF0aGlzLiRwcmludE1hcmdpbkVsKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIGlmICghdGhpcy4kcHJpbnRNYXJnaW5FbCkgew0KICAgICAgICAgICAgY29udGFpbmVyRWwgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICBjb250YWluZXJFbC5jbGFzc05hbWUgPSAiYWNlX3ByaW50X21hcmdpbl9sYXllciI7DQogICAgICAgICAgICB0aGlzLiRwcmludE1hcmdpbkVsID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgdGhpcy4kcHJpbnRNYXJnaW5FbC5jbGFzc05hbWUgPSAiYWNlX3ByaW50X21hcmdpbiI7DQogICAgICAgICAgICBjb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLiRwcmludE1hcmdpbkVsKTsNCiAgICAgICAgICAgIHRoaXMuY29udGVudC5pbnNlcnRCZWZvcmUoY29udGFpbmVyRWwsIHRoaXMuJHRleHRMYXllci5lbGVtZW50KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBzdHlsZSA9IHRoaXMuJHByaW50TWFyZ2luRWwuc3R5bGU7DQogICAgICAgIHN0eWxlLmxlZnQgPSAoKHRoaXMuY2hhcmFjdGVyV2lkdGggKiB0aGlzLiRwcmludE1hcmdpbkNvbHVtbikgKyB0aGlzLiRwYWRkaW5nKSArICJweCI7DQogICAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSB0aGlzLiRzaG93UHJpbnRNYXJnaW4gPyAidmlzaWJsZSIgOiAiaGlkZGVuIjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRDb250YWluZXJFbGVtZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRNb3VzZUV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGV4dEFyZWFDb250YWluZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOw0KICAgIH07DQoNCiAgICB0aGlzLm1vdmVUZXh0QXJlYVRvQ3Vyc29yID0gZnVuY3Rpb24odGV4dGFyZWEpIHsNCiAgICAgICAgLy8gaW4gSUUgdGhlIG5hdGl2ZSBjdXJzb3IgYWx3YXlzIHNoaW5lcyB0aHJvdWdoDQogICAgICAgIC8vIHRoaXMgcGVyc2lzdHMgaW4gSUU5DQogICAgICAgIGlmICh1c2VyYWdlbnQuaXNJRSkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgDQogICAgICAgIGlmICh0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3cgPT09IDApDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHBvcyA9IHRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oKTsNCiAgICAgICAgaWYgKCFwb3MpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuY29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMubGF5ZXJDb25maWcub2Zmc2V0Ow0KDQogICAgICAgIHRleHRhcmVhLnN0eWxlLmxlZnQgPSAoYm91bmRzLmxlZnQgKyBwb3MubGVmdCkgKyAicHgiOw0KICAgICAgICB0ZXh0YXJlYS5zdHlsZS50b3AgPSAoYm91bmRzLnRvcCArIHBvcy50b3AgLSB0aGlzLnNjcm9sbFRvcCArIG9mZnNldCkgKyAicHgiOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEZpcnN0VmlzaWJsZVJvdyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdzsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdyArICh0aGlzLmxheWVyQ29uZmlnLm9mZnNldCA9PT0gMCA/IDAgOiAxKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMYXN0RnVsbHlWaXNpYmxlUm93ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBmbGludCA9IE1hdGguZmxvb3IoKHRoaXMubGF5ZXJDb25maWcuaGVpZ2h0ICsgdGhpcy5sYXllckNvbmZpZy5vZmZzZXQpIC8gdGhpcy5sYXllckNvbmZpZy5saW5lSGVpZ2h0KTsNCiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cgLSAxICsgZmxpbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGFzdFZpc2libGVSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJDb25maWcubGFzdFJvdzsNCiAgICB9Ow0KDQogICAgdGhpcy4kcGFkZGluZyA9IG51bGw7DQogICAgdGhpcy5zZXRQYWRkaW5nID0gZnVuY3Rpb24ocGFkZGluZykgew0KICAgICAgICB0aGlzLiRwYWRkaW5nID0gcGFkZGluZzsNCiAgICAgICAgdGhpcy4kdGV4dExheWVyLnNldFBhZGRpbmcocGFkZGluZyk7DQogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnNldFBhZGRpbmcocGFkZGluZyk7DQogICAgICAgIHRoaXMuJG1hcmtlckZyb250LnNldFBhZGRpbmcocGFkZGluZyk7DQogICAgICAgIHRoaXMuJG1hcmtlckJhY2suc2V0UGFkZGluZyhwYWRkaW5nKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTsNCiAgICAgICAgdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlID0gZnVuY3Rpb24oYWx3YXlzVmlzaWJsZSkgew0KICAgICAgICBpZiAodGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlICE9IGFsd2F5c1Zpc2libGUpIHsNCiAgICAgICAgICAgIHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZSA9IGFsd2F5c1Zpc2libGU7DQogICAgICAgICAgICBpZiAoIXRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZSB8fCAhdGhpcy4kaG9yaXpTY3JvbGwpDQogICAgICAgICAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJHVwZGF0ZVNjcm9sbEJhciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnNjcm9sbEJhci5zZXRJbm5lckhlaWdodCh0aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodCk7DQogICAgICAgIHRoaXMuc2Nyb2xsQmFyLnNldFNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCk7DQogICAgfTsNCg0KICAgIHRoaXMuJHJlbmRlckNoYW5nZXMgPSBmdW5jdGlvbihjaGFuZ2VzKSB7DQogICAgICAgIGlmICghY2hhbmdlcyB8fCAhdGhpcy5zZXNzaW9uIHx8ICF0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAvLyB0ZXh0LCBzY3JvbGxpbmcgYW5kIHJlc2l6ZSBjaGFuZ2VzIGNhbiBjYXVzZSB0aGUgdmlldyBwb3J0IHNpemUgdG8gY2hhbmdlDQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfRlVMTCB8fA0KICAgICAgICAgICAgY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX1NJWkUgfHwNCiAgICAgICAgICAgIGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9URVhUIHx8DQogICAgICAgICAgICBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfTElORVMgfHwNCiAgICAgICAgICAgIGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9TQ1JPTEwNCiAgICAgICAgKQ0KICAgICAgICAgICAgdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCk7DQoNCiAgICAgICAgLy8gaG9yaXpvbnRhbCBzY3JvbGxpbmcNCiAgICAgICAgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9IX1NDUk9MTCkgew0KICAgICAgICAgICAgdGhpcy5zY3JvbGxlci5zY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxMZWZ0Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLyByZWFkIHRoZSB2YWx1ZSBhZnRlciB3cml0aW5nIGl0IHNpbmNlIHRoZSB2YWx1ZSBtaWdodCBnZXQgY2xpcHBlZA0KICAgICAgICAgICAgdmFyIHNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbGVyLnNjcm9sbExlZnQ7DQogICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0Ow0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIGZ1bGwNCiAgICAgICAgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9GVUxMKSB7DQogICAgICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpOw0KICAgICAgICAgICAgLy8gdXBkYXRlIHNjcm9sbGJhciBmaXJzdCB0byBub3QgbG9zZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBndXR0ZXIgY2FsbHMgcmVzaXplDQogICAgICAgICAgICB0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKTsNCiAgICAgICAgICAgIHRoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICBpZiAodGhpcy5zaG93R3V0dGVyKQ0KICAgICAgICAgICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gc2Nyb2xsaW5nDQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfU0NST0xMKSB7DQogICAgICAgICAgICB0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKTsNCiAgICAgICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfVEVYVCB8fCBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfTElORVMpDQogICAgICAgICAgICAgICAgdGhpcy4kdGV4dExheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIuc2Nyb2xsTGluZXModGhpcy5sYXllckNvbmZpZyk7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpDQogICAgICAgICAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgdGhpcy4kbWFya2VyQmFjay51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICB0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICB0aGlzLiRjdXJzb3JMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX1RFWFQpIHsNCiAgICAgICAgICAgIHRoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQogICAgICAgICAgICBpZiAodGhpcy5zaG93R3V0dGVyKQ0KICAgICAgICAgICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfTElORVMpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLiR1cGRhdGVMaW5lcygpKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0d1dHRlcikNCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9HVVRURVIpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpDQogICAgICAgICAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9DVVJTT1IpDQogICAgICAgICAgICB0aGlzLiRjdXJzb3JMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7DQoNCiAgICAgICAgaWYgKGNoYW5nZXMgJiAodGhpcy5DSEFOR0VfTUFSS0VSIHwgdGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKSkgew0KICAgICAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGNoYW5nZXMgJiAodGhpcy5DSEFOR0VfTUFSS0VSIHwgdGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spKSB7DQogICAgICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfU0laRSkNCiAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpOw0KICAgIH07DQoNCiAgICB0aGlzLiRjb21wdXRlTGF5ZXJDb25maWcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247DQoNCiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuc2Nyb2xsVG9wICUgdGhpcy5saW5lSGVpZ2h0Ow0KICAgICAgICB2YXIgbWluSGVpZ2h0ID0gdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCArIHRoaXMubGluZUhlaWdodDsNCg0KICAgICAgICB2YXIgbG9uZ2VzdExpbmUgPSB0aGlzLiRnZXRMb25nZXN0TGluZSgpOw0KDQogICAgICAgIHZhciBob3JpelNjcm9sbCA9IHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZSB8fCB0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGggLSBsb25nZXN0TGluZSA8IDA7DQogICAgICAgIHZhciBob3JpelNjcm9sbENoYW5nZWQgPSB0aGlzLiRob3JpelNjcm9sbCAhPT0gaG9yaXpTY3JvbGw7DQogICAgICAgIHRoaXMuJGhvcml6U2Nyb2xsID0gaG9yaXpTY3JvbGw7DQogICAgICAgIGlmIChob3JpelNjcm9sbENoYW5nZWQpIHsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIuc3R5bGUub3ZlcmZsb3dYID0gaG9yaXpTY3JvbGwgPyAic2Nyb2xsIiA6ICJoaWRkZW4iOw0KICAgICAgICAgICAgLy8gd2hlbiB3ZSBoaWRlIHNjcm9sbGJhciBzY3JvbGwgZXZlbnQgaXNuJ3QgZW1pdGVkDQogICAgICAgICAgICAvLyBsZWF2aW5nIHNlc3Npb24gd2l0aCB3cm9uZyBzY3JvbGxMZWZ0IHZhbHVlDQogICAgICAgICAgICBpZiAoIWhvcml6U2Nyb2xsKQ0KICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KDApOw0KICAgICAgICB9DQogICAgICAgIHZhciBtYXhIZWlnaHQgPSB0aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGVuZ3RoKCkgKiB0aGlzLmxpbmVIZWlnaHQ7DQogICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5zY3JvbGxUb3AsIG1heEhlaWdodCAtIHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpKSk7DQoNCiAgICAgICAgdmFyIGxpbmVDb3VudCA9IE1hdGguY2VpbChtaW5IZWlnaHQgLyB0aGlzLmxpbmVIZWlnaHQpIC0gMTsNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgodGhpcy5zY3JvbGxUb3AgLSBvZmZzZXQpIC8gdGhpcy5saW5lSGVpZ2h0KSk7DQogICAgICAgIHZhciBsYXN0Um93ID0gZmlyc3RSb3cgKyBsaW5lQ291bnQ7DQoNCiAgICAgICAgLy8gTWFwIGxpbmVzIG9uIHRoZSBzY3JlZW4gdG8gbGluZXMgaW4gdGhlIGRvY3VtZW50Lg0KICAgICAgICB2YXIgZmlyc3RSb3dTY3JlZW4sIGZpcnN0Um93SGVpZ2h0Ow0KICAgICAgICB2YXIgbGluZUhlaWdodCA9IHsgbGluZUhlaWdodDogdGhpcy5saW5lSGVpZ2h0IH07DQogICAgICAgIGZpcnN0Um93ID0gc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50Um93KGZpcnN0Um93LCAwKTsNCg0KICAgICAgICAvLyBDaGVjayBpZiBmaXJzdFJvdyBpcyBpbnNpZGUgb2YgYSBmb2xkTGluZS4gSWYgdHJ1ZSwgdGhlbiB1c2UgdGhlIGZpcnN0DQogICAgICAgIC8vIHJvdyBvZiB0aGUgZm9sZExpbmUuDQogICAgICAgIHZhciBmb2xkTGluZSA9IHNlc3Npb24uZ2V0Rm9sZExpbmUoZmlyc3RSb3cpOw0KICAgICAgICBpZiAoZm9sZExpbmUpIHsNCiAgICAgICAgICAgIGZpcnN0Um93ID0gZm9sZExpbmUuc3RhcnQucm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgZmlyc3RSb3dTY3JlZW4gPSBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3coZmlyc3RSb3csIDApOw0KICAgICAgICBmaXJzdFJvd0hlaWdodCA9IHNlc3Npb24uZ2V0Um93SGVpZ2h0KGxpbmVIZWlnaHQsIGZpcnN0Um93KTsNCg0KICAgICAgICBsYXN0Um93ID0gTWF0aC5taW4oc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50Um93KGxhc3RSb3csIDApLCBzZXNzaW9uLmdldExlbmd0aCgpIC0gMSk7DQogICAgICAgIG1pbkhlaWdodCA9IHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQgKyBzZXNzaW9uLmdldFJvd0hlaWdodChsaW5lSGVpZ2h0LCBsYXN0Um93KSsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Um93SGVpZ2h0Ow0KDQogICAgICAgIG9mZnNldCA9IHRoaXMuc2Nyb2xsVG9wIC0gZmlyc3RSb3dTY3JlZW4gKiB0aGlzLmxpbmVIZWlnaHQ7DQoNCiAgICAgICAgdGhpcy5sYXllckNvbmZpZyA9IHsNCiAgICAgICAgICAgIHdpZHRoIDogbG9uZ2VzdExpbmUsDQogICAgICAgICAgICBwYWRkaW5nIDogdGhpcy4kcGFkZGluZywNCiAgICAgICAgICAgIGZpcnN0Um93IDogZmlyc3RSb3csDQogICAgICAgICAgICBmaXJzdFJvd1NjcmVlbjogZmlyc3RSb3dTY3JlZW4sDQogICAgICAgICAgICBsYXN0Um93IDogbGFzdFJvdywNCiAgICAgICAgICAgIGxpbmVIZWlnaHQgOiB0aGlzLmxpbmVIZWlnaHQsDQogICAgICAgICAgICBjaGFyYWN0ZXJXaWR0aCA6IHRoaXMuY2hhcmFjdGVyV2lkdGgsDQogICAgICAgICAgICBtaW5IZWlnaHQgOiBtaW5IZWlnaHQsDQogICAgICAgICAgICBtYXhIZWlnaHQgOiBtYXhIZWlnaHQsDQogICAgICAgICAgICBvZmZzZXQgOiBvZmZzZXQsDQogICAgICAgICAgICBoZWlnaHQgOiB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0DQogICAgICAgIH07DQoNCiAgICAgICAgLy8gRm9yIGRlYnVnZ2luZy4NCiAgICAgICAgLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodGhpcy5sYXllckNvbmZpZykpOw0KDQogICAgICAgIHRoaXMuJGd1dHRlckxheWVyLmVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gKC1vZmZzZXQpICsgInB4IjsNCiAgICAgICAgdGhpcy5jb250ZW50LnN0eWxlLm1hcmdpblRvcCA9ICgtb2Zmc2V0KSArICJweCI7DQogICAgICAgIHRoaXMuY29udGVudC5zdHlsZS53aWR0aCA9IGxvbmdlc3RMaW5lICsgMiAqIHRoaXMuJHBhZGRpbmcgKyAicHgiOw0KICAgICAgICB0aGlzLmNvbnRlbnQuc3R5bGUuaGVpZ2h0ID0gbWluSGVpZ2h0ICsgInB4IjsNCg0KICAgICAgICAvLyBIb3Jpem9udGFsIHNjcm9sbGJhciB2aXNpYmlsaXR5IG1heSBoYXZlIGNoYW5nZWQsIHdoaWNoIGNoYW5nZXMNCiAgICAgICAgLy8gdGhlIGNsaWVudCBoZWlnaHQgb2YgdGhlIHNjcm9sbGVyDQogICAgICAgIGlmIChob3JpelNjcm9sbENoYW5nZWQpDQogICAgICAgICAgICB0aGlzLm9uUmVzaXplKHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLiR1cGRhdGVMaW5lcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgZmlyc3RSb3cgPSB0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c7DQogICAgICAgIHRoaXMuJGNoYW5nZWRMaW5lcyA9IG51bGw7DQoNCiAgICAgICAgdmFyIGxheWVyQ29uZmlnID0gdGhpcy5sYXllckNvbmZpZzsNCg0KICAgICAgICAvLyBpZiB0aGUgdXBkYXRlIGNoYW5nZXMgdGhlIHdpZHRoIG9mIHRoZSBkb2N1bWVudCBkbyBhIGZ1bGwgcmVkcmF3DQogICAgICAgIGlmIChsYXllckNvbmZpZy53aWR0aCAhPSB0aGlzLiRnZXRMb25nZXN0TGluZSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRleHRMYXllci51cGRhdGUobGF5ZXJDb25maWcpOw0KDQogICAgICAgIGlmIChmaXJzdFJvdyA+IGxheWVyQ29uZmlnLmxhc3RSb3cgKyAxKSB7IHJldHVybjsgfQ0KICAgICAgICBpZiAobGFzdFJvdyA8IGxheWVyQ29uZmlnLmZpcnN0Um93KSB7IHJldHVybjsgfQ0KDQogICAgICAgIC8vIGlmIHRoZSBsYXN0IHJvdyBpcyB1bmtub3duIC0+IHJlZHJhdyBldmVyeXRoaW5nDQogICAgICAgIGlmIChsYXN0Um93ID09PSBJbmZpbml0eSkgew0KICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0d1dHRlcikNCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobGF5ZXJDb25maWcpOw0KICAgICAgICAgICAgdGhpcy4kdGV4dExheWVyLnVwZGF0ZShsYXllckNvbmZpZyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAvLyBlbHNlIHVwZGF0ZSBvbmx5IHRoZSBjaGFuZ2VkIHJvd3MNCiAgICAgICAgdGhpcy4kdGV4dExheWVyLnVwZGF0ZUxpbmVzKGxheWVyQ29uZmlnLCBmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRMb25nZXN0TGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgY2hhckNvdW50ID0gdGhpcy5zZXNzaW9uLmdldFNjcmVlbldpZHRoKCk7DQogICAgICAgIGlmICh0aGlzLiR0ZXh0TGF5ZXIuc2hvd0ludmlzaWJsZXMpDQogICAgICAgICAgICBjaGFyQ291bnQgKz0gMTsNCg0KICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoIC0gMiAqIHRoaXMuJHBhZGRpbmcsIE1hdGgucm91bmQoY2hhckNvdW50ICogdGhpcy5jaGFyYWN0ZXJXaWR0aCkpOw0KICAgIH07DQoNCiAgICB0aGlzLnVwZGF0ZUZyb250TWFya2VycyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLiRtYXJrZXJGcm9udC5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKHRydWUpKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpOw0KICAgIH07DQoNCiAgICB0aGlzLnVwZGF0ZUJhY2tNYXJrZXJzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJG1hcmtlckJhY2suc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycygpKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSyk7DQogICAgfTsNCg0KICAgIHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbiA9IGZ1bmN0aW9uKHJvdywgY2xhc3NOYW1lKXsNCiAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIuYWRkR3V0dGVyRGVjb3JhdGlvbihyb3csIGNsYXNzTmFtZSk7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpew0KICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uKHJvdywgY2xhc3NOYW1lKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEJyZWFrcG9pbnRzID0gZnVuY3Rpb24ocm93cykgew0KICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5zZXRCcmVha3BvaW50cyhyb3dzKTsNCiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEFubm90YXRpb25zID0gZnVuY3Rpb24oYW5ub3RhdGlvbnMpIHsNCiAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOw0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUik7DQogICAgfTsNCg0KICAgIHRoaXMudXBkYXRlQ3Vyc29yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfQ1VSU09SKTsNCiAgICB9Ow0KDQogICAgdGhpcy5oaWRlQ3Vyc29yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLmhpZGVDdXJzb3IoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zaG93Q3Vyc29yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnNob3dDdXJzb3IoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAvLyB0aGUgZWRpdG9yIGlzIG5vdCB2aXNpYmxlDQogICAgICAgIGlmICh0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0ID09PSAwKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBwb3MgPSB0aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKCk7DQoNCiAgICAgICAgdmFyIGxlZnQgPSBwb3MubGVmdDsNCiAgICAgICAgdmFyIHRvcCA9IHBvcy50b3A7DQoNCiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wID4gdG9wKSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRvcCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgKyB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0IDwgdG9wICsgdGhpcy5saW5lSGVpZ2h0KSB7DQogICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRvcCArIHRoaXMubGluZUhlaWdodCAtIHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQ7DQoNCiAgICAgICAgaWYgKHNjcm9sbExlZnQgPiBsZWZ0KSB7DQogICAgICAgICAgICBpZiAobGVmdCA8IHRoaXMuJHBhZGRpbmcgKyAyICogdGhpcy5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCkNCiAgICAgICAgICAgICAgICBsZWZ0ID0gMDsNCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KGxlZnQpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHNjcm9sbExlZnQgKyB0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGggPCBsZWZ0ICsgdGhpcy5jaGFyYWN0ZXJXaWR0aCkgew0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoTWF0aC5yb3VuZChsZWZ0ICsgdGhpcy5jaGFyYWN0ZXJXaWR0aCAtIHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCkpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRTY3JvbGxUb3BSb3cgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9wIC8gdGhpcy5saW5lSGVpZ2h0Ow0KICAgIH07DQoNCiAgICB0aGlzLmdldFNjcm9sbEJvdHRvbVJvdyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodGhpcy5zY3JvbGxUb3AgKyB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSAvIHRoaXMubGluZUhlaWdodCkgLSAxKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxUb1JvdyA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHJvdyAqIHRoaXMubGluZUhlaWdodCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsVG9MaW5lID0gZnVuY3Rpb24obGluZSwgY2VudGVyKSB7DQogICAgICAgIHZhciBwb3MgPSB0aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6IGxpbmUsIGNvbHVtbjogMH0pOw0KICAgICAgICB2YXIgb2Zmc2V0ID0gcG9zLnRvcDsNCiAgICAgICAgaWYgKGNlbnRlcikNCiAgICAgICAgICAgIG9mZnNldCAtPSB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0IC8gMjsNCg0KICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKG9mZnNldCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2Nyb2xsVG9ZID0gZnVuY3Rpb24oc2Nyb2xsVG9wKSB7DQogICAgICAgIC8vIGFmdGVyIGNhbGxpbmcgc2Nyb2xsQmFyLnNldFNjcm9sbFRvcA0KICAgICAgICAvLyBzY3JvbGxiYXIgc2VuZHMgdXMgZXZlbnQgd2l0aCBzYW1lIHNjcm9sbFRvcC4gaWdub3JlIGl0DQogICAgICAgIGlmICh0aGlzLnNjcm9sbFRvcCAhPT0gc2Nyb2xsVG9wKSB7DQogICAgICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCk7DQogICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbFRvWCA9IGZ1bmN0aW9uKHNjcm9sbExlZnQpIHsNCiAgICAgICAgaWYgKHNjcm9sbExlZnQgPD0gdGhpcy4kcGFkZGluZykNCiAgICAgICAgICAgIHNjcm9sbExlZnQgPSAwOw0KDQogICAgICAgIGlmICh0aGlzLnNjcm9sbExlZnQgIT09IHNjcm9sbExlZnQpDQogICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0Ow0KICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0hfU0NST0xMKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JvbGxCeSA9IGZ1bmN0aW9uKGRlbHRhWCwgZGVsdGFZKSB7DQogICAgICAgIGRlbHRhWSAmJiB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSArIGRlbHRhWSk7DQogICAgICAgIGRlbHRhWCAmJiB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpICsgZGVsdGFYKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc1Njcm9sbGFibGVCeSA9IGZ1bmN0aW9uKGRlbHRhWCwgZGVsdGFZKSB7DQogICAgICAgIGlmIChkZWx0YVkgPCAwICYmIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSA+IDApDQogICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICBpZiAoZGVsdGFZID4gMCAmJiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkgKyB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0IDwgdGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQpDQogICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAvLyB0b2RvOiBoYW5kbGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcNCiAgICB9Ow0KDQogICAgdGhpcy5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyA9IGZ1bmN0aW9uKHBhZ2VYLCBwYWdlWSkgew0KICAgICAgICB2YXIgY2FudmFzUG9zID0gdGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCg0KICAgICAgICB2YXIgY29sID0gTWF0aC5yb3VuZCgNCiAgICAgICAgICAgIChwYWdlWCArIHRoaXMuc2Nyb2xsTGVmdCAtIGNhbnZhc1Bvcy5sZWZ0IC0gdGhpcy4kcGFkZGluZyAtIGRvbS5nZXRQYWdlU2Nyb2xsTGVmdCgpKSAvIHRoaXMuY2hhcmFjdGVyV2lkdGgNCiAgICAgICAgKTsNCiAgICAgICAgdmFyIHJvdyA9IE1hdGguZmxvb3IoDQogICAgICAgICAgICAocGFnZVkgKyB0aGlzLnNjcm9sbFRvcCAtIGNhbnZhc1Bvcy50b3AgLSBkb20uZ2V0UGFnZVNjcm9sbFRvcCgpKSAvIHRoaXMubGluZUhlaWdodA0KICAgICAgICApOw0KDQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHJvdywgTWF0aC5tYXgoY29sLCAwKSk7DQogICAgfTsNCg0KICAgIHRoaXMudGV4dFRvU2NyZWVuQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgY2FudmFzUG9zID0gdGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICAgICAgdmFyIHBvcyA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24ocm93LCBjb2x1bW4pOw0KDQogICAgICAgIHZhciB4ID0gdGhpcy4kcGFkZGluZyArIE1hdGgucm91bmQocG9zLmNvbHVtbiAqIHRoaXMuY2hhcmFjdGVyV2lkdGgpOw0KICAgICAgICB2YXIgeSA9IHBvcy5yb3cgKiB0aGlzLmxpbmVIZWlnaHQ7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHBhZ2VYOiBjYW52YXNQb3MubGVmdCArIHggLSB0aGlzLnNjcm9sbExlZnQsDQogICAgICAgICAgICBwYWdlWTogY2FudmFzUG9zLnRvcCArIHkgLSB0aGlzLnNjcm9sbFRvcA0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB0aGlzLnZpc3VhbGl6ZUZvY3VzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGRvbS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwgImFjZV9mb2N1cyIpOw0KICAgIH07DQoNCiAgICB0aGlzLnZpc3VhbGl6ZUJsdXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLCAiYWNlX2ZvY3VzIik7DQogICAgfTsNCg0KICAgIHRoaXMuc2hvd0NvbXBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgaWYgKCF0aGlzLiRjb21wb3NpdGlvbikgew0KICAgICAgICAgICAgdGhpcy4kY29tcG9zaXRpb24gPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICB0aGlzLiRjb21wb3NpdGlvbi5jbGFzc05hbWUgPSAiYWNlX2NvbXBvc2l0aW9uIjsNCiAgICAgICAgICAgIHRoaXMuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLiRjb21wb3NpdGlvbik7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLiRjb21wb3NpdGlvbi5pbm5lckhUTUwgPSAiJiMxNjA7IjsNCg0KICAgICAgICB2YXIgcG9zID0gdGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpOw0KICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRjb21wb3NpdGlvbi5zdHlsZTsNCiAgICAgICAgc3R5bGUudG9wID0gcG9zLnRvcCArICJweCI7DQogICAgICAgIHN0eWxlLmxlZnQgPSAocG9zLmxlZnQgKyB0aGlzLiRwYWRkaW5nKSArICJweCI7DQogICAgICAgIHN0eWxlLmhlaWdodCA9IHRoaXMubGluZUhlaWdodCArICJweCI7DQoNCiAgICAgICAgdGhpcy5oaWRlQ3Vyc29yKCk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0Q29tcG9zaXRpb25UZXh0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICBkb20uc2V0SW5uZXJUZXh0KHRoaXMuJGNvbXBvc2l0aW9uLCB0ZXh0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5oaWRlQ29tcG9zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5zaG93Q3Vyc29yKCk7DQoNCiAgICAgICAgaWYgKCF0aGlzLiRjb21wb3NpdGlvbikNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRjb21wb3NpdGlvbi5zdHlsZTsNCiAgICAgICAgc3R5bGUudG9wID0gIi0xMDAwMHB4IjsNCiAgICAgICAgc3R5bGUubGVmdCA9ICItMTAwMDBweCI7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0VGhlbWUgPSBmdW5jdGlvbih0aGVtZSkgew0KICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOw0KDQogICAgICAgIHRoaXMuJHRoZW1lVmFsdWUgPSB0aGVtZTsNCiAgICAgICAgaWYgKCF0aGVtZSB8fCB0eXBlb2YgdGhlbWUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgIHRoZW1lID0gdGhlbWUgfHwgImFjZS90aGVtZS90ZXh0bWF0ZSI7DQogICAgICAgICAgICByZXF1aXJlKFt0aGVtZV0sIGZ1bmN0aW9uKHRoZW1lKSB7DQogICAgICAgICAgICAgICAgYWZ0ZXJMb2FkKHRoZW1lKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgYWZ0ZXJMb2FkKHRoZW1lKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGFmdGVyTG9hZCh0aGVtZSkgew0KICAgICAgICAgICAgZG9tLmltcG9ydENzc1N0cmluZygNCiAgICAgICAgICAgICAgICB0aGVtZS5jc3NUZXh0LA0KICAgICAgICAgICAgICAgIHRoZW1lLmNzc0NsYXNzLA0KICAgICAgICAgICAgICAgIF9zZWxmLmNvbnRhaW5lci5vd25lckRvY3VtZW50DQogICAgICAgICAgICApOw0KDQogICAgICAgICAgICBpZiAoX3NlbGYuJHRoZW1lKQ0KICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyhfc2VsZi5jb250YWluZXIsIF9zZWxmLiR0aGVtZSk7DQoNCiAgICAgICAgICAgIF9zZWxmLiR0aGVtZSA9IHRoZW1lID8gdGhlbWUuY3NzQ2xhc3MgOiBudWxsOw0KDQogICAgICAgICAgICBpZiAoX3NlbGYuJHRoZW1lKQ0KICAgICAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyhfc2VsZi5jb250YWluZXIsIF9zZWxmLiR0aGVtZSk7DQoNCiAgICAgICAgICAgIGlmICh0aGVtZSAmJiB0aGVtZS5pc0RhcmspDQogICAgICAgICAgICAgICAgZG9tLmFkZENzc0NsYXNzKF9zZWxmLmNvbnRhaW5lciwgImFjZV9kYXJrIik7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKF9zZWxmLmNvbnRhaW5lciwgImFjZV9kYXJrIik7DQoNCiAgICAgICAgICAgIC8vIGZvcmNlIHJlLW1lYXN1cmUgb2YgdGhlIGd1dHRlciB3aWR0aA0KICAgICAgICAgICAgaWYgKF9zZWxmLiRzaXplKSB7DQogICAgICAgICAgICAgICAgX3NlbGYuJHNpemUud2lkdGggPSAwOw0KICAgICAgICAgICAgICAgIF9zZWxmLm9uUmVzaXplKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUaGVtZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kdGhlbWVWYWx1ZTsNCiAgICB9Ow0KDQogICAgLy8gTWV0aG9kcyBhbGxvd3MgdG8gYWRkIC8gcmVtb3ZlIENTUyBjbGFzc25hbWVzIHRvIHRoZSBlZGl0b3IgZWxlbWVudC4NCiAgICAvLyBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgYnkgcGx1Zy1pbnMgdG8gcHJvdmlkZSBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mDQogICAgLy8gYSBjZXJ0YWluIG1vZGUgdGhhdCBlZGl0b3IgaXMgaW4uDQoNCiAgICB0aGlzLnNldFN0eWxlID0gZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUpIHsNCiAgICAgIGRvbS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwgc3R5bGUpOw0KICAgIH07DQoNCiAgICB0aGlzLnVuc2V0U3R5bGUgPSBmdW5jdGlvbiB1bnNldFN0eWxlKHN0eWxlKSB7DQogICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsIHN0eWxlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuJHRleHRMYXllci5kZXN0cm95KCk7DQogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLmRlc3Ryb3koKTsNCiAgICB9Ow0KDQp9KS5jYWxsKFZpcnR1YWxSZW5kZXJlci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLlZpcnR1YWxSZW5kZXJlciA9IFZpcnR1YWxSZW5kZXJlcjsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbiBET1QgdmllcmVjayBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xheWVyL2d1dHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KdmFyIEd1dHRlciA9IGZ1bmN0aW9uKHBhcmVudEVsKSB7DQogICAgdGhpcy5lbGVtZW50ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiYWNlX2xheWVyIGFjZV9ndXR0ZXItbGF5ZXIiOw0KICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7DQogICAgdGhpcy5zZXRTaG93Rm9sZFdpZGdldHModGhpcy4kc2hvd0ZvbGRXaWRnZXRzKTsNCiAgICANCiAgICB0aGlzLmd1dHRlcldpZHRoID0gMDsNCg0KICAgIHRoaXMuJGJyZWFrcG9pbnRzID0gW107DQogICAgdGhpcy4kYW5ub3RhdGlvbnMgPSBbXTsNCiAgICB0aGlzLiRkZWNvcmF0aW9ucyA9IFtdOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KICAgIA0KICAgIHRoaXMuc2V0U2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpew0KICAgICAgICBpZiAoIXRoaXMuJGRlY29yYXRpb25zW3Jvd10pDQogICAgICAgICAgICB0aGlzLiRkZWNvcmF0aW9uc1tyb3ddID0gIiI7DQogICAgICAgIHRoaXMuJGRlY29yYXRpb25zW3Jvd10gKz0gIiBhY2VfIiArIGNsYXNzTmFtZTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpew0KICAgICAgICB0aGlzLiRkZWNvcmF0aW9uc1tyb3ddID0gdGhpcy4kZGVjb3JhdGlvbnNbcm93XS5yZXBsYWNlKCIgYWNlXyIgKyBjbGFzc05hbWUsICIiKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRCcmVha3BvaW50cyA9IGZ1bmN0aW9uKHJvd3MpIHsNCiAgICAgICAgdGhpcy4kYnJlYWtwb2ludHMgPSByb3dzLmNvbmNhdCgpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEFubm90YXRpb25zID0gZnVuY3Rpb24oYW5ub3RhdGlvbnMpIHsNCiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHNwYXJzZSBhcnJheQ0KICAgICAgICB0aGlzLiRhbm5vdGF0aW9ucyA9IFtdOw0KICAgICAgICBmb3IgKHZhciByb3cgaW4gYW5ub3RhdGlvbnMpIGlmIChhbm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShyb3cpKSB7DQogICAgICAgICAgICB2YXIgcm93QW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc1tyb3ddOw0KICAgICAgICAgICAgaWYgKCFyb3dBbm5vdGF0aW9ucykNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgdmFyIHJvd0luZm8gPSB0aGlzLiRhbm5vdGF0aW9uc1tyb3ddID0gew0KICAgICAgICAgICAgICAgIHRleHQ6IFtdDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJvd0Fubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGFubm90YXRpb24gPSByb3dBbm5vdGF0aW9uc1tpXTsNCiAgICAgICAgICAgICAgICB2YXIgYW5ub1RleHQgPSBhbm5vdGF0aW9uLnRleHQucmVwbGFjZSgvIi9nLCAiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCAiJiM4MjE3OyIpLnJlcGxhY2UoLzwvLCAiJmx0OyIpOw0KICAgICAgICAgICAgICAgIGlmIChyb3dJbmZvLnRleHQuaW5kZXhPZihhbm5vVGV4dCkgPT09IC0xKQ0KICAgICAgICAgICAgICAgICAgICByb3dJbmZvLnRleHQucHVzaChhbm5vVGV4dCk7DQogICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBhbm5vdGF0aW9uLnR5cGU7DQogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gImVycm9yIikNCiAgICAgICAgICAgICAgICAgICAgcm93SW5mby5jbGFzc05hbWUgPSAiYWNlX2Vycm9yIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJ3YXJuaW5nIiAmJiByb3dJbmZvLmNsYXNzTmFtZSAhPSAiYWNlX2Vycm9yIikNCiAgICAgICAgICAgICAgICAgICAgcm93SW5mby5jbGFzc05hbWUgPSAiYWNlX3dhcm5pbmciOw0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImluZm8iICYmICghcm93SW5mby5jbGFzc05hbWUpKQ0KICAgICAgICAgICAgICAgICAgICByb3dJbmZvLmNsYXNzTmFtZSA9ICJhY2VfaW5mbyI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbihjb25maWcpIHsNCiAgICAgICAgdGhpcy4kY29uZmlnID0gY29uZmlnOw0KDQogICAgICAgIHZhciBlbXB0eUFubm8gPSB7Y2xhc3NOYW1lOiAiIiwgdGV4dDogW119Ow0KICAgICAgICB2YXIgaHRtbCA9IFtdOw0KICAgICAgICB2YXIgaSA9IGNvbmZpZy5maXJzdFJvdzsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSBjb25maWcubGFzdFJvdzsNCiAgICAgICAgdmFyIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGkpOw0KICAgICAgICB2YXIgZm9sZFN0YXJ0ID0gZm9sZCA/IGZvbGQuc3RhcnQucm93IDogSW5maW5pdHk7DQogICAgICAgIHZhciBmb2xkV2lkZ2V0cyA9IHRoaXMuJHNob3dGb2xkV2lkZ2V0cyAmJiB0aGlzLnNlc3Npb24uZm9sZFdpZGdldHM7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgICAgIGlmKGkgPiBmb2xkU3RhcnQpIHsNCiAgICAgICAgICAgICAgICBpID0gZm9sZC5lbmQucm93ICsgMTsNCiAgICAgICAgICAgICAgICBmb2xkID0gdGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShpLCBmb2xkKTsNCiAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihpID4gbGFzdFJvdykNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgdmFyIGFubm90YXRpb24gPSB0aGlzLiRhbm5vdGF0aW9uc1tpXSB8fCBlbXB0eUFubm87DQogICAgICAgICAgICBodG1sLnB1c2goIjxkaXYgY2xhc3M9J2FjZV9ndXR0ZXItY2VsbCIsDQogICAgICAgICAgICAgICAgdGhpcy4kZGVjb3JhdGlvbnNbaV0gfHwgIiIsDQogICAgICAgICAgICAgICAgdGhpcy4kYnJlYWtwb2ludHNbaV0gPyAiIGFjZV9icmVha3BvaW50ICIgOiAiICIsDQogICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5jbGFzc05hbWUsDQogICAgICAgICAgICAgICAgIicgdGl0bGU9JyIsIGFubm90YXRpb24udGV4dC5qb2luKCJcbiIpLA0KICAgICAgICAgICAgICAgICInIHN0eWxlPSdoZWlnaHQ6IiwgY29uZmlnLmxpbmVIZWlnaHQsICJweDsnPiIsIChpKzEpKTsNCg0KICAgICAgICAgICAgaWYgKGZvbGRXaWRnZXRzKSB7DQogICAgICAgICAgICAgICAgdmFyIGMgPSBmb2xkV2lkZ2V0c1tpXTsNCiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjYWNoZWQgdmFsdWUgaXMgaW52YWxpZGF0ZWQgYW5kIHdlIG5lZWQgdG8gcmVjb21wdXRlDQogICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgYyA9IGZvbGRXaWRnZXRzW2ldID0gdGhpcy5zZXNzaW9uLmdldEZvbGRXaWRnZXQoaSk7DQogICAgICAgICAgICAgICAgaWYgKGMpDQogICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaCgNCiAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBjbGFzcz0nYWNlX2ZvbGQtd2lkZ2V0ICIsIGMsDQogICAgICAgICAgICAgICAgICAgICAgICBjID09ICJzdGFydCIgJiYgaSA9PSBmb2xkU3RhcnQgJiYgaSA8IGZvbGQuZW5kLnJvdyA/ICIgY2xvc2VkIiA6ICIgb3BlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiJz48L3NwYW4+Ig0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgd3JhcHBlZFJvd0xlbmd0aCA9IHRoaXMuc2Vzc2lvbi5nZXRSb3dMZW5ndGgoaSkgLSAxOw0KICAgICAgICAgICAgd2hpbGUgKHdyYXBwZWRSb3dMZW5ndGgtLSkgew0KICAgICAgICAgICAgICAgIGh0bWwucHVzaCgiPC9kaXY+PGRpdiBjbGFzcz0nYWNlX2d1dHRlci1jZWxsJyBzdHlsZT0naGVpZ2h0OiIsIGNvbmZpZy5saW5lSGVpZ2h0LCAicHgnPlx4QTYiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaHRtbC5wdXNoKCI8L2Rpdj4iKTsNCg0KICAgICAgICAgICAgaSsrOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZWxlbWVudCA9IGRvbS5zZXRJbm5lckh0bWwodGhpcy5lbGVtZW50LCBodG1sLmpvaW4oIiIpKTsNCiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IGNvbmZpZy5taW5IZWlnaHQgKyAicHgiOw0KICAgICAgICANCiAgICAgICAgdmFyIGd1dHRlcldpZHRoID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoOw0KICAgICAgICBpZiAoZ3V0dGVyV2lkdGggIT09IHRoaXMuZ3V0dGVyV2lkdGgpIHsNCiAgICAgICAgICAgIHRoaXMuZ3V0dGVyV2lkdGggPSBndXR0ZXJXaWR0aDsNCiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUd1dHRlcldpZHRoIiwgZ3V0dGVyV2lkdGgpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJHNob3dGb2xkV2lkZ2V0cyA9IHRydWU7DQogICAgdGhpcy5zZXRTaG93Rm9sZFdpZGdldHMgPSBmdW5jdGlvbihzaG93KSB7DQogICAgICAgIGlmIChzaG93KQ0KICAgICAgICAgICAgZG9tLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwgImFjZV9mb2xkaW5nLWVuYWJsZWQiKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwgImFjZV9mb2xkaW5nLWVuYWJsZWQiKTsNCg0KICAgICAgICB0aGlzLiRzaG93Rm9sZFdpZGdldHMgPSBzaG93Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRTaG93Rm9sZFdpZGdldHMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHNob3dGb2xkV2lkZ2V0czsNCiAgICB9Ow0KDQp9KS5jYWxsKEd1dHRlci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkd1dHRlciA9IEd1dHRlcjsNCg0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xheWVyL21hcmtlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJywgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCg0KdmFyIE1hcmtlciA9IGZ1bmN0aW9uKHBhcmVudEVsKSB7DQogICAgdGhpcy5lbGVtZW50ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiYWNlX2xheWVyIGFjZV9tYXJrZXItbGF5ZXIiOw0KICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRwYWRkaW5nID0gMDsNCg0KICAgIHRoaXMuc2V0UGFkZGluZyA9IGZ1bmN0aW9uKHBhZGRpbmcpIHsNCiAgICAgICAgdGhpcy4kcGFkZGluZyA9IHBhZGRpbmc7DQogICAgfTsNCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQogICAgfTsNCiAgICANCiAgICB0aGlzLnNldE1hcmtlcnMgPSBmdW5jdGlvbihtYXJrZXJzKSB7DQogICAgICAgIHRoaXMubWFya2VycyA9IG1hcmtlcnM7DQogICAgfTsNCg0KICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7DQogICAgICAgIHZhciBjb25maWcgPSBjb25maWcgfHwgdGhpcy5jb25maWc7DQogICAgICAgIGlmICghY29uZmlnKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOw0KDQoNCiAgICAgICAgdmFyIGh0bWwgPSBbXTsNCiAgICAgICAgZm9yICggdmFyIGtleSBpbiB0aGlzLm1hcmtlcnMpIHsNCiAgICAgICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLm1hcmtlcnNba2V5XTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gbWFya2VyLnJhbmdlLmNsaXBSb3dzKGNvbmZpZy5maXJzdFJvdywgY29uZmlnLmxhc3RSb3cpOw0KICAgICAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkgY29udGludWU7DQoNCiAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UudG9TY3JlZW5SYW5nZSh0aGlzLnNlc3Npb24pOw0KICAgICAgICAgICAgaWYgKG1hcmtlci5yZW5kZXJlcikgew0KICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzLiRnZXRUb3AocmFuZ2Uuc3RhcnQucm93LCBjb25maWcpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gTWF0aC5yb3VuZCgNCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcGFkZGluZyArIHJhbmdlLnN0YXJ0LmNvbHVtbiAqIGNvbmZpZy5jaGFyYWN0ZXJXaWR0aA0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgbWFya2VyLnJlbmRlcmVyKGh0bWwsIHJhbmdlLCBsZWZ0LCB0b3AsIGNvbmZpZyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hcmtlci50eXBlID09ICJ0ZXh0Iikgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0TWFya2VyKGh0bWwsIHJhbmdlLCBtYXJrZXIuY2xhenosIGNvbmZpZyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyKA0KICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCwgcmFuZ2UsIG1hcmtlci5jbGF6eiwgY29uZmlnLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnR5cGUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKA0KICAgICAgICAgICAgICAgICAgICBodG1sLCByYW5nZSwgbWFya2VyLmNsYXp6LCBjb25maWcsDQogICAgICAgICAgICAgICAgICAgIG51bGwsIG1hcmtlci50eXBlDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb20uc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCwgaHRtbC5qb2luKCIiKSk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldFRvcCA9IGZ1bmN0aW9uKHJvdywgbGF5ZXJDb25maWcpIHsNCiAgICAgICAgcmV0dXJuIChyb3cgLSBsYXllckNvbmZpZy5maXJzdFJvd1NjcmVlbikgKiBsYXllckNvbmZpZy5saW5lSGVpZ2h0Ow0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBEcmF3cyBhIG1hcmtlciwgd2hpY2ggc3BhbnMgYSByYW5nZSBvZiB0ZXh0IGluIGEgc2luZ2xlIGxpbmUNCiAgICAgKi8gDQogICAgdGhpcy5kcmF3VGV4dE1hcmtlciA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIHJhbmdlLCBjbGF6eiwgbGF5ZXJDb25maWcpIHsNCiAgICAgICAgLy8gc2VsZWN0aW9uIHN0YXJ0DQogICAgICAgIHZhciByb3cgPSByYW5nZS5zdGFydC5yb3c7DQoNCiAgICAgICAgdmFyIGxpbmVSYW5nZSA9IG5ldyBSYW5nZSgNCiAgICAgICAgICAgIHJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgcm93LCB0aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihyb3cpDQogICAgICAgICk7DQogICAgICAgIHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoc3RyaW5nQnVpbGRlciwgbGluZVJhbmdlLCBjbGF6eiwgbGF5ZXJDb25maWcsIDEsICJ0ZXh0Iik7DQoNCiAgICAgICAgLy8gc2VsZWN0aW9uIGVuZA0KICAgICAgICByb3cgPSByYW5nZS5lbmQucm93Ow0KICAgICAgICBsaW5lUmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3csIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHN0cmluZ0J1aWxkZXIsIGxpbmVSYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCAwLCAidGV4dCIpOw0KDQogICAgICAgIGZvciAocm93ID0gcmFuZ2Uuc3RhcnQucm93ICsgMTsgcm93IDwgcmFuZ2UuZW5kLnJvdzsgcm93KyspIHsNCiAgICAgICAgICAgIGxpbmVSYW5nZS5zdGFydC5yb3cgPSByb3c7DQogICAgICAgICAgICBsaW5lUmFuZ2UuZW5kLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIGxpbmVSYW5nZS5lbmQuY29sdW1uID0gdGhpcy5zZXNzaW9uLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4ocm93KTsNCiAgICAgICAgICAgIHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoc3RyaW5nQnVpbGRlciwgbGluZVJhbmdlLCBjbGF6eiwgbGF5ZXJDb25maWcsIDEsICJ0ZXh0Iik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogRHJhd3MgYSBtdWx0aSBsaW5lIG1hcmtlciwgd2hlcmUgbGluZXMgc3BhbiB0aGUgZnVsbCB3aWR0aA0KICAgICAqLw0KICAgICB0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXIgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCB0eXBlKSB7DQogICAgICAgIHZhciBwYWRkaW5nID0gdHlwZSA9PT0gImJhY2tncm91bmQiID8gMCA6IHRoaXMuJHBhZGRpbmc7DQogICAgICAgIHZhciBsYXllcldpZHRoID0gbGF5ZXJDb25maWcud2lkdGggKyAyICogdGhpcy4kcGFkZGluZyAtIHBhZGRpbmc7DQogICAgICAgIC8vIGZyb20gc2VsZWN0aW9uIHN0YXJ0IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUNCiAgICAgICAgdmFyIGhlaWdodCA9IGxheWVyQ29uZmlnLmxpbmVIZWlnaHQ7DQogICAgICAgIHZhciB3aWR0aCA9IE1hdGgucm91bmQobGF5ZXJXaWR0aCAtIChyYW5nZS5zdGFydC5jb2x1bW4gKiBsYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCkpOw0KICAgICAgICB2YXIgdG9wID0gdGhpcy4kZ2V0VG9wKHJhbmdlLnN0YXJ0LnJvdywgbGF5ZXJDb25maWcpOw0KICAgICAgICB2YXIgbGVmdCA9IE1hdGgucm91bmQoDQogICAgICAgICAgICBwYWRkaW5nICsgcmFuZ2Uuc3RhcnQuY29sdW1uICogbGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgNCiAgICAgICAgKTsNCg0KICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goDQogICAgICAgICAgICAiPGRpdiBjbGFzcz0nIiwgY2xhenosICInIHN0eWxlPSciLA0KICAgICAgICAgICAgImhlaWdodDoiLCBoZWlnaHQsICJweDsiLA0KICAgICAgICAgICAgIndpZHRoOiIsIHdpZHRoLCAicHg7IiwNCiAgICAgICAgICAgICJ0b3A6IiwgdG9wLCAicHg7IiwNCiAgICAgICAgICAgICJsZWZ0OiIsIGxlZnQsICJweDsnPjwvZGl2PiINCiAgICAgICAgKTsNCg0KICAgICAgICAvLyBmcm9tIHN0YXJ0IG9mIHRoZSBsYXN0IGxpbmUgdG8gdGhlIHNlbGVjdGlvbiBlbmQNCiAgICAgICAgdG9wID0gdGhpcy4kZ2V0VG9wKHJhbmdlLmVuZC5yb3csIGxheWVyQ29uZmlnKTsNCiAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKHJhbmdlLmVuZC5jb2x1bW4gKiBsYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCk7DQoNCiAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKA0KICAgICAgICAgICAgIjxkaXYgY2xhc3M9JyIsIGNsYXp6LCAiJyBzdHlsZT0nIiwNCiAgICAgICAgICAgICJoZWlnaHQ6IiwgaGVpZ2h0LCAicHg7IiwNCiAgICAgICAgICAgICJ3aWR0aDoiLCB3aWR0aCwgInB4OyIsDQogICAgICAgICAgICAidG9wOiIsIHRvcCwgInB4OyIsDQogICAgICAgICAgICAibGVmdDoiLCBwYWRkaW5nLCAicHg7Jz48L2Rpdj4iDQogICAgICAgICk7DQoNCiAgICAgICAgLy8gYWxsIHRoZSBjb21wbGV0ZSBsaW5lcw0KICAgICAgICBoZWlnaHQgPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyAtIDEpICogbGF5ZXJDb25maWcubGluZUhlaWdodDsNCiAgICAgICAgaWYgKGhlaWdodCA8IDApDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIHRvcCA9IHRoaXMuJGdldFRvcChyYW5nZS5zdGFydC5yb3cgKyAxLCBsYXllckNvbmZpZyk7DQoNCiAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKA0KICAgICAgICAgICAgIjxkaXYgY2xhc3M9JyIsIGNsYXp6LCAiJyBzdHlsZT0nIiwNCiAgICAgICAgICAgICJoZWlnaHQ6IiwgaGVpZ2h0LCAicHg7IiwNCiAgICAgICAgICAgICJ3aWR0aDoiLCBsYXllcldpZHRoLCAicHg7IiwNCiAgICAgICAgICAgICJ0b3A6IiwgdG9wLCAicHg7IiwNCiAgICAgICAgICAgICJsZWZ0OiIsIHBhZGRpbmcsICJweDsnPjwvZGl2PiINCiAgICAgICAgKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogRHJhd3MgYSBtYXJrZXIgd2hpY2ggY292ZXJzIG9uZSBzaW5nbGUgZnVsbCBsaW5lDQogICAgICovDQogICAgdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlciA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIHJhbmdlLCBjbGF6eiwgbGF5ZXJDb25maWcsIGV4dHJhTGVuZ3RoLCB0eXBlKSB7DQogICAgICAgIHZhciBwYWRkaW5nID0gdHlwZSA9PT0gImJhY2tncm91bmQiID8gMCA6IHRoaXMuJHBhZGRpbmc7DQogICAgICAgIHZhciBoZWlnaHQgPSBsYXllckNvbmZpZy5saW5lSGVpZ2h0Ow0KDQogICAgICAgIGlmICh0eXBlID09PSAiYmFja2dyb3VuZCIpDQogICAgICAgICAgICB2YXIgd2lkdGggPSBsYXllckNvbmZpZy53aWR0aDsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKChyYW5nZS5lbmQuY29sdW1uICsgKGV4dHJhTGVuZ3RoIHx8IDApIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSAqIGxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoKTsNCg0KICAgICAgICB2YXIgdG9wID0gdGhpcy4kZ2V0VG9wKHJhbmdlLnN0YXJ0LnJvdywgbGF5ZXJDb25maWcpOw0KICAgICAgICB2YXIgbGVmdCA9IE1hdGgucm91bmQoDQogICAgICAgICAgICBwYWRkaW5nICsgcmFuZ2Uuc3RhcnQuY29sdW1uICogbGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgNCiAgICAgICAgKTsNCg0KICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goDQogICAgICAgICAgICAiPGRpdiBjbGFzcz0nIiwgY2xhenosICInIHN0eWxlPSciLA0KICAgICAgICAgICAgImhlaWdodDoiLCBoZWlnaHQsICJweDsiLA0KICAgICAgICAgICAgIndpZHRoOiIsIHdpZHRoLCAicHg7IiwNCiAgICAgICAgICAgICJ0b3A6IiwgdG9wLCAicHg7IiwNCiAgICAgICAgICAgICJsZWZ0OiIsIGxlZnQsInB4Oyc+PC9kaXY+Ig0KICAgICAgICApOw0KICAgIH07DQoNCn0pLmNhbGwoTWFya2VyLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWFya2VyID0gTWFya2VyOw0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4gRE9UIHZpZXJlY2sgQVQgZ21haWwgRE9UIGNvbT4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpLnN1Y2FuQGdtYWlsLmNvbT4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGF5ZXIvdGV4dCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvdXNlcmFnZW50JywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdXNlcmFnZW50ID0gcmVxdWlyZSgiLi4vbGliL3VzZXJhZ2VudCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQp2YXIgVGV4dCA9IGZ1bmN0aW9uKHBhcmVudEVsKSB7DQogICAgdGhpcy5lbGVtZW50ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiYWNlX2xheWVyIGFjZV90ZXh0LWxheWVyIjsNCiAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpOw0KDQogICAgdGhpcy4kY2hhcmFjdGVyU2l6ZSA9IHRoaXMuJG1lYXN1cmVTaXplcygpIHx8IHt3aWR0aDogMCwgaGVpZ2h0OiAwfTsNCiAgICB0aGlzLiRwb2xsU2l6ZUNoYW5nZXMoKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuRU9GX0NIQVIgPSAiXHhCNiI7IC8vIiZwYXJhOyI7DQogICAgdGhpcy5FT0xfQ0hBUiA9ICJceEFDIjsgLy8iJm5vdDsiOw0KICAgIHRoaXMuVEFCX0NIQVIgPSAiXHUyMTkyIjsgLy8iJnJhcnI7IjsNCiAgICB0aGlzLlNQQUNFX0NIQVIgPSAiXHhCNyI7IC8vIiZtaWRkb3Q7IjsNCiAgICB0aGlzLiRwYWRkaW5nID0gMDsNCg0KICAgIHRoaXMuc2V0UGFkZGluZyA9IGZ1bmN0aW9uKHBhZGRpbmcpIHsNCiAgICAgICAgdGhpcy4kcGFkZGluZyA9IHBhZGRpbmc7DQogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wYWRkaW5nID0gIjAgIiArIHBhZGRpbmcgKyAicHgiOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExpbmVIZWlnaHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0IHx8IDE7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Q2hhcmFjdGVyV2lkdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUud2lkdGggfHwgMTsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzaXplID0gdGhpcy4kbWVhc3VyZVNpemVzKCk7DQogICAgICAgIGlmIChzaXplICYmICh0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoICE9PSBzaXplLndpZHRoIHx8IHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0ICE9PSBzaXplLmhlaWdodCkpIHsNCiAgICAgICAgICAgIHRoaXMuJGNoYXJhY3RlclNpemUgPSBzaXplOw0KICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsIHtkYXRhOiBzaXplfSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kcG9sbFNpemVDaGFuZ2VzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCiAgICAgICAgdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlbGYuY2hlY2tGb3JTaXplQ2hhbmdlcygpOw0KICAgICAgICB9LCA1MDApOw0KICAgIH07DQoNCiAgICB0aGlzLiRmb250U3R5bGVzID0gew0KICAgICAgICBmb250RmFtaWx5IDogMSwNCiAgICAgICAgZm9udFNpemUgOiAxLA0KICAgICAgICBmb250V2VpZ2h0IDogMSwNCiAgICAgICAgZm9udFN0eWxlIDogMSwNCiAgICAgICAgbGluZUhlaWdodCA6IDENCiAgICB9Ow0KDQogICAgdGhpcy4kbWVhc3VyZVNpemVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBuID0gMTAwMDsNCiAgICAgICAgaWYgKCF0aGlzLiRtZWFzdXJlTm9kZSkgew0KICAgICAgICAgICAgdmFyIG1lYXN1cmVOb2RlID0gdGhpcy4kbWVhc3VyZU5vZGUgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICB2YXIgc3R5bGUgPSBtZWFzdXJlTm9kZS5zdHlsZTsNCg0KICAgICAgICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQgPSAiYXV0byI7DQogICAgICAgICAgICBzdHlsZS5sZWZ0ID0gc3R5bGUudG9wID0gKC1uICogNDApICArICJweCI7DQoNCiAgICAgICAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCiAgICAgICAgICAgIHN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ID0gInZpc2libGUiOw0KICAgICAgICAgICAgc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOw0KDQogICAgICAgICAgICAvLyBpbiBGRiAzLjYgbW9ub3NwYWNlIGZvbnRzIGNhbiBoYXZlIGEgZml4ZWQgc3ViIHBpeGVsIHdpZHRoLg0KICAgICAgICAgICAgLy8gdGhhdCdzIHdoeSB3ZSBoYXZlIHRvIG1lYXN1cmUgbWFueSBjaGFyYWN0ZXJzDQogICAgICAgICAgICAvLyBOb3RlOiBjaGFyYWN0ZXJXaWR0aCBjYW4gYmUgYSBmbG9hdCENCiAgICAgICAgICAgIG1lYXN1cmVOb2RlLmlubmVySFRNTCA9IGxhbmcuc3RyaW5nUmVwZWF0KCJYeSIsIG4pOw0KDQogICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVhc3VyZU5vZGUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGU7DQogICAgICAgICAgICAgICAgd2hpbGUgKCFkb20uaGFzQ3NzQ2xhc3MoY29udGFpbmVyLCAiYWNlX2VkaXRvciIpKQ0KICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsNCiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWVhc3VyZU5vZGUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIFNpemUgYW5kIHdpZHRoIGNhbiBiZSBudWxsIGlmIHRoZSBlZGl0b3IgaXMgbm90IHZpc2libGUgb3INCiAgICAgICAgLy8gZGV0YWNoZWQgZnJvbSB0aGUgZG9jdW1lbnQNCiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZTsNCiAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBkb20uY29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpOw0KICAgICAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuJGZvbnRTdHlsZXMpDQogICAgICAgICAgICBzdHlsZVtwcm9wXSA9IGNvbXB1dGVkU3R5bGVbcHJvcF07DQoNCiAgICAgICAgdmFyIHNpemUgPSB7DQogICAgICAgICAgICBoZWlnaHQ6IHRoaXMuJG1lYXN1cmVOb2RlLm9mZnNldEhlaWdodCwNCiAgICAgICAgICAgIHdpZHRoOiB0aGlzLiRtZWFzdXJlTm9kZS5vZmZzZXRXaWR0aCAvIChuICogMikNCiAgICAgICAgfTsNCg0KICAgICAgICAvLyBTaXplIGFuZCB3aWR0aCBjYW4gYmUgbnVsbCBpZiB0aGUgZWRpdG9yIGlzIG5vdCB2aXNpYmxlIG9yDQogICAgICAgIC8vIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50DQogICAgICAgIGlmIChzaXplLndpZHRoID09IDAgJiYgc2l6ZS5oZWlnaHQgPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgIHJldHVybiBzaXplOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247DQogICAgfTsNCg0KICAgIHRoaXMuc2hvd0ludmlzaWJsZXMgPSBmYWxzZTsNCiAgICB0aGlzLnNldFNob3dJbnZpc2libGVzID0gZnVuY3Rpb24oc2hvd0ludmlzaWJsZXMpIHsNCiAgICAgICAgaWYgKHRoaXMuc2hvd0ludmlzaWJsZXMgPT0gc2hvd0ludmlzaWJsZXMpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgdGhpcy5zaG93SW52aXNpYmxlcyA9IHNob3dJbnZpc2libGVzOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdGFiU3RyaW5ncyA9IFtdOw0KICAgIHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHRhYlNpemUgPSB0aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpOw0KICAgICAgICB2YXIgdGFiU3RyID0gdGhpcy4kdGFiU3RyaW5ncyA9IFswXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0YWJTaXplICsgMTsgaSsrKSB7DQogICAgICAgICAgICBpZiAodGhpcy5zaG93SW52aXNpYmxlcykgew0KICAgICAgICAgICAgICAgIHRhYlN0ci5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+Ig0KICAgICAgICAgICAgICAgICAgICArIHRoaXMuVEFCX0NIQVINCiAgICAgICAgICAgICAgICAgICAgKyBuZXcgQXJyYXkoaSkuam9pbigiJiMxNjA7IikNCiAgICAgICAgICAgICAgICAgICAgKyAiPC9zcGFuPiIpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0YWJTdHIucHVzaChuZXcgQXJyYXkoaSsxKS5qb2luKCImIzE2MDsiKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgIH07DQoNCiAgICB0aGlzLnVwZGF0ZUxpbmVzID0gZnVuY3Rpb24oY29uZmlnLCBmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICB0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCk7DQogICAgICAgIC8vIER1ZSB0byB3cmFwIGxpbmUgY2hhbmdlcyB0aGVyZSBjYW4gYmUgbmV3IGxpbmVzIGlmIGUuZy4NCiAgICAgICAgLy8gdGhlIGxpbmUgdG8gdXBkYXRlZCB3cmFwcGVkIGluIHRoZSBtZWFudGltZS4NCiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxhc3RSb3cgIT0gY29uZmlnLmxhc3RSb3cgfHwNCiAgICAgICAgICAgIHRoaXMuY29uZmlnLmZpcnN0Um93ICE9IGNvbmZpZy5maXJzdFJvdykgew0KICAgICAgICAgICAgdGhpcy5zY3JvbGxMaW5lcyhjb25maWcpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOw0KDQogICAgICAgIHZhciBmaXJzdCA9IE1hdGgubWF4KGZpcnN0Um93LCBjb25maWcuZmlyc3RSb3cpOw0KICAgICAgICB2YXIgbGFzdCA9IE1hdGgubWluKGxhc3RSb3csIGNvbmZpZy5sYXN0Um93KTsNCg0KICAgICAgICB2YXIgbGluZUVsZW1lbnRzID0gdGhpcy5lbGVtZW50LmNoaWxkTm9kZXM7DQogICAgICAgIHZhciBsaW5lRWxlbWVudHNJZHggPSAwOw0KDQogICAgICAgIGZvciAodmFyIHJvdyA9IGNvbmZpZy5maXJzdFJvdzsgcm93IDwgZmlyc3Q7IHJvdysrKSB7DQogICAgICAgICAgICB2YXIgZm9sZExpbmUgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUocm93KTsNCiAgICAgICAgICAgIGlmIChmb2xkTGluZSkgew0KICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZS5jb250YWluc1JvdyhmaXJzdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmb2xkTGluZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJvdyA9IGZvbGRMaW5lLmVuZC5yb3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGluZUVsZW1lbnRzSWR4ICsrOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yICh2YXIgaT1maXJzdDsgaTw9bGFzdDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgbGluZUVsZW1lbnQgPSBsaW5lRWxlbWVudHNbbGluZUVsZW1lbnRzSWR4KytdOw0KICAgICAgICAgICAgaWYgKCFsaW5lRWxlbWVudCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgdmFyIGh0bWwgPSBbXTsNCiAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGksIGkpOw0KICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZShodG1sLCBpLCB0b2tlbnNbMF0udG9rZW5zLCAhdGhpcy4kdXNlTGluZUdyb3VwcygpKTsNCiAgICAgICAgICAgIGxpbmVFbGVtZW50ID0gZG9tLnNldElubmVySHRtbChsaW5lRWxlbWVudCwgaHRtbC5qb2luKCIiKSk7DQoNCiAgICAgICAgICAgIGkgPSB0aGlzLnNlc3Npb24uZ2V0Um93Rm9sZEVuZChpKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnNjcm9sbExpbmVzID0gZnVuY3Rpb24oY29uZmlnKSB7DQogICAgICAgIHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKTsNCiAgICAgICAgdmFyIG9sZENvbmZpZyA9IHRoaXMuY29uZmlnOw0KICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsNCg0KICAgICAgICBpZiAoIW9sZENvbmZpZyB8fCBvbGRDb25maWcubGFzdFJvdyA8IGNvbmZpZy5maXJzdFJvdykNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShjb25maWcpOw0KDQogICAgICAgIGlmIChjb25maWcubGFzdFJvdyA8IG9sZENvbmZpZy5maXJzdFJvdykNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShjb25maWcpOw0KDQogICAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudDsNCiAgICAgICAgaWYgKG9sZENvbmZpZy5maXJzdFJvdyA8IGNvbmZpZy5maXJzdFJvdykNCiAgICAgICAgICAgIGZvciAodmFyIHJvdz10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQob2xkQ29uZmlnLmZpcnN0Um93LCBjb25maWcuZmlyc3RSb3cgLSAxKTsgcm93PjA7IHJvdy0tKQ0KICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpOw0KDQogICAgICAgIGlmIChvbGRDb25maWcubGFzdFJvdyA+IGNvbmZpZy5sYXN0Um93KQ0KICAgICAgICAgICAgZm9yICh2YXIgcm93PXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChjb25maWcubGFzdFJvdyArIDEsIG9sZENvbmZpZy5sYXN0Um93KTsgcm93PjA7IHJvdy0tKQ0KICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmxhc3RDaGlsZCk7DQoNCiAgICAgICAgaWYgKGNvbmZpZy5maXJzdFJvdyA8IG9sZENvbmZpZy5maXJzdFJvdykgew0KICAgICAgICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChjb25maWcsIGNvbmZpZy5maXJzdFJvdywgb2xkQ29uZmlnLmZpcnN0Um93IC0gMSk7DQogICAgICAgICAgICBpZiAoZWwuZmlyc3RDaGlsZCkNCiAgICAgICAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIGVsLmZpcnN0Q2hpbGQpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGZyYWdtZW50KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChjb25maWcubGFzdFJvdyA+IG9sZENvbmZpZy5sYXN0Um93KSB7DQogICAgICAgICAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGNvbmZpZywgb2xkQ29uZmlnLmxhc3RSb3cgKyAxLCBjb25maWcubGFzdFJvdyk7DQogICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChmcmFnbWVudCk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudCA9IGZ1bmN0aW9uKGNvbmZpZywgZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLA0KICAgICAgICAgICAgcm93ID0gZmlyc3RSb3csDQogICAgICAgICAgICBmb2xkID0gdGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShyb3cpLA0KICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5Ow0KDQogICAgICAgIHdoaWxlICh0cnVlKSB7DQogICAgICAgICAgICBpZiAocm93ID4gZm9sZFN0YXJ0KSB7DQogICAgICAgICAgICAgICAgcm93ID0gZm9sZC5lbmQucm93KzE7DQogICAgICAgICAgICAgICAgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocm93LCBmb2xkKTsNCiAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocm93ID4gbGFzdFJvdykNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCg0KICAgICAgICAgICAgdmFyIGh0bWwgPSBbXTsNCiAgICAgICAgICAgIC8vIEdldCB0aGUgdG9rZW5zIHBlciBsaW5lIGFzIHRoZXJlIG1pZ2h0IGJlIHNvbWUgbGluZXMgaW4gYmV0d2Vlbg0KICAgICAgICAgICAgLy8gYmVlaW5nIGZvbGRlZC4NCiAgICAgICAgICAgIC8vIE9QVElNSVpFOiBJZiB0aGVyZSBpcyBhIGxvbmcgYmxvY2sgb2YgdW5mb2xkZWQgbGluZXMsIGp1c3QgbWFrZQ0KICAgICAgICAgICAgLy8gdGhpcyBjYWxsIG9uY2UgZm9yIHRoYXQgYmlnIGJsb2NrIG9mIHVuZm9sZGVkIGxpbmVzLg0KICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpOw0KICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMSkNCiAgICAgICAgICAgICAgICB0aGlzLiRyZW5kZXJMaW5lKGh0bWwsIHJvdywgdG9rZW5zWzBdLnRva2VucywgZmFsc2UpOw0KDQogICAgICAgICAgICAvLyBkb24ndCB1c2Ugc2V0SW5uZXJIdG1sIHNpbmNlIHdlIGFyZSB3b3JraW5nIHdpdGggYW4gZW1wdHkgRElWDQogICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbC5qb2luKCIiKTsNCiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VMaW5lR3JvdXBzKCkpIHsNCiAgICAgICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2FjZV9saW5lX2dyb3VwJzsNCiAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjb250YWluZXIuY2hpbGROb2Rlcw0KICAgICAgICAgICAgICAgIHdoaWxlKGxpbmVzLmxlbmd0aCkNCiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobGluZXNbMF0pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByb3crKzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZnJhZ21lbnQ7DQogICAgfTsNCg0KICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7DQogICAgICAgIHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKTsNCiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7DQoNCiAgICAgICAgdmFyIGh0bWwgPSBbXTsNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gY29uZmlnLmZpcnN0Um93LCBsYXN0Um93ID0gY29uZmlnLmxhc3RSb3c7DQoNCiAgICAgICAgdmFyIHJvdyA9IGZpcnN0Um93LA0KICAgICAgICAgICAgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocm93KSwNCiAgICAgICAgICAgIGZvbGRTdGFydCA9IGZvbGQgP2ZvbGQuc3RhcnQucm93IDpJbmZpbml0eTsNCg0KICAgICAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICAgICAgaWYgKHJvdyA+IGZvbGRTdGFydCkgew0KICAgICAgICAgICAgICAgIHJvdyA9IGZvbGQuZW5kLnJvdysxOw0KICAgICAgICAgICAgICAgIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHJvdywgZm9sZCk7DQogICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJvdyA+IGxhc3RSb3cpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VMaW5lR3JvdXBzKCkpDQogICAgICAgICAgICAgICAgaHRtbC5wdXNoKCI8ZGl2IGNsYXNzPSdhY2VfbGluZV9ncm91cCc+IikNCg0KICAgICAgICAgICAgLy8gR2V0IHRoZSB0b2tlbnMgcGVyIGxpbmUgYXMgdGhlcmUgbWlnaHQgYmUgc29tZSBsaW5lcyBpbiBiZXR3ZWVuDQogICAgICAgICAgICAvLyBiZWVpbmcgZm9sZGVkLg0KICAgICAgICAgICAgLy8gT1BUSU1JWkU6IElmIHRoZXJlIGlzIGEgbG9uZyBibG9jayBvZiB1bmZvbGRlZCBsaW5lcywganVzdCBtYWtlDQogICAgICAgICAgICAvLyB0aGlzIGNhbGwgb25jZSBmb3IgdGhhdCBiaWcgYmxvY2sgb2YgdW5mb2xkZWQgbGluZXMuDQogICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5zZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdyk7DQogICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgICAgIHRoaXMuJHJlbmRlckxpbmUoaHRtbCwgcm93LCB0b2tlbnNbMF0udG9rZW5zLCBmYWxzZSk7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VMaW5lR3JvdXBzKCkpDQogICAgICAgICAgICAgICAgaHRtbC5wdXNoKCI8L2Rpdj4iKTsgLy8gZW5kIHRoZSBsaW5lIGdyb3VwDQoNCiAgICAgICAgICAgIHJvdysrOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZWxlbWVudCA9IGRvbS5zZXRJbm5lckh0bWwodGhpcy5lbGVtZW50LCBodG1sLmpvaW4oIiIpKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kdGV4dFRva2VuID0gew0KICAgICAgICAidGV4dCI6IHRydWUsDQogICAgICAgICJycGFyZW4iOiB0cnVlLA0KICAgICAgICAibHBhcmVuIjogdHJ1ZQ0KICAgIH07DQoNCiAgICB0aGlzLiRyZW5kZXJUb2tlbiA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIHNjcmVlbkNvbHVtbiwgdG9rZW4sIHZhbHVlKSB7ICAgICAgICANCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICB2YXIgcmVwbGFjZVJlZyA9IC9cdHwmfDx8KCArKXwoW1x2XGYgXHUwMGEwXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDBiXHUyMDI4XHUyMDI5XHUzMDAwXSl8W1x1MTEwMC1cdTExNUZdfFtcdTExQTMtXHUxMUE3XXxbXHUxMUZBLVx1MTFGRl18W1x1MjMyOS1cdTIzMkFdfFtcdTJFODAtXHUyRTk5XXxbXHUyRTlCLVx1MkVGM118W1x1MkYwMC1cdTJGRDVdfFtcdTJGRjAtXHUyRkZCXXxbXHUzMDAwLVx1MzAzRV18W1x1MzA0MS1cdTMwOTZdfFtcdTMwOTktXHUzMEZGXXxbXHUzMTA1LVx1MzEyRF18W1x1MzEzMS1cdTMxOEVdfFtcdTMxOTAtXHUzMUJBXXxbXHUzMUMwLVx1MzFFM118W1x1MzFGMC1cdTMyMUVdfFtcdTMyMjAtXHUzMjQ3XXxbXHUzMjUwLVx1MzJGRV18W1x1MzMwMC1cdTREQkZdfFtcdTRFMDAtXHVBNDhDXXxbXHVBNDkwLVx1QTRDNl18W1x1QTk2MC1cdUE5N0NdfFtcdUFDMDAtXHVEN0EzXXxbXHVEN0IwLVx1RDdDNl18W1x1RDdDQi1cdUQ3RkJdfFtcdUY5MDAtXHVGQUZGXXxbXHVGRTEwLVx1RkUxOV18W1x1RkUzMC1cdUZFNTJdfFtcdUZFNTQtXHVGRTY2XXxbXHVGRTY4LVx1RkU2Ql18W1x1RkYwMS1cdUZGNjBdfFtcdUZGRTAtXHVGRkU2XS9nOw0KICAgICAgICB2YXIgcmVwbGFjZUZ1bmMgPSBmdW5jdGlvbihjLCBhLCBiLCB0YWJJZHgsIGlkeDQpIHsNCiAgICAgICAgICAgIGlmIChjLmNoYXJDb2RlQXQoMCkgPT0gMzIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5KGMubGVuZ3RoKzEpLmpvaW4oIiYjMTYwOyIpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICJcdCIpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGFiU2l6ZSA9IHNlbGYuc2Vzc2lvbi5nZXRTY3JlZW5UYWJTaXplKHNjcmVlbkNvbHVtbiArIHRhYklkeCk7DQogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IHRhYlNpemUgLSAxOw0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLiR0YWJTdHJpbmdzW3RhYlNpemVdOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICImIikgew0KICAgICAgICAgICAgICAgIGlmICh1c2VyYWdlbnQuaXNPbGRHZWNrbykNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICImIjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiJmFtcDsiOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICI8Iikgew0KICAgICAgICAgICAgICAgIHJldHVybiAiJmx0OyI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gIlx1MzAwMCIpIHsNCiAgICAgICAgICAgICAgICAvLyBVKzMwMDAgaXMgYm90aCBpbnZpc2libGUgQU5EIGZ1bGwtd2lkdGgsIHNvIG11c3QgYmUgaGFuZGxlZCB1bmlxdWVseQ0KICAgICAgICAgICAgICAgIHZhciBjbGFzc1RvVXNlID0gc2VsZi5zaG93SW52aXNpYmxlcyA/ICJhY2VfY2prIGFjZV9pbnZpc2libGUiIDogImFjZV9jamsiOw0KICAgICAgICAgICAgICAgIHZhciBzcGFjZSA9IHNlbGYuc2hvd0ludmlzaWJsZXMgPyBzZWxmLlNQQUNFX0NIQVIgOiAiIjsNCiAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gMTsNCiAgICAgICAgICAgICAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSciICsgY2xhc3NUb1VzZSArICInIHN0eWxlPSd3aWR0aDoiICsNCiAgICAgICAgICAgICAgICAgICAgKHNlbGYuY29uZmlnLmNoYXJhY3RlcldpZHRoICogMikgKw0KICAgICAgICAgICAgICAgICAgICAicHgnPiIgKyBzcGFjZSArICI8L3NwYW4+IjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5tYXRjaCgvW1x2XGYgXHUwMGEwXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDBiXHUyMDI4XHUyMDI5XHUzMDAwXS8pKSB7DQogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2hvd0ludmlzaWJsZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYWNlID0gbmV3IEFycmF5KGMubGVuZ3RoKzEpLmpvaW4oc2VsZi5TUEFDRV9DSEFSKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+IiArIHNwYWNlICsgIjwvc3Bhbj4iOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiJiMxNjA7IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAxOw0KICAgICAgICAgICAgICAgIHJldHVybiAiPHNwYW4gY2xhc3M9J2FjZV9jamsnIHN0eWxlPSd3aWR0aDoiICsNCiAgICAgICAgICAgICAgICAgICAgKHNlbGYuY29uZmlnLmNoYXJhY3RlcldpZHRoICogMikgKw0KICAgICAgICAgICAgICAgICAgICAicHgnPiIgKyBjICsgIjwvc3Bhbj4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBvdXRwdXQgPSB2YWx1ZS5yZXBsYWNlKHJlcGxhY2VSZWcsIHJlcGxhY2VGdW5jKTsNCg0KICAgICAgICBpZiAoIXRoaXMuJHRleHRUb2tlblt0b2tlbi50eXBlXSkgew0KICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAiYWNlXyIgKyB0b2tlbi50eXBlLnJlcGxhY2UoL1wuL2csICIgYWNlXyIpOw0KICAgICAgICAgICAgdmFyIHN0eWxlID0gIiI7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAiZm9sZCIpDQogICAgICAgICAgICAgICAgc3R5bGUgPSAiIHN0eWxlPSd3aWR0aDoiICsgKHRva2VuLnZhbHVlLmxlbmd0aCAqIHRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKSArICJweDsnICI7DQogICAgICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goIjxzcGFuIGNsYXNzPSciLCBjbGFzc2VzLCAiJyIsIHN0eWxlLCAiPiIsIG91dHB1dCwgIjwvc3Bhbj4iKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaChvdXRwdXQpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBzY3JlZW5Db2x1bW4gKyB2YWx1ZS5sZW5ndGg7DQogICAgfTsNCg0KICAgIHRoaXMuJHJlbmRlckxpbmVDb3JlID0gZnVuY3Rpb24oc3RyaW5nQnVpbGRlciwgbGFzdFJvdywgdG9rZW5zLCBzcGxpdHMsIG9ubHlDb250ZW50cykgew0KICAgICAgICB2YXIgY2hhcnMgPSAwOw0KICAgICAgICB2YXIgc3BsaXQgPSAwOw0KICAgICAgICB2YXIgc3BsaXRDaGFyczsNCiAgICAgICAgdmFyIHNjcmVlbkNvbHVtbiA9IDA7DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCg0KICAgICAgICBpZiAoIXNwbGl0cyB8fCBzcGxpdHMubGVuZ3RoID09IDApDQogICAgICAgICAgICBzcGxpdENoYXJzID0gTnVtYmVyLk1BWF9WQUxVRTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgc3BsaXRDaGFycyA9IHNwbGl0c1swXTsNCg0KICAgICAgICBpZiAoIW9ubHlDb250ZW50cykgew0KICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8ZGl2IGNsYXNzPSdhY2VfbGluZScgc3R5bGU9J2hlaWdodDoiLA0KICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmxpbmVIZWlnaHQsICJweCIsDQogICAgICAgICAgICAgICAgIic+Ig0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2VuLnZhbHVlOw0KDQogICAgICAgICAgICBpZiAoY2hhcnMgKyB2YWx1ZS5sZW5ndGggPCBzcGxpdENoYXJzKSB7DQogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uID0gc2VsZi4kcmVuZGVyVG9rZW4oDQogICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIsIHNjcmVlbkNvbHVtbiwgdG9rZW4sIHZhbHVlDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBjaGFycyArPSB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICB3aGlsZSAoY2hhcnMgKyB2YWx1ZS5sZW5ndGggPj0gc3BsaXRDaGFycykgew0KICAgICAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gPSBzZWxmLiRyZW5kZXJUb2tlbigNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIsIHNjcmVlbkNvbHVtbiwgDQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdmFsdWUuc3Vic3RyaW5nKDAsIHNwbGl0Q2hhcnMgLSBjaGFycykNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoc3BsaXRDaGFycyAtIGNoYXJzKTsNCiAgICAgICAgICAgICAgICAgICAgY2hhcnMgPSBzcGxpdENoYXJzOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmx5Q29udGVudHMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPC9kaXY+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nYWNlX2xpbmUnIHN0eWxlPSdoZWlnaHQ6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5saW5lSGVpZ2h0LCAicHgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICInPiINCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBzcGxpdCArKzsNCiAgICAgICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uID0gMDsNCiAgICAgICAgICAgICAgICAgICAgc3BsaXRDaGFycyA9IHNwbGl0c1tzcGxpdF0gfHwgTnVtYmVyLk1BWF9WQUxVRTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPSAwKSB7DQogICAgICAgICAgICAgICAgICAgIGNoYXJzICs9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uID0gc2VsZi4kcmVuZGVyVG9rZW4oDQogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLCBzY3JlZW5Db2x1bW4sIHRva2VuLCB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnNob3dJbnZpc2libGVzKSB7DQogICAgICAgICAgICBpZiAobGFzdFJvdyAhPT0gdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpIC0gMSkNCiAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goIjxzcGFuIGNsYXNzPSdhY2VfaW52aXNpYmxlJz4iICsgdGhpcy5FT0xfQ0hBUiArICI8L3NwYW4+Iik7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+IiArIHRoaXMuRU9GX0NIQVIgKyAiPC9zcGFuPiIpOw0KICAgICAgICB9DQogICAgICAgIGlmICghb25seUNvbnRlbnRzKQ0KICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8L2Rpdj4iKTsNCiAgICB9Ow0KDQogICAgdGhpcy4kcmVuZGVyTGluZSA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIHJvdywgdG9rZW5zLCBvbmx5Q29udGVudHMpIHsNCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxpbmUgdG8gcmVuZGVyIGlzIGZvbGRlZCBvciBub3QuIElmIG5vdCwgdGhpbmdzIGFyZQ0KICAgICAgICAvLyBzaW1wbGUsIG90aGVyd2lzZSwgd2UgbmVlZCB0byBmYWtlIHNvbWUgdGhpbmdzLi4uDQogICAgICAgIGlmICghdGhpcy5zZXNzaW9uLmlzUm93Rm9sZGVkKHJvdykpIHsNCiAgICAgICAgICAgIHZhciBzcGxpdHMgPSB0aGlzLnNlc3Npb24uZ2V0Um93U3BsaXREYXRhKHJvdyk7DQogICAgICAgICAgICB0aGlzLiRyZW5kZXJMaW5lQ29yZShzdHJpbmdCdWlsZGVyLCByb3csIHRva2Vucywgc3BsaXRzLCBvbmx5Q29udGVudHMpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy4kcmVuZGVyRm9sZExpbmUoc3RyaW5nQnVpbGRlciwgcm93LCB0b2tlbnMsIG9ubHlDb250ZW50cyk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kcmVuZGVyRm9sZExpbmUgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByb3csIHRva2Vucywgb25seUNvbnRlbnRzKSB7DQogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uLA0KICAgICAgICAgICAgZm9sZExpbmUgPSBzZXNzaW9uLmdldEZvbGRMaW5lKHJvdyksDQogICAgICAgICAgICByZW5kZXJUb2tlbnMgPSBbXTsNCg0KICAgICAgICBmdW5jdGlvbiBhZGRUb2tlbnModG9rZW5zLCBmcm9tLCB0bykgew0KICAgICAgICAgICAgdmFyIGlkeCA9IDAsIGNvbCA9IDA7DQogICAgICAgICAgICB3aGlsZSAoKGNvbCArIHRva2Vuc1tpZHhdLnZhbHVlLmxlbmd0aCkgPCBmcm9tKSB7DQogICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1tpZHhdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBpZHgrKzsNCg0KICAgICAgICAgICAgICAgIGlmIChpZHggPT0gdG9rZW5zLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGNvbCAhPSBmcm9tKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdG9rZW5zW2lkeF0udmFsdWUuc3Vic3RyaW5nKGZyb20gLSBjb2wpOw0KICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0b2tlbiB2YWx1ZSBpcyBsb25nZXIgdGhlbiB0aGUgZnJvbS4uLnRvIHNwYWNpbmcuDQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+ICh0byAtIGZyb20pKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHRvIC0gZnJvbSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmVuZGVyVG9rZW5zLnB1c2goew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2tlbnNbaWR4XS50eXBlLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgIGNvbCA9IGZyb20gKyB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgaWR4ICs9IDE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHdoaWxlIChjb2wgPCB0bykgew0KICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2Vuc1tpZHhdLnZhbHVlOw0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggKyBjb2wgPiB0bykgew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB0byAtIGNvbCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJlbmRlclRva2Vucy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5zW2lkeF0udHlwZSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgY29sICs9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBpZHggKz0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZvbGRMaW5lLndhbGsoZnVuY3Rpb24ocGxhY2Vob2xkZXIsIHJvdywgY29sdW1uLCBsYXN0Q29sdW1uLCBpc05ld1Jvdykgew0KICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7DQogICAgICAgICAgICAgICByZW5kZXJUb2tlbnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJmb2xkIiwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBsYWNlaG9sZGVyDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChpc05ld1Jvdykgew0KICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggIT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBhZGRUb2tlbnModG9rZW5zLCBsYXN0Q29sdW1uLCBjb2x1bW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfS5iaW5kKHRoaXMpLCBmb2xkTGluZS5lbmQucm93LCB0aGlzLnNlc3Npb24uZ2V0TGluZShmb2xkTGluZS5lbmQucm93KS5sZW5ndGgpOw0KDQogICAgICAgIC8vIFRPRE86IEJ1aWxkIGEgZmFrZSBzcGxpdHMgYXJyYXkhDQogICAgICAgIHZhciBzcGxpdHMgPSB0aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlP3RoaXMuc2Vzc2lvbi4kd3JhcERhdGFbcm93XTpudWxsOw0KICAgICAgICB0aGlzLiRyZW5kZXJMaW5lQ29yZShzdHJpbmdCdWlsZGVyLCByb3csIHJlbmRlclRva2Vucywgc3BsaXRzLCBvbmx5Q29udGVudHMpOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kdXNlTGluZUdyb3VwcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAvLyBGb3IgdGhlIHVwZGF0ZUxpbmVzIGZ1bmN0aW9uIHRvIHdvcmsgY29ycmVjdGx5LCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZQ0KICAgICAgICAvLyBjaGlsZCBub2RlcyBvZiB0aGlzLmVsZW1lbnQgY29ycmVzcG9uZCBvbiBhIDEtdG8tMSBiYXNpcyB0byByb3dzIGluIHRoZSANCiAgICAgICAgLy8gZG9jdW1lbnQgKGFzIGRpc3RpbmN0IGZyb20gbGluZXMgb24gdGhlIHNjcmVlbikuIEZvciBzZXNzaW9ucyB0aGF0IGFyZQ0KICAgICAgICAvLyB3cmFwcGVkLCB0aGlzIG1lYW5zIHdlIG5lZWQgdG8gYWRkIGEgbGF5ZXIgdG8gdGhlIG5vZGUgaGllcmFyY2h5ICh0YWdnZWQNCiAgICAgICAgLy8gd2l0aCB0aGUgY2xhc3MgbmFtZSBhY2VfbGluZV9ncm91cCkuDQogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKTsNCiAgICB9Ow0KDQogICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpOw0KICAgICAgICBpZiAodGhpcy4kbWVhc3VyZU5vZGUpDQogICAgICAgICAgICB0aGlzLiRtZWFzdXJlTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJG1lYXN1cmVOb2RlKTsNCiAgICAgICAgZGVsZXRlIHRoaXMuJG1lYXN1cmVOb2RlOw0KICAgIH07DQoNCn0pLmNhbGwoVGV4dC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLlRleHQgPSBUZXh0Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGF5ZXIvY3Vyc29yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCg0KdmFyIEN1cnNvciA9IGZ1bmN0aW9uKHBhcmVudEVsKSB7DQogICAgdGhpcy5lbGVtZW50ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiYWNlX2xheWVyIGFjZV9jdXJzb3ItbGF5ZXIiOw0KICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7DQoNCiAgICB0aGlzLmN1cnNvciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmN1cnNvci5jbGFzc05hbWUgPSAiYWNlX2N1cnNvciBhY2VfaGlkZGVuIjsNCiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jdXJzb3IpOw0KDQogICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHBhZGRpbmcgPSAwOw0KICAgIHRoaXMuc2V0UGFkZGluZyA9IGZ1bmN0aW9uKHBhZGRpbmcpIHsNCiAgICAgICAgdGhpcy4kcGFkZGluZyA9IHBhZGRpbmc7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5oaWRlQ3Vyc29yID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7DQogICAgICAgIGRvbS5hZGRDc3NDbGFzcyh0aGlzLmN1cnNvciwgImFjZV9oaWRkZW4iKTsNCiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmJsaW5rSWQpOw0KICAgIH07DQoNCiAgICB0aGlzLnNob3dDdXJzb3IgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlOw0KICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jdXJzb3IsICJhY2VfaGlkZGVuIik7DQogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7DQogICAgICAgIHRoaXMucmVzdGFydFRpbWVyKCk7DQogICAgfTsNCg0KICAgIHRoaXMucmVzdGFydFRpbWVyID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5ibGlua0lkKTsNCiAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuY3Vyc29yOw0KICAgICAgICB0aGlzLmJsaW5rSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGN1cnNvci5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIGN1cnNvci5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KICAgICAgICAgICAgfSwgNDAwKTsNCiAgICAgICAgfSwgMTAwMCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0UGl4ZWxQb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBvblNjcmVlbikgew0KICAgICAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLnNlc3Npb24pIHsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgbGVmdCA6IDAsDQogICAgICAgICAgICAgICAgdG9wIDogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghcG9zaXRpb24pDQogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCk7DQogICAgICAgIHZhciBwb3MgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHBvc2l0aW9uKTsNCiAgICAgICAgdmFyIGN1cnNvckxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuJHBhZGRpbmcgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmNvbHVtbiAqIHRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKTsNCiAgICAgICAgdmFyIGN1cnNvclRvcCA9IChwb3Mucm93IC0gKG9uU2NyZWVuID8gdGhpcy5jb25maWcuZmlyc3RSb3dTY3JlZW4gOiAwKSkgKg0KICAgICAgICAgICAgdGhpcy5jb25maWcubGluZUhlaWdodDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbGVmdCA6IGN1cnNvckxlZnQsDQogICAgICAgICAgICB0b3AgOiBjdXJzb3JUb3ANCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbihjb25maWcpIHsNCiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7DQoNCiAgICAgICAgdGhpcy5waXhlbFBvcyA9IHRoaXMuZ2V0UGl4ZWxQb3NpdGlvbihudWxsLCB0cnVlKTsNCg0KICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5sZWZ0ID0gdGhpcy5waXhlbFBvcy5sZWZ0ICsgInB4IjsNCiAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUudG9wID0gIHRoaXMucGl4ZWxQb3MudG9wICsgInB4IjsNCiAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUud2lkdGggPSBjb25maWcuY2hhcmFjdGVyV2lkdGggKyAicHgiOw0KICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5oZWlnaHQgPSBjb25maWcubGluZUhlaWdodCArICJweCI7DQoNCiAgICAgICAgdmFyIG92ZXJ3cml0ZSA9IHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKQ0KICAgICAgICBpZiAob3ZlcndyaXRlICE9IHRoaXMub3ZlcndyaXRlKSB7DQogICAgICAgICAgICB0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsNCiAgICAgICAgICAgIGlmIChvdmVyd3JpdGUpDQogICAgICAgICAgICAgICAgZG9tLmFkZENzc0NsYXNzKHRoaXMuY3Vyc29yLCAiYWNlX292ZXJ3cml0ZSIpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyh0aGlzLmN1cnNvciwgImFjZV9vdmVyd3JpdGUiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMucmVzdGFydFRpbWVyKCk7DQogICAgfTsNCg0KICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYmxpbmtJZCk7DQogICAgfQ0KDQp9KS5jYWxsKEN1cnNvci5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkN1cnNvciA9IEN1cnNvcjsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQ0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3Njcm9sbGJhcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBkb20gPSByZXF1aXJlKCIuL2xpYi9kb20iKTsNCnZhciBldmVudCA9IHJlcXVpcmUoIi4vbGliL2V2ZW50Iik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KdmFyIFNjcm9sbEJhciA9IGZ1bmN0aW9uKHBhcmVudCkgew0KICAgIHRoaXMuZWxlbWVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9zYiI7DQoNCiAgICB0aGlzLmlubmVyID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyKTsNCg0KICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpOw0KDQogICAgLy8gaW4gT1NYIGxpb24gdGhlIHNjcm9sbGJhcnMgYXBwZWFyIHRvIGhhdmUgbm8gd2lkdGguIEluIHRoaXMgY2FzZSByZXNpemUNCiAgICAvLyB0aGUgdG8gc2hvdyB0aGUgc2Nyb2xsYmFyIGJ1dCBzdGlsbCBwcmV0ZW5kIHRoYXQgdGhlIHNjcm9sbGJhciBoYXMgYSB3aWR0aA0KICAgIC8vIG9mIDBweA0KICAgIC8vIGluIEZpcmVmb3ggNisgc2Nyb2xsYmFyIGlzIGhpZGRlbiBpZiBlbGVtZW50IGhhcyB0aGUgc2FtZSB3aWR0aCBhcyBzY3JvbGxiYXINCiAgICAvLyBtYWtlIGVsZW1lbnQgYSBsaXR0bGUgYml0IHdpZGVyIHRvIHJldGFpbiBzY3JvbGxiYXIgd2hlbiBwYWdlIGlzIHpvb21lZCANCiAgICB0aGlzLndpZHRoID0gZG9tLnNjcm9sbGJhcldpZHRoKHBhcmVudC5vd25lckRvY3VtZW50KTsNCiAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSAodGhpcy53aWR0aCB8fCAxNSkgKyA1ICsgInB4IjsNCg0KICAgIGV2ZW50LmFkZExpc3RlbmVyKHRoaXMuZWxlbWVudCwgInNjcm9sbCIsIHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5vblNjcm9sbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJzY3JvbGwiLCB7ZGF0YTogdGhpcy5lbGVtZW50LnNjcm9sbFRvcH0pOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFdpZHRoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLndpZHRoOw0KICAgIH07DQoNCiAgICB0aGlzLnNldEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgew0KICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgInB4IjsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRJbm5lckhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgew0KICAgICAgICB0aGlzLmlubmVyLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24oc2Nyb2xsVG9wKSB7DQogICAgICAgIHRoaXMuZWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7DQogICAgfTsNCg0KfSkuY2FsbChTY3JvbGxCYXIucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5TY3JvbGxCYXIgPSBTY3JvbGxCYXI7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvcmVuZGVybG9vcCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi9saWIvZXZlbnQiKTsNCg0KdmFyIFJlbmRlckxvb3AgPSBmdW5jdGlvbihvblJlbmRlciwgd2luKSB7DQogICAgdGhpcy5vblJlbmRlciA9IG9uUmVuZGVyOw0KICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOw0KICAgIHRoaXMuY2hhbmdlcyA9IDA7DQogICAgdGhpcy53aW5kb3cgPSB3aW4gfHwgd2luZG93Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5zY2hlZHVsZSA9IGZ1bmN0aW9uKGNoYW5nZSkgew0KICAgICAgICAvL3RoaXMub25SZW5kZXIoY2hhbmdlKTsNCiAgICAgICAgLy9yZXR1cm47DQogICAgICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlcyB8IGNoYW5nZTsNCiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmcpIHsNCiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7DQogICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgICAgICAgICAgZXZlbnQubmV4dFRpY2soZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgX3NlbGYucGVuZGluZyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHZhciBjaGFuZ2VzOw0KICAgICAgICAgICAgICAgIHdoaWxlIChjaGFuZ2VzID0gX3NlbGYuY2hhbmdlcykgew0KICAgICAgICAgICAgICAgICAgICBfc2VsZi5jaGFuZ2VzID0gMDsNCiAgICAgICAgICAgICAgICAgICAgX3NlbGYub25SZW5kZXIoY2hhbmdlcyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwgdGhpcy53aW5kb3cpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChSZW5kZXJMb29wLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuUmVuZGVyTG9vcCA9IFJlbmRlckxvb3A7DQp9KTsNCmRlZmluZSgidGV4dCFhY2UvY3NzL2VkaXRvci5jc3MiLCBbXSwgIkBpbXBvcnQgdXJsKC8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Ecm9pZCtTYW5zK01vbm8pO1xuIiArDQogICJcbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZWRpdG9yIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIG92ZXJmbG93OiBoaWRkZW47XG4iICsNCiAgIiAgICBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsICdEcm9pZCBTYW5zIE1vbm8nLCAnQ29uc29sYXMnLCBtb25vc3BhY2U7XG4iICsNCiAgIiAgICBmb250LXNpemU6IDEycHg7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2Vfc2Nyb2xsZXIge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgb3ZlcmZsb3cteDogc2Nyb2xsO1xuIiArDQogICIgICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2NvbnRlbnQge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKw0KICAiICAgIGN1cnNvcjogdGV4dDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9jb21wb3NpdGlvbiB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kOiAjNTU1O1xuIiArDQogICIgICAgY29sb3I6ICNEREQ7XG4iICsNCiAgIiAgICB6LWluZGV4OiA0O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2d1dHRlciB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsNCiAgIiAgICBvdmVyZmxvdyA6IGhpZGRlbjtcbiIgKw0KICAiICAgIGhlaWdodDogMTAwJTtcbiIgKw0KICAiICAgIHdpZHRoOiBhdXRvO1xuIiArDQogICIgICAgY3Vyc29yOiBkZWZhdWx0O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2d1dHRlci1jZWxsIHtcbiIgKw0KICAiICAgIHBhZGRpbmctbGVmdDogMTlweDtcbiIgKw0KICAiICAgIHBhZGRpbmctcmlnaHQ6IDZweDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9ndXR0ZXItY2VsbC5hY2VfZXJyb3Ige1xuIiArDQogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9naWYsR0lGODlhJTEwJTAwJTEwJTAwJUQ1JTAwJTAwJUY1b3IlRjUlODclODglRjVuciVGNG5zJUVCbXElRjV6JTdGJURESlQlREVLUyVERk9XJUYxWWMlRjJhaCVDRSg3JUNFKTglRDE4RSVERCU0ME0lRjJLWiVFQlUlNjAlRjQlNjBtJURDaXIlQzglMTYoJUM4JTE5KiVDRSUyNTUlRjElM0ZSJUYxJTNGUyVFNiVBQiVCNSVDQSU1REklQ0VuJTVFJUY3JUEyJTlBJUM5RyUzRSVFMGElNUIlRjclODklODUlRjV5eSVGNiU4MiU4MCVFRCU4MiU4MCVGRiVCRiVCRiVFMyVDNCVDNCVGRiVGRiVGRiVGRiVGRiVGRiUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCElRjklMDQlMDElMDAlMDAlMjUlMDAlMkMlMDAlMDAlMDAlMDAlMTAlMDAlMTAlMDAlMDAlMDZwJUMwJTkycEglMkMlMUElOEYlQzglRDJIJTkzJUUxZDQlMjMlRTQlODglRDMlMDltQiUxRE4lQjQ4JUY1JTkwJTQwJTYwJTkyRyU1QiU5NCUyMCUzRSUyMiVEMiU4NyUyNCVGQSUyMCUyNCVDNSUwNkElMDAlMjAlQjElMDclMDJCJUEzOCU4OVgudiUxNyU4MiUxMSUxM3ElMTAlMEZpJTI0JTBGJThCJTEwJTdCRCUxMiUwRWklMDklOTIlMDklMEVwRCUxOCUxNSUyNCUwQSU5Q2klMDUlMEMlMThGJTE4JTBCJTA3JTA0JTAxJTA0JTA2JUEwSCUxOCUxMiUwRCUxNCUwRCUxMiVBMUklQjMlQjQlQjVJQSUwMCUzQlwiKTtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2d1dHRlci1jZWxsLmFjZV93YXJuaW5nIHtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmLEdJRjg5YSUxMCUwMCUxMCUwMCVENSUwMCUwMCVGRiVEQnIlRkYlREUlODElRkYlRTIlOEQlRkYlRTIlOEYlRkYlRTQlOTYlRkYlRTMlOTclRkYlRTUlOUQlRkYlRTYlOUUlRkYlRUUlQzElRkYlQzhaJUZGJUNEayVGRiVEMHMlRkYlRDQlODElRkYlRDUlODIlRkYlRDUlODMlRkYlREMlOTclRkYlREUlOUQlRkYlRTclQjglRkYlQ0NsJTdCUSUxMyU4MFUlMTUlODJXJTE2JTgxVSUxNiU4OSU1QiUxOCU4NyU1QiUxOCU4QyU1RSUxQSU5NGQlMUQlQzUlODMtJUM5JTg3JTJGJUM2JTg0LiVDNiU4NS4lQ0QlOEIyJUM5JTg3MSVDQiU4QTMlQ0QlOEI1JURDJTk4JTNGJURGJTlCQiVFMCU5Q0MlRTElQTVVJUNCJTg3MSVDRiU4QjUlRDElOEQ2JURCJTk3JTQwJURGJTlBQiVERCU5OUIlRTMlQjBwJUU3JUNDJUFFJUZGJUZGJUZGJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwISVGOSUwNCUwMSUwMCUwMCUyRiUwMCUyQyUwMCUwMCUwMCUwMCUxMCUwMCUxMCUwMCUwMCUwNmElQzAlOTdwSCUyQyUxQSU4RkglQTElQUJUciUyNSU4NyUyQiUwNCU4MiVGNCU3QyVCOVglOTElMDglQ0IlOTklMUMhJTI2JTEzJTg0KmlKOSglMTVHJUNBJTg0JTE0JTAxJTFBJTk3JTBDJTAzJTgwJTNBJTlBJTNFJTgxJTg0JTNFJTExJTA4JUIxJThCJTIwJTAyJTEyJTBGJTE4JTFBJTBGJTBBJTAzJ0YlMUMlMDQlMEIlMTAlMTYlMTglMTAlMEIlMDUlMUNGJTFELSUwNiUwNyU5QSU5QS0lMUVHJTFCJUEwJUExJUEwVSVBNCVBNSVBNkJBJTAwJTNCXCIpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge1xuIiArDQogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFNUUFBQUFBQUVGQlFWSlNVbDVlWG1Sa1pHdHJhMzkvZjRXRmhZbUppWkdSa2FhbXByeTh2TVBEdzh6TXpOWFYxZHpjM09UazVPcnE2dkR3OFAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQWtBQUJRQUxBQUFBQUFRQUJBQUFBVXVJQ1dPWkdtZWFCbWw1WEd3RkNRU0JHeVhSU0F3dHFRSWlSdWl3SU01Qm9ZVmJFRkl5R0NRb2VKR3JWcHRJUUE3XCIpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZWRpdG9yIC5hY2Vfc2Ige1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuIiArDQogICIgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuIiArDQogICIgICAgcmlnaHQ6IDA7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZWRpdG9yIC5hY2Vfc2IgZGl2IHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIHdpZHRoOiAxcHg7XG4iICsNCiAgIiAgICBsZWZ0OiAwO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2VkaXRvciAuYWNlX3ByaW50X21hcmdpbl9sYXllciB7XG4iICsNCiAgIiAgICB6LWluZGV4OiAwO1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiIgKw0KICAiICAgIG1hcmdpbjogMDtcbiIgKw0KICAiICAgIGxlZnQ6IDA7XG4iICsNCiAgIiAgICBoZWlnaHQ6IDEwMCU7XG4iICsNCiAgIiAgICB3aWR0aDogMTAwJTtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9lZGl0b3IgLmFjZV9wcmludF9tYXJnaW4ge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgaGVpZ2h0OiAxMDAlO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2VkaXRvciB0ZXh0YXJlYSB7XG4iICsNCiAgIiAgICBwb3NpdGlvbjogZml4ZWQ7XG4iICsNCiAgIiAgICB6LWluZGV4OiAwO1xuIiArDQogICIgICAgd2lkdGg6IDEwcHg7XG4iICsNCiAgIiAgICBoZWlnaHQ6IDMwcHg7XG4iICsNCiAgIiAgICBvcGFjaXR5OiAwO1xuIiArDQogICIgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4iICsNCiAgIiAgICBhcHBlYXJhbmNlOiBub25lO1xuIiArDQogICIgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuIiArDQogICIgICAgYm9yZGVyOiBub25lO1xuIiArDQogICIgICAgcmVzaXplOiBub25lO1xuIiArDQogICIgICAgb3V0bGluZTogbm9uZTtcbiIgKw0KICAiICAgIG92ZXJmbG93OiBoaWRkZW47XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfbGF5ZXIge1xuIiArDQogICIgICAgei1pbmRleDogMTtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIG92ZXJmbG93OiBoaWRkZW47XG4iICsNCiAgIiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuIiArDQogICIgICAgaGVpZ2h0OiAxMDAlO1xuIiArDQogICIgICAgd2lkdGg6IDEwMCU7XG4iICsNCiAgIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLyogc2V0dGluZyBwb2ludGVyLWV2ZW50czogYXV0bzsgb24gbm9kZSB1bmRlciB0aGUgbW91c2UsIHdoaWNoIGNoYW5nZXNcbiIgKw0KICAiICAgICAgICBkdXJpbmcgc2Nyb2xsLCB3aWxsIGJyZWFrIG1vdXNlIHdoZWVsIHNjcm9sbGluZyBpbiBTYWZhcmkgKi9cbiIgKw0KICAiICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2d1dHRlciAuYWNlX2xheWVyIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiIgKw0KICAiICAgIG1pbi13aWR0aDogNDBweDtcbiIgKw0KICAiICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuIiArDQogICIgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfdGV4dC1sYXllciB7XG4iICsNCiAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfY2prIHtcbiIgKw0KICAiICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiIgKw0KICAiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9jdXJzb3ItbGF5ZXIge1xuIiArDQogICIgICAgei1pbmRleDogNDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9jdXJzb3Ige1xuIiArDQogICIgICAgei1pbmRleDogNDtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9jdXJzb3IuYWNlX2hpZGRlbiB7XG4iICsNCiAgIiAgICBvcGFjaXR5OiAwLjI7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfbGluZSB7XG4iICsNCiAgIiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgei1pbmRleDogMztcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgei1pbmRleDogNDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIHotaW5kZXg6IDU7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1xuIiArDQogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArDQogICIgICAgei1pbmRleDogMjtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcbiIgKw0KICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKw0KICAiICAgIHotaW5kZXg6IDY7XG4iICsNCiAgIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2xpbmUgLmFjZV9mb2xkIHtcbiIgKw0KICAiICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICBcbiIgKw0KICAiICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiIgKw0KICAiICAgIGhlaWdodDogMTFweDtcbiIgKw0KICAiICAgIG1hcmdpbi10b3A6IC0ycHg7XG4iICsNCiAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuIiArDQogICJcbiIgKw0KICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IFxuIiArDQogICIgICAgICAgIHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMTElMDAlMDAlMDAlMDklMDglMDYlMDAlMDAlMDAlRDQlRTglQzclMEMlMDAlMDAlMDMlMUVpQ0NQSUNDJTIwUHJvZmlsZSUwMCUwMHglMDElODVUJURGayVEM1AlMTQlRkUlREFlJTlEJUIwJUUxJThCJTNBZyUxMSUwOSUzRWglOTFuZFN0QyU5QyVCNmtXJUJBJUNEWiVFQTYlQjchSCU5QiVBNm0lNUMlOUElQzYlMjQlRUR+JUIwJTA3JUQ5JThCbyUzQSVDNXclRjElMDclM0UlRjklMDclMEMlRDklODNvJTdCJTkyJTBEJUM2JTE0YSVGOCVBQyU4OCUyMkwlRjYlMjIlQjMlOUUlOUI0TSdTJTAzJUI5JUY3JUJCJURGJUY5JUVFOSclRTclRTQlNUUlQTAlRjlxWiVEMyUxNCUyRiUwRiUxNFVTTyVDNSVDMiVGQyVDNCVFNCUxNCVERiVGMiUwMSU1RSUxQ0MlMkIlRkNoTSU4QiU4NiUxNkolMjZHJTQwJTBGJUQzJUIyeSVFRiVCMyVGMyUwRSUxRSVDNmx0JUVFbyVERiVBQiVGRWMlRDUlOUElOTUlMEMlMTElRjAlMUMlMjAlQkUlOTQ1JUM0JTIyJUUxWSVBMGklNUMlRDR0JTEzJUUwJUQ2JTg5JUVGJTlEMTUlQzIlQ0RMc1glQTclMDQlMDklMUZnOG9jJTgxJUUxJThDJThEJTIzJTk2ZjQ1JTQwJTlBJTA5JUMyJTA3JUM1QiUzQUslQjglNDA4JTk4aSVFMCVGMyUwRCVEOCVDRSU4MSUxNCVFNCclMjYlQTklOTIuJThCJTNDJUFCRVIlMkYlRTVkRSVCMiUwQyVGNiVGMCUxRnMlODMlRjJfJUIwJUE4JTk0JUU5JTlCJUFEJUU3JTEwJThEbSU5QSUxOU4lRDElN0MlOEElREUlMUY5JTdEcCU4QyVFNiUwMCVENSVDMSUzRl8lMTglQkRBJUI4JTlEcFg2JUUzJUEzNX5CJUNEJTI0JUFFJTExJTI2JUJEJUU3JUVFdGklOTglRURlJTlBJTk3WSklMTIlMjUlMUMlMjQlQkNiVCVBRTNsaSVFNiUwQiUwMyU4OSU5QSVFNiVEMyVFRCVGNFAlOTIlQjAlOUY0JUJGNDNZJUYzJUUzJUVEUCU5NSUwNCVFQjElQzUlRjUlRjZLRiVGNCVCQSVCRCVENyVEQiU5MSU5MyUwNyVFMzUlM0UlQTcpJUQ2JTdGJTQwJUZFJUJEJUY3JUY1ciU4QSVFNXklOTIlRjAlRUIlQjQlMUUlOEQlRDUlRjQlNUIlOTIlM0FWJURCJURCJUU0JUNEJUE2JTIzJUMzJUM0d1ElM0YlMDNIQiU4MiU4RSUxQ2QoJUUwJTkxQiUwQ2ElOUFjJUM0JUFBJUY4TCUxNiUxOSUyMkolQTQlRDJpdFR5JUIyOCVENiUzQiglOTMlOTYlRUQlMUNHeCVDOV8lMEUlQjglNUUlMTYlRjUlNUIlQjIlQjglRjYlRTAlRkIlOUUlREQlMjUlRDclOEUlQkMlMTUlODUlQzUlQjclQTMlRDhRJUVEJUI1JTgxJUU5JUJBJUIyJTEzJTlBJTFCJTdGdWElQTUlQTNuJUUxNyVCOSVFNSU5QiUxQm0lQUIlMEIlMDhRJUZFJThBJUU1JUIxSCU1RWUlQ0FPJTgyUSVEN3U2JUU2JTkwUyU5NyVGQ3UlMEIlQ0YyJTk0JUVFJTI1diUxMlglMEMlQkElQUMlRjAlNUUlRjgqbCUwQU8lODUlMTclQzIlOTclQkYlRDQlQzglQ0UlREUlQUQlMTElQ0IlODBxJTJDJTNFJUFCJTlFUyVDRCVDNiVFQyUyNSVEMkwlRDIlRUJkJUI4JUJGJThBJUY1QiVDNiUxOCVGOSU5MDFDWiU5RCVCRSUyNE0lOUMlOEE5JUYyJURBUCUwQiclMDZ3JTgyJUVCJUU2JUUyJTVDJTJGJUQ3JTA3JTlFJUJCJUNDJTVEJUUxJUZBJUI5JTA4JUFELnIlMjMlOEUlQzIlMTclRjVFJTdDISVGMCVCRTMlQkUlM0VfJUI3byU4OGElQTclREIlQkUlRDNkJUVCJUEzMVolRUIlQkIlRDMlOTElQkElQTIlQjF6JTk0JThGJURCJyVGNiUzRCU4RSVBQSUxMyUxOSVCMiVCMSVCRSVCMX5WJTA4JTJCJUI0JUEyY2pKJUIzdE8lMDAlMDMlMjVtTiU5NyVGMyUwNSU5MyVFRiUxMSU4NCUwQiU3QyU4OCVBRS0lODklOEYlQUJiVyU5ME8lMkIlMEFvJTk5JTBDJTVFJTk3JTBDSSVBRkglRDkuJUIwJTNCJThGJUVEJTAzJUI2UyVENiU1RCVFNmlfczklRjMqcCVFOSUxQiVGRCVDMyVFQi43VSUwNiU1RSUxOSVDMCVEMXMuJTE3JUEwM3UlRTQlMDklQjAlN0MlNUUlMkMlRUIlMTUlREIlMUYlM0MlOUUlQjclODAlOTElM0IlREJjJUFEJTNEbWElQkElOEIlM0VWJUFCJURCdC4lNUIlMUUlMDElQkIlMEYlQUIlRDUlOUYlQ0YlQUElRDUlREQlRTclRTQlN0YlMEJ4JUEzJUZDJTA2JUE5JTIzJTBBJUQ2JUMyJUExXzIlMDAlMDAlMDAlMDlwSFlzJTAwJTAwJTBCJTEzJTAwJTAwJTBCJTEzJTAxJTAwJTlBJTlDJTE4JTAwJTAwJTAwJUI1SURBVCglMTUlQTUlOTElM0QlMEUlMDIhJTEwJTg1YWMlRTElMDUlRDYlQ0UlRDYlQzYlQ0UlRDIlRTglRUQlQ0QlREUlQzAlQzYlRDZOLiVFMFYlRjglM0QlOUNhJTg5MVhIJUMyJUJFJUQ5eSUzRiU5MCElRTYlOUMlQzMlQkZrJUU1JTAxMSVDNi0lRjUlQzhOJTA0JURGJUJEJUZGJTg5JURGdCU4M0ROJTYwJTNFJUYzJUFCJUEwJURFJTFBJTVEZyVCRSUxMFElOTclMUIlNDAlOUMlQThvJTEwJThGJTVFJTgyOCVCNCUxQiU2MCU4NyVGNiUwMiUyNiU4NSUxQ2glMUUlQzElMkIlNUJrJUZGJTg2JUVFJUI3aiUwOSU5QSVEQSU5QiVBQ2UlQTMlRjklRUMlREEhOSVCNCVENSVBNiU4MSU4NiU4NiU5OCVDQyUzQyU1QiU0MCVGQSU4MSVCMyVFOSVDQiUyMyU5NCVDMTZBem8lMDUlRDQlRTElQzElOTVhJTNCJThBJyVBMCVFOCVDQyUxNyUyMiU4NSUxRCVCQSUwMCVBMiVGQSVEQyUwQSU5NCVEMSVEMSU4RCU4QiUzQSU4NCUxN0IlQzclNjAlMUElMjVaJUZDJThEJTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIiksXG4iICsNCiAgIiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMDclMDglMDYlMDAlMDAlMDAlQzQlREQlODBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCUzQUlEQVQ4JTExYyVGQyVGRiVGRiU3RiUxOCUwMyUxQSU2MCUwMSVGMiUzRiVBMCU4OTElODAlMDQlRkYlMTEtJUY4JTE3JTlCSiVFMiUwNSVCMVpEJTgxdiUyNnQlRTclODAlRjglQTMlODJoJUExMiUxQSUyMCVBMyUwMSUwMiUwRiUwMSVCQSUyNSUwNiUwMCUxOSVDMCUwRCVBRUYlRDUlM0VTJTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O1xuIiArDQogICIgICAgY29sb3I6IHRyYW5zcGFyZW50O1xuIiArDQogICJcbiIgKw0KICAiICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuIiArDQogICIgICAgLW1vei1ib3JkZXItcmFkaXVzOiAycHg7XG4iICsNCiAgIiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDtcbiIgKw0KICAiICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiIgKw0KICAiICAgIFxuIiArDQogICIgICAgY3Vyc29yOiBwb2ludGVyO1xuIiArDQogICIgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZGFyayAuYWNlX2ZvbGQge1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2ZvbGQ6aG92ZXJ7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLWltYWdlOiBcbiIgKw0KICAiICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuIiArDQogICIgICAgICAgIHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDA3JTA4JTA2JTAwJTAwJTAwJUM0JUREJTgwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAzSURBVDglMTFjJUZDJUZGJUZGJTdGJTNFJTAzJTFBJTYwJTAxJUYyJTNGJUEzJTg5MSU4MCUwNCVGRlElMjYlRjh3JUMwJUI0MyVBMSVEQiUwQyVFMiU4RiUwQSVBMiU4NSVDQWglODAlOEMlMDYlMDglM0MlMDQlRTglOTYlMTglMDAlQTNTJTBEJUNEJUNGJUQ4JUMxJTlEJTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2RyYWdnaW5nIC5hY2VfY29udGVudCB7XG4iICsNCiAgIiAgICBjdXJzb3I6IG1vdmU7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZm9sZGluZy1lbmFibGVkID4gLmFjZV9ndXR0ZXItY2VsbCB7XG4iICsNCiAgIiAgICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2ZvbGQtd2lkZ2V0IHtcbiIgKw0KICAiICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsNCiAgIlxuIiArDQogICIgICAgbWFyZ2luOiAwIC0xMnB4IDFweCAxcHg7XG4iICsNCiAgIiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4iICsNCiAgIiAgICBoZWlnaHQ6IDE0cHg7XG4iICsNCiAgIiAgICB3aWR0aDogMTFweDtcbiIgKw0KICAiICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTtcbiIgKw0KICAiICAgIFxuIiArDQogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMCUwNSUwOCUwNiUwMCUwMCUwMCU4RG8lMjYlRTUlMDAlMDAlMDA0SURBVHglREFlJThBJUIxJTBEJTAwMCUwQyVDMiVGMiUyQ0slOTYlQkMlRDAlOEY5JTgxJTg4SCVFOSVEMCUwRSU5NiVDMCUxMCU5MiUzRSUwMiU4MCU1RSU4MiVFNCVBOSotJUVFc3clQzglQ0MlMTElRUUlOTZ3JUQ4JURDJUU5KkVoJTBDJTE1MSglMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiIgKw0KICAiICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgNXB4O1xuIiArDQogICJcbiIgKw0KICAiICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9mb2xkLXdpZGdldC5lbmQge1xuIiArDQogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMCUwNSUwOCUwNiUwMCUwMCUwMCU4RG8lMjYlRTUlMDAlMDAlMDA0SURBVHglREFtJUM3JUMxJTA5JTAwMCUwOEMlRDElOEMlRUNFJUM4RSglOEUlRUMlMDIpJTFFWkolRjElQzEnJTA0JTA3SSVFMSVFNSVFRSVDQUwlRjUlQTIlOTklOTklMjIlRTIlRDYlMUZVJUI1JUZFMCVEOXglQTclMjZXejUlMEUlRDUlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiIgKw0KICAifVxuIiArDQogICJcbiIgKw0KICAiLmFjZV9mb2xkLXdpZGdldC5jbG9zZWQge1xuIiArDQogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwMyUwMCUwMCUwMCUwNiUwOCUwNiUwMCUwMCUwMCUwNiVFNSUyNCUwQyUwMCUwMCUwMDlJREFUeCVEQTUlQ0ElQzElMDklMDAwJTA4JTAzJUMwJUFDKiglM0UlMDQlQzElMEQlQkElQjElMjMlQTRVaCVFMCUyMCU4MSVDMCVDQyVGOCU4MiU4MSVBQSVBMiVBQXJHZnIlODglMDglMTElMTElMUMlREQlN0QlRTAlRUUlNUIlRjYlRjYlQ0IlQjglMDVRJTJGJUU5dGFpJUQ5JTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZm9sZC13aWRnZXQ6aG92ZXIge1xuIiArDQogICIgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO1xuIiArDQogICIgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuIiArDQogICIgICAgLW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsNCiAgIiAgICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsNCiAgIiAgICAtd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiIgKw0KICAiICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiIgKw0KICAiICAgIGJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiIgKw0KICAiICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgNHB4O1xuIiArDQogICJ9XG4iICsNCiAgIlxuIiArDQogICIuYWNlX2ZvbGQtd2lkZ2V0OmFjdGl2ZSB7XG4iICsNCiAgIiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuIiArDQogICIgICAgLW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUpO1xuIiArDQogICIgICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUpO1xuIiArDQogICIgICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuIiArDQogICIgICAgYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiIgKw0KICAiICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4iICsNCiAgIn1cbiIgKw0KICAiXG4iICsNCiAgIi5hY2VfZm9sZC13aWRnZXQuaW52YWxpZCB7XG4iICsNCiAgIiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZCNEI0O1xuIiArDQogICIgICAgYm9yZGVyLWNvbG9yOiAjREU1NTU1O1xuIiArDQogICJ9XG4iICsNCiAgIiIpOw0KDQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KdmFyIFdvcmtlckNsaWVudCA9IGZ1bmN0aW9uKHRvcExldmVsTmFtZXNwYWNlcywgcGFja2FnZWRKcywgbW9kLCBjbGFzc25hbWUpIHsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSB0aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7DQoNCiAgICBpZiAobW9kdWxlLnBhY2thZ2VkKSB7DQogICAgICAgIHZhciBiYXNlID0gdGhpcy4kZ3Vlc3NCYXNlUGF0aCgpOw0KICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKGJhc2UgKyBwYWNrYWdlZEpzKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHZhciB3b3JrZXJVcmwgPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsIG51bGwsICJfIikpOw0KICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7DQoNCiAgICAgICAgdmFyIHRsbnMgPSB7fTsNCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRvcExldmVsTmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIG5zID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOw0KICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKG5zLCBudWxsLCAiXyIpLnJlcGxhY2UoLy5qcyQvLCAiIikpOw0KDQogICAgICAgICAgICB0bG5zW25zXSA9IHBhdGg7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoew0KICAgICAgICBpbml0IDogdHJ1ZSwNCiAgICAgICAgdGxuczogdGxucywNCiAgICAgICAgbW9kdWxlOiBtb2QsDQogICAgICAgIGNsYXNzbmFtZTogY2xhc3NuYW1lDQogICAgfSk7DQoNCiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOw0KICAgIHRoaXMuY2FsbGJhY2tzID0ge307DQoNCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHRoaXMuJHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhlKTsNCiAgICAgICAgdGhyb3cgZTsNCiAgICB9Ow0KICAgIHRoaXMuJHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBtc2cgPSBlLmRhdGE7DQogICAgICAgIHN3aXRjaChtc2cudHlwZSkgew0KICAgICAgICAgICAgY2FzZSAibG9nIjoNCiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhtc2cuZGF0YSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgImV2ZW50IjoNCiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdChtc2cubmFtZSwge2RhdGE6IG1zZy5kYXRhfSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgImNhbGwiOg0KICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOw0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgew0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtc2cuZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCl7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQoNCiAgICB0aGlzLiRub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocGF0aCkgew0KICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXSsvLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdA0KICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdA0KICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkNCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQ0KICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsNCiAgICAgICAgcmV0dXJuIHBhdGg7DQogICAgfTsNCg0KICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkNCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7DQoNCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsNCg0KICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7DQogICAgICAgICAgICBpZiAoYmFzZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsNCg0KICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7DQogICAgICAgICAgICBpZiAoIXNyYykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsNCiAgICAgICAgICAgIGlmIChtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7DQogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsNCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsNCiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOw0KICAgICAgICB0aGlzLiRkb2MgPSBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsNCiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgew0KICAgICAgICBpZiAoY2FsbGJhY2spIHsNCiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOw0KICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7DQogICAgICAgICAgICBhcmdzLnB1c2goaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOw0KICAgIH07DQoNCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzDQogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50DQogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkge30NCiAgICB9Ow0KDQogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7DQogICAgICAgIGlmKHRoaXMuJGRvYykNCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7DQoNCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOw0KICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7DQogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7DQogICAgfTsNCg0KICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIGUucmFuZ2UgPSB7DQogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LA0KICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7DQogICAgfTsNCg0KfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RleHRtYXRlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRtIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLXRtIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzZCNzJFNjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1wNCn1cDQogICAgICAgIFwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjogYmx1ZTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7XA0KICBjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHtcDQogIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTMsIDAsIDApO1wNCiAgY29sb3I6IHdoaXRlO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSxcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtcDQogIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IHJnYigzLCAxMDYsIDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfeG1sX3BlIHtcDQogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6ICMwMDAwQTI7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX21hcmt1cGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcDQogIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOnJnYigyOCwgMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXgge1wNCiAgY29sb3I6IHJnYigyNTUsIDAsIDApXA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCjsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhhKXtpZih0eXBlb2YgcmVxdWlyZWpzIT0idW5kZWZpbmVkIil7dmFyIGU9Yi5kZWZpbmU7Yi5kZWZpbmU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0eXBlb2YgYyE9ImZ1bmN0aW9uIj9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKGEsYixmdW5jdGlvbihhLGQsZSl7cmV0dXJuIGJbMl09PSJtb2R1bGUiJiYoZS5wYWNrYWdlZD0hMCksYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0sYi5kZWZpbmUucGFja2FnZWQ9ITA7cmV0dXJufXZhciBmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGQoIiIsYSxiKX07Zi5wYWNrYWdlZD0hMDt2YXIgZz1iO2EmJihiW2FdfHwoYlthXT17fSksZz1iW2FdKSxnLmRlZmluZSYmKGMub3JpZ2luYWw9Zy5kZWZpbmUpLGcuZGVmaW5lPWMsZy5yZXF1aXJlJiYoZC5vcmlnaW5hbD1nLnJlcXVpcmUpLGcucmVxdWlyZT1mfXZhciBhPSIiLGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKSxjPWZ1bmN0aW9uKGEsYixkKXtpZih0eXBlb2YgYSE9InN0cmluZyIpe2Mub3JpZ2luYWw/Yy5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTooY29uc29sZS5lcnJvcigiZHJvcHBpbmcgbW9kdWxlIGJlY2F1c2UgZGVmaW5lIHdhc24ndCBhIHN0cmluZy4iKSxjb25zb2xlLnRyYWNlKCkpO3JldHVybn1hcmd1bWVudHMubGVuZ3RoPT0yJiYoZD1iKSxjLm1vZHVsZXN8fChjLm1vZHVsZXM9e30pLGMubW9kdWxlc1thXT1kfSxkPWZ1bmN0aW9uKGEsYixjKXtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik9PT0iW29iamVjdCBBcnJheV0iKXt2YXIgZT1bXTtmb3IodmFyIGc9MCxoPWIubGVuZ3RoO2c8aDsrK2cpe3ZhciBpPWYoYSxiW2ddKTtpZighaSYmZC5vcmlnaW5hbClyZXR1cm4gZC5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTtlLnB1c2goaSl9YyYmYy5hcHBseShudWxsLGUpfWVsc2V7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgaj1mKGEsYik7cmV0dXJuIWomJmQub3JpZ2luYWw/ZC5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTooYyYmYygpLGopfWlmKGQub3JpZ2luYWwpcmV0dXJuIGQub3JpZ2luYWwuYXBwbHkod2luZG93LGFyZ3VtZW50cyl9fSxlPWZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKCIhIikhPT0tMSl7dmFyIGM9Yi5zcGxpdCgiISIpO3JldHVybiBlKGEsY1swXSkrIiEiK2UoYSxjWzFdKX1pZihiLmNoYXJBdCgwKT09Ii4iKXt2YXIgZD1hLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuam9pbigiLyIpO2I9ZCsiLyIrYjt3aGlsZShiLmluZGV4T2YoIi4iKSE9PS0xJiZmIT1iKXt2YXIgZj1iO2I9Yi5yZXBsYWNlKC9cL1wuXC8vLCIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCIiKX19cmV0dXJuIGJ9LGY9ZnVuY3Rpb24oYSxiKXtiPWUoYSxiKTt2YXIgZj1jLm1vZHVsZXNbYl07aWYoIWYpcmV0dXJuIG51bGw7aWYodHlwZW9mIGY9PSJmdW5jdGlvbiIpe3ZhciBnPXt9LGg9e2lkOmIsdXJpOiIiLGV4cG9ydHM6ZyxwYWNrYWdlZDohMH0saT1mdW5jdGlvbihhLGMpe3JldHVybiBkKGIsYSxjKX0saj1mKGksZyxoKTtyZXR1cm4gZz1qfHxoLmV4cG9ydHMsYy5tb2R1bGVzW2JdPWcsZ31yZXR1cm4gZn07ZyhhKX0pKCksZGVmaW5lKCJhY2UvYWNlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9lZGl0b3IiLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3VuZG9tYW5hZ2VyIiwiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvdGhlbWUvdGV4dG1hdGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGEoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIGQ9YSgiLi9saWIvZG9tIiksZT1hKCIuL2xpYi9ldmVudCIpLGY9YSgiLi9lZGl0b3IiKS5FZGl0b3IsZz1hKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGg9YSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyLGk9YSgiLi92aXJ0dWFsX3JlbmRlcmVyIikuVmlydHVhbFJlbmRlcmVyO2EoIi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKSxiLmVkaXQ9ZnVuY3Rpb24oYil7dHlwZW9mIGI9PSJzdHJpbmciJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dmFyIGM9bmV3IGcoZC5nZXRJbm5lclRleHQoYikpO2Muc2V0VW5kb01hbmFnZXIobmV3IGgpLGIuaW5uZXJIVE1MPSIiO3ZhciBqPW5ldyBmKG5ldyBpKGIsYSgiLi90aGVtZS90ZXh0bWF0ZSIpKSk7ai5zZXRTZXNzaW9uKGMpO3ZhciBrPXt9O3JldHVybiBrLmRvY3VtZW50PWMsay5lZGl0b3I9aixqLnJlc2l6ZSgpLGUuYWRkTGlzdGVuZXIod2luZG93LCJyZXNpemUiLGZ1bmN0aW9uKCl7ai5yZXNpemUoKX0pLGIuZW52PWssai5lbnY9ayxqfX0pLGRlZmluZSgiYWNlL2xpYi9maXhvbGRicm93c2VycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvcmVnZXhwIiwiYWNlL2xpYi9lczUtc2hpbSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCIsYSgiLi9yZWdleHAiKSxhKCIuL2VzNS1zaGltIil9KSxkZWZpbmUoImFjZS9saWIvcmVnZXhwIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuKGEuZ2xvYmFsPyJnIjoiIikrKGEuaWdub3JlQ2FzZT8iaSI6IiIpKyhhLm11bHRpbGluZT8ibSI6IiIpKyhhLmV4dGVuZGVkPyJ4IjoiIikrKGEuc3RpY2t5PyJ5IjoiIil9ZnVuY3Rpb24gaChhLGIsYyl7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpcmV0dXJuIGEuaW5kZXhPZihiLGMpO2Zvcih2YXIgZD1jfHwwO2Q8YS5sZW5ndGg7ZCsrKWlmKGFbZF09PT1iKXJldHVybiBkO3JldHVybi0xfSJ1c2Ugc3RyaWN0Ijt2YXIgZD17ZXhlYzpSZWdFeHAucHJvdG90eXBlLmV4ZWMsdGVzdDpSZWdFeHAucHJvdG90eXBlLnRlc3QsbWF0Y2g6U3RyaW5nLnByb3RvdHlwZS5tYXRjaCxyZXBsYWNlOlN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxzcGxpdDpTdHJpbmcucHJvdG90eXBlLnNwbGl0fSxlPWQuZXhlYy5jYWxsKC8oKT8/LywiIilbMV09PT11bmRlZmluZWQsZj1mdW5jdGlvbigpe3ZhciBhPS9eL2c7cmV0dXJuIGQudGVzdC5jYWxsKGEsIiIpLCFhLmxhc3RJbmRleH0oKTtSZWdFeHAucHJvdG90eXBlLmV4ZWM9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5leGVjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLGk7aWYodHlwZW9mIGE9PSJzdHJpbmciJiZiKXshZSYmYi5sZW5ndGg+MSYmaChiLCIiKT4tMSYmKGk9UmVnRXhwKHRoaXMuc291cmNlLGQucmVwbGFjZS5jYWxsKGcodGhpcyksImciLCIiKSksZC5yZXBsYWNlLmNhbGwoYS5zbGljZShiLmluZGV4KSxpLGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTE7YTxhcmd1bWVudHMubGVuZ3RoLTI7YSsrKWFyZ3VtZW50c1thXT09PXVuZGVmaW5lZCYmKGJbYV09dW5kZWZpbmVkKX0pKTtpZih0aGlzLl94cmVnZXhwJiZ0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcylmb3IodmFyIGo9MTtqPGIubGVuZ3RoO2orKyljPXRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2otMV0sYyYmKGJbY109YltqXSk7IWYmJnRoaXMuZ2xvYmFsJiYhYlswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PmIuaW5kZXgmJnRoaXMubGFzdEluZGV4LS19cmV0dXJuIGJ9LGZ8fChSZWdFeHAucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5leGVjLmNhbGwodGhpcyxhKTtyZXR1cm4gYiYmdGhpcy5nbG9iYWwmJiFiWzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+Yi5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLSwhIWJ9KX0pLGRlZmluZSgiYWNlL2xpYi9lczUtc2hpbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBwKGEpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsInNlbnRpbmVsIix7fSksInNlbnRpbmVsImluIGF9Y2F0Y2goYil7fX1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYodHlwZW9mIGMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD1nLmNhbGwoYXJndW1lbnRzLDEpLGU9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIGE9ZnVuY3Rpb24oKXt9O2EucHJvdG90eXBlPWMucHJvdG90eXBlO3ZhciBmPW5ldyBhLGg9Yy5hcHBseShmLGQuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIGghPT1udWxsJiZPYmplY3QoaCk9PT1oP2g6Zn1yZXR1cm4gYy5hcHBseShiLGQuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSl9O3JldHVybiBlfSk7dmFyIGQ9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsZT1BcnJheS5wcm90b3R5cGUsZj1PYmplY3QucHJvdG90eXBlLGc9ZS5zbGljZSxoPWQuYmluZChmLnRvU3RyaW5nKSxpPWQuYmluZChmLmhhc093blByb3BlcnR5KSxqLGssbCxtLG47aWYobj1pKGYsIl9fZGVmaW5lR2V0dGVyX18iKSlqPWQuYmluZChmLl9fZGVmaW5lR2V0dGVyX18pLGs9ZC5iaW5kKGYuX19kZWZpbmVTZXR0ZXJfXyksbD1kLmJpbmQoZi5fX2xvb2t1cEdldHRlcl9fKSxtPWQuYmluZChmLl9fbG9va3VwU2V0dGVyX18pO0FycmF5LmlzQXJyYXl8fChBcnJheS5pc0FycmF5PWZ1bmN0aW9uKGIpe3JldHVybiBoKGIpPT0iW29iamVjdCBBcnJheV0ifSksQXJyYXkucHJvdG90eXBlLmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9YXJndW1lbnRzWzFdLGU9MCxmPWMubGVuZ3RoPj4+MDtpZihoKGIpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7d2hpbGUoZTxmKWUgaW4gYyYmYi5jYWxsKGQsY1tlXSxlLGMpLGUrK30pLEFycmF5LnByb3RvdHlwZS5tYXB8fChBcnJheS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGIpe3ZhciBjPUcodGhpcyksZD1jLmxlbmd0aD4+PjAsZT1BcnJheShkKSxmPWFyZ3VtZW50c1sxXTtpZihoKGIpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBnPTA7ZzxkO2crKylnIGluIGMmJihlW2ddPWIuY2FsbChmLGNbZ10sZyxjKSk7cmV0dXJuIGV9KSxBcnJheS5wcm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9Yy5sZW5ndGg+Pj4wLGU9W10sZj1hcmd1bWVudHNbMV07aWYoaChiKSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgZz0wO2c8ZDtnKyspZyBpbiBjJiZiLmNhbGwoZixjW2ddLGcsYykmJmUucHVzaChjW2ddKTtyZXR1cm4gZX0pLEFycmF5LnByb3RvdHlwZS5ldmVyeXx8KEFycmF5LnByb3RvdHlwZS5ldmVyeT1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9Yy5sZW5ndGg+Pj4wLGU9YXJndW1lbnRzWzFdO2lmKGgoYikhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjtmb3IodmFyIGY9MDtmPGQ7ZisrKWlmKGYgaW4gYyYmIWIuY2FsbChlLGNbZl0sZixjKSlyZXR1cm4hMTtyZXR1cm4hMH0pLEFycmF5LnByb3RvdHlwZS5zb21lfHwoQXJyYXkucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24oYil7dmFyIGM9Ryh0aGlzKSxkPWMubGVuZ3RoPj4+MCxlPWFyZ3VtZW50c1sxXTtpZihoKGIpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBmPTA7ZjxkO2YrKylpZihmIGluIGMmJmIuY2FsbChlLGNbZl0sZixjKSlyZXR1cm4hMDtyZXR1cm4hMX0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2V8fChBcnJheS5wcm90b3R5cGUucmVkdWNlPWZ1bmN0aW9uKGIpe3ZhciBjPUcodGhpcyksZD1jLmxlbmd0aD4+PjA7aWYoaChiKSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCFkJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGU9MCxmO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpZj1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihlIGluIGMpe2Y9Y1tlKytdO2JyZWFrfWlmKCsrZT49ZCl0aHJvdyBuZXcgVHlwZUVycm9yfXdoaWxlKCEwKTtmb3IoO2U8ZDtlKyspZSBpbiBjJiYoZj1iLmNhbGwodm9pZCAwLGYsY1tlXSxlLGMpKTtyZXR1cm4gZn0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodHx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodD1mdW5jdGlvbihiKXt2YXIgYz1HKHRoaXMpLGQ9Yy5sZW5ndGg+Pj4wO2lmKGgoYikhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjtpZighZCYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBlLGY9ZC0xO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpZT1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihmIGluIGMpe2U9Y1tmLS1dO2JyZWFrfWlmKC0tZjwwKXRocm93IG5ldyBUeXBlRXJyb3J9d2hpbGUoITApO2RvIGYgaW4gdGhpcyYmKGU9Yi5jYWxsKHZvaWQgMCxlLGNbZl0sZixjKSk7d2hpbGUoZi0tKTtyZXR1cm4gZX0pLEFycmF5LnByb3RvdHlwZS5pbmRleE9mfHwoQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oYil7dmFyIGM9Ryh0aGlzKSxkPWMubGVuZ3RoPj4+MDtpZighZClyZXR1cm4tMTt2YXIgZT0wO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGU9RShhcmd1bWVudHNbMV0pKSxlPWU+PTA/ZTpNYXRoLm1heCgwLGQrZSk7Zm9yKDtlPGQ7ZSsrKWlmKGUgaW4gYyYmY1tlXT09PWIpcmV0dXJuIGU7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Z8fChBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oYil7dmFyIGM9Ryh0aGlzKSxkPWMubGVuZ3RoPj4+MDtpZighZClyZXR1cm4tMTt2YXIgZT1kLTE7YXJndW1lbnRzLmxlbmd0aD4xJiYoZT1NYXRoLm1pbihlLEUoYXJndW1lbnRzWzFdKSkpLGU9ZT49MD9lOmQtTWF0aC5hYnMoZSk7Zm9yKDtlPj0wO2UtLSlpZihlIGluIGMmJmI9PT1jW2VdKXJldHVybiBlO3JldHVybi0xfSksT2JqZWN0LmdldFByb3RvdHlwZU9mfHwoT2JqZWN0LmdldFByb3RvdHlwZU9mPWZ1bmN0aW9uKGIpe3JldHVybiBiLl9fcHJvdG9fX3x8KGIuY29uc3RydWN0b3I/Yi5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6Zil9KTtpZighT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIG89Ik9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgbm9uLW9iamVjdDogIjtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPWZ1bmN0aW9uKGIsYyl7aWYodHlwZW9mIGIhPSJvYmplY3QiJiZ0eXBlb2YgYiE9ImZ1bmN0aW9uInx8Yj09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihvK2IpO2lmKCFpKGIsYykpcmV0dXJuO3ZhciBkLGUsZztkPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07aWYobil7dmFyIGg9Yi5fX3Byb3RvX187Yi5fX3Byb3RvX189Zjt2YXIgZT1sKGIsYyksZz1tKGIsYyk7Yi5fX3Byb3RvX189aDtpZihlfHxnKXJldHVybiBlJiYoZC5nZXQ9ZSksZyYmKGQuc2V0PWcpLGR9cmV0dXJuIGQudmFsdWU9YltjXSxkfX1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPWZ1bmN0aW9uKGIpe3JldHVybiBPYmplY3Qua2V5cyhiKX0pLE9iamVjdC5jcmVhdGV8fChPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ7aWYoYj09PW51bGwpZD17X19wcm90b19fOm51bGx9O2Vsc2V7aWYodHlwZW9mIGIhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoInR5cGVvZiBwcm90b3R5cGVbIit0eXBlb2YgYisiXSAhPSAnb2JqZWN0JyIpO3ZhciBlPWZ1bmN0aW9uKCl7fTtlLnByb3RvdHlwZT1iLGQ9bmV3IGUsZC5fX3Byb3RvX189Yn1yZXR1cm4gYyE9PXZvaWQgMCYmT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZCxjKSxkfSk7aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KXt2YXIgcT1wKHt9KSxyPXR5cGVvZiBkb2N1bWVudD09InVuZGVmaW5lZCJ8fHAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2lmKCFxfHwhcil2YXIgcz1PYmplY3QuZGVmaW5lUHJvcGVydHl9aWYoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8cyl7dmFyIHQ9IlByb3BlcnR5IGRlc2NyaXB0aW9uIG11c3QgYmUgYW4gb2JqZWN0OiAiLHU9Ik9iamVjdC5kZWZpbmVQcm9wZXJ0eSBjYWxsZWQgb24gbm9uLW9iamVjdDogIix2PSJnZXR0ZXJzICYgc2V0dGVycyBjYW4gbm90IGJlIGRlZmluZWQgb24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7T2JqZWN0LmRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKGIsYyxkKXtpZih0eXBlb2YgYiE9Im9iamVjdCImJnR5cGVvZiBiIT0iZnVuY3Rpb24ifHxiPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKHUrYik7aWYodHlwZW9mIGQhPSJvYmplY3QiJiZ0eXBlb2YgZCE9ImZ1bmN0aW9uInx8ZD09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcih0K2QpO2lmKHMpdHJ5e3JldHVybiBzLmNhbGwoT2JqZWN0LGIsYyxkKX1jYXRjaChlKXt9aWYoaShkLCJ2YWx1ZSIpKWlmKG4mJihsKGIsYyl8fG0oYixjKSkpe3ZhciBnPWIuX19wcm90b19fO2IuX19wcm90b19fPWYsZGVsZXRlIGJbY10sYltjXT1kLnZhbHVlLGIuX19wcm90b19fPWd9ZWxzZSBiW2NdPWQudmFsdWU7ZWxzZXtpZighbil0aHJvdyBuZXcgVHlwZUVycm9yKHYpO2koZCwiZ2V0IikmJmooYixjLGQuZ2V0KSxpKGQsInNldCIpJiZrKGIsYyxkLnNldCl9cmV0dXJuIGJ9fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzfHwoT2JqZWN0LmRlZmluZVByb3BlcnRpZXM9ZnVuY3Rpb24oYixjKXtmb3IodmFyIGQgaW4gYylpKGMsZCkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLGQsY1tkXSk7cmV0dXJuIGJ9KSxPYmplY3Quc2VhbHx8KE9iamVjdC5zZWFsPWZ1bmN0aW9uKGIpe3JldHVybiBifSksT2JqZWN0LmZyZWV6ZXx8KE9iamVjdC5mcmVlemU9ZnVuY3Rpb24oYil7cmV0dXJuIGJ9KTt0cnl7T2JqZWN0LmZyZWV6ZShmdW5jdGlvbigpe30pfWNhdGNoKHcpe09iamVjdC5mcmVlemU9ZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiB0eXBlb2YgYz09ImZ1bmN0aW9uIj9jOmIoYyl9fShPYmplY3QuZnJlZXplKX1PYmplY3QucHJldmVudEV4dGVuc2lvbnN8fChPYmplY3QucHJldmVudEV4dGVuc2lvbnM9ZnVuY3Rpb24oYil7cmV0dXJuIGJ9KSxPYmplY3QuaXNTZWFsZWR8fChPYmplY3QuaXNTZWFsZWQ9ZnVuY3Rpb24oYil7cmV0dXJuITF9KSxPYmplY3QuaXNGcm96ZW58fChPYmplY3QuaXNGcm96ZW49ZnVuY3Rpb24oYil7cmV0dXJuITF9KSxPYmplY3QuaXNFeHRlbnNpYmxlfHwoT2JqZWN0LmlzRXh0ZW5zaWJsZT1mdW5jdGlvbihiKXtpZihPYmplY3QoYik9PT1iKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGM9IiI7d2hpbGUoaShiLGMpKWMrPSI/IjtiW2NdPSEwO3ZhciBkPWkoYixjKTtyZXR1cm4gZGVsZXRlIGJbY10sZH0pO2lmKCFPYmplY3Qua2V5cyl7dmFyIHg9ITAseT1bInRvU3RyaW5nIiwidG9Mb2NhbGVTdHJpbmciLCJ2YWx1ZU9mIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjb25zdHJ1Y3RvciJdLHo9eS5sZW5ndGg7Zm9yKHZhciBBIGlue3RvU3RyaW5nOm51bGx9KXg9ITE7T2JqZWN0LmtleXM9ZnVuY3Rpb24gSChhKXtpZih0eXBlb2YgYSE9Im9iamVjdCImJnR5cGVvZiBhIT0iZnVuY3Rpb24ifHxhPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIEg9W107Zm9yKHZhciBiIGluIGEpaShhLGIpJiZILnB1c2goYik7aWYoeClmb3IodmFyIGM9MCxkPXo7YzxkO2MrKyl7dmFyIGU9eVtjXTtpKGEsZSkmJkgucHVzaChlKX1yZXR1cm4gSH19aWYoIURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nfHwobmV3IERhdGUoLTYyMTk4NzU1MmU1KSkudG9JU09TdHJpbmcoKS5pbmRleE9mKCItMDAwMDAxIik9PT0tMSlEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3ZhciBiLGMsZCxlO2lmKCFpc0Zpbml0ZSh0aGlzKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcjtiPVt0aGlzLmdldFVUQ01vbnRoKCkrMSx0aGlzLmdldFVUQ0RhdGUoKSx0aGlzLmdldFVUQ0hvdXJzKCksdGhpcy5nZXRVVENNaW51dGVzKCksdGhpcy5nZXRVVENTZWNvbmRzKCldLGU9dGhpcy5nZXRVVENGdWxsWWVhcigpLGU9KGU8MD8iLSI6ZT45OTk5PyIrIjoiIikrKCIwMDAwMCIrTWF0aC5hYnMoZSkpLnNsaWNlKDA8PWUmJmU8PTk5OTk/LTQ6LTYpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWQ9YltjXSxkPDEwJiYoYltjXT0iMCIrZCk7cmV0dXJuIGUrIi0iK2Iuc2xpY2UoMCwyKS5qb2luKCItIikrIlQiK2Iuc2xpY2UoMikuam9pbigiOiIpKyIuIisoIjAwMCIrdGhpcy5nZXRVVENNaWxsaXNlY29uZHMoKSkuc2xpY2UoLTMpKyJaIn07RGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSksRGF0ZS5wcm90b3R5cGUudG9KU09OfHwoRGF0ZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGIpe2lmKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKX0pLERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpIT09ODY0ZTEzJiYoRGF0ZT1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbiBlKGIsYyxkLGYsZyxoLGkpe3ZhciBqPWFyZ3VtZW50cy5sZW5ndGg7aWYodGhpcyBpbnN0YW5jZW9mIGEpe3ZhciBrPWo9PTEmJlN0cmluZyhiKT09PWI/bmV3IGEoZS5wYXJzZShiKSk6aj49Nz9uZXcgYShiLGMsZCxmLGcsaCxpKTpqPj02P25ldyBhKGIsYyxkLGYsZyxoKTpqPj01P25ldyBhKGIsYyxkLGYsZyk6aj49ND9uZXcgYShiLGMsZCxmKTpqPj0zP25ldyBhKGIsYyxkKTpqPj0yP25ldyBhKGIsYyk6aj49MT9uZXcgYShiKTpuZXcgYTtyZXR1cm4gay5jb25zdHJ1Y3Rvcj1lLGt9cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjPW5ldyBSZWdFeHAoIl4oXFxkezR9fFsrLV1cXGR7Nn0pKD86LShcXGR7Mn0pKD86LShcXGR7Mn0pKD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86WnwoPzooWy0rXSkoXFxkezJ9KTooXFxkezJ9KSkpPyk/KT8pPyQiKTtmb3IodmFyIGQgaW4gYSliW2RdPWFbZF07cmV0dXJuIGIubm93PWEubm93LGIuVVRDPWEuVVRDLGIucHJvdG90eXBlPWEucHJvdG90eXBlLGIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIsYi5wYXJzZT1mdW5jdGlvbihkKXt2YXIgZT1jLmV4ZWMoZCk7aWYoZSl7ZS5zaGlmdCgpO2Zvcih2YXIgZj0xO2Y8NztmKyspZVtmXT0rKGVbZl18fChmPDM/MTowKSksZj09MSYmZVtmXS0tO3ZhciBnPStlLnBvcCgpLGg9K2UucG9wKCksaT1lLnBvcCgpLGo9MDtpZihpKXtpZihoPjIzfHxnPjU5KXJldHVybiBOYU47aj0oaCo2MCtnKSo2ZTQqKGk9PSIrIj8tMToxKX12YXIgaz0rZVswXTtyZXR1cm4gMDw9ayYmazw9OTk/KGVbMF09ays0MDAsYS5VVEMuYXBwbHkodGhpcyxlKStqLTEyNjIyNzgwOGU1KTphLlVUQy5hcHBseSh0aGlzLGUpK2p9cmV0dXJuIGEucGFyc2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxifShEYXRlKSk7dmFyIEI9Ilx0XG4LXGZcciDCoOGagOGgjuKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOe+7vyI7aWYoIVN0cmluZy5wcm90b3R5cGUudHJpbXx8Qi50cmltKCkpe0I9IlsiK0IrIl0iO3ZhciBDPW5ldyBSZWdFeHAoIl4iK0IrQisiKiIpLEQ9bmV3IFJlZ0V4cChCK0IrIiokIik7U3RyaW5nLnByb3RvdHlwZS50cmltPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKEMsIiIpLnJlcGxhY2UoRCwiIil9fXZhciBFPWZ1bmN0aW9uKGEpe3JldHVybiBhPSthLGEhPT1hP2E9MDphIT09MCYmYSE9PTEvMCYmYSE9PS1JbmZpbml0eSYmKGE9KGE+MHx8LTEpKk1hdGguZmxvb3IoTWF0aC5hYnMoYSkpKSxhfSxGPSJhIlswXSE9ImEiLEc9ZnVuY3Rpb24oYSl7aWYoYT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yO3JldHVybiBGJiZ0eXBlb2YgYT09InN0cmluZyImJmE/YS5zcGxpdCgiIik6T2JqZWN0KGEpfX0pLGRlZmluZSgiYWNlL2xpYi9kb20iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjtiLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhifHxkLGEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSl9LGIuc2V0VGV4dD1mdW5jdGlvbihhLGIpe2EuaW5uZXJUZXh0IT09dW5kZWZpbmVkJiYoYS5pbm5lclRleHQ9YiksYS50ZXh0Q29udGVudCE9PXVuZGVmaW5lZCYmKGEudGV4dENvbnRlbnQ9Yil9LGIuaGFzQ3NzQ2xhc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpO3JldHVybiBjLmluZGV4T2YoYikhPT0tMX0sYi5hZGRDc3NDbGFzcz1mdW5jdGlvbihhLGMpe2IuaGFzQ3NzQ2xhc3MoYSxjKXx8KGEuY2xhc3NOYW1lKz0iICIrYyl9LGIucmVtb3ZlQ3NzQ2xhc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpO2Zvcig7Oyl7dmFyIGQ9Yy5pbmRleE9mKGIpO2lmKGQ9PS0xKWJyZWFrO2Muc3BsaWNlKGQsMSl9YS5jbGFzc05hbWU9Yy5qb2luKCIgIil9LGIudG9nZ2xlQ3NzQ2xhc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpLGQ9ITA7Zm9yKDs7KXt2YXIgZT1jLmluZGV4T2YoYik7aWYoZT09LTEpYnJlYWs7ZD0hMSxjLnNwbGljZShlLDEpfXJldHVybiBkJiZjLnB1c2goYiksYS5jbGFzc05hbWU9Yy5qb2luKCIgIiksZH0sYi5zZXRDc3NDbGFzcz1mdW5jdGlvbihhLGMsZCl7ZD9iLmFkZENzc0NsYXNzKGEsYyk6Yi5yZW1vdmVDc3NDbGFzcyhhLGMpfSxiLmhhc0Nzc1N0cmluZz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZDtiPWJ8fGRvY3VtZW50O2lmKGIuY3JlYXRlU3R5bGVTaGVldCYmKGQ9Yi5zdHlsZVNoZWV0cykpe3doaWxlKGM8ZC5sZW5ndGgpaWYoZFtjKytdLm93bmluZ0VsZW1lbnQuaWQ9PT1hKXJldHVybiEwfWVsc2UgaWYoZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpKXdoaWxlKGM8ZC5sZW5ndGgpaWYoZFtjKytdLmlkPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sYi5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24oYyxlLGYpe2Y9Znx8ZG9jdW1lbnQ7aWYoZSYmYi5oYXNDc3NTdHJpbmcoZSxmKSlyZXR1cm4gbnVsbDt2YXIgZztpZihmLmNyZWF0ZVN0eWxlU2hlZXQpZz1mLmNyZWF0ZVN0eWxlU2hlZXQoKSxnLmNzc1RleHQ9YyxlJiYoZy5vd25pbmdFbGVtZW50LmlkPWUpO2Vsc2V7Zz1mLmNyZWF0ZUVsZW1lbnROUz9mLmNyZWF0ZUVsZW1lbnROUyhkLCJzdHlsZSIpOmYuY3JlYXRlRWxlbWVudCgic3R5bGUiKSxnLmFwcGVuZENoaWxkKGYuY3JlYXRlVGV4dE5vZGUoYykpLGUmJihnLmlkPWUpO3ZhciBoPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Zi5kb2N1bWVudEVsZW1lbnQ7aC5hcHBlbmRDaGlsZChnKX19LGIuaW1wb3J0Q3NzU3R5bHNoZWV0PWZ1bmN0aW9uKGEsYyl7aWYoYy5jcmVhdGVTdHlsZVNoZWV0KWMuY3JlYXRlU3R5bGVTaGVldChhKTtlbHNle3ZhciBkPWIuY3JlYXRlRWxlbWVudCgibGluayIpO2QucmVsPSJzdHlsZXNoZWV0IixkLmhyZWY9YTt2YXIgZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O2UuYXBwZW5kQ2hpbGQoZCl9fSxiLmdldElubmVyV2lkdGg9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGIuY29tcHV0ZWRTdHlsZShhLCJwYWRkaW5nTGVmdCIpLDEwKStwYXJzZUludChiLmNvbXB1dGVkU3R5bGUoYSwicGFkZGluZ1JpZ2h0IiksMTApK2EuY2xpZW50V2lkdGh9LGIuZ2V0SW5uZXJIZWlnaHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGIuY29tcHV0ZWRTdHlsZShhLCJwYWRkaW5nVG9wIiksMTApK3BhcnNlSW50KGIuY29tcHV0ZWRTdHlsZShhLCJwYWRkaW5nQm90dG9tIiksMTApK2EuY2xpZW50SGVpZ2h0fSx3aW5kb3cucGFnZVlPZmZzZXQhPT11bmRlZmluZWQ/KGIuZ2V0UGFnZVNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucGFnZVlPZmZzZXR9LGIuZ2V0UGFnZVNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0fSk6KGIuZ2V0UGFnZVNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcH0sYi5nZXRQYWdlU2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR9KSx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZT9iLmNvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj8od2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIil8fHt9KVtiXXx8IiI6d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIil8fHt9fTpiLmNvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9hLmN1cnJlbnRTdHlsZVtiXTphLmN1cnJlbnRTdHlsZX0sYi5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbihhKXt2YXIgYz1iLmNyZWF0ZUVsZW1lbnQoInAiKTtjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLm1pbldpZHRoPSIwcHgiLGMuc3R5bGUuaGVpZ2h0PSIyMDBweCI7dmFyIGQ9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuc3R5bGU7ZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUubGVmdD0iLTEwMDAwcHgiLGUub3ZlcmZsb3c9ImhpZGRlbiIsZS53aWR0aD0iMjAwcHgiLGUubWluV2lkdGg9IjBweCIsZS5oZWlnaHQ9IjE1MHB4IixkLmFwcGVuZENoaWxkKGMpO3ZhciBmPWEuYm9keXx8YS5kb2N1bWVudEVsZW1lbnQ7Zi5hcHBlbmRDaGlsZChkKTt2YXIgZz1jLm9mZnNldFdpZHRoO2Uub3ZlcmZsb3c9InNjcm9sbCI7dmFyIGg9Yy5vZmZzZXRXaWR0aDtyZXR1cm4gZz09aCYmKGg9ZC5jbGllbnRXaWR0aCksZi5yZW1vdmVDaGlsZChkKSxnLWh9LGIuc2V0SW5uZXJIdG1sPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5jbG9uZU5vZGUoITEpO3JldHVybiBjLmlubmVySFRNTD1iLGEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYyxhKSxjfSxiLnNldElubmVyVGV4dD1mdW5jdGlvbihhLGIpe3ZhciBjPWEub3duZXJEb2N1bWVudDtjLmJvZHkmJiJ0ZXh0Q29udGVudCJpbiBjLmJvZHk/YS50ZXh0Q29udGVudD1iOmEuaW5uZXJUZXh0PWJ9LGIuZ2V0SW5uZXJUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiPWEub3duZXJEb2N1bWVudDtyZXR1cm4gYi5ib2R5JiYidGV4dENvbnRlbnQiaW4gYi5ib2R5P2EudGV4dENvbnRlbnQ6YS5pbm5lclRleHR8fGEudGV4dENvbnRlbnR8fCIifSxiLmdldFBhcmVudFdpbmRvdz1mdW5jdGlvbihhKXtyZXR1cm4gYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d9fSksZGVmaW5lKCJhY2UvbGliL2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEsYixjKXt2YXIgZj0wO2UuaXNPcGVyYSYmZS5pc01hYz9mPTB8KGIubWV0YUtleT8xOjApfChiLmFsdEtleT8yOjApfChiLnNoaWZ0S2V5PzQ6MCl8KGIuY3RybEtleT84OjApOmY9MHwoYi5jdHJsS2V5PzE6MCl8KGIuYWx0S2V5PzI6MCl8KGIuc2hpZnRLZXk/NDowKXwoYi5tZXRhS2V5Pzg6MCk7aWYoYyBpbiBkLk1PRElGSUVSX0tFWVMpe3N3aXRjaChkLk1PRElGSUVSX0tFWVNbY10pe2Nhc2UiQWx0IjpmPTI7YnJlYWs7Y2FzZSJTaGlmdCI6Zj00O2JyZWFrO2Nhc2UiQ3RybCI6Zj0xO2JyZWFrO2RlZmF1bHQ6Zj04fWM9MH1yZXR1cm4gZiY4JiYoYz09OTF8fGM9PTkzKSYmKGM9MCksISFmfHxjIGluIGQuRlVOQ1RJT05fS0VZU3x8YyBpbiBkLlBSSU5UQUJMRV9LRVlTP2EoYixmLGMpOiExfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2tleXMiKSxlPWEoIi4vdXNlcmFnZW50IiksZj1hKCIuL2RvbSIpO2IuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilyZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSk7aWYoYS5hdHRhY2hFdmVudCl7dmFyIGQ9ZnVuY3Rpb24oKXtjKHdpbmRvdy5ldmVudCl9O2MuX3dyYXBwZXI9ZCxhLmF0dGFjaEV2ZW50KCJvbiIrYixkKX19LGIucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucmVtb3ZlRXZlbnRMaXN0ZW5lcilyZXR1cm4gYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSk7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYy5fd3JhcHBlcnx8Yyl9LGIuc3RvcEV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBiLnN0b3BQcm9wYWdhdGlvbihhKSxiLnByZXZlbnREZWZhdWx0KGEpLCExfSxiLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOmEuY2FuY2VsQnViYmxlPSEwfSxiLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9LGIuZ2V0RG9jdW1lbnRYPWZ1bmN0aW9uKGEpe3JldHVybiBhLmNsaWVudFg/YS5jbGllbnRYK2YuZ2V0UGFnZVNjcm9sbExlZnQoKTphLnBhZ2VYfSxiLmdldERvY3VtZW50WT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGllbnRZP2EuY2xpZW50WStmLmdldFBhZ2VTY3JvbGxUb3AoKTphLnBhZ2VZfSxiLmdldEJ1dHRvbj1mdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0iZGJsY2xpY2siPzA6YS50eXBlPT0iY29udGV4dG1lbnUiPzI6YS5wcmV2ZW50RGVmYXVsdD9hLmJ1dHRvbjp7MTowLDI6Miw0OjF9W2EuYnV0dG9uXX0sZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldENhcHR1cmU/Yi5jYXB0dXJlPWZ1bmN0aW9uKGEsYyxkKXtmdW5jdGlvbiBlKGEpe3JldHVybiBjKGEpLGIuc3RvcFByb3BhZ2F0aW9uKGEpfWZ1bmN0aW9uIGcoZSl7YyhlKSxmfHwoZj0hMCxkKGUpKSxiLnJlbW92ZUxpc3RlbmVyKGEsIm1vdXNlbW92ZSIsYyksYi5yZW1vdmVMaXN0ZW5lcihhLCJtb3VzZXVwIixnKSxiLnJlbW92ZUxpc3RlbmVyKGEsImxvc2VjYXB0dXJlIixnKSxhLnJlbGVhc2VDYXB0dXJlKCl9dmFyIGY9ITE7Yi5hZGRMaXN0ZW5lcihhLCJtb3VzZW1vdmUiLGMpLGIuYWRkTGlzdGVuZXIoYSwibW91c2V1cCIsZyksYi5hZGRMaXN0ZW5lcihhLCJsb3NlY2FwdHVyZSIsZyksYS5zZXRDYXB0dXJlKCl9OmIuY2FwdHVyZT1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtiKGEpLGEuc3RvcFByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gZShhKXtiJiZiKGEpLGMmJmMoYSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixkLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixlLCEwKSxhLnN0b3BQcm9wYWdhdGlvbigpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsZCwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZSwhMCl9LGIuYWRkTW91c2VXaGVlbExpc3RlbmVyPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9OCxlPWZ1bmN0aW9uKGEpe2Eud2hlZWxEZWx0YSE9PXVuZGVmaW5lZD9hLndoZWVsRGVsdGFYIT09dW5kZWZpbmVkPyhhLndoZWVsWD0tYS53aGVlbERlbHRhWC9kLGEud2hlZWxZPS1hLndoZWVsRGVsdGFZL2QpOihhLndoZWVsWD0wLGEud2hlZWxZPS1hLndoZWVsRGVsdGEvZCk6YS5heGlzJiZhLmF4aXM9PWEuSE9SSVpPTlRBTF9BWElTPyhhLndoZWVsWD0oYS5kZXRhaWx8fDApKjUsYS53aGVlbFk9MCk6KGEud2hlZWxYPTAsYS53aGVlbFk9KGEuZGV0YWlsfHwwKSo1KSxjKGEpfTtiLmFkZExpc3RlbmVyKGEsIkRPTU1vdXNlU2Nyb2xsIixlKSxiLmFkZExpc3RlbmVyKGEsIm1vdXNld2hlZWwiLGUpfSxiLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXI9ZnVuY3Rpb24oYSxjLGQsZixnKXt2YXIgaD0wLGksaixrPWZ1bmN0aW9uKGEpe2grPTEsaD09MSYmKGk9YS5jbGllbnRYLGo9YS5jbGllbnRZLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtoPTB9LGZ8fDYwMCkpO3ZhciBlPWIuZ2V0QnV0dG9uKGEpPT1jO2lmKCFlfHxNYXRoLmFicyhhLmNsaWVudFgtaSk+NXx8TWF0aC5hYnMoYS5jbGllbnRZLWopPjUpaD0wO2g9PWQmJihoPTAsZyhhKSk7aWYoZSlyZXR1cm4gYi5wcmV2ZW50RGVmYXVsdChhKX07Yi5hZGRMaXN0ZW5lcihhLCJtb3VzZWRvd24iLGspLGUuaXNPbGRJRSYmYi5hZGRMaXN0ZW5lcihhLCJkYmxjbGljayIsayl9LGIuYWRkQ29tbWFuZEtleUxpc3RlbmVyPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yi5hZGRMaXN0ZW5lcjtpZihlLmlzT2xkR2Vja298fGUuaXNPcGVyYSl7dmFyIGY9bnVsbDtkKGEsImtleWRvd24iLGZ1bmN0aW9uKGEpe2Y9YS5rZXlDb2RlfSksZChhLCJrZXlwcmVzcyIsZnVuY3Rpb24oYSl7cmV0dXJuIGcoYyxhLGYpfSl9ZWxzZXt2YXIgaD1udWxsO2QoYSwia2V5ZG93biIsZnVuY3Rpb24oYSl7cmV0dXJuIGg9YS5rZXlJZGVudGlmaWVyfHxhLmtleUNvZGUsZyhjLGEsYS5rZXlDb2RlKX0pfX07aWYod2luZG93LnBvc3RNZXNzYWdlKXt2YXIgaD0xO2IubmV4dFRpY2s9ZnVuY3Rpb24oYSxjKXtjPWN8fHdpbmRvdzt2YXIgZD0iemVyby10aW1lb3V0LW1lc3NhZ2UtIitoO2IuYWRkTGlzdGVuZXIoYywibWVzc2FnZSIsZnVuY3Rpb24gZShmKXtmLmRhdGE9PWQmJihiLnN0b3BQcm9wYWdhdGlvbihmKSxiLnJlbW92ZUxpc3RlbmVyKGMsIm1lc3NhZ2UiLGUpLGEoKSl9KSxjLnBvc3RNZXNzYWdlKGQsIioiKX19ZWxzZSBiLm5leHRUaWNrPWZ1bmN0aW9uKGEsYil7Yj1ifHx3aW5kb3csd2luZG93LnNldFRpbWVvdXQoYSwwKX19KSxkZWZpbmUoImFjZS9saWIva2V5cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL29vcCIpLGU9ZnVuY3Rpb24oKXt2YXIgYT17TU9ESUZJRVJfS0VZUzp7MTY6IlNoaWZ0IiwxNzoiQ3RybCIsMTg6IkFsdCIsMjI0OiJNZXRhIn0sS0VZX01PRFM6e2N0cmw6MSxhbHQ6MixvcHRpb246MixzaGlmdDo0LG1ldGE6OCxjb21tYW5kOjh9LEZVTkNUSU9OX0tFWVM6ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMzoiUmV0dXJuIiwxOToiUGF1c2UiLDI3OiJFc2MiLDMyOiJTcGFjZSIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkxlZnQiLDM4OiJVcCIsMzk6IlJpZ2h0Iiw0MDoiRG93biIsNDQ6IlByaW50Iiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiw5NjoiTnVtcGFkMCIsOTc6Ik51bXBhZDEiLDk4OiJOdW1wYWQyIiw5OToiTnVtcGFkMyIsMTAwOiJOdW1wYWQ0IiwxMDE6Ik51bXBhZDUiLDEwMjoiTnVtcGFkNiIsMTAzOiJOdW1wYWQ3IiwxMDQ6Ik51bXBhZDgiLDEwNToiTnVtcGFkOSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1sb2NrIiwxNDU6IlNjcm9sbGxvY2sifSxQUklOVEFCTEVfS0VZUzp7MzI6IiAiLDQ4OiIwIiw0OToiMSIsNTA6IjIiLDUxOiIzIiw1MjoiNCIsNTM6IjUiLDU0OiI2Iiw1NToiNyIsNTY6IjgiLDU3OiI5Iiw1OToiOyIsNjE6Ij0iLDY1OiJhIiw2NjoiYiIsNjc6ImMiLDY4OiJkIiw2OToiZSIsNzA6ImYiLDcxOiJnIiw3MjoiaCIsNzM6ImkiLDc0OiJqIiw3NToiayIsNzY6ImwiLDc3OiJtIiw3ODoibiIsNzk6Im8iLDgwOiJwIiw4MToicSIsODI6InIiLDgzOiJzIiw4NDoidCIsODU6InUiLDg2OiJ2Iiw4NzoidyIsODg6IngiLDg5OiJ5Iiw5MDoieiIsMTA3OiIrIiwxMDk6Ii0iLDExMDoiLiIsMTg4OiIsIiwxOTA6Ii4iLDE5MToiLyIsMTkyOiJgIiwyMTk6IlsiLDIyMDoiXFwiLDIyMToiXSIsMjIyOiciJ319O2Zvcih2YXIgYiBpbiBhLkZVTkNUSU9OX0tFWVMpe3ZhciBjPWEuRlVOQ1RJT05fS0VZU1tiXS50b1VwcGVyQ2FzZSgpO2FbY109cGFyc2VJbnQoYiwxMCl9cmV0dXJuIGQubWl4aW4oYSxhLk1PRElGSUVSX0tFWVMpLGQubWl4aW4oYSxhLlBSSU5UQUJMRV9LRVlTKSxkLm1peGluKGEsYS5GVU5DVElPTl9LRVlTKSxhfSgpO2QubWl4aW4oYixlKSxiLmtleUNvZGVUb1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4oZVthXXx8U3RyaW5nLmZyb21DaGFyQ29kZShhKSkudG9Mb3dlckNhc2UoKX19KSxkZWZpbmUoImFjZS9saWIvb29wIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixiLmluaGVyaXRzPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt9O3JldHVybiBmdW5jdGlvbihiLGMpe2EucHJvdG90eXBlPWMucHJvdG90eXBlLGIuc3VwZXJfPWMucHJvdG90eXBlLGIucHJvdG90eXBlPW5ldyBhLGIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJ9fSgpLGIubWl4aW49ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119LGIuaW1wbGVtZW50PWZ1bmN0aW9uKGEsYyl7Yi5taXhpbihhLGMpfX0pLGRlZmluZSgiYWNlL2xpYi91c2VyYWdlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPShuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL21hY3x3aW58bGludXgvaSl8fFsib3RoZXIiXSlbMF0udG9Mb3dlckNhc2UoKSxlPW5hdmlnYXRvci51c2VyQWdlbnQ7Yi5pc1dpbj1kPT0id2luIixiLmlzTWFjPWQ9PSJtYWMiLGIuaXNMaW51eD1kPT0ibGludXgiLGIuaXNJRT1uYXZpZ2F0b3IuYXBwTmFtZT09Ik1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciImJnBhcnNlRmxvYXQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoWzAtOV0rW1wuMC05XSspLylbMV0pLGIuaXNPbGRJRT1iLmlzSUUmJmIuaXNJRTw5LGIuaXNHZWNrbz1iLmlzTW96aWxsYT13aW5kb3cuY29udHJvbGxlcnMmJndpbmRvdy5uYXZpZ2F0b3IucHJvZHVjdD09PSJHZWNrbyIsYi5pc09sZEdlY2tvPWIuaXNHZWNrbyYmcGFyc2VJbnQoKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL3J2XDooXGQrKS8pfHxbXSlbMV0sMTApPDQsYi5pc09wZXJhPXdpbmRvdy5vcGVyYSYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYSk9PSJbb2JqZWN0IE9wZXJhXSIsYi5pc1dlYktpdD1wYXJzZUZsb2F0KGUuc3BsaXQoIldlYktpdC8iKVsxXSl8fHVuZGVmaW5lZCxiLmlzQ2hyb21lPXBhcnNlRmxvYXQoZS5zcGxpdCgiIENocm9tZS8iKVsxXSl8fHVuZGVmaW5lZCxiLmlzQUlSPWUuaW5kZXhPZigiQWRvYmVBSVIiKT49MCxiLmlzSVBhZD1lLmluZGV4T2YoImlQYWQiKT49MCxiLmlzVG91Y2hQYWQ9ZS5pbmRleE9mKCJUb3VjaFBhZCIpPj0wLGIuT1M9e0xJTlVYOiJMSU5VWCIsTUFDOiJNQUMiLFdJTkRPV1M6IldJTkRPV1MifSxiLmdldE9TPWZ1bmN0aW9uKCl7cmV0dXJuIGIuaXNNYWM/Yi5PUy5NQUM6Yi5pc0xpbnV4P2IuT1MuTElOVVg6Yi5PUy5XSU5ET1dTfX0pLGRlZmluZSgiYWNlL2VkaXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIiwiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS9zZWFyY2giLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIiwiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGEoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9sYW5nIiksZj1hKCIuL2xpYi91c2VyYWdlbnQiKSxnPWEoIi4va2V5Ym9hcmQvdGV4dGlucHV0IikuVGV4dElucHV0LGg9YSgiLi9tb3VzZS9tb3VzZV9oYW5kbGVyIikuTW91c2VIYW5kbGVyLGk9YSgiLi9tb3VzZS9mb2xkX2hhbmRsZXIiKS5Gb2xkSGFuZGxlcixqPWEoIi4va2V5Ym9hcmQva2V5YmluZGluZyIpLktleUJpbmRpbmcsaz1hKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGw9YSgiLi9zZWFyY2giKS5TZWFyY2gsbT1hKCIuL3JhbmdlIikuUmFuZ2Usbj1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89YSgiLi9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiKS5Db21tYW5kTWFuYWdlcixwPWEoIi4vY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIpLmNvbW1hbmRzLHE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldENvbnRhaW5lckVsZW1lbnQoKTt0aGlzLmNvbnRhaW5lcj1jLHRoaXMucmVuZGVyZXI9YSx0aGlzLnRleHRJbnB1dD1uZXcgZyhhLmdldFRleHRBcmVhQ29udGFpbmVyKCksdGhpcyksdGhpcy5rZXlCaW5kaW5nPW5ldyBqKHRoaXMpLGYuaXNJUGFkfHwodGhpcy4kbW91c2VIYW5kbGVyPW5ldyBoKHRoaXMpLG5ldyBpKHRoaXMpKSx0aGlzLiRibG9ja1Njcm9sbGluZz0wLHRoaXMuJHNlYXJjaD0obmV3IGwpLnNldCh7d3JhcDohMH0pLHRoaXMuY29tbWFuZHM9bmV3IG8oZi5pc01hYz8ibWFjIjoid2luIixwKSx0aGlzLnNldFNlc3Npb24oYnx8bmV3IGsoIiIpKX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsbiksdGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oYSl7dGhpcy5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihhKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLmdldEtleWJvYXJkSGFuZGxlcigpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7aWYodGhpcy5zZXNzaW9uPT1hKXJldHVybjtpZih0aGlzLnNlc3Npb24pe3ZhciBiPXRoaXMuc2Vzc2lvbjt0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG9rZW5pemVyVXBkYXRlIix0aGlzLiRvblRva2VuaXplclVwZGF0ZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm9uQ2hhbmdlRm9sZCIsdGhpcy4kb25DaGFuZ2VGb2xkKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VPdmVyd3JpdGUiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUxlZnRUb3AiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7dmFyIGM9dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKX10aGlzLnNlc3Npb249YSx0aGlzLiRvbkRvY3VtZW50Q2hhbmdlPXRoaXMub25Eb2N1bWVudENoYW5nZS5iaW5kKHRoaXMpLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oYSksdGhpcy4kb25DaGFuZ2VNb2RlPXRoaXMub25DaGFuZ2VNb2RlLmJpbmQodGhpcyksYS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VNb2RlIix0aGlzLiRvbkNoYW5nZU1vZGUpLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlPXRoaXMub25Ub2tlbml6ZXJVcGRhdGUuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZT10aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQuYmluZCh0aGlzLnJlbmRlcmVyKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQ9dGhpcy5vbkNoYW5nZVdyYXBMaW1pdC5iaW5kKHRoaXMpLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcExpbWl0Iix0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCksdGhpcy4kb25DaGFuZ2VXcmFwTW9kZT10aGlzLm9uQ2hhbmdlV3JhcE1vZGUuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBNb2RlIix0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKSx0aGlzLiRvbkNoYW5nZUZvbGQ9dGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlcj10aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcj10aGlzLm9uQ2hhbmdlQmFja01hcmtlci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludD10aGlzLm9uQ2hhbmdlQnJlYWtwb2ludC5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbj10aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbi5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlPXRoaXMub25DdXJzb3JDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2U9dGhpcy5vblNjcm9sbFRvcENoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTY3JvbGxUb3AiLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKSx0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2U9dGhpcy5vblNjcm9sbExlZnRDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsTGVmdCIsdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKSx0aGlzLnNlbGVjdGlvbj1hLmdldFNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlPXRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlbGVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKSx0aGlzLm9uQ2hhbmdlTW9kZSgpLHRoaXMuJGJsb2NrU2Nyb2xsaW5nKz0xLHRoaXMub25DdXJzb3JDaGFuZ2UoKSx0aGlzLiRibG9ja1Njcm9sbGluZy09MSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKCksdGhpcy5vblNjcm9sbExlZnRDaGFuZ2UoKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5vbkNoYW5nZUZyb250TWFya2VyKCksdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIoKSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludCgpLHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uKCksdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMucmVuZGVyZXIuYWRqdXN0V3JhcExpbWl0KCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCksdGhpcy5fZW1pdCgiY2hhbmdlU2Vzc2lvbiIse3Nlc3Npb246YSxvbGRTZXNzaW9uOmJ9KX0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbn0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5vblJlc2l6ZSgpfSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0VGhlbWUoYSl9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRUaGVtZSgpfSx0aGlzLnNldFN0eWxlPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0U3R5bGUoYSl9LHRoaXMudW5zZXRTdHlsZT1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnVuc2V0U3R5bGUoYSl9LHRoaXMuc2V0Rm9udFNpemU9ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXIuc3R5bGUuZm9udFNpemU9YSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZvbnRTaXplKCl9LHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0JiYodGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQpLHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodD1udWxsKTtpZih0aGlzLiRoaWdobGlnaHRQZW5kaW5nKXJldHVybjt2YXIgYT10aGlzO3RoaXMuJGhpZ2hsaWdodFBlbmRpbmc9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2EuJGhpZ2hsaWdodFBlbmRpbmc9ITE7dmFyIGI9YS5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoYS5nZXRDdXJzb3JQb3NpdGlvbigpKTtpZihiKXt2YXIgYz1uZXcgbShiLnJvdyxiLmNvbHVtbixiLnJvdyxiLmNvbHVtbisxKTthLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQ9YS5zZXNzaW9uLmFkZE1hcmtlcihjLCJhY2VfYnJhY2tldCIsInRleHQiKX19LDEwKX0sdGhpcy5mb2N1cz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2EudGV4dElucHV0LmZvY3VzKCl9KSx0aGlzLnRleHRJbnB1dC5mb2N1cygpfSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQoKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7dGhpcy50ZXh0SW5wdXQuYmx1cigpfSx0aGlzLm9uRm9jdXM9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUZvY3VzKCksdGhpcy5fZW1pdCgiZm9jdXMiKX0sdGhpcy5vbkJsdXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmhpZGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUJsdXIoKSx0aGlzLl9lbWl0KCJibHVyIil9LHRoaXMub25Eb2N1bWVudENoYW5nZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGEsYz1iLnJhbmdlLGQ7Yy5zdGFydC5yb3c9PWMuZW5kLnJvdyYmYi5hY3Rpb24hPSJpbnNlcnRMaW5lcyImJmIuYWN0aW9uIT0icmVtb3ZlTGluZXMiP2Q9Yy5lbmQucm93OmQ9SW5maW5pdHksdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhjLnN0YXJ0LnJvdyxkKSx0aGlzLl9lbWl0KCJjaGFuZ2UiLGEpLHRoaXMub25DdXJzb3JDaGFuZ2UoKX0sdGhpcy5vblRva2VuaXplclVwZGF0ZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7dGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhiLmZpcnN0LGIubGFzdCl9LHRoaXMub25TY3JvbGxUb3BDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWSh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkpfSx0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9YKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkpfSx0aGlzLm9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLiRibG9ja1Njcm9sbGluZ3x8dGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpLHRoaXMucmVuZGVyZXIubW92ZVRleHRBcmVhVG9DdXJzb3IodGhpcy50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpKSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cygpLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0sdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U2Vzc2lvbigpO2EuJGhpZ2hsaWdodExpbmVNYXJrZXImJmEucmVtb3ZlTWFya2VyKGEuJGhpZ2hsaWdodExpbmVNYXJrZXIpLGEuJGhpZ2hsaWdodExpbmVNYXJrZXI9bnVsbDtpZih0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmUoKSYmKHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKSE9ImxpbmUifHwhdGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSkpe3ZhciBiPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxjPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShiLnJvdyksZDtjP2Q9bmV3IG0oYy5zdGFydC5yb3csMCxjLmVuZC5yb3crMSwwKTpkPW5ldyBtKGIucm93LDAsYi5yb3crMSwwKSxhLiRoaWdobGlnaHRMaW5lTWFya2VyPWEuYWRkTWFya2VyKGQsImFjZV9hY3RpdmVfbGluZSIsImJhY2tncm91bmQiKX19LHRoaXMub25TZWxlY3Rpb25DaGFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRTZXNzaW9uKCk7Yi4kc2VsZWN0aW9uTWFya2VyJiZiLnJlbW92ZU1hcmtlcihiLiRzZWxlY3Rpb25NYXJrZXIpLGIuJHNlbGVjdGlvbk1hcmtlcj1udWxsO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBjPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCksZD10aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7Yi4kc2VsZWN0aW9uTWFya2VyPWIuYWRkTWFya2VyKGMsImFjZV9zZWxlY3Rpb24iLGQpfWVsc2UgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpO3RoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCYmdGhpcy5zZXNzaW9uLmdldE1vZGUoKS5oaWdobGlnaHRTZWxlY3Rpb24odGhpcyl9LHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnJvbnRNYXJrZXJzKCl9LHRoaXMub25DaGFuZ2VCYWNrTWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2V0QnJlYWtwb2ludHModGhpcy5zZXNzaW9uLmdldEJyZWFrcG9pbnRzKCkpfSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2V0QW5ub3RhdGlvbnModGhpcy5zZXNzaW9uLmdldEFubm90YXRpb25zKCkpfSx0aGlzLm9uQ2hhbmdlTW9kZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlVGV4dCgpfSx0aGlzLm9uQ2hhbmdlV3JhcExpbWl0PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMub25DaGFuZ2VXcmFwTW9kZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIub25SZXNpemUoITApfSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbigpe3RoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRDb3B5VGV4dD1mdW5jdGlvbigpe3ZhciBhPSIiO3JldHVybiB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fChhPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSksdGhpcy5fZW1pdCgiY29weSIsYSksYX0sdGhpcy5vbkN1dD1mdW5jdGlvbigpe2lmKHRoaXMuJHJlYWRPbmx5KXJldHVybjt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5fZW1pdCgiY3V0IixhKSx0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fCh0aGlzLnNlc3Npb24ucmVtb3ZlKGEpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2Vzc2lvbixjPWIuZ2V0TW9kZSgpLGQ9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSl7dmFyIGU9Yy50cmFuc2Zvcm1BY3Rpb24oYi5nZXRTdGF0ZShkLnJvdyksImluc2VydGlvbiIsdGhpcyxiLGEpO2UmJihhPWUudGV4dCl9YT1hLnJlcGxhY2UoIlx0Iix0aGlzLnNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpZD10aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpO2Vsc2UgaWYodGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpKXt2YXIgZj1uZXcgbS5mcm9tUG9pbnRzKGQsZCk7Zi5lbmQuY29sdW1uKz1hLmxlbmd0aCx0aGlzLnNlc3Npb24ucmVtb3ZlKGYpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKTt2YXIgZz1kLmNvbHVtbixoPWIuZ2V0U3RhdGUoZC5yb3cpLGk9Yy5jaGVja091dGRlbnQoaCxiLmdldExpbmUoZC5yb3cpLGEpLGo9Yi5nZXRMaW5lKGQucm93KSxrPWMuZ2V0TmV4dExpbmVJbmRlbnQoaCxqLnNsaWNlKDAsZC5jb2x1bW4pLGIuZ2V0VGFiU3RyaW5nKCkpLGw9Yi5pbnNlcnQoZCxhKTtlJiZlLnNlbGVjdGlvbiYmKGUuc2VsZWN0aW9uLmxlbmd0aD09Mj90aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgbShkLnJvdyxnK2Uuc2VsZWN0aW9uWzBdLGQucm93LGcrZS5zZWxlY3Rpb25bMV0pKTp0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgbShkLnJvdytlLnNlbGVjdGlvblswXSxlLnNlbGVjdGlvblsxXSxkLnJvdytlLnNlbGVjdGlvblsyXSxlLnNlbGVjdGlvblszXSkpKTt2YXIgaD1iLmdldFN0YXRlKGQucm93KTtpZihiLmdldERvY3VtZW50KCkuaXNOZXdMaW5lKGEpKXt0aGlzLm1vdmVDdXJzb3JUbyhkLnJvdysxLDApO3ZhciBuPWIuZ2V0VGFiU2l6ZSgpLG89TnVtYmVyLk1BWF9WQUxVRTtmb3IodmFyIHA9ZC5yb3crMTtwPD1sLnJvdzsrK3Ape3ZhciBxPTA7aj1iLmdldExpbmUocCk7Zm9yKHZhciByPTA7cjxqLmxlbmd0aDsrK3IpaWYoai5jaGFyQXQocik9PSJcdCIpcSs9bjtlbHNle2lmKGouY2hhckF0KHIpIT0iICIpYnJlYWs7cSs9MX0vW15cc10vLnRlc3QoaikmJihvPU1hdGgubWluKHEsbykpfWZvcih2YXIgcD1kLnJvdysxO3A8PWwucm93OysrcCl7dmFyIHM9bztqPWIuZ2V0TGluZShwKTtmb3IodmFyIHI9MDtyPGoubGVuZ3RoJiZzPjA7KytyKWouY2hhckF0KHIpPT0iXHQiP3MtPW46ai5jaGFyQXQocik9PSIgIiYmKHMtPTEpO2IucmVtb3ZlKG5ldyBtKHAsMCxwLHIpKX1iLmluZGVudFJvd3MoZC5yb3crMSxsLnJvdyxrKX1pJiZjLmF1dG9PdXRkZW50KGgsYixkLnJvdyl9LHRoaXMub25UZXh0SW5wdXQ9ZnVuY3Rpb24oYSxiKXtiJiZ0aGlzLl9lbWl0KCJwYXN0ZSIsYSksdGhpcy5rZXlCaW5kaW5nLm9uVGV4dElucHV0KGEsYil9LHRoaXMub25Db21tYW5kS2V5PWZ1bmN0aW9uKGEsYixjKXt0aGlzLmtleUJpbmRpbmcub25Db21tYW5kS2V5KGEsYixjKX0sdGhpcy5zZXRPdmVyd3JpdGU9ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uLnNldE92ZXJ3cml0ZShhKX0sdGhpcy5nZXRPdmVyd3JpdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpfSx0aGlzLnRvZ2dsZU92ZXJ3cml0ZT1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi50b2dnbGVPdmVyd3JpdGUoKX0sdGhpcy5zZXRTY3JvbGxTcGVlZD1mdW5jdGlvbihhKXt0aGlzLiRtb3VzZUhhbmRsZXIuc2V0U2Nyb2xsU3BlZWQoYSl9LHRoaXMuZ2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW91c2VIYW5kbGVyLmdldFNjcm9sbFNwZWVkKCl9LHRoaXMuc2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKGEpe3RoaXMuJG1vdXNlSGFuZGxlci5zZXREcmFnRGVsYXkoYSl9LHRoaXMuZ2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vdXNlSGFuZGxlci5nZXREcmFnRGVsYXkoKX0sdGhpcy4kc2VsZWN0aW9uU3R5bGU9ImxpbmUiLHRoaXMuc2V0U2VsZWN0aW9uU3R5bGU9ZnVuY3Rpb24oYSl7aWYodGhpcy4kc2VsZWN0aW9uU3R5bGU9PWEpcmV0dXJuO3RoaXMuJHNlbGVjdGlvblN0eWxlPWEsdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvblN0eWxlIix7ZGF0YTphfSl9LHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2VsZWN0aW9uU3R5bGV9LHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmU9ITAsdGhpcy5zZXRIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmU9PWEpcmV0dXJuO3RoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmU9YSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCl9LHRoaXMuZ2V0SGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lfSx0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQ9ITAsdGhpcy5zZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQ9ZnVuY3Rpb24oYSl7aWYodGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPT1hKXJldHVybjt0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQ9YSxhP3RoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuaGlnaGxpZ2h0U2VsZWN0aW9uKHRoaXMpOnRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuY2xlYXJTZWxlY3Rpb25IaWdobGlnaHQodGhpcyl9LHRoaXMuZ2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZH0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihhKXtpZih0aGlzLmdldFNob3dJbnZpc2libGVzKCk9PWEpcmV0dXJuO3RoaXMucmVuZGVyZXIuc2V0U2hvd0ludmlzaWJsZXMoYSl9LHRoaXMuZ2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTaG93SW52aXNpYmxlcygpfSx0aGlzLnNldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNldFNob3dQcmludE1hcmdpbihhKX0sdGhpcy5nZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTaG93UHJpbnRNYXJnaW4oKX0sdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNldFByaW50TWFyZ2luQ29sdW1uKGEpfSx0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0UHJpbnRNYXJnaW5Db2x1bW4oKX0sdGhpcy4kcmVhZE9ubHk9ITEsdGhpcy5zZXRSZWFkT25seT1mdW5jdGlvbihhKXt0aGlzLiRyZWFkT25seT1hfSx0aGlzLmdldFJlYWRPbmx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJlYWRPbmx5fSx0aGlzLiRtb2RlQmVoYXZpb3Vycz0hMCx0aGlzLnNldEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKGEpe3RoaXMuJG1vZGVCZWhhdmlvdXJzPWF9LHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW9kZUJlaGF2aW91cnN9LHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyO2lmKGIuZ2V0U2hvd0ZvbGRXaWRnZXRzKCk9PWEpcmV0dXJuO3RoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyLnNldFNob3dGb2xkV2lkZ2V0cyhhKSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9YSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuZ2V0U2hvd0ZvbGRXaWRnZXRzKCl9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmKGE9PSJsZWZ0Ij90aGlzLnNlbGVjdGlvbi5zZWxlY3RMZWZ0KCk6dGhpcy5zZWxlY3Rpb24uc2VsZWN0UmlnaHQoKSk7dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSl7dmFyIGM9dGhpcy5zZXNzaW9uLGQ9Yy5nZXRTdGF0ZShiLnN0YXJ0LnJvdyksZT1jLmdldE1vZGUoKS50cmFuc2Zvcm1BY3Rpb24oZCwiZGVsZXRpb24iLHRoaXMsYyxiKTtlJiYoYj1lKX10aGlzLnNlc3Npb24ucmVtb3ZlKGIpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRSaWdodCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRMZWZ0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVUb0xpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZVN0YXJ0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVUb0xpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVFbmQoKTt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7YS5zdGFydC5jb2x1bW49PWEuZW5kLmNvbHVtbiYmYS5zdGFydC5yb3c9PWEuZW5kLnJvdyYmKGEuZW5kLmNvbHVtbj0wLGEuZW5kLnJvdysrKSx0aGlzLnNlc3Npb24ucmVtb3ZlKGEpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5zcGxpdExpbmU9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fCh0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpKTt2YXIgYT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7dGhpcy5pbnNlcnQoIlxuIiksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihhKX0sdGhpcy50cmFuc3Bvc2VMZXR0ZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSlyZXR1cm47dmFyIGE9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLGI9YS5jb2x1bW47aWYoYj09PTApcmV0dXJuO3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGEucm93KSxkLGU7YjxjLmxlbmd0aD8oZD1jLmNoYXJBdChiKStjLmNoYXJBdChiLTEpLGU9bmV3IG0oYS5yb3csYi0xLGEucm93LGIrMSkpOihkPWMuY2hhckF0KGItMSkrYy5jaGFyQXQoYi0yKSxlPW5ldyBtKGEucm93LGItMixhLnJvdyxiKSksdGhpcy5zZXNzaW9uLnJlcGxhY2UoZSxkKX0sdGhpcy50b0xvd2VyQ2FzZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgYj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksYz10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGIpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKGIsYy50b0xvd2VyQ2FzZSgpKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShhKX0sdGhpcy50b1VwcGVyQ2FzZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgYj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksYz10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGIpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKGIsYy50b1VwcGVyQ2FzZSgpKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShhKX0sdGhpcy5pbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlc3Npb24sYj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYoIShiLnN0YXJ0LnJvdzxiLmVuZC5yb3d8fGIuc3RhcnQuY29sdW1uPGIuZW5kLmNvbHVtbikpe3ZhciBkO2lmKHRoaXMuc2Vzc2lvbi5nZXRVc2VTb2Z0VGFicygpKXt2YXIgZj1hLmdldFRhYlNpemUoKSxnPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxoPWEuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihnLnJvdyxnLmNvbHVtbiksaT1mLWglZjtkPWUuc3RyaW5nUmVwZWF0KCIgIixpKX1lbHNlIGQ9Ilx0IjtyZXR1cm4gdGhpcy5pbnNlcnQoZCl9dmFyIGM9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7YS5pbmRlbnRSb3dzKGMuZmlyc3QsYy5sYXN0LCJcdCIpfSx0aGlzLmJsb2NrT3V0ZGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTt0aGlzLnNlc3Npb24ub3V0ZGVudFJvd3MoYS5nZXRSYW5nZSgpKX0sdGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlc3Npb24uZ2V0U3RhdGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdyksYj10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLnRvZ2dsZUNvbW1lbnRMaW5lcyhhLHRoaXMuc2Vzc2lvbixiLmZpcnN0LGIubGFzdCl9LHRoaXMucmVtb3ZlTGluZXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKSxiO2EuZmlyc3Q9PT0wfHxhLmxhc3QrMTx0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCk/Yj1uZXcgbShhLmZpcnN0LDAsYS5sYXN0KzEsMCk6Yj1uZXcgbShhLmZpcnN0LTEsdGhpcy5zZXNzaW9uLmdldExpbmUoYS5maXJzdC0xKS5sZW5ndGgsYS5sYXN0LHRoaXMuc2Vzc2lvbi5nZXRMaW5lKGEubGFzdCkubGVuZ3RoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKGIpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5tb3ZlTGluZXNEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc2Vzc2lvbi5tb3ZlTGluZXNEb3duKGEsYil9KX0sdGhpcy5tb3ZlTGluZXNVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnNlc3Npb24ubW92ZUxpbmVzVXAoYSxiKX0pfSx0aGlzLm1vdmVUZXh0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuJHJlYWRPbmx5P251bGw6dGhpcy5zZXNzaW9uLm1vdmVUZXh0KGEsYil9LHRoaXMuY29weUxpbmVzVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmR1cGxpY2F0ZUxpbmVzKGEsYiksMH0pfSx0aGlzLmNvcHlMaW5lc0Rvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmR1cGxpY2F0ZUxpbmVzKGEsYil9KX0sdGhpcy4kbW92ZUxpbmVzPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGdldFNlbGVjdGVkUm93cygpLGM9dGhpcy5zZWxlY3Rpb247aWYoIWMuaXNNdWx0aUxpbmUoKSl2YXIgZD1jLmdldFJhbmdlKCksZT1jLmlzQmFja3dhcmRzKCk7dmFyIGY9YS5jYWxsKHRoaXMsYi5maXJzdCxiLmxhc3QpO2Q/KGQuc3RhcnQucm93Kz1mLGQuZW5kLnJvdys9ZixjLnNldFNlbGVjdGlvblJhbmdlKGQsZSkpOihjLnNldFNlbGVjdGlvbkFuY2hvcihiLmxhc3QrZisxLDApLGMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXtjLm1vdmVDdXJzb3JUbyhiLmZpcnN0K2YsMCl9KSl9LHRoaXMuJGdldFNlbGVjdGVkUm93cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5jb2xsYXBzZVJvd3MoKTtyZXR1cm57Zmlyc3Q6YS5zdGFydC5yb3csbGFzdDphLmVuZC5yb3d9fSx0aGlzLm9uQ29tcG9zaXRpb25TdGFydD1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNob3dDb21wb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpfSx0aGlzLm9uQ29tcG9zaXRpb25VcGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy5yZW5kZXJlci5zZXRDb21wb3NpdGlvblRleHQoYSl9LHRoaXMub25Db21wb3NpdGlvbkVuZD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuaGlkZUNvbXBvc2l0aW9uKCl9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RWaXNpYmxlUm93KCl9LHRoaXMuZ2V0TGFzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRMYXN0VmlzaWJsZVJvdygpfSx0aGlzLmlzUm93VmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gYT49dGhpcy5nZXRGaXJzdFZpc2libGVSb3coKSYmYTw9dGhpcy5nZXRMYXN0VmlzaWJsZVJvdygpfSx0aGlzLmlzUm93RnVsbHlWaXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBhPj10aGlzLnJlbmRlcmVyLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93KCkmJmE8PXRoaXMucmVuZGVyZXIuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdygpfSx0aGlzLiRnZXRWaXNpYmxlUm93Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKS10aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpKzF9LHRoaXMuJGdldFBhZ2VEb3duUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCl9LHRoaXMuJGdldFBhZ2VVcFJvdz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCksYj10aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpO3JldHVybiBhLShiLWEpfSx0aGlzLnNlbGVjdFBhZ2VEb3duPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kZ2V0UGFnZURvd25Sb3coKStNYXRoLmZsb29yKHRoaXMuJGdldFZpc2libGVSb3dDb3VudCgpLzIpO3RoaXMuc2Nyb2xsUGFnZURvd24oKTt2YXIgYj10aGlzLmdldFNlbGVjdGlvbigpLGM9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihiLmdldFNlbGVjdGlvbkxlYWQoKSksZD10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGEsYy5jb2x1bW4pO2Iuc2VsZWN0VG8oZC5yb3csZC5jb2x1bW4pfSx0aGlzLnNlbGVjdFBhZ2VVcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCktdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKSxiPXRoaXMuJGdldFBhZ2VVcFJvdygpK01hdGgucm91bmQoYS8yKTt0aGlzLnNjcm9sbFBhZ2VVcCgpO3ZhciBjPXRoaXMuZ2V0U2VsZWN0aW9uKCksZD10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGMuZ2V0U2VsZWN0aW9uTGVhZCgpKSxlPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYixkLmNvbHVtbik7Yy5zZWxlY3RUbyhlLnJvdyxlLmNvbHVtbil9LHRoaXMuZ290b1BhZ2VEb3duPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kZ2V0UGFnZURvd25Sb3coKSxiPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW4oKS5jb2x1bW47dGhpcy5zY3JvbGxUb1JvdyhhKSx0aGlzLmdldFNlbGVjdGlvbigpLm1vdmVDdXJzb3JUb1NjcmVlbihhLGIpfSx0aGlzLmdvdG9QYWdlVXA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnZXRQYWdlVXBSb3coKSxiPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW4oKS5jb2x1bW47dGhpcy5zY3JvbGxUb1JvdyhhKSx0aGlzLmdldFNlbGVjdGlvbigpLm1vdmVDdXJzb3JUb1NjcmVlbihhLGIpfSx0aGlzLnNjcm9sbFBhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUb1Jvdyh0aGlzLiRnZXRQYWdlRG93blJvdygpKX0sdGhpcy5zY3JvbGxQYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvUm93KHRoaXMuJGdldFBhZ2VVcFJvdygpKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvUm93KGEpfSx0aGlzLnNjcm9sbFRvTGluZT1mdW5jdGlvbihhLGIpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9MaW5lKGEsYil9LHRoaXMuY2VudGVyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLGI9TWF0aC5mbG9vcihhLnN0YXJ0LnJvdysoYS5lbmQucm93LWEuc3RhcnQucm93KS8yKTt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvTGluZShiLCEwKX0sdGhpcy5nZXRDdXJzb3JQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKX0sdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSl9LHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKX0sdGhpcy5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt0aGlzLiRibG9ja1Njcm9sbGluZys9MSx0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwoKSx0aGlzLiRibG9ja1Njcm9sbGluZy09MX0sdGhpcy5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubW92ZUN1cnNvclRvPWZ1bmN0aW9uKGEsYil7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKGEsYil9LHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvUG9zaXRpb24oYSl9LHRoaXMuanVtcFRvTWF0Y2hpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksYj10aGlzLnNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldChhKTtifHwoYS5jb2x1bW4rPTEsYj10aGlzLnNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldChhKSksYnx8KGEuY29sdW1uLT0yLGI9dGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoYSkpLGImJih0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5tb3ZlQ3Vyc29yVG8oYi5yb3csYi5jb2x1bW4pKX0sdGhpcy5nb3RvTGluZT1mdW5jdGlvbihhLGIpe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZXNzaW9uLnVuZm9sZCh7cm93OmEtMSxjb2x1bW46Ynx8MH0pLHRoaXMuJGJsb2NrU2Nyb2xsaW5nKz0xLHRoaXMubW92ZUN1cnNvclRvKGEtMSxifHwwKSx0aGlzLiRibG9ja1Njcm9sbGluZy09MSx0aGlzLmlzUm93RnVsbHlWaXNpYmxlKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKS5yb3cpfHx0aGlzLnNjcm9sbFRvTGluZShhLCEwKX0sdGhpcy5uYXZpZ2F0ZVRvPWZ1bmN0aW9uKGEsYil7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMubW92ZUN1cnNvclRvKGEsYil9LHRoaXMubmF2aWdhdGVVcD1mdW5jdGlvbihhKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLGE9YXx8MSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoLWEsMCl9LHRoaXMubmF2aWdhdGVEb3duPWZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksYT1hfHwxLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeShhLDApfSx0aGlzLm5hdmlnYXRlTGVmdD1mdW5jdGlvbihhKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgYj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuc3RhcnQ7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihiKX1lbHNle2E9YXx8MTt3aGlsZShhLS0pdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxlZnQoKX10aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVSaWdodD1mdW5jdGlvbihhKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgYj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuZW5kO3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oYil9ZWxzZXthPWF8fDE7d2hpbGUoYS0tKXRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JSaWdodCgpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUxpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lU3RhcnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVMaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVFbmQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVGaWxlRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVFbmQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRSaWdodCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRMZWZ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oYSxiKXtiJiZ0aGlzLiRzZWFyY2guc2V0KGIpO3ZhciBjPXRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7aWYoIWMpcmV0dXJuO3RoaXMuJHRyeVJlcGxhY2UoYyxhKSxjIT09bnVsbCYmdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYyl9LHRoaXMucmVwbGFjZUFsbD1mdW5jdGlvbihhLGIpe2ImJnRoaXMuJHNlYXJjaC5zZXQoYik7dmFyIGM9dGhpcy4kc2VhcmNoLmZpbmRBbGwodGhpcy5zZXNzaW9uKTtpZighYy5sZW5ndGgpcmV0dXJuO3ZhciBkPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKDAsMCksdGhpcy4kYmxvY2tTY3JvbGxpbmcrPTE7Zm9yKHZhciBlPWMubGVuZ3RoLTE7ZT49MDstLWUpdGhpcy4kdHJ5UmVwbGFjZShjW2VdLGEpO3RoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGQpLHRoaXMuJGJsb2NrU2Nyb2xsaW5nLT0xfSx0aGlzLiR0cnlSZXBsYWNlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShhKTtyZXR1cm4gYj10aGlzLiRzZWFyY2gucmVwbGFjZShjLGIpLGIhPT1udWxsPyhhLmVuZD10aGlzLnNlc3Npb24ucmVwbGFjZShhLGIpLGEpOm51bGx9LHRoaXMuZ2V0TGFzdFNlYXJjaE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2VhcmNoLmdldE9wdGlvbnMoKX0sdGhpcy5maW5kPWZ1bmN0aW9uKGEsYil7dGhpcy5jbGVhclNlbGVjdGlvbigpLGI9Ynx8e30sYi5uZWVkbGU9YSx0aGlzLiRzZWFyY2guc2V0KGIpLHRoaXMuJGZpbmQoKX0sdGhpcy5maW5kTmV4dD1mdW5jdGlvbihhKXthPWF8fHt9LHR5cGVvZiBhLmJhY2t3YXJkcz09InVuZGVmaW5lZCImJihhLmJhY2t3YXJkcz0hMSksdGhpcy4kc2VhcmNoLnNldChhKSx0aGlzLiRmaW5kKCl9LHRoaXMuZmluZFByZXZpb3VzPWZ1bmN0aW9uKGEpe2E9YXx8e30sdHlwZW9mIGEuYmFja3dhcmRzPT0idW5kZWZpbmVkIiYmKGEuYmFja3dhcmRzPSEwKSx0aGlzLiRzZWFyY2guc2V0KGEpLHRoaXMuJGZpbmQoKX0sdGhpcy4kZmluZD1mdW5jdGlvbihhKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fHRoaXMuJHNlYXJjaC5zZXQoe25lZWRsZTp0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSl9KSx0eXBlb2YgYSE9InVuZGVmaW5lZCImJnRoaXMuJHNlYXJjaC5zZXQoe2JhY2t3YXJkczphfSk7dmFyIGI9dGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKTtiJiYodGhpcy5zZXNzaW9uLnVuZm9sZChiKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShiKSl9LHRoaXMudW5kbz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLnVuZG8oKX0sdGhpcy5yZWRvPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkucmVkbygpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmRlc3Ryb3koKX19KSkuY2FsbChxLnByb3RvdHlwZSksYi5FZGl0b3I9cX0pLGRlZmluZSgiYWNlL2xpYi9sYW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixiLnN0cmluZ1JldmVyc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKX0sYi5zdHJpbmdSZXBlYXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4obmV3IEFycmF5KGIrMSkpLmpvaW4oYSl9O3ZhciBkPS9eXHNccyovLGU9L1xzXHMqJC87Yi5zdHJpbmdUcmltTGVmdD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGQsIiIpfSxiLnN0cmluZ1RyaW1SaWdodD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGUsIiIpfSxiLmNvcHlPYmplY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifSxiLmNvcHlBcnJheT1mdW5jdGlvbihhKXt2YXIgYj1bXTtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYVtjXSYmdHlwZW9mIGFbY109PSJvYmplY3QiP2JbY109dGhpcy5jb3B5T2JqZWN0KGFbY10pOmJbY109YVtjXTtyZXR1cm4gYn0sYi5kZWVwQ29weT1mdW5jdGlvbihhKXtpZih0eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuIGE7dmFyIGI9YS5jb25zdHJ1Y3RvcigpO2Zvcih2YXIgYyBpbiBhKXR5cGVvZiBhW2NdPT0ib2JqZWN0Ij9iW2NdPXRoaXMuZGVlcENvcHkoYVtjXSk6YltjXT1hW2NdO3JldHVybiBifSxiLmFycmF5VG9NYXA9ZnVuY3Rpb24oYSl7dmFyIGI9e307Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYlthW2NdXT0xO3JldHVybiBifSxiLmFycmF5UmVtb3ZlPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yzw9YS5sZW5ndGg7YysrKWI9PT1hW2NdJiZhLnNwbGljZShjLDEpfSxiLmVzY2FwZVJlZ0V4cD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csIlxcJDEiKX0sYi5kZWZlcnJlZENhbGw9ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPWZ1bmN0aW9uKCl7Yj1udWxsLGEoKX0sZD1mdW5jdGlvbihhKXtyZXR1cm4gZC5jYW5jZWwoKSxiPXNldFRpbWVvdXQoYyxhfHwwKSxkfTtyZXR1cm4gZC5zY2hlZHVsZT1kLGQuY2FsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbCgpLGEoKSxkfSxkLmNhbmNlbD1mdW5jdGlvbigpe3JldHVybiBjbGVhclRpbWVvdXQoYiksYj1udWxsLGR9LGR9fSksZGVmaW5lKCJhY2Uva2V5Ym9hcmQvdGV4dGlucHV0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9ldmVudCIpLGU9YSgiLi4vbGliL3VzZXJhZ2VudCIpLGY9YSgiLi4vbGliL2RvbSIpLGc9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBsKCl7dHJ5e2Muc2VsZWN0KCl9Y2F0Y2goYSl7fX1mdW5jdGlvbiBtKGEpe2lmKCFpKXt2YXIgZD1hfHxjLnZhbHVlO2lmKGQpe2QuY2hhckNvZGVBdChkLmxlbmd0aC0xKT09Zy5jaGFyQ29kZUF0KDApPyhkPWQuc2xpY2UoMCwtMSksZCYmYi5vblRleHRJbnB1dChkLGopKTpiLm9uVGV4dElucHV0KGQsaik7aWYoIXYoKSlyZXR1cm4hMX19aT0hMSxqPSExLGMudmFsdWU9ZyxsKCl9ZnVuY3Rpb24gdigpe3JldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09Y312YXIgYz1mLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7ZS5pc1RvdWNoUGFkJiZjLnNldEF0dHJpYnV0ZSgieC1wYWxtLWRpc2FibGUtYXV0by1jYXAiLCEwKSxjLnN0eWxlLmxlZnQ9Ii0xMDAwMHB4IixjLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsYS5pbnNlcnRCZWZvcmUoYyxhLmZpcnN0Q2hpbGQpO3ZhciBnPVN0cmluZy5mcm9tQ2hhckNvZGUoMCk7bSgpO3ZhciBoPSExLGk9ITEsaj0hMSxrPSIiLG49ZnVuY3Rpb24oYSl7c2V0VGltZW91dChmdW5jdGlvbigpe2h8fG0oYS5kYXRhKX0sMCl9LG89ZnVuY3Rpb24oYSl7aWYoZS5pc09sZElFJiZjLnZhbHVlLmNoYXJDb2RlQXQoMCk+MTI4KXJldHVybjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aHx8bSgpfSwwKX0scD1mdW5jdGlvbihhKXtoPSEwLGIub25Db21wb3NpdGlvblN0YXJ0KCksZS5pc0dlY2tvfHxzZXRUaW1lb3V0KHEsMCl9LHE9ZnVuY3Rpb24oKXtpZighaClyZXR1cm47Yi5vbkNvbXBvc2l0aW9uVXBkYXRlKGMudmFsdWUpfSxyPWZ1bmN0aW9uKGEpe2g9ITEsYi5vbkNvbXBvc2l0aW9uRW5kKCl9LHM9ZnVuY3Rpb24oYSl7aT0hMDt2YXIgZD1iLmdldENvcHlUZXh0KCk7ZD9jLnZhbHVlPWQ6YS5wcmV2ZW50RGVmYXVsdCgpLGwoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bSgpfSwwKX0sdD1mdW5jdGlvbihhKXtpPSEwO3ZhciBkPWIuZ2V0Q29weVRleHQoKTtkPyhjLnZhbHVlPWQsYi5vbkN1dCgpKTphLnByZXZlbnREZWZhdWx0KCksbCgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXttKCl9LDApfTtkLmFkZENvbW1hbmRLZXlMaXN0ZW5lcihjLGIub25Db21tYW5kS2V5LmJpbmQoYikpO2lmKGUuaXNPbGRJRSl7dmFyIHU9ezEzOjEsMjc6MX07ZC5hZGRMaXN0ZW5lcihjLCJrZXl1cCIsZnVuY3Rpb24oYSl7aCYmKCFjLnZhbHVlfHx1W2Eua2V5Q29kZV0pJiZzZXRUaW1lb3V0KHIsMCk7aWYoKGMudmFsdWUuY2hhckNvZGVBdCgwKXwwKTwxMjkpcmV0dXJuO2g/cSgpOnAoKX0pfSJvbnByb3BlcnR5Y2hhbmdlImluIGMmJiEoIm9uaW5wdXQiaW4gYyk/ZC5hZGRMaXN0ZW5lcihjLCJwcm9wZXJ0eWNoYW5nZSIsbyk6ZC5hZGRMaXN0ZW5lcihjLCJpbnB1dCIsbiksZC5hZGRMaXN0ZW5lcihjLCJwYXN0ZSIsZnVuY3Rpb24oYSl7aj0hMCxhLmNsaXBib2FyZERhdGEmJmEuY2xpcGJvYXJkRGF0YS5nZXREYXRhPyhtKGEuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpLGEucHJldmVudERlZmF1bHQoKSk6bygpfSksIm9uYmVmb3JlY29weSJpbiBjJiZ0eXBlb2YgY2xpcGJvYXJkRGF0YSE9InVuZGVmaW5lZCI/KGQuYWRkTGlzdGVuZXIoYywiYmVmb3JlY29weSIsZnVuY3Rpb24oYSl7dmFyIGM9Yi5nZXRDb3B5VGV4dCgpO2M/Y2xpcGJvYXJkRGF0YS5zZXREYXRhKCJUZXh0IixjKTphLnByZXZlbnREZWZhdWx0KCl9KSxkLmFkZExpc3RlbmVyKGEsImtleWRvd24iLGZ1bmN0aW9uKGEpe2lmKGEuY3RybEtleSYmYS5rZXlDb2RlPT04OCl7dmFyIGM9Yi5nZXRDb3B5VGV4dCgpO2MmJihjbGlwYm9hcmREYXRhLnNldERhdGEoIlRleHQiLGMpLGIub25DdXQoKSksZC5wcmV2ZW50RGVmYXVsdChhKX19KSk6KGQuYWRkTGlzdGVuZXIoYywiY29weSIscyksZC5hZGRMaXN0ZW5lcihjLCJjdXQiLHQpKSxkLmFkZExpc3RlbmVyKGMsImNvbXBvc2l0aW9uc3RhcnQiLHApLGUuaXNHZWNrbyYmZC5hZGRMaXN0ZW5lcihjLCJ0ZXh0IixxKSxlLmlzV2ViS2l0JiZkLmFkZExpc3RlbmVyKGMsImtleXVwIixxKSxkLmFkZExpc3RlbmVyKGMsImNvbXBvc2l0aW9uZW5kIixyKSxkLmFkZExpc3RlbmVyKGMsImJsdXIiLGZ1bmN0aW9uKCl7Yi5vbkJsdXIoKX0pLGQuYWRkTGlzdGVuZXIoYywiZm9jdXMiLGZ1bmN0aW9uKCl7Yi5vbkZvY3VzKCksbCgpfSksdGhpcy5mb2N1cz1mdW5jdGlvbigpe2Iub25Gb2N1cygpLGwoKSxjLmZvY3VzKCl9LHRoaXMuYmx1cj1mdW5jdGlvbigpe2MuYmx1cigpfSx0aGlzLmlzRm9jdXNlZD12LHRoaXMuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBjfSx0aGlzLm9uQ29udGV4dE1lbnU9ZnVuY3Rpb24oYSxiKXthJiYoa3x8KGs9Yy5zdHlsZS5jc3NUZXh0KSxjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmZpeGVkOyB6LWluZGV4OjEwMDA7bGVmdDoiKyhhLngtMikrInB4OyB0b3A6IisoYS55LTIpKyJweDsiKSxiJiYoYy52YWx1ZT0iIil9LHRoaXMub25Db250ZXh0TWVudUNsb3NlPWZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2smJihjLnN0eWxlLmNzc1RleHQ9ayxrPSIiKSxtKCl9LDApfX07Yi5UZXh0SW5wdXQ9Z30pLGRlZmluZSgiYWNlL21vdXNlL21vdXNlX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMiLCJhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIsImFjZS9tb3VzZS9tb3VzZV9ldmVudCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2V2ZW50IiksZT1hKCIuL2RlZmF1bHRfaGFuZGxlcnMiKS5EZWZhdWx0SGFuZGxlcnMsZj1hKCIuL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiKS5HdXR0ZXJIYW5kbGVyLGc9YSgiLi9tb3VzZV9ldmVudCIpLk1vdXNlRXZlbnQsaD1mdW5jdGlvbihhKXt0aGlzLmVkaXRvcj1hLG5ldyBlKGEpLG5ldyBmKGEpLGQuYWRkTGlzdGVuZXIoYS5jb250YWluZXIsIm1vdXNlZG93biIsZnVuY3Rpb24oYil7cmV0dXJuIGEuZm9jdXMoKSxkLnByZXZlbnREZWZhdWx0KGIpfSksZC5hZGRMaXN0ZW5lcihhLmNvbnRhaW5lciwic2VsZWN0c3RhcnQiLGZ1bmN0aW9uKGEpe3JldHVybiBkLnByZXZlbnREZWZhdWx0KGEpfSk7dmFyIGI9YS5yZW5kZXJlci5nZXRNb3VzZUV2ZW50VGFyZ2V0KCk7ZC5hZGRMaXN0ZW5lcihiLCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywibW91c2Vkb3duIikpLGQuYWRkTGlzdGVuZXIoYiwiY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiY2xpY2siKSksZC5hZGRMaXN0ZW5lcihiLCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzLCJtb3VzZW1vdmUiKSksZC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKGIsMCwyLDUwMCx0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImRibGNsaWNrIikpLGQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihiLDAsMyw2MDAsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJ0cmlwbGVjbGljayIpKSxkLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIoYiwwLDQsNjAwLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywicXVhZGNsaWNrIikpLGQuYWRkTW91c2VXaGVlbExpc3RlbmVyKGEuY29udGFpbmVyLHRoaXMub25Nb3VzZVdoZWVsLmJpbmQodGhpcywibW91c2V3aGVlbCIpKTt2YXIgYz1hLnJlbmRlcmVyLiRndXR0ZXI7ZC5hZGRMaXN0ZW5lcihjLCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVybW91c2Vkb3duIikpLGQuYWRkTGlzdGVuZXIoYywiY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVyY2xpY2siKSksZC5hZGRMaXN0ZW5lcihjLCJkYmxjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJkYmxjbGljayIpKSxkLmFkZExpc3RlbmVyKGMsIm1vdXNlbW92ZSIsdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsImd1dHRlciIpKX07KChmdW5jdGlvbigpe3RoaXMuJHNjcm9sbFNwZWVkPTEsdGhpcy5zZXRTY3JvbGxTcGVlZD1mdW5jdGlvbihhKXt0aGlzLiRzY3JvbGxTcGVlZD1hfSx0aGlzLmdldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbFNwZWVkfSx0aGlzLm9uTW91c2VFdmVudD1mdW5jdGlvbihhLGIpe3RoaXMuZWRpdG9yLl9lbWl0KGEsbmV3IGcoYix0aGlzLmVkaXRvcikpfSx0aGlzLiRkcmFnRGVsYXk9MjUwLHRoaXMuc2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKGEpe3RoaXMuJGRyYWdEZWxheT1hfSx0aGlzLmdldERyYWdEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkcmFnRGVsYXl9LHRoaXMub25Nb3VzZU1vdmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeSYmdGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkubW91c2Vtb3ZlO2lmKCFjfHwhYy5sZW5ndGgpcmV0dXJuO3RoaXMuZWRpdG9yLl9lbWl0KGEsbmV3IGcoYix0aGlzLmVkaXRvcikpfSx0aGlzLm9uTW91c2VXaGVlbD1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBnKGIsdGhpcy5lZGl0b3IpO2Muc3BlZWQ9dGhpcy4kc2Nyb2xsU3BlZWQqMixjLndoZWVsWD1iLndoZWVsWCxjLndoZWVsWT1iLndoZWVsWSx0aGlzLmVkaXRvci5fZW1pdChhLGMpfX0pKS5jYWxsKGgucHJvdG90eXBlKSxiLk1vdXNlSGFuZGxlcj1ofSksZGVmaW5lKCJhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvYnJvd3Nlcl9mb2N1cyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBrKGEpe3RoaXMuZWRpdG9yPWEsdGhpcy4kY2xpY2tTZWxlY3Rpb249bnVsbCx0aGlzLmJyb3dzZXJGb2N1cz1uZXcgZixhLnNldERlZmF1bHRIYW5kbGVyKCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24uYmluZCh0aGlzKSksYS5zZXREZWZhdWx0SGFuZGxlcigiZGJsY2xpY2siLHRoaXMub25Eb3VibGVDbGljay5iaW5kKHRoaXMpKSxhLnNldERlZmF1bHRIYW5kbGVyKCJ0cmlwbGVjbGljayIsdGhpcy5vblRyaXBsZUNsaWNrLmJpbmQodGhpcykpLGEuc2V0RGVmYXVsdEhhbmRsZXIoInF1YWRjbGljayIsdGhpcy5vblF1YWRDbGljay5iaW5kKHRoaXMpKSxhLnNldERlZmF1bHRIYW5kbGVyKCJtb3VzZXdoZWVsIix0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpfWZ1bmN0aW9uIGwoYSxiLGMsZCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhjLWEsMikrTWF0aC5wb3coZC1iLDIpKX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2V2ZW50IiksZT1hKCIuLi9saWIvZG9tIiksZj1hKCIuLi9saWIvYnJvd3Nlcl9mb2N1cyIpLkJyb3dzZXJGb2N1cyxnPTAsaD0xLGk9MixqPTU7KChmdW5jdGlvbigpe3RoaXMub25Nb3VzZURvd249ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gQyhiKXthLmdldFNoaWZ0S2V5KCk/bS5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihiKTpuLiRjbGlja1NlbGVjdGlvbnx8KG0ubW92ZUN1cnNvclRvUG9zaXRpb24oYiksbS5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oYi5yb3csYi5jb2x1bW4pKSxxPWh9dmFyIGI9YS5pblNlbGVjdGlvbigpLGM9YS5wYWdlWCxmPWEucGFnZVksaz1hLmdldERvY3VtZW50UG9zaXRpb24oKSxtPXRoaXMuZWRpdG9yLG49dGhpcyxvPW0uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxwPW8uaXNFbXB0eSgpLHE9ZztpZihiJiYoIXRoaXMuYnJvd3NlckZvY3VzLmlzRm9jdXNlZCgpfHwobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLmJyb3dzZXJGb2N1cy5sYXN0Rm9jdXM8MjB8fCFtLmlzRm9jdXNlZCgpKSl7bS5mb2N1cygpO3JldHVybn12YXIgcj1hLmdldEJ1dHRvbigpO2lmKHIhPT0wKXtwJiZtLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGspLHI9PTImJihtLnRleHRJbnB1dC5vbkNvbnRleHRNZW51KHt4OmEuY2xpZW50WCx5OmEuY2xpZW50WX0scCksZC5jYXB0dXJlKG0uY29udGFpbmVyLGZ1bmN0aW9uKCl7fSxtLnRleHRJbnB1dC5vbkNvbnRleHRNZW51Q2xvc2UpKTtyZXR1cm59Ynx8QyhrKTt2YXIgcz1jLHQ9Zix1PShuZXcgRGF0ZSkuZ2V0VGltZSgpLHYsdyx4LHk9ZnVuY3Rpb24oYSl7cz1kLmdldERvY3VtZW50WChhKSx0PWQuZ2V0RG9jdW1lbnRZKGEpfSx6PWZ1bmN0aW9uKGEpe2NsZWFySW50ZXJ2YWwoRikscT09Zz9DKGspOnE9PWkmJkEoYSksbi4kY2xpY2tTZWxlY3Rpb249bnVsbCxxPWd9LEE9ZnVuY3Rpb24oYSl7ZS5yZW1vdmVDc3NDbGFzcyhtLmNvbnRhaW5lciwiYWNlX2RyYWdnaW5nIiksbS5zZXNzaW9uLnJlbW92ZU1hcmtlcih4KSxtLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9ufHx2fHwobS5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihrKSxtLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbihrLnJvdyxrLmNvbHVtbikpO2lmKCF2KXJldHVybjtpZih3LmNvbnRhaW5zKHYucm93LHYuY29sdW1uKSl7dj1udWxsO3JldHVybn1tLmNsZWFyU2VsZWN0aW9uKCk7aWYoYSYmKGEuY3RybEtleXx8YS5hbHRLZXkpKXZhciBiPW0uc2Vzc2lvbixjPWIuaW5zZXJ0KHYsYi5nZXRUZXh0UmFuZ2UodykpO2Vsc2UgdmFyIGM9bS5tb3ZlVGV4dCh3LHYpO2lmKCFjKXt2PW51bGw7cmV0dXJufW0uc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGMpfSxCPWZ1bmN0aW9uKCl7aWYocT09Zyl7dmFyIGE9bChjLGYscyx0KSxiPShuZXcgRGF0ZSkuZ2V0VGltZSgpO2lmKGE+ail7cT1oO3ZhciBkPW0ucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMocyx0KTtkLnJvdz1NYXRoLm1heCgwLE1hdGgubWluKGQucm93LG0uc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSksQyhkKX1lbHNlIGlmKGItdT5tLmdldERyYWdEZWxheSgpKXtxPWksdz1tLmdldFNlbGVjdGlvblJhbmdlKCk7dmFyIGs9bS5nZXRTZWxlY3Rpb25TdHlsZSgpO3g9bS5zZXNzaW9uLmFkZE1hcmtlcih3LCJhY2Vfc2VsZWN0aW9uIixrKSxtLmNsZWFyU2VsZWN0aW9uKCksZS5hZGRDc3NDbGFzcyhtLmNvbnRhaW5lciwiYWNlX2RyYWdnaW5nIil9fXE9PWk/RSgpOnE9PWgmJkQoKX0sRD1mdW5jdGlvbigpe3ZhciBhLGI9bS5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhzLHQpO2Iucm93PU1hdGgubWF4KDAsTWF0aC5taW4oYi5yb3csbS5zZXNzaW9uLmdldExlbmd0aCgpLTEpKSxuLiRjbGlja1NlbGVjdGlvbj9uLiRjbGlja1NlbGVjdGlvbi5jb250YWlucyhiLnJvdyxiLmNvbHVtbik/bS5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2Uobi4kY2xpY2tTZWxlY3Rpb24pOihuLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlKGIucm93LGIuY29sdW1uKT09LTE/YT1uLiRjbGlja1NlbGVjdGlvbi5lbmQ6YT1uLiRjbGlja1NlbGVjdGlvbi5zdGFydCxtLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IoYS5yb3csYS5jb2x1bW4pLG0uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24oYikpOm0uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24oYiksbS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpfSxFPWZ1bmN0aW9uKCl7dj1tLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHMsdCksdi5yb3c9TWF0aC5tYXgoMCxNYXRoLm1pbih2LnJvdyxtLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpLG0ubW92ZUN1cnNvclRvUG9zaXRpb24odil9O2QuY2FwdHVyZShtLmNvbnRhaW5lcix5LHopO3ZhciBGPXNldEludGVydmFsKEIsMjApO3JldHVybiBhLnByZXZlbnREZWZhdWx0KCl9LHRoaXMub25Eb3VibGVDbGljaz1mdW5jdGlvbihhKXt2YXIgYj1hLmdldERvY3VtZW50UG9zaXRpb24oKSxjPXRoaXMuZWRpdG9yO2MubW92ZUN1cnNvclRvUG9zaXRpb24oYiksYy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKX0sdGhpcy5vblRyaXBsZUNsaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGM9dGhpcy5lZGl0b3I7Yy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihiKSxjLnNlbGVjdGlvbi5zZWxlY3RMaW5lKCksdGhpcy4kY2xpY2tTZWxlY3Rpb249Yy5nZXRTZWxlY3Rpb25SYW5nZSgpfSx0aGlzLm9uUXVhZENsaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZWRpdG9yO2Iuc2VsZWN0QWxsKCksdGhpcy4kY2xpY2tTZWxlY3Rpb249Yi5nZXRTZWxlY3Rpb25SYW5nZSgpfSx0aGlzLm9uU2Nyb2xsPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZWRpdG9yO2IucmVuZGVyZXIuc2Nyb2xsQnkoYS53aGVlbFgqYS5zcGVlZCxhLndoZWVsWSphLnNwZWVkKTtpZihiLnJlbmRlcmVyLmlzU2Nyb2xsYWJsZUJ5KGEud2hlZWxYKmEuc3BlZWQsYS53aGVlbFkqYS5zcGVlZCkpcmV0dXJuIGEucHJldmVudERlZmF1bHQoKX19KSkuY2FsbChrLnByb3RvdHlwZSksYi5EZWZhdWx0SGFuZGxlcnM9a30pLGRlZmluZSgiYWNlL2xpYi9icm93c2VyX2ZvY3VzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL29vcCIpLGU9YSgiLi9ldmVudCIpLGY9YSgiLi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGc9ZnVuY3Rpb24oYSl7YT1hfHx3aW5kb3csdGhpcy5sYXN0Rm9jdXM9KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5faXNGb2N1c2VkPSEwO3ZhciBiPXRoaXM7Im9uZm9jdXNpbiJpbiBhLmRvY3VtZW50PyhlLmFkZExpc3RlbmVyKGEuZG9jdW1lbnQsImZvY3VzaW4iLGZ1bmN0aW9uKGEpe2IuX3NldEZvY3VzZWQoITApfSksZS5hZGRMaXN0ZW5lcihhLmRvY3VtZW50LCJmb2N1c291dCIsZnVuY3Rpb24oYSl7Yi5fc2V0Rm9jdXNlZCghIWEudG9FbGVtZW50KX0pKTooZS5hZGRMaXN0ZW5lcihhLCJibHVyIixmdW5jdGlvbihhKXtiLl9zZXRGb2N1c2VkKCExKX0pLGUuYWRkTGlzdGVuZXIoYSwiZm9jdXMiLGZ1bmN0aW9uKGEpe2IuX3NldEZvY3VzZWQoITApfSkpfTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxmKSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0ZvY3VzZWR9LHRoaXMuX3NldEZvY3VzZWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5faXNGb2N1c2VkPT1hKXJldHVybjthJiYodGhpcy5sYXN0Rm9jdXM9KG5ldyBEYXRlKS5nZXRUaW1lKCkpLHRoaXMuX2lzRm9jdXNlZD1hLHRoaXMuX2VtaXQoImNoYW5nZUZvY3VzIil9fSkpLmNhbGwoZy5wcm90b3R5cGUpLGIuQnJvd3NlckZvY3VzPWd9KSxkZWZpbmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9e307ZC5fZW1pdD1kLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEsYil7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fSx0aGlzLl9kZWZhdWx0SGFuZGxlcnM9dGhpcy5fZGVmYXVsdEhhbmRsZXJzfHx7fTt2YXIgYz10aGlzLl9ldmVudFJlZ2lzdHJ5W2FdfHxbXSxkPXRoaXMuX2RlZmF1bHRIYW5kbGVyc1thXTtpZighYy5sZW5ndGgmJiFkKXJldHVybjtiPWJ8fHt9LGIudHlwZT1hLGIuc3RvcFByb3BhZ2F0aW9ufHwoYi5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXt0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0pLGIucHJldmVudERlZmF1bHR8fChiLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfSk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe2NbZV0oYik7aWYoYi5wcm9wYWdhdGlvblN0b3BwZWQpYnJlYWt9ZCYmIWIuZGVmYXVsdFByZXZlbnRlZCYmZChiKX0sZC5zZXREZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihhLGIpe3RoaXMuX2RlZmF1bHRIYW5kbGVycz10aGlzLl9kZWZhdWx0SGFuZGxlcnN8fHt9O2lmKHRoaXMuX2RlZmF1bHRIYW5kbGVyc1thXSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yICciK2ErIicgaXMgYWxyZWFkeSBzZXQiKTt0aGlzLl9kZWZhdWx0SGFuZGxlcnNbYV09Yn0sZC5vbj1kLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9O3ZhciBjPXRoaXMuX2V2ZW50UmVnaXN0cnlbYV07aWYoIWMpdmFyIGM9dGhpcy5fZXZlbnRSZWdpc3RyeVthXT1bXTtjLmluZGV4T2YoYik9PS0xJiZjLnB1c2goYil9LGQucmVtb3ZlTGlzdGVuZXI9ZC5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fTt2YXIgYz10aGlzLl9ldmVudFJlZ2lzdHJ5W2FdO2lmKCFjKXJldHVybjt2YXIgZD1jLmluZGV4T2YoYik7ZCE9PS0xJiZjLnNwbGljZShkLDEpfSxkLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihhKXt0aGlzLl9ldmVudFJlZ2lzdHJ5JiYodGhpcy5fZXZlbnRSZWdpc3RyeVthXT1bXSl9LGIuRXZlbnRFbWl0dGVyPWR9KSxkZWZpbmUoImFjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7YS5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVyY2xpY2siLGZ1bmN0aW9uKGIpe3ZhciBjPWIuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxkPWEuc2Vzc2lvbi5zZWxlY3Rpb247ZC5tb3ZlQ3Vyc29yVG8oYywwKSxkLnNlbGVjdExpbmUoKX0pfSJ1c2Ugc3RyaWN0IixiLkd1dHRlckhhbmRsZXI9ZH0pLGRlZmluZSgiYWNlL21vdXNlL21vdXNlX2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2V2ZW50IiksZT1iLk1vdXNlRXZlbnQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmRvbUV2ZW50PWEsdGhpcy5lZGl0b3I9Yix0aGlzLnBhZ2VYPWQuZ2V0RG9jdW1lbnRYKGEpLHRoaXMucGFnZVk9ZC5nZXREb2N1bWVudFkoYSksdGhpcy5jbGllbnRYPWEuY2xpZW50WCx0aGlzLmNsaWVudFk9YS5jbGllbnRZLHRoaXMuJHBvcz1udWxsLHRoaXMuJGluU2VsZWN0aW9uPW51bGwsdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExfTsoKGZ1bmN0aW9uKCl7dGhpcy5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXtkLnN0b3BQcm9wYWdhdGlvbih0aGlzLmRvbUV2ZW50KSx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0sdGhpcy5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2QucHJldmVudERlZmF1bHQodGhpcy5kb21FdmVudCksdGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfSx0aGlzLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMucHJldmVudERlZmF1bHQoKX0sdGhpcy5nZXREb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kcG9zKXJldHVybiB0aGlzLiRwb3M7dmFyIGE9ZC5nZXREb2N1bWVudFgodGhpcy5kb21FdmVudCksYj1kLmdldERvY3VtZW50WSh0aGlzLmRvbUV2ZW50KTtyZXR1cm4gdGhpcy4kcG9zPXRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKGEsYiksdGhpcy4kcG9zLnJvdz1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuJHBvcy5yb3csdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSksdGhpcy4kcG9zfSx0aGlzLmluU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kaW5TZWxlY3Rpb24hPT1udWxsKXJldHVybiB0aGlzLiRpblNlbGVjdGlvbjt2YXIgYT10aGlzLmVkaXRvcjtpZihhLmdldFJlYWRPbmx5KCkpdGhpcy4kaW5TZWxlY3Rpb249ITE7ZWxzZXt2YXIgYj1hLmdldFNlbGVjdGlvblJhbmdlKCk7aWYoYi5pc0VtcHR5KCkpdGhpcy4kaW5TZWxlY3Rpb249ITE7ZWxzZXt2YXIgYz10aGlzLmdldERvY3VtZW50UG9zaXRpb24oKTt0aGlzLiRpblNlbGVjdGlvbj1iLmNvbnRhaW5zKGMucm93LGMuY29sdW1uKX19cmV0dXJuIHRoaXMuJGluU2VsZWN0aW9ufSx0aGlzLmdldEJ1dHRvbj1mdW5jdGlvbigpe3JldHVybiBkLmdldEJ1dHRvbih0aGlzLmRvbUV2ZW50KX0sdGhpcy5nZXRTaGlmdEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50LnNoaWZ0S2V5fSx0aGlzLmdldEFjY2VsS2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQuY3RybEtleXx8dGhpcy5kb21FdmVudC5tZXRhS2V5fX0pKS5jYWxsKGUucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Eub24oImNsaWNrIixmdW5jdGlvbihiKXt2YXIgYz1iLmdldERvY3VtZW50UG9zaXRpb24oKSxkPWEuc2Vzc2lvbixlPWQuZ2V0Rm9sZEF0KGMucm93LGMuY29sdW1uLDEpO2UmJihiLmdldEFjY2VsS2V5KCk/ZC5yZW1vdmVGb2xkKGUpOmQuZXhwYW5kRm9sZChlKSxiLnN0b3AoKSl9KSxhLm9uKCJndXR0ZXJjbGljayIsZnVuY3Rpb24oYil7aWYoYi5kb21FdmVudC50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoImFjZV9mb2xkLXdpZGdldCIpIT0tMSl7dmFyIGM9Yi5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93O2Euc2Vzc2lvbi5vbkZvbGRXaWRnZXRDbGljayhjLGIuZG9tRXZlbnQpLGIuc3RvcCgpfX0pfSJ1c2Ugc3RyaWN0IixiLkZvbGRIYW5kbGVyPWR9KSxkZWZpbmUoImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi9ldmVudCIsImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIva2V5cyIpLGU9YSgiLi4vbGliL2V2ZW50Iik7YSgiLi4vY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIpO3ZhciBmPWZ1bmN0aW9uKGEpe3RoaXMuJGVkaXRvcj1hLHRoaXMuJGRhdGE9e30sdGhpcy4kaGFuZGxlcnM9W3RoaXNdfTsoKGZ1bmN0aW9uKCl7dGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oYSl7aWYodGhpcy4kaGFuZGxlcnNbdGhpcy4kaGFuZGxlcnMubGVuZ3RoLTFdPT1hKXJldHVybjt0aGlzLiRkYXRhPXt9LHRoaXMuJGhhbmRsZXJzPWE/W3RoaXMsYV06W3RoaXNdfSx0aGlzLmFkZEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihhKXt0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcihhKSx0aGlzLiRoYW5kbGVycy5wdXNoKGEpfSx0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRoYW5kbGVycy5pbmRleE9mKGEpO3JldHVybiBiPT0tMT8hMToodGhpcy4kaGFuZGxlcnMuc3BsaWNlKGIsMSksITApfSx0aGlzLmdldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoYW5kbGVyc1t0aGlzLiRoYW5kbGVycy5sZW5ndGgtMV19LHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBmO2Zvcih2YXIgZz10aGlzLiRoYW5kbGVycy5sZW5ndGg7Zy0tOyl7Zj10aGlzLiRoYW5kbGVyc1tnXS5oYW5kbGVLZXlib2FyZCh0aGlzLiRkYXRhLGEsYixjLGQpO2lmKGYmJmYuY29tbWFuZClicmVha31pZighZnx8IWYuY29tbWFuZClyZXR1cm4hMTt2YXIgaD0hMSxpPXRoaXMuJGVkaXRvci5jb21tYW5kcztyZXR1cm4gZi5jb21tYW5kIT0ibnVsbCI/aD1pLmV4ZWMoZi5jb21tYW5kLHRoaXMuJGVkaXRvcixmLmFyZ3MpOmg9ITAsaCYmZCYmZS5zdG9wRXZlbnQoZCksaH0sdGhpcy5oYW5kbGVLZXlib2FyZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJue2NvbW1hbmQ6dGhpcy4kZWRpdG9yLmNvbW1hbmRzLmZpbmRLZXlDb21tYW5kKGIsYyl9fSx0aGlzLm9uQ29tbWFuZEtleT1mdW5jdGlvbihhLGIsYyl7dmFyIGU9ZC5rZXlDb2RlVG9TdHJpbmcoYyk7dGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoYixlLGMsYSl9LHRoaXMub25UZXh0SW5wdXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz0hMTshYiYmYS5sZW5ndGg9PTEmJihjPXRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKDAsYSkpLGN8fHRoaXMuJGVkaXRvci5jb21tYW5kcy5leGVjKCJpbnNlcnRzdHJpbmciLHRoaXMuJGVkaXRvcixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5LZXlCaW5kaW5nPWZ9KSxkZWZpbmUoImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoYSxiKXtyZXR1cm57d2luOmEsbWFjOmJ9fSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpO2IuY29tbWFuZHM9W3tuYW1lOiJzZWxlY3RhbGwiLGJpbmRLZXk6ZSgiQ3RybC1BIiwiQ29tbWFuZC1BIiksZXhlYzpmdW5jdGlvbihhKXthLnNlbGVjdEFsbCgpfSxyZWFkT25seTohMH0se25hbWU6ImNlbnRlcnNlbGVjdGlvbiIsYmluZEtleTplKG51bGwsIkN0cmwtTCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5jZW50ZXJTZWxlY3Rpb24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZSIsYmluZEtleTplKCJDdHJsLUwiLCJDb21tYW5kLUwiKSxleGVjOmZ1bmN0aW9uKGEpe3ZhciBiPXBhcnNlSW50KHByb21wdCgiRW50ZXIgbGluZSBudW1iZXI6IiksMTApO2lzTmFOKGIpfHxhLmdvdG9MaW5lKGIpfSxyZWFkT25seTohMH0se25hbWU6ImZvbGQiLGJpbmRLZXk6ZSgiQWx0LUwiLCJBbHQtTCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZXNzaW9uLnRvZ2dsZUZvbGQoITEpfSxyZWFkT25seTohMH0se25hbWU6InVuZm9sZCIsYmluZEtleTplKCJBbHQtU2hpZnQtTCIsIkFsdC1TaGlmdC1MIiksZXhlYzpmdW5jdGlvbihhKXthLnNlc3Npb24udG9nZ2xlRm9sZCghMCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZGFsbCIsYmluZEtleTplKCJBbHQtMCIsIkFsdC0wIiksZXhlYzpmdW5jdGlvbihhKXthLnNlc3Npb24uZm9sZEFsbCgpfSxyZWFkT25seTohMH0se25hbWU6InVuZm9sZGFsbCIsYmluZEtleTplKCJBbHQtU2hpZnQtMCIsIkFsdC1TaGlmdC0wIiksZXhlYzpmdW5jdGlvbihhKXthLnNlc3Npb24udW5mb2xkKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZG5leHQiLGJpbmRLZXk6ZSgiQ3RybC1LIiwiQ29tbWFuZC1HIiksZXhlYzpmdW5jdGlvbihhKXthLmZpbmROZXh0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZHByZXZpb3VzIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtSyIsIkNvbW1hbmQtU2hpZnQtRyIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5maW5kUHJldmlvdXMoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kIixiaW5kS2V5OmUoIkN0cmwtRiIsIkNvbW1hbmQtRiIpLGV4ZWM6ZnVuY3Rpb24oYSl7dmFyIGI9cHJvbXB0KCJGaW5kOiIsYS5nZXRDb3B5VGV4dCgpKTthLmZpbmQoYil9LHJlYWRPbmx5OiEwfSx7bmFtZToib3ZlcndyaXRlIixiaW5kS2V5OmUoIkluc2VydCIsIkluc2VydCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS50b2dnbGVPdmVyd3JpdGUoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b3N0YXJ0IixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtSG9tZXxBbHQtU2hpZnQtVXAiLCJDb21tYW5kLVNoaWZ0LVVwIiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVTdGFydCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9zdGFydCIsYmluZEtleTplKCJDdHJsLUhvbWV8Q3RybC1VcCIsIkNvbW1hbmQtSG9tZXxDb21tYW5kLVVwIiksZXhlYzpmdW5jdGlvbihhKXthLm5hdmlnYXRlRmlsZVN0YXJ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dXAiLGJpbmRLZXk6ZSgiU2hpZnQtVXAiLCJTaGlmdC1VcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RVcCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvbGluZXVwIixiaW5kS2V5OmUoIlVwIiwiVXB8Q3RybC1QIiksZXhlYzpmdW5jdGlvbihhLGIpe2EubmF2aWdhdGVVcChiLnRpbWVzKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2VuZCIsYmluZEtleTplKCJDdHJsLVNoaWZ0LUVuZHxBbHQtU2hpZnQtRG93biIsIkNvbW1hbmQtU2hpZnQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlRW5kKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2VuZCIsYmluZEtleTplKCJDdHJsLUVuZHxDdHJsLURvd24iLCJDb21tYW5kLUVuZHxDb21tYW5kLURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2EubmF2aWdhdGVGaWxlRW5kKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0ZG93biIsYmluZEtleTplKCJTaGlmdC1Eb3duIiwiU2hpZnQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3REb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ29saW5lZG93biIsYmluZEtleTplKCJEb3duIiwiRG93bnxDdHJsLU4iKSxleGVjOmZ1bmN0aW9uKGEsYil7YS5uYXZpZ2F0ZURvd24oYi50aW1lcyl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0d29yZGxlZnQiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1MZWZ0IiwiT3B0aW9uLVNoaWZ0LUxlZnQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0V29yZExlZnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvd29yZGxlZnQiLGJpbmRLZXk6ZSgiQ3RybC1MZWZ0IiwiT3B0aW9uLUxlZnQiKSxleGVjOmZ1bmN0aW9uKGEpe2EubmF2aWdhdGVXb3JkTGVmdCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbGluZXN0YXJ0IixiaW5kS2V5OmUoIkFsdC1TaGlmdC1MZWZ0IiwiQ29tbWFuZC1TaGlmdC1MZWZ0IiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lc3RhcnQiLGJpbmRLZXk6ZSgiQWx0LUxlZnR8SG9tZSIsIkNvbW1hbmQtTGVmdHxIb21lfEN0cmwtQSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5uYXZpZ2F0ZUxpbmVTdGFydCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxlZnQiLGJpbmRLZXk6ZSgiU2hpZnQtTGVmdCIsIlNoaWZ0LUxlZnQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGVmdCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9sZWZ0IixiaW5kS2V5OmUoIkxlZnQiLCJMZWZ0fEN0cmwtQiIpLGV4ZWM6ZnVuY3Rpb24oYSxiKXthLm5hdmlnYXRlTGVmdChiLnRpbWVzKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R3b3JkcmlnaHQiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1SaWdodCIsIk9wdGlvbi1TaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkUmlnaHQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvd29yZHJpZ2h0IixiaW5kS2V5OmUoIkN0cmwtUmlnaHQiLCJPcHRpb24tUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGEpe2EubmF2aWdhdGVXb3JkUmlnaHQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2xpbmVlbmQiLGJpbmRLZXk6ZSgiQWx0LVNoaWZ0LVJpZ2h0IiwiQ29tbWFuZC1TaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmVlbmQiLGJpbmRLZXk6ZSgiQWx0LVJpZ2h0fEVuZCIsIkNvbW1hbmQtUmlnaHR8RW5kfEN0cmwtRSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5uYXZpZ2F0ZUxpbmVFbmQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RyaWdodCIsYmluZEtleTplKCJTaGlmdC1SaWdodCIsIlNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdFJpZ2h0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3JpZ2h0IixiaW5kS2V5OmUoIlJpZ2h0IiwiUmlnaHR8Q3RybC1GIiksZXhlYzpmdW5jdGlvbihhLGIpe2EubmF2aWdhdGVSaWdodChiLnRpbWVzKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RwYWdlZG93biIsYmluZEtleTplKCJTaGlmdC1QYWdlRG93biIsIlNoaWZ0LVBhZ2VEb3duIiksZXhlYzpmdW5jdGlvbihhKXthLnNlbGVjdFBhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicGFnZWRvd24iLGJpbmRLZXk6ZShudWxsLCJQYWdlRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zY3JvbGxQYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9wYWdlZG93biIsYmluZEtleTplKCJQYWdlRG93biIsIk9wdGlvbi1QYWdlRG93bnxDdHJsLVYiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ290b1BhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cGFnZXVwIixiaW5kS2V5OmUoIlNoaWZ0LVBhZ2VVcCIsIlNoaWZ0LVBhZ2VVcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zZWxlY3RQYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJwYWdldXAiLGJpbmRLZXk6ZShudWxsLCJQYWdlVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2Nyb2xsUGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3BhZ2V1cCIsYmluZEtleTplKCJQYWdlVXAiLCJPcHRpb24tUGFnZVVwIiksZXhlYzpmdW5jdGlvbihhKXthLmdvdG9QYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsaW5lc3RhcnQiLGJpbmRLZXk6ZSgiU2hpZnQtSG9tZSIsIlNoaWZ0LUhvbWUiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGluZWVuZCIsYmluZEtleTplKCJTaGlmdC1FbmQiLCJTaGlmdC1FbmQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpfSxyZWFkT25seTohMH0se25hbWU6InRvZ2dsZXJlY29yZGluZyIsYmluZEtleTplKCJDdHJsLUFsdC1FIiwiQ29tbWFuZC1PcHRpb24tRSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5jb21tYW5kcy50b2dnbGVSZWNvcmRpbmcoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJyZXBsYXltYWNybyIsYmluZEtleTplKCJDdHJsLVNoaWZ0LUUiLCJDb21tYW5kLVNoaWZ0LUUiKSxleGVjOmZ1bmN0aW9uKGEpe2EuY29tbWFuZHMucmVwbGF5KGEpfSxyZWFkT25seTohMH0se25hbWU6Imp1bXB0b21hdGNoaW5nIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtUCIsIkN0cmwtU2hpZnQtUCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5qdW1wVG9NYXRjaGluZygpfSxyZWFkT25seTohMH0se25hbWU6InJlbW92ZWxpbmUiLGJpbmRLZXk6ZSgiQ3RybC1EIiwiQ29tbWFuZC1EIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZUxpbmVzKCl9fSx7bmFtZToidG9nZ2xlY29tbWVudCIsYmluZEtleTplKCJDdHJsLTciLCJDb21tYW5kLTciKSxleGVjOmZ1bmN0aW9uKGEpe2EudG9nZ2xlQ29tbWVudExpbmVzKCl9fSx7bmFtZToicmVwbGFjZSIsYmluZEtleTplKCJDdHJsLVIiLCJDb21tYW5kLU9wdGlvbi1GIiksZXhlYzpmdW5jdGlvbihhKXt2YXIgYj1wcm9tcHQoIkZpbmQ6IixhLmdldENvcHlUZXh0KCkpO2lmKCFiKXJldHVybjt2YXIgYz1wcm9tcHQoIlJlcGxhY2VtZW50OiIpO2lmKCFjKXJldHVybjthLnJlcGxhY2UoYyx7bmVlZGxlOmJ9KX19LHtuYW1lOiJyZXBsYWNlYWxsIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtUiIsIkNvbW1hbmQtU2hpZnQtT3B0aW9uLUYiKSxleGVjOmZ1bmN0aW9uKGEpe3ZhciBiPXByb21wdCgiRmluZDoiKTtpZighYilyZXR1cm47dmFyIGM9cHJvbXB0KCJSZXBsYWNlbWVudDoiKTtpZighYylyZXR1cm47YS5yZXBsYWNlQWxsKGMse25lZWRsZTpifSl9fSx7bmFtZToidW5kbyIsYmluZEtleTplKCJDdHJsLVoiLCJDb21tYW5kLVoiKSxleGVjOmZ1bmN0aW9uKGEpe2EudW5kbygpfX0se25hbWU6InJlZG8iLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1afEN0cmwtWSIsIkNvbW1hbmQtU2hpZnQtWnxDb21tYW5kLVkiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVkbygpfX0se25hbWU6ImNvcHlsaW5lc3VwIixiaW5kS2V5OmUoIkN0cmwtQWx0LVVwIiwiQ29tbWFuZC1PcHRpb24tVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2EuY29weUxpbmVzVXAoKX19LHtuYW1lOiJtb3ZlbGluZXN1cCIsYmluZEtleTplKCJBbHQtVXAiLCJPcHRpb24tVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2EubW92ZUxpbmVzVXAoKX19LHtuYW1lOiJjb3B5bGluZXNkb3duIixiaW5kS2V5OmUoIkN0cmwtQWx0LURvd24iLCJDb21tYW5kLU9wdGlvbi1Eb3duIiksZXhlYzpmdW5jdGlvbihhKXthLmNvcHlMaW5lc0Rvd24oKX19LHtuYW1lOiJtb3ZlbGluZXNkb3duIixiaW5kS2V5OmUoIkFsdC1Eb3duIiwiT3B0aW9uLURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2EubW92ZUxpbmVzRG93bigpfX0se25hbWU6ImRlbCIsYmluZEtleTplKCJEZWxldGUiLCJEZWxldGV8Q3RybC1EIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZSgicmlnaHQiKX19LHtuYW1lOiJiYWNrc3BhY2UiLGJpbmRLZXk6ZSgiQ3RybC1CYWNrc3BhY2V8Q29tbWFuZC1CYWNrc3BhY2V8T3B0aW9uLUJhY2tzcGFjZXxTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlIiwiQ3RybC1CYWNrc3BhY2V8Q29tbWFuZC1CYWNrc3BhY2V8U2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZXxDdHJsLUgiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlKCJsZWZ0Iil9fSx7bmFtZToicmVtb3ZldG9saW5lc3RhcnQiLGJpbmRLZXk6ZSgiQWx0LUJhY2tzcGFjZSIsIk9wdGlvbi1CYWNrc3BhY2UiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlVG9MaW5lU3RhcnQoKX19LHtuYW1lOiJyZW1vdmV0b2xpbmVlbmQiLGJpbmRLZXk6ZSgiQWx0LURlbGV0ZSIsIkN0cmwtSyIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVUb0xpbmVFbmQoKX19LHtuYW1lOiJyZW1vdmV3b3JkbGVmdCIsYmluZEtleTplKCJDdHJsLUJhY2tzcGFjZSIsIkFsdC1CYWNrc3BhY2V8Q3RybC1BbHQtQmFja3NwYWNlIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZVdvcmRMZWZ0KCl9fSx7bmFtZToicmVtb3Zld29yZHJpZ2h0IixiaW5kS2V5OmUoIkN0cmwtRGVsZXRlIiwiQWx0LURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVXb3JkUmlnaHQoKX19LHtuYW1lOiJvdXRkZW50IixiaW5kS2V5OmUoIlNoaWZ0LVRhYiIsIlNoaWZ0LVRhYiIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5ibG9ja091dGRlbnQoKX19LHtuYW1lOiJpbmRlbnQiLGJpbmRLZXk6ZSgiVGFiIiwiVGFiIiksZXhlYzpmdW5jdGlvbihhKXthLmluZGVudCgpfX0se25hbWU6Imluc2VydHN0cmluZyIsZXhlYzpmdW5jdGlvbihhLGIpe2EuaW5zZXJ0KGIpfX0se25hbWU6Imluc2VydHRleHQiLGV4ZWM6ZnVuY3Rpb24oYSxiKXthLmluc2VydChkLnN0cmluZ1JlcGVhdChiLnRleHR8fCIiLGIudGltZXN8fDEpKX19LHtuYW1lOiJzcGxpdGxpbmUiLGJpbmRLZXk6ZShudWxsLCJDdHJsLU8iKSxleGVjOmZ1bmN0aW9uKGEpe2Euc3BsaXRMaW5lKCl9fSx7bmFtZToidHJhbnNwb3NlbGV0dGVycyIsYmluZEtleTplKCJDdHJsLVQiLCJDdHJsLVQiKSxleGVjOmZ1bmN0aW9uKGEpe2EudHJhbnNwb3NlTGV0dGVycygpfX0se25hbWU6InRvdXBwZXJjYXNlIixiaW5kS2V5OmUoIkN0cmwtVSIsIkN0cmwtVSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS50b1VwcGVyQ2FzZSgpfX0se25hbWU6InRvbG93ZXJjYXNlIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtVSIsIkN0cmwtU2hpZnQtVSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS50b0xvd2VyQ2FzZSgpfX1dfSksZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2Uvc2VsZWN0aW9uIiwiYWNlL21vZGUvdGV4dCIsImFjZS9yYW5nZSIsImFjZS9kb2N1bWVudCIsImFjZS9iYWNrZ3JvdW5kX3Rva2VuaXplciIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZGluZyIsImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9sYW5nIiksZj1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGc9YSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb24saD1hKCIuL21vZGUvdGV4dCIpLk1vZGUsaT1hKCIuL3JhbmdlIikuUmFuZ2Usaj1hKCIuL2RvY3VtZW50IikuRG9jdW1lbnQsaz1hKCIuL2JhY2tncm91bmRfdG9rZW5pemVyIikuQmFja2dyb3VuZFRva2VuaXplcixsPWZ1bmN0aW9uKGEsYil7dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy4kZnJvbnRNYXJrZXJzPXt9LHRoaXMuJGJhY2tNYXJrZXJzPXt9LHRoaXMuJG1hcmtlcklkPTEsdGhpcy4kcm93Q2FjaGU9W10sdGhpcy4kd3JhcERhdGE9W10sdGhpcy4kZm9sZERhdGE9W10sdGhpcy4kdW5kb1NlbGVjdD0hMCx0aGlzLiRmb2xkRGF0YS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPSIiO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oYil7YSs9IlxuIitiLnRvU3RyaW5nKCl9KSxhfSxhIGluc3RhbmNlb2Ygaj90aGlzLnNldERvY3VtZW50KGEpOnRoaXMuc2V0RG9jdW1lbnQobmV3IGooYSkpLHRoaXMuc2VsZWN0aW9uPW5ldyBnKHRoaXMpLGI/dGhpcy5zZXRNb2RlKGIpOnRoaXMuc2V0TW9kZShuZXcgaCl9OygoZnVuY3Rpb24oKXtmdW5jdGlvbiBvKGEpe3JldHVybiBhPDQzNTI/ITE6YT49NDM1MiYmYTw9NDQ0N3x8YT49NDUxNSYmYTw9NDUxOXx8YT49NDYwMiYmYTw9NDYwN3x8YT49OTAwMSYmYTw9OTAwMnx8YT49MTE5MDQmJmE8PTExOTI5fHxhPj0xMTkzMSYmYTw9MTIwMTl8fGE+PTEyMDMyJiZhPD0xMjI0NXx8YT49MTIyNzImJmE8PTEyMjgzfHxhPj0xMjI4OCYmYTw9MTIzNTB8fGE+PTEyMzUzJiZhPD0xMjQzOHx8YT49MTI0NDEmJmE8PTEyNTQzfHxhPj0xMjU0OSYmYTw9MTI1ODl8fGE+PTEyNTkzJiZhPD0xMjY4Nnx8YT49MTI2ODgmJmE8PTEyNzMwfHxhPj0xMjczNiYmYTw9MTI3NzF8fGE+PTEyNzg0JiZhPD0xMjgzMHx8YT49MTI4MzImJmE8PTEyODcxfHxhPj0xMjg4MCYmYTw9MTMwNTR8fGE+PTEzMDU2JiZhPD0xOTkwM3x8YT49MTk5NjgmJmE8PTQyMTI0fHxhPj00MjEyOCYmYTw9NDIxODJ8fGE+PTQzMzYwJiZhPD00MzM4OHx8YT49NDQwMzImJmE8PTU1MjAzfHxhPj01NTIxNiYmYTw9NTUyMzh8fGE+PTU1MjQzJiZhPD01NTI5MXx8YT49NjM3NDQmJmE8PTY0MjU1fHxhPj02NTA0MCYmYTw9NjUwNDl8fGE+PTY1MDcyJiZhPD02NTEwNnx8YT49NjUxMDgmJmE8PTY1MTI2fHxhPj02NTEyOCYmYTw9NjUxMzF8fGE+PTY1MjgxJiZhPD02NTM3Nnx8YT49NjU1MDQmJmE8PTY1NTEwfWQuaW1wbGVtZW50KHRoaXMsZiksdGhpcy5zZXREb2N1bWVudD1mdW5jdGlvbihhKXtpZih0aGlzLmRvYyl0aHJvdyBuZXcgRXJyb3IoIkRvY3VtZW50IGlzIGFscmVhZHkgc2V0Iik7dGhpcy5kb2M9YSxhLm9uKCJjaGFuZ2UiLHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKSksdGhpcy5vbigiY2hhbmdlRm9sZCIsdGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSksdGhpcy5iZ1Rva2VuaXplciYmKHRoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKSx0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApKX0sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY30sdGhpcy4kcmVzZXRSb3dDYWNoZT1mdW5jdGlvbihhKXtpZihhPT0wKXt0aGlzLiRyb3dDYWNoZT1bXTtyZXR1cm59dmFyIGI9dGhpcy4kcm93Q2FjaGU7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5kb2NSb3c+PWEpe2Iuc3BsaWNlKGMsYi5sZW5ndGgpO3JldHVybn19LHRoaXMub25DaGFuZ2VGb2xkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTt0aGlzLiRyZXNldFJvd0NhY2hlKGIuc3RhcnQucm93KX0sdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kcmVzZXRSb3dDYWNoZShiLnJhbmdlLnN0YXJ0LnJvdyk7dmFyIGM9dGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2UoYSk7IXRoaXMuJGZyb21VbmRvJiZ0aGlzLiR1bmRvTWFuYWdlciYmIWIuaWdub3JlJiYodGhpcy4kZGVsdGFzRG9jLnB1c2goYiksYyYmYy5sZW5ndGghPTAmJnRoaXMuJGRlbHRhc0ZvbGQucHVzaCh7YWN0aW9uOiJyZW1vdmVGb2xkcyIsZm9sZHM6Y30pLHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLnNjaGVkdWxlKCkpLHRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoYi5yYW5nZS5zdGFydC5yb3cpLHRoaXMuX2VtaXQoImNoYW5nZSIsYSl9LHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oYSl7dGhpcy5kb2Muc2V0VmFsdWUoYSksdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKDAsMCksdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuJGRlbHRhcz1bXSx0aGlzLiRkZWx0YXNEb2M9W10sdGhpcy4kZGVsdGFzRm9sZD1bXSx0aGlzLmdldFVuZG9NYW5hZ2VyKCkucmVzZXQoKX0sdGhpcy5nZXRWYWx1ZT10aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldFZhbHVlKCl9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9ufSx0aGlzLmdldFN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFN0YXRlKGEpfSx0aGlzLmdldFRva2Vucz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhhLGIpfSx0aGlzLmdldFRva2VuQXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhhLGEpWzBdLnRva2VucyxkLGU9MDtpZihiPT1udWxsKWY9Yy5sZW5ndGgtMSxlPXRoaXMuZ2V0TGluZShhKS5sZW5ndGg7ZWxzZSBmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7ZSs9Y1tmXS52YWx1ZS5sZW5ndGg7aWYoZT49YilicmVha31yZXR1cm4gZD1jW2ZdLGQ/KGQuaW5kZXg9ZixkLnN0YXJ0PWUtZC52YWx1ZS5sZW5ndGgsZCk6bnVsbH0sdGhpcy5zZXRVbmRvTWFuYWdlcj1mdW5jdGlvbihhKXt0aGlzLiR1bmRvTWFuYWdlcj1hLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy4kZGVsdGFzPVtdLHRoaXMuJGRlbHRhc0RvYz1bXSx0aGlzLiRkZWx0YXNGb2xkPVtdLHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyJiZ0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKTtpZihhKXt2YXIgYj10aGlzO3RoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcj1mdW5jdGlvbigpe2IuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpLGIuJGRlbHRhc0ZvbGQubGVuZ3RoJiYoYi4kZGVsdGFzLnB1c2goe2dyb3VwOiJmb2xkIixkZWx0YXM6Yi4kZGVsdGFzRm9sZH0pLGIuJGRlbHRhc0ZvbGQ9W10pLGIuJGRlbHRhc0RvYy5sZW5ndGgmJihiLiRkZWx0YXMucHVzaCh7Z3JvdXA6ImRvYyIsZGVsdGFzOmIuJGRlbHRhc0RvY30pLGIuJGRlbHRhc0RvYz1bXSksYi4kZGVsdGFzLmxlbmd0aD4wJiZhLmV4ZWN1dGUoe2FjdGlvbjoiYWNldXBkYXRlIixhcmdzOltiLiRkZWx0YXMsYl19KSxiLiRkZWx0YXM9W119LHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyPWUuZGVmZXJyZWRDYWxsKHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcil9fSx0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXI9e3VuZG86ZnVuY3Rpb24oKXt9LHJlZG86ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0sdGhpcy5nZXRVbmRvTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1bmRvTWFuYWdlcnx8dGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyfSx0aGlzLmdldFRhYlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVzZVNvZnRUYWJzKCk/ZS5zdHJpbmdSZXBlYXQoIiAiLHRoaXMuZ2V0VGFiU2l6ZSgpKToiXHQifSx0aGlzLiR1c2VTb2Z0VGFicz0hMCx0aGlzLnNldFVzZVNvZnRUYWJzPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJHVzZVNvZnRUYWJzPT09YSlyZXR1cm47dGhpcy4kdXNlU29mdFRhYnM9YX0sdGhpcy5nZXRVc2VTb2Z0VGFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VTb2Z0VGFic30sdGhpcy4kdGFiU2l6ZT00LHRoaXMuc2V0VGFiU2l6ZT1mdW5jdGlvbihhKXtpZihpc05hTihhKXx8dGhpcy4kdGFiU2l6ZT09PWEpcmV0dXJuO3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHRhYlNpemU9YSx0aGlzLl9lbWl0KCJjaGFuZ2VUYWJTaXplIil9LHRoaXMuZ2V0VGFiU2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0YWJTaXplfSx0aGlzLmlzVGFiU3RvcD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMmJmEuY29sdW1uJXRoaXMuJHRhYlNpemU9PTB9LHRoaXMuJG92ZXJ3cml0ZT0hMSx0aGlzLnNldE92ZXJ3cml0ZT1mdW5jdGlvbihhKXtpZih0aGlzLiRvdmVyd3JpdGU9PWEpcmV0dXJuO3RoaXMuJG92ZXJ3cml0ZT1hLHRoaXMuX2VtaXQoImNoYW5nZU92ZXJ3cml0ZSIpfSx0aGlzLmdldE92ZXJ3cml0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRvdmVyd3JpdGV9LHRoaXMudG9nZ2xlT3ZlcndyaXRlPWZ1bmN0aW9uKCl7dGhpcy5zZXRPdmVyd3JpdGUoIXRoaXMuJG92ZXJ3cml0ZSl9LHRoaXMuZ2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYnJlYWtwb2ludHN9LHRoaXMuc2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oYSl7dGhpcy4kYnJlYWtwb2ludHM9W107Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy4kYnJlYWtwb2ludHNbYVtiXV09ITA7dGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmNsZWFyQnJlYWtwb2ludHM9ZnVuY3Rpb24oKXt0aGlzLiRicmVha3BvaW50cz1bXSx0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuc2V0QnJlYWtwb2ludD1mdW5jdGlvbihhKXt0aGlzLiRicmVha3BvaW50c1thXT0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuY2xlYXJCcmVha3BvaW50PWZ1bmN0aW9uKGEpe2RlbGV0ZSB0aGlzLiRicmVha3BvaW50c1thXSx0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuZ2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYnJlYWtwb2ludHN9LHRoaXMuYWRkTWFya2VyPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJG1hcmtlcklkKyssZj17cmFuZ2U6YSx0eXBlOmN8fCJsaW5lIixyZW5kZXJlcjp0eXBlb2YgYz09ImZ1bmN0aW9uIj9jOm51bGwsY2xheno6YixpbkZyb250OiEhZH07cmV0dXJuIGQ/KHRoaXMuJGZyb250TWFya2Vyc1tlXT1mLHRoaXMuX2VtaXQoImNoYW5nZUZyb250TWFya2VyIikpOih0aGlzLiRiYWNrTWFya2Vyc1tlXT1mLHRoaXMuX2VtaXQoImNoYW5nZUJhY2tNYXJrZXIiKSksZX0sdGhpcy5yZW1vdmVNYXJrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kZnJvbnRNYXJrZXJzW2FdfHx0aGlzLiRiYWNrTWFya2Vyc1thXTtpZighYilyZXR1cm47dmFyIGM9Yi5pbkZyb250P3RoaXMuJGZyb250TWFya2Vyczp0aGlzLiRiYWNrTWFya2VycztiJiYoZGVsZXRlIGNbYV0sdGhpcy5fZW1pdChiLmluRnJvbnQ/ImNoYW5nZUZyb250TWFya2VyIjoiY2hhbmdlQmFja01hcmtlciIpKX0sdGhpcy5nZXRNYXJrZXJzPWZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuJGZyb250TWFya2Vyczp0aGlzLiRiYWNrTWFya2Vyc30sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihhKXt0aGlzLiRhbm5vdGF0aW9ucz17fTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXSxkPWMucm93O3RoaXMuJGFubm90YXRpb25zW2RdP3RoaXMuJGFubm90YXRpb25zW2RdLnB1c2goYyk6dGhpcy4kYW5ub3RhdGlvbnNbZF09W2NdfXRoaXMuX2VtaXQoImNoYW5nZUFubm90YXRpb24iLHt9KX0sdGhpcy5nZXRBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhbm5vdGF0aW9uc3x8e319LHRoaXMuY2xlYXJBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3RoaXMuJGFubm90YXRpb25zPXt9LHRoaXMuX2VtaXQoImNoYW5nZUFubm90YXRpb24iLHt9KX0sdGhpcy4kZGV0ZWN0TmV3TGluZT1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eLio/KFxyP1xuKS9tKTtiP3RoaXMuJGF1dG9OZXdMaW5lPWJbMV06dGhpcy4kYXV0b05ld0xpbmU9IlxuIn0sdGhpcy5nZXRXb3JkUmFuZ2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldExpbmUoYSksZD0hMTtiPjAmJihkPSEhYy5jaGFyQXQoYi0xKS5tYXRjaCh0aGlzLnRva2VuUmUpKSxkfHwoZD0hIWMuY2hhckF0KGIpLm1hdGNoKHRoaXMudG9rZW5SZSkpO3ZhciBlPWQ/dGhpcy50b2tlblJlOnRoaXMubm9uVG9rZW5SZSxmPWI7aWYoZj4wKXtkbyBmLS07d2hpbGUoZj49MCYmYy5jaGFyQXQoZikubWF0Y2goZSkpO2YrK312YXIgZz1iO3doaWxlKGc8Yy5sZW5ndGgmJmMuY2hhckF0KGcpLm1hdGNoKGUpKWcrKztyZXR1cm4gbmV3IGkoYSxmLGEsZyl9LHRoaXMuZ2V0QVdvcmRSYW5nZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0V29yZFJhbmdlKGEsYiksZD10aGlzLmdldExpbmUoYy5lbmQucm93KTt3aGlsZShkLmNoYXJBdChjLmVuZC5jb2x1bW4pLm1hdGNoKC9bIFx0XS8pKWMuZW5kLmNvbHVtbis9MTtyZXR1cm4gY30sdGhpcy5zZXROZXdMaW5lTW9kZT1mdW5jdGlvbihhKXt0aGlzLmRvYy5zZXROZXdMaW5lTW9kZShhKX0sdGhpcy5nZXROZXdMaW5lTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXROZXdMaW5lTW9kZSgpfSx0aGlzLiR1c2VXb3JrZXI9ITAsdGhpcy5zZXRVc2VXb3JrZXI9ZnVuY3Rpb24oYSl7aWYodGhpcy4kdXNlV29ya2VyPT1hKXJldHVybjt0aGlzLiR1c2VXb3JrZXI9YSx0aGlzLiRzdG9wV29ya2VyKCksYSYmdGhpcy4kc3RhcnRXb3JrZXIoKX0sdGhpcy5nZXRVc2VXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlV29ya2VyfSx0aGlzLm9uUmVsb2FkVG9rZW5pemVyPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTt0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KGIuZmlyc3QpLHRoaXMuX2VtaXQoInRva2VuaXplclVwZGF0ZSIsYSl9LHRoaXMuJG1vZGU9bnVsbCx0aGlzLnNldE1vZGU9ZnVuY3Rpb24oYSl7aWYodGhpcy4kbW9kZT09PWEpcmV0dXJuO3RoaXMuJG1vZGU9YSx0aGlzLiRzdG9wV29ya2VyKCksdGhpcy4kdXNlV29ya2VyJiZ0aGlzLiRzdGFydFdvcmtlcigpO3ZhciBiPWEuZ2V0VG9rZW5pemVyKCk7aWYoYi5hZGRFdmVudExpc3RlbmVyIT09dW5kZWZpbmVkKXt2YXIgYz10aGlzLm9uUmVsb2FkVG9rZW5pemVyLmJpbmQodGhpcyk7Yi5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLGMpfWlmKCF0aGlzLmJnVG9rZW5pemVyKXt0aGlzLmJnVG9rZW5pemVyPW5ldyBrKGIpO3ZhciBkPXRoaXM7dGhpcy5iZ1Rva2VuaXplci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLGZ1bmN0aW9uKGEpe2QuX2VtaXQoInRva2VuaXplclVwZGF0ZSIsYSl9KX1lbHNlIHRoaXMuYmdUb2tlbml6ZXIuc2V0VG9rZW5pemVyKGIpO3RoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKSx0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApLHRoaXMudG9rZW5SZT1hLnRva2VuUmUsdGhpcy5ub25Ub2tlblJlPWEubm9uVG9rZW5SZSx0aGlzLiRzZXRGb2xkaW5nKGEuZm9sZGluZ1J1bGVzKSx0aGlzLl9lbWl0KCJjaGFuZ2VNb2RlIil9LHRoaXMuJHN0b3BXb3JrZXI9ZnVuY3Rpb24oKXt0aGlzLiR3b3JrZXImJnRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbH0sdGhpcy4kc3RhcnRXb3JrZXI9ZnVuY3Rpb24oKXtpZih0eXBlb2YgV29ya2VyIT0idW5kZWZpbmVkIiYmIWEubm9Xb3JrZXIpdHJ5e3RoaXMuJHdvcmtlcj10aGlzLiRtb2RlLmNyZWF0ZVdvcmtlcih0aGlzKX1jYXRjaChiKXtjb25zb2xlLmxvZygiQ291bGQgbm90IGxvYWQgd29ya2VyIiksY29uc29sZS5sb2coYiksdGhpcy4kd29ya2VyPW51bGx9ZWxzZSB0aGlzLiR3b3JrZXI9bnVsbH0sdGhpcy5nZXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vZGV9LHRoaXMuJHNjcm9sbFRvcD0wLHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChNYXRoLm1heCgwLGEpKTtpZih0aGlzLiRzY3JvbGxUb3A9PT1hKXJldHVybjt0aGlzLiRzY3JvbGxUb3A9YSx0aGlzLl9lbWl0KCJjaGFuZ2VTY3JvbGxUb3AiLGEpfSx0aGlzLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxUb3B9LHRoaXMuJHNjcm9sbExlZnQ9MCx0aGlzLnNldFNjcm9sbExlZnQ9ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKE1hdGgubWF4KDAsYSkpO2lmKHRoaXMuJHNjcm9sbExlZnQ9PT1hKXJldHVybjt0aGlzLiRzY3JvbGxMZWZ0PWEsdGhpcy5fZW1pdCgiY2hhbmdlU2Nyb2xsTGVmdCIsYSl9LHRoaXMuZ2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxMZWZ0fSx0aGlzLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNvbXB1dGVXaWR0aCgpLHRoaXMud2lkdGh9LHRoaXMuZ2V0U2NyZWVuV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY29tcHV0ZVdpZHRoKCksdGhpcy5zY3JlZW5XaWR0aH0sdGhpcy4kY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJG1vZGlmaWVkfHxhKXt0aGlzLiRtb2RpZmllZD0hMTt2YXIgYj10aGlzLmRvYy5nZXRBbGxMaW5lcygpLGM9MCxkPTA7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMuZ2V0Rm9sZExpbmUoZSksZyxoO2c9YltlXTtpZihmKXt2YXIgaT1mLnJhbmdlLmVuZDtnPXRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGYpLGU9aS5yb3d9aD1nLmxlbmd0aCxjPU1hdGgubWF4KGMsaCksdGhpcy4kdXNlV3JhcE1vZGV8fChkPU1hdGgubWF4KGQsdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgoZylbMF0pKX10aGlzLndpZHRoPWMsdGhpcy4kdXNlV3JhcE1vZGU/dGhpcy5zY3JlZW5XaWR0aD10aGlzLiR3cmFwTGltaXQ6dGhpcy5zY3JlZW5XaWR0aD1kfX0sdGhpcy5nZXRMaW5lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRvYy5nZXRMaW5lKGEpfSx0aGlzLmdldExpbmVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZG9jLmdldExpbmVzKGEsYil9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldExlbmd0aCgpfSx0aGlzLmdldFRleHRSYW5nZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kb2MuZ2V0VGV4dFJhbmdlKGEpfSx0aGlzLmluc2VydD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmRvYy5pbnNlcnQoYSxiKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZG9jLnJlbW92ZShhKX0sdGhpcy51bmRvQ2hhbmdlcz1mdW5jdGlvbihhLGIpe2lmKCFhLmxlbmd0aClyZXR1cm47dGhpcy4kZnJvbVVuZG89ITA7dmFyIGM9bnVsbDtmb3IodmFyIGQ9YS5sZW5ndGgtMTtkIT0tMTtkLS0pe3ZhciBlPWFbZF07ZS5ncm91cD09ImRvYyI/KHRoaXMuZG9jLnJldmVydERlbHRhcyhlLmRlbHRhcyksYz10aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGUuZGVsdGFzLCEwLGMpKTplLmRlbHRhcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMuYWRkRm9sZHMoYS5mb2xkcyl9LHRoaXMpfXJldHVybiB0aGlzLiRmcm9tVW5kbz0hMSxjJiZ0aGlzLiR1bmRvU2VsZWN0JiYhYiYmdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYyksY30sdGhpcy5yZWRvQ2hhbmdlcz1mdW5jdGlvbihhLGIpe2lmKCFhLmxlbmd0aClyZXR1cm47dGhpcy4kZnJvbVVuZG89ITA7dmFyIGM9bnVsbDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtlLmdyb3VwPT0iZG9jIiYmKHRoaXMuZG9jLmFwcGx5RGVsdGFzKGUuZGVsdGFzKSxjPXRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZS5kZWx0YXMsITEsYykpfXJldHVybiB0aGlzLiRmcm9tVW5kbz0hMSxjJiZ0aGlzLiR1bmRvU2VsZWN0JiYhYiYmdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYyksY30sdGhpcy5zZXRVbmRvU2VsZWN0PWZ1bmN0aW9uKGEpe3RoaXMuJHVuZG9TZWxlY3Q9YX0sdGhpcy4kZ2V0VW5kb1NlbGVjdGlvbj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYz1hLmFjdGlvbj09Imluc2VydFRleHQifHxhLmFjdGlvbj09Imluc2VydExpbmVzIjtyZXR1cm4gYj8hYzpjfXZhciBlPWFbMF0sZixnLGg9ITE7ZChlKT8oZj1lLnJhbmdlLmNsb25lKCksaD0hMCk6KGY9aS5mcm9tUG9pbnRzKGUucmFuZ2Uuc3RhcnQsZS5yYW5nZS5zdGFydCksaD0hMSk7Zm9yKHZhciBqPTE7ajxhLmxlbmd0aDtqKyspZT1hW2pdLGQoZSk/KGc9ZS5yYW5nZS5zdGFydCxmLmNvbXBhcmUoZy5yb3csZy5jb2x1bW4pPT0tMSYmZi5zZXRTdGFydChlLnJhbmdlLnN0YXJ0KSxnPWUucmFuZ2UuZW5kLGYuY29tcGFyZShnLnJvdyxnLmNvbHVtbik9PTEmJmYuc2V0RW5kKGUucmFuZ2UuZW5kKSxoPSEwKTooZz1lLnJhbmdlLnN0YXJ0LGYuY29tcGFyZShnLnJvdyxnLmNvbHVtbik9PS0xJiYoZj1pLmZyb21Qb2ludHMoZS5yYW5nZS5zdGFydCxlLnJhbmdlLnN0YXJ0KSksaD0hMSk7aWYoYyE9bnVsbCl7dmFyIGs9Yy5jb21wYXJlUmFuZ2UoZik7az09MT9mLnNldFN0YXJ0KGMuc3RhcnQpOms9PS0xJiZmLnNldEVuZChjLmVuZCl9cmV0dXJuIGZ9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmRvYy5yZXBsYWNlKGEsYil9LHRoaXMubW92ZVRleHQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldFRleHRSYW5nZShhKTt0aGlzLnJlbW92ZShhKTt2YXIgZD1iLnJvdyxlPWIuY29sdW1uOyFhLmlzTXVsdGlMaW5lKCkmJmEuc3RhcnQucm93PT1kJiZhLmVuZC5jb2x1bW48ZSYmKGUtPWMubGVuZ3RoKTtpZihhLmlzTXVsdGlMaW5lKCkmJmEuZW5kLnJvdzxkKXt2YXIgZj10aGlzLmRvYy4kc3BsaXQoYyk7ZC09Zi5sZW5ndGgtMX12YXIgZz1kK2EuZW5kLnJvdy1hLnN0YXJ0LnJvdyxoPWEuaXNNdWx0aUxpbmUoKT9hLmVuZC5jb2x1bW46ZSthLmVuZC5jb2x1bW4tYS5zdGFydC5jb2x1bW4saj1uZXcgaShkLGUsZyxoKTtyZXR1cm4gdGhpcy5pbnNlcnQoai5zdGFydCxjKSxqfSx0aGlzLmluZGVudFJvd3M9ZnVuY3Rpb24oYSxiLGMpe2M9Yy5yZXBsYWNlKC9cdC9nLHRoaXMuZ2V0VGFiU3RyaW5nKCkpO2Zvcih2YXIgZD1hO2Q8PWI7ZCsrKXRoaXMuaW5zZXJ0KHtyb3c6ZCxjb2x1bW46MH0sYyl9LHRoaXMub3V0ZGVudFJvd3M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2xsYXBzZVJvd3MoKSxjPW5ldyBpKDAsMCwwLDApLGQ9dGhpcy5nZXRUYWJTaXplKCk7Zm9yKHZhciBlPWIuc3RhcnQucm93O2U8PWIuZW5kLnJvdzsrK2Upe3ZhciBmPXRoaXMuZ2V0TGluZShlKTtjLnN0YXJ0LnJvdz1lLGMuZW5kLnJvdz1lO2Zvcih2YXIgZz0wO2c8ZDsrK2cpaWYoZi5jaGFyQXQoZykhPSIgIilicmVhaztnPGQmJmYuY2hhckF0KGcpPT0iXHQiPyhjLnN0YXJ0LmNvbHVtbj1nLGMuZW5kLmNvbHVtbj1nKzEpOihjLnN0YXJ0LmNvbHVtbj0wLGMuZW5kLmNvbHVtbj1nKSx0aGlzLnJlbW92ZShjKX19LHRoaXMubW92ZUxpbmVzVXA9ZnVuY3Rpb24oYSxiKXtpZihhPD0wKXJldHVybiAwO3ZhciBjPXRoaXMuZG9jLnJlbW92ZUxpbmVzKGEsYik7cmV0dXJuIHRoaXMuZG9jLmluc2VydExpbmVzKGEtMSxjKSwtMX0sdGhpcy5tb3ZlTGluZXNEb3duPWZ1bmN0aW9uKGEsYil7aWYoYj49dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSlyZXR1cm4gMDt2YXIgYz10aGlzLmRvYy5yZW1vdmVMaW5lcyhhLGIpO3JldHVybiB0aGlzLmRvYy5pbnNlcnRMaW5lcyhhKzEsYyksMX0sdGhpcy5kdXBsaWNhdGVMaW5lcz1mdW5jdGlvbihhLGIpe3ZhciBhPXRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KGEpLGI9dGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQoYiksYz10aGlzLmdldExpbmVzKGEsYik7dGhpcy5kb2MuaW5zZXJ0TGluZXMoYSxjKTt2YXIgZD1iLWErMTtyZXR1cm4gZH0sdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oYSx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xKSl9LHRoaXMuJGNsaXBDb2x1bW5Ub1Jvdz1mdW5jdGlvbihhLGIpe3JldHVybiBiPDA/MDpNYXRoLm1pbih0aGlzLmRvYy5nZXRMaW5lKGEpLmxlbmd0aCxiKX0sdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudD1mdW5jdGlvbihhLGIpe2I9TWF0aC5tYXgoMCxiKTtpZihhPDApYT0wLGI9MDtlbHNle3ZhciBjPXRoaXMuZG9jLmdldExlbmd0aCgpO2E+PWM/KGE9Yy0xLGI9dGhpcy5kb2MuZ2V0TGluZShjLTEpLmxlbmd0aCk6Yj1NYXRoLm1pbih0aGlzLmRvYy5nZXRMaW5lKGEpLmxlbmd0aCxiKX1yZXR1cm57cm93OmEsY29sdW1uOmJ9fSx0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe2Euc3RhcnQucm93PDA/KGEuc3RhcnQucm93PTAsYS5zdGFydC5jb2x1bW49MCk6YS5zdGFydC5jb2x1bW49dGhpcy4kY2xpcENvbHVtblRvUm93KGEuc3RhcnQucm93LGEuc3RhcnQuY29sdW1uKTt2YXIgYj10aGlzLmRvYy5nZXRMZW5ndGgoKS0xO3JldHVybiBhLmVuZC5yb3c+Yj8oYS5lbmQucm93PWIsYS5lbmQuY29sdW1uPXRoaXMuZG9jLmdldExpbmUoYikubGVuZ3RoKTphLmVuZC5jb2x1bW49dGhpcy4kY2xpcENvbHVtblRvUm93KGEuZW5kLnJvdyxhLmVuZC5jb2x1bW4pLGF9LHRoaXMuJHdyYXBMaW1pdD04MCx0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLiR3cmFwTGltaXRSYW5nZT17bWluOm51bGwsbWF4Om51bGx9LHRoaXMuc2V0VXNlV3JhcE1vZGU9ZnVuY3Rpb24oYSl7aWYoYSE9dGhpcy4kdXNlV3JhcE1vZGUpe3RoaXMuJHVzZVdyYXBNb2RlPWEsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTtpZihhKXt2YXIgYj10aGlzLmdldExlbmd0aCgpO3RoaXMuJHdyYXBEYXRhPVtdO2Zvcih2YXIgYz0wO2M8YjtjKyspdGhpcy4kd3JhcERhdGEucHVzaChbXSk7dGhpcy4kdXBkYXRlV3JhcERhdGEoMCxiLTEpfXRoaXMuX2VtaXQoImNoYW5nZVdyYXBNb2RlIil9fSx0aGlzLmdldFVzZVdyYXBNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVdyYXBNb2RlfSx0aGlzLnNldFdyYXBMaW1pdFJhbmdlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy4kd3JhcExpbWl0UmFuZ2UubWluIT09YXx8dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4IT09Yil0aGlzLiR3cmFwTGltaXRSYW5nZS5taW49YSx0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXg9Yix0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VXcmFwTW9kZSIpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRjb25zdHJhaW5XcmFwTGltaXQoYSk7cmV0dXJuIGIhPXRoaXMuJHdyYXBMaW1pdCYmYj4wPyh0aGlzLiR3cmFwTGltaXQ9Yix0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsdGhpcy5nZXRMZW5ndGgoKS0xKSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuX2VtaXQoImNoYW5nZVdyYXBMaW1pdCIpKSwhMCk6ITF9LHRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiR3cmFwTGltaXRSYW5nZS5taW47YiYmKGE9TWF0aC5tYXgoYixhKSk7dmFyIGM9dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4O3JldHVybiBjJiYoYT1NYXRoLm1pbihjLGEpKSxNYXRoLm1heCgxLGEpfSx0aGlzLmdldFdyYXBMaW1pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR3cmFwTGltaXR9LHRoaXMuZ2V0V3JhcExpbWl0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm57bWluOnRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbixtYXg6dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4fX0sdGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kdXNlV3JhcE1vZGUsYyxkPWEuZGF0YS5hY3Rpb24sZT1hLmRhdGEucmFuZ2Uuc3RhcnQucm93LGY9YS5kYXRhLnJhbmdlLmVuZC5yb3csZz1hLmRhdGEucmFuZ2Uuc3RhcnQsaD1hLmRhdGEucmFuZ2UuZW5kLGk9bnVsbDtkLmluZGV4T2YoIkxpbmVzIikhPS0xPyhkPT0iaW5zZXJ0TGluZXMiP2Y9ZSthLmRhdGEubGluZXMubGVuZ3RoOmY9ZSxjPWEuZGF0YS5saW5lcz9hLmRhdGEubGluZXMubGVuZ3RoOmYtZSk6Yz1mLWU7aWYoYyE9MClpZihkLmluZGV4T2YoInJlbW92ZSIpIT0tMSl7YiYmdGhpcy4kd3JhcERhdGEuc3BsaWNlKGUsYyk7dmFyIGo9dGhpcy4kZm9sZERhdGE7aT10aGlzLmdldEZvbGRzSW5SYW5nZShhLmRhdGEucmFuZ2UpLHRoaXMucmVtb3ZlRm9sZHMoaSk7dmFyIGs9dGhpcy5nZXRGb2xkTGluZShoLnJvdyksbD0wO2lmKGspe2suYWRkUmVtb3ZlQ2hhcnMoaC5yb3csaC5jb2x1bW4sZy5jb2x1bW4taC5jb2x1bW4pLGsuc2hpZnRSb3coLWMpO3ZhciBtPXRoaXMuZ2V0Rm9sZExpbmUoZSk7bSYmbSE9PWsmJihtLm1lcmdlKGspLGs9bSksbD1qLmluZGV4T2YoaykrMX1mb3IobDtsPGoubGVuZ3RoO2wrKyl7dmFyIGs9altsXTtrLnN0YXJ0LnJvdz49aC5yb3cmJmsuc2hpZnRSb3coLWMpfWY9ZX1lbHNle3ZhciBuO2lmKGIpe249W2UsMF07Zm9yKHZhciBvPTA7bzxjO28rKyluLnB1c2goW10pO3RoaXMuJHdyYXBEYXRhLnNwbGljZS5hcHBseSh0aGlzLiR3cmFwRGF0YSxuKX12YXIgaj10aGlzLiRmb2xkRGF0YSxrPXRoaXMuZ2V0Rm9sZExpbmUoZSksbD0wO2lmKGspe3ZhciBwPWsucmFuZ2UuY29tcGFyZUluc2lkZShnLnJvdyxnLmNvbHVtbik7cD09MD8oaz1rLnNwbGl0KGcucm93LGcuY29sdW1uKSxrLnNoaWZ0Um93KGMpLGsuYWRkUmVtb3ZlQ2hhcnMoZiwwLGguY29sdW1uLWcuY29sdW1uKSk6cD09LTEmJihrLmFkZFJlbW92ZUNoYXJzKGUsMCxoLmNvbHVtbi1nLmNvbHVtbiksay5zaGlmdFJvdyhjKSksbD1qLmluZGV4T2YoaykrMX1mb3IobDtsPGoubGVuZ3RoO2wrKyl7dmFyIGs9altsXTtrLnN0YXJ0LnJvdz49ZSYmay5zaGlmdFJvdyhjKX19ZWxzZXtjPU1hdGguYWJzKGEuZGF0YS5yYW5nZS5zdGFydC5jb2x1bW4tYS5kYXRhLnJhbmdlLmVuZC5jb2x1bW4pLGQuaW5kZXhPZigicmVtb3ZlIikhPS0xJiYoaT10aGlzLmdldEZvbGRzSW5SYW5nZShhLmRhdGEucmFuZ2UpLHRoaXMucmVtb3ZlRm9sZHMoaSksYz0tYyk7dmFyIGs9dGhpcy5nZXRGb2xkTGluZShlKTtrJiZrLmFkZFJlbW92ZUNoYXJzKGUsZy5jb2x1bW4sYyl9cmV0dXJuIGImJnRoaXMuJHdyYXBEYXRhLmxlbmd0aCE9dGhpcy5kb2MuZ2V0TGVuZ3RoKCkmJmNvbnNvbGUuZXJyb3IoImRvYy5nZXRMZW5ndGgoKSBhbmQgJHdyYXBEYXRhLmxlbmd0aCBoYXZlIHRvIGJlIHRoZSBzYW1lISIpLGImJnRoaXMuJHVwZGF0ZVdyYXBEYXRhKGUsZiksaX0sdGhpcy4kdXBkYXRlV3JhcERhdGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRvYy5nZXRBbGxMaW5lcygpLGQ9dGhpcy5nZXRUYWJTaXplKCksZj10aGlzLiR3cmFwRGF0YSxpPXRoaXMuJHdyYXBMaW1pdCxqLGssbT1hO2I9TWF0aC5taW4oYixjLmxlbmd0aC0xKTt3aGlsZShtPD1iKXtrPXRoaXMuZ2V0Rm9sZExpbmUobSxrKTtpZighaylqPXRoaXMuJGdldERpc3BsYXlUb2tlbnMoZS5zdHJpbmdUcmltUmlnaHQoY1ttXSkpLGZbbV09dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMoaixpLGQpLG0rKztlbHNle2o9W10say53YWxrKGZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmO2lmKGEpe2Y9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhhLGoubGVuZ3RoKSxmWzBdPWc7Zm9yKHZhciBpPTE7aTxmLmxlbmd0aDtpKyspZltpXT1ofWVsc2UgZj10aGlzLiRnZXREaXNwbGF5VG9rZW5zKGNbYl0uc3Vic3RyaW5nKGUsZCksai5sZW5ndGgpO2o9ai5jb25jYXQoZil9LmJpbmQodGhpcyksay5lbmQucm93LGNbay5lbmQucm93XS5sZW5ndGgrMSk7d2hpbGUoai5sZW5ndGghPTAmJmpbai5sZW5ndGgtMV0+PWwpai5wb3AoKTtmW2suc3RhcnQucm93XT10aGlzLiRjb21wdXRlV3JhcFNwbGl0cyhqLGksZCksbT1rLmVuZC5yb3crMX19fTt2YXIgYj0xLGM9MixnPTMsaD00LGo9OSxsPTEwLG09MTEsbj0xMjt0aGlzLiRjb21wdXRlV3JhcFNwbGl0cz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGkoYil7dmFyIGQ9YS5zbGljZShlLGIpLGc9ZC5sZW5ndGg7ZC5qb2luKCIiKS5yZXBsYWNlKC8xMi9nLGZ1bmN0aW9uKCl7Zy09MX0pLnJlcGxhY2UoLzIvZyxmdW5jdGlvbigpe2ctPTF9KSxmKz1nLGMucHVzaChmKSxlPWJ9aWYoYS5sZW5ndGg9PTApcmV0dXJuW107dmFyIGM9W10sZD1hLmxlbmd0aCxlPTAsZj0wO3doaWxlKGQtZT5iKXt2YXIgaz1lK2I7aWYoYVtrXT49bCl7d2hpbGUoYVtrXT49bClrKys7aShrKTtjb250aW51ZX1pZihhW2tdPT1nfHxhW2tdPT1oKXtmb3IoaztrIT1lLTE7ay0tKWlmKGFba109PWcpYnJlYWs7aWYoaz5lKXtpKGspO2NvbnRpbnVlfWs9ZStiO2ZvcihrO2s8YS5sZW5ndGg7aysrKWlmKGFba10hPWgpYnJlYWs7aWYoaz09YS5sZW5ndGgpYnJlYWs7aShrKTtjb250aW51ZX12YXIgbT1NYXRoLm1heChrLTEwLGUtMSk7d2hpbGUoaz5tJiZhW2tdPGcpay0tO3doaWxlKGs+bSYmYVtrXT09ailrLS07aWYoaz5tKXtpKCsrayk7Y29udGludWV9az1lK2IsaShrKX1yZXR1cm4gY30sdGhpcy4kZ2V0RGlzcGxheVRva2Vucz1mdW5jdGlvbihhLGQpe3ZhciBlPVtdLGY7ZD1kfHwwO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hLmNoYXJDb2RlQXQoZyk7aWYoaD09OSl7Zj10aGlzLmdldFNjcmVlblRhYlNpemUoZS5sZW5ndGgrZCksZS5wdXNoKG0pO2Zvcih2YXIgaT0xO2k8ZjtpKyspZS5wdXNoKG4pfWVsc2UgaD09MzI/ZS5wdXNoKGwpOmg+MzkmJmg8NDh8fGg+NTcmJmg8NjQ/ZS5wdXNoKGopOmg+PTQzNTImJm8oaCk/ZS5wdXNoKGIsYyk6ZS5wdXNoKGIpfXJldHVybiBlfSx0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aD1mdW5jdGlvbihhLGIsYyl7aWYoYj09MClyZXR1cm5bMCwwXTtiPT1udWxsJiYoYj1jK2EubGVuZ3RoKk1hdGgubWF4KHRoaXMuZ2V0VGFiU2l6ZSgpLDIpKSxjPWN8fDA7dmFyIGQsZTtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtkPWEuY2hhckNvZGVBdChlKSxkPT05P2MrPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShjKTpkPj00MzUyJiZvKGQpP2MrPTI6Yys9MTtpZihjPmIpYnJlYWt9cmV0dXJuW2MsZV19LHRoaXMuZ2V0Um93TGVuZ3RoPWZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2FdPzE6dGhpcy4kd3JhcERhdGFbYV0ubGVuZ3RoKzF9LHRoaXMuZ2V0Um93SGVpZ2h0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ2V0Um93TGVuZ3RoKGIpKmEubGluZUhlaWdodH0sdGhpcy5nZXRTY3JlZW5MYXN0Um93Q29sdW1uPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oYSx0aGlzLmRvYy5nZXRMaW5lKGEpLmxlbmd0aCl9LHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGEsYik7cmV0dXJuIHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihjKX0sdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhhLGIpO3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihjLE51bWJlci5NQVhfVkFMVUUvMTApfSx0aGlzLmdldFJvd1NwbGl0RGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kd3JhcERhdGFbYV06dW5kZWZpbmVkfSx0aGlzLmdldFNjcmVlblRhYlNpemU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJHRhYlNpemUtYSV0aGlzLiR0YWJTaXplfSx0aGlzLnNjcmVlblRvRG9jdW1lbnRSb3c9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYSxiKS5yb3d9LHRoaXMuc2NyZWVuVG9Eb2N1bWVudENvbHVtbj1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihhLGIpLmNvbHVtbn0sdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oYSxiKXtpZihhPDApcmV0dXJue3JvdzowLGNvbHVtbjowfTt2YXIgYyxkPTAsZT0wLGYsZz0wLGg9MCxpPXRoaXMuJHJvd0NhY2hlO2Zvcih2YXIgaj0wO2o8aS5sZW5ndGg7aisrKXtpZighKGlbal0uc2NyZWVuUm93PGEpKWJyZWFrO2c9aVtqXS5zY3JlZW5Sb3csZD1pW2pdLmRvY1Jvd312YXIgaz0haS5sZW5ndGh8fGo9PWkubGVuZ3RoLGw9dGhpcy5nZXRMZW5ndGgoKS0xLG09dGhpcy5nZXROZXh0Rm9sZExpbmUoZCksbj1tP20uc3RhcnQucm93OkluZmluaXR5O3doaWxlKGc8PWEpe2g9dGhpcy5nZXRSb3dMZW5ndGgoZCk7aWYoZytoLTE+PWF8fGQ+PWwpYnJlYWs7Zys9aCxkKyssZD5uJiYoZD1tLmVuZC5yb3crMSxtPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGQsbSksbj1tP20uc3RhcnQucm93OkluZmluaXR5KSxrJiZpLnB1c2goe2RvY1JvdzpkLHNjcmVlblJvdzpnfSl9aWYobSYmbS5zdGFydC5yb3c8PWQpYz10aGlzLmdldEZvbGREaXNwbGF5TGluZShtKSxkPW0uc3RhcnQucm93O2Vsc2V7aWYoZytoPD1hfHxkPmwpcmV0dXJue3JvdzpsLGNvbHVtbjp0aGlzLmdldExpbmUobCkubGVuZ3RofTtjPXRoaXMuZ2V0TGluZShkKSxtPW51bGx9aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciBvPXRoaXMuJHdyYXBEYXRhW2RdO28mJihmPW9bYS1nXSxhPmcmJm8ubGVuZ3RoJiYoZT1vW2EtZy0xXXx8b1tvLmxlbmd0aC0xXSxjPWMuc3Vic3RyaW5nKGUpKSl9cmV0dXJuIGUrPXRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKGMsYilbMV0sdGhpcy4kdXNlV3JhcE1vZGU/ZT49ZiYmKGU9Zi0xKTplPU1hdGgubWluKGUsYy5sZW5ndGgpLG0/bS5pZHhUb1Bvc2l0aW9uKGUpOntyb3c6ZCxjb2x1bW46ZX19LHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PSJ1bmRlZmluZWQiKXZhciBjPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoYS5yb3csYS5jb2x1bW4pO2Vsc2UgYz10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGEsYik7YT1jLnJvdyxiPWMuY29sdW1uO3ZhciBkO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXtkPXRoaXMuJHdyYXBEYXRhO2lmKGE+ZC5sZW5ndGgtMSlyZXR1cm57cm93OnRoaXMuZ2V0U2NyZWVuTGVuZ3RoKCksY29sdW1uOmQubGVuZ3RoPT0wPzA6ZFtkLmxlbmd0aC0xXS5sZW5ndGgtMX19dmFyIGU9MCxmPW51bGwsZz1udWxsO2c9dGhpcy5nZXRGb2xkQXQoYSxiLDEpLGcmJihhPWcuc3RhcnQucm93LGI9Zy5zdGFydC5jb2x1bW4pO3ZhciBoLGk9MCxqPXRoaXMuJHJvd0NhY2hlO2Zvcih2YXIgaz0wO2s8ai5sZW5ndGg7aysrKXtpZighKGpba10uZG9jUm93PGEpKWJyZWFrO2U9altrXS5zY3JlZW5Sb3csaT1qW2tdLmRvY1Jvd312YXIgbD0hai5sZW5ndGh8fGs9PWoubGVuZ3RoLG09dGhpcy5nZXROZXh0Rm9sZExpbmUoaSksbj1tP20uc3RhcnQucm93OkluZmluaXR5O3doaWxlKGk8YSl7aWYoaT49bil7aD1tLmVuZC5yb3crMTtpZihoPmEpYnJlYWs7bT10aGlzLmdldE5leHRGb2xkTGluZShoLG0pLG49bT9tLnN0YXJ0LnJvdzpJbmZpbml0eX1lbHNlIGg9aSsxO2UrPXRoaXMuZ2V0Um93TGVuZ3RoKGkpLGk9aCxsJiZqLnB1c2goe2RvY1JvdzppLHNjcmVlblJvdzplfSl9dmFyIG89IiI7bSYmaT49bj8obz10aGlzLmdldEZvbGREaXNwbGF5TGluZShtLGEsYiksZj1tLnN0YXJ0LnJvdyk6KG89dGhpcy5nZXRMaW5lKGEpLnN1YnN0cmluZygwLGIpLGY9YSk7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciBwPWRbZl0scT0wO3doaWxlKG8ubGVuZ3RoPj1wW3FdKWUrKyxxKys7bz1vLnN1YnN0cmluZyhwW3EtMV18fDAsby5sZW5ndGgpfXJldHVybntyb3c6ZSxjb2x1bW46dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgobylbMF19fSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYSxiKS5jb2x1bW59LHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihhLGIpLnJvd30sdGhpcy5nZXRTY3JlZW5MZW5ndGg9ZnVuY3Rpb24oKXt2YXIgYT0wLGI9bnVsbDtpZighdGhpcy4kdXNlV3JhcE1vZGUpe2E9dGhpcy5nZXRMZW5ndGgoKTt2YXIgYz10aGlzLiRmb2xkRGF0YTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPWNbZF0sYS09Yi5lbmQucm93LWIuc3RhcnQucm93fWVsc2V7dmFyIGU9dGhpcy4kd3JhcERhdGEubGVuZ3RoLGY9MCxkPTAsYj10aGlzLiRmb2xkRGF0YVtkKytdLGc9Yj9iLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZShmPGUpYSs9dGhpcy4kd3JhcERhdGFbZl0ubGVuZ3RoKzEsZisrLGY+ZyYmKGY9Yi5lbmQucm93KzEsYj10aGlzLiRmb2xkRGF0YVtkKytdLGc9Yj9iLnN0YXJ0LnJvdzpJbmZpbml0eSl9cmV0dXJuIGF9fSkpLmNhbGwobC5wcm90b3R5cGUpLGEoIi4vZWRpdF9zZXNzaW9uL2ZvbGRpbmciKS5Gb2xkaW5nLmNhbGwobC5wcm90b3R5cGUpLGEoIi4vZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giKS5CcmFja2V0TWF0Y2guY2FsbChsLnByb3RvdHlwZSksYi5FZGl0U2Vzc2lvbj1sfSksZGVmaW5lKCJhY2Uvc2VsZWN0aW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvbGFuZyIpLGY9YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixnPWEoIi4vcmFuZ2UiKS5SYW5nZSxoPWZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbj1hLHRoaXMuZG9jPWEuZ2V0RG9jdW1lbnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb25MZWFkPXRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLDApLHRoaXMuc2VsZWN0aW9uQW5jaG9yPXRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLDApO3ZhciBiPXRoaXM7dGhpcy5zZWxlY3Rpb25MZWFkLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGEpe2IuX2VtaXQoImNoYW5nZUN1cnNvciIpLGIuJGlzRW1wdHl8fGIuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpLCFiLiRwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbk9uQ2hhbmdlJiZhLm9sZC5jb2x1bW4hPWEudmFsdWUuY29sdW1uJiZiLiR1cGRhdGVEZXNpcmVkQ29sdW1uKCl9KSx0aGlzLnNlbGVjdGlvbkFuY2hvci5vbigiY2hhbmdlIixmdW5jdGlvbigpe2IuJGlzRW1wdHl8fGIuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGYpLHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRpc0VtcHR5fHx0aGlzLnNlbGVjdGlvbkFuY2hvci5yb3c9PXRoaXMuc2VsZWN0aW9uTGVhZC5yb3cmJnRoaXMuc2VsZWN0aW9uQW5jaG9yLmNvbHVtbj09dGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbn0sdGhpcy5pc011bHRpTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8hMTp0aGlzLmdldFJhbmdlKCkuaXNNdWx0aUxpbmUoKX0sdGhpcy5nZXRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25MZWFkLmdldFBvc2l0aW9uKCl9LHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yPWZ1bmN0aW9uKGEsYil7dGhpcy5zZWxlY3Rpb25BbmNob3Iuc2V0UG9zaXRpb24oYSxiKSx0aGlzLiRpc0VtcHR5JiYodGhpcy4kaXNFbXB0eT0hMSx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSl9LHRoaXMuZ2V0U2VsZWN0aW9uQW5jaG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGlzRW1wdHk/dGhpcy5nZXRTZWxlY3Rpb25MZWFkKCk6dGhpcy5zZWxlY3Rpb25BbmNob3IuZ2V0UG9zaXRpb24oKX0sdGhpcy5nZXRTZWxlY3Rpb25MZWFkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpfSx0aGlzLnNoaWZ0U2VsZWN0aW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJGlzRW1wdHkpe3RoaXMubW92ZUN1cnNvclRvKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3csdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbithKTtyZXR1cm59dmFyIGI9dGhpcy5nZXRTZWxlY3Rpb25BbmNob3IoKSxjPXRoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpLGQ9dGhpcy5pc0JhY2t3YXJkcygpOyghZHx8Yi5jb2x1bW4hPT0wKSYmdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IoYi5yb3csYi5jb2x1bW4rYSksKGR8fGMuY29sdW1uIT09MCkmJnRoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbyhjLnJvdyxjLmNvbHVtbithKX0pfSx0aGlzLmlzQmFja3dhcmRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25BbmNob3IsYj10aGlzLnNlbGVjdGlvbkxlYWQ7cmV0dXJuIGEucm93PmIucm93fHxhLnJvdz09Yi5yb3cmJmEuY29sdW1uPmIuY29sdW1ufSx0aGlzLmdldFJhbmdlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25BbmNob3IsYj10aGlzLnNlbGVjdGlvbkxlYWQ7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2cuZnJvbVBvaW50cyhiLGIpOnRoaXMuaXNCYWNrd2FyZHMoKT9nLmZyb21Qb2ludHMoYixhKTpnLmZyb21Qb2ludHMoYSxiKX0sdGhpcy5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMuJGlzRW1wdHl8fCh0aGlzLiRpc0VtcHR5PSEwLHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpKX0sdGhpcy5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRvYy5nZXRMZW5ndGgoKS0xO3RoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKGEsdGhpcy5kb2MuZ2V0TGluZShhKS5sZW5ndGgpLHRoaXMubW92ZUN1cnNvclRvKDAsMCl9LHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oYSxiKXtiPyh0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihhLmVuZC5yb3csYS5lbmQuY29sdW1uKSx0aGlzLnNlbGVjdFRvKGEuc3RhcnQucm93LGEuc3RhcnQuY29sdW1uKSk6KHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKGEuc3RhcnQucm93LGEuc3RhcnQuY29sdW1uKSx0aGlzLnNlbGVjdFRvKGEuZW5kLnJvdyxhLmVuZC5jb2x1bW4pKSx0aGlzLiR1cGRhdGVEZXNpcmVkQ29sdW1uKCl9LHRoaXMuJHVwZGF0ZURlc2lyZWRDb2x1bW49ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnNvcigpO3RoaXMuJGRlc2lyZWRDb2x1bW49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oYS5yb3csYS5jb2x1bW4pfSx0aGlzLiRtb3ZlU2VsZWN0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2VsZWN0aW9uTGVhZDt0aGlzLiRpc0VtcHR5JiZ0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihiLnJvdyxiLmNvbHVtbiksYS5jYWxsKHRoaXMpfSx0aGlzLnNlbGVjdFRvPWZ1bmN0aW9uKGEsYil7dGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKGEsYil9KX0sdGhpcy5zZWxlY3RUb1Bvc2l0aW9uPWZ1bmN0aW9uKGEpe3RoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGEpfSl9LHRoaXMuc2VsZWN0VXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclVwKX0sdGhpcy5zZWxlY3REb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JEb3duKX0sdGhpcy5zZWxlY3RSaWdodD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yUmlnaHQpfSx0aGlzLnNlbGVjdExlZnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxlZnQpfSx0aGlzLnNlbGVjdExpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGluZVN0YXJ0KX0sdGhpcy5zZWxlY3RMaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lRW5kKX0sdGhpcy5zZWxlY3RGaWxlRW5kPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlRW5kKX0sdGhpcy5zZWxlY3RGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckZpbGVTdGFydCl9LHRoaXMuc2VsZWN0V29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQpfSx0aGlzLnNlbGVjdFdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCl9LHRoaXMuc2VsZWN0V29yZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3Vyc29yKCksYj10aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKGEucm93LGEuY29sdW1uKTt0aGlzLnNldFNlbGVjdGlvblJhbmdlKGIpfSx0aGlzLnNlbGVjdEFXb3JkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJzb3IoKSxiPXRoaXMuc2Vzc2lvbi5nZXRBV29yZFJhbmdlKGEucm93LGEuY29sdW1uKTt0aGlzLnNldFNlbGVjdGlvblJhbmdlKGIpfSx0aGlzLnNlbGVjdExpbmU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbGVjdGlvbkxlYWQucm93LGIsYz10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUoYSk7Yz8oYT1jLnN0YXJ0LnJvdyxiPWMuZW5kLnJvdyk6Yj1hLHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKGEsMCksdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKGIrMSwwKX0pfSx0aGlzLm1vdmVDdXJzb3JVcD1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KC0xLDApfSx0aGlzLm1vdmVDdXJzb3JEb3duPWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoMSwwKX0sdGhpcy5tb3ZlQ3Vyc29yTGVmdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpLGI7aWYoYj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGEucm93LGEuY29sdW1uLC0xKSl0aGlzLm1vdmVDdXJzb3JUbyhiLnN0YXJ0LnJvdyxiLnN0YXJ0LmNvbHVtbik7ZWxzZSBpZihhLmNvbHVtbj09MClhLnJvdz4wJiZ0aGlzLm1vdmVDdXJzb3JUbyhhLnJvdy0xLHRoaXMuZG9jLmdldExpbmUoYS5yb3ctMSkubGVuZ3RoKTtlbHNle3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7dGhpcy5zZXNzaW9uLmlzVGFiU3RvcChhKSYmdGhpcy5kb2MuZ2V0TGluZShhLnJvdykuc2xpY2UoYS5jb2x1bW4tYyxhLmNvbHVtbikuc3BsaXQoIiAiKS5sZW5ndGgtMT09Yz90aGlzLm1vdmVDdXJzb3JCeSgwLC1jKTp0aGlzLm1vdmVDdXJzb3JCeSgwLC0xKX19LHRoaXMubW92ZUN1cnNvclJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25MZWFkLmdldFBvc2l0aW9uKCksYjtpZihiPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoYS5yb3csYS5jb2x1bW4sMSkpdGhpcy5tb3ZlQ3Vyc29yVG8oYi5lbmQucm93LGIuZW5kLmNvbHVtbik7ZWxzZSBpZih0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uPT10aGlzLmRvYy5nZXRMaW5lKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3cpLmxlbmd0aCl0aGlzLnNlbGVjdGlvbkxlYWQucm93PHRoaXMuZG9jLmdldExlbmd0aCgpLTEmJnRoaXMubW92ZUN1cnNvclRvKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3crMSwwKTtlbHNle3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCksYT10aGlzLnNlbGVjdGlvbkxlYWQ7dGhpcy5zZXNzaW9uLmlzVGFiU3RvcChhKSYmdGhpcy5kb2MuZ2V0TGluZShhLnJvdykuc2xpY2UoYS5jb2x1bW4sYS5jb2x1bW4rYykuc3BsaXQoIiAiKS5sZW5ndGgtMT09Yz90aGlzLm1vdmVDdXJzb3JCeSgwLGMpOnRoaXMubW92ZUN1cnNvckJ5KDAsMSl9fSx0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbGVjdGlvbkxlYWQucm93LGI9dGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbixjPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KGEsYiksZD10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGMsMCksZT10aGlzLnNlc3Npb24uZ2V0RGlzcGxheUxpbmUoYSxudWxsLGQucm93LGQuY29sdW1uKSxmPWUubWF0Y2goL15ccyovKTtmWzBdLmxlbmd0aD09Yj90aGlzLm1vdmVDdXJzb3JUbyhkLnJvdyxkLmNvbHVtbik6dGhpcy5tb3ZlQ3Vyc29yVG8oZC5yb3csZC5jb2x1bW4rZlswXS5sZW5ndGgpfSx0aGlzLm1vdmVDdXJzb3JMaW5lRW5kPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25MZWFkLGI9dGhpcy5zZXNzaW9uLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uKGEucm93LGEuY29sdW1uKTt0aGlzLm1vdmVDdXJzb3JUbyhiLnJvdyxiLmNvbHVtbil9LHRoaXMubW92ZUN1cnNvckZpbGVFbmQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRvYy5nZXRMZW5ndGgoKS0xLGI9dGhpcy5kb2MuZ2V0TGluZShhKS5sZW5ndGg7dGhpcy5tb3ZlQ3Vyc29yVG8oYSxiKX0sdGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG8oMCwwKX0sdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25MZWFkLnJvdyxiPXRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4sYz10aGlzLmRvYy5nZXRMaW5lKGEpLGQ9Yy5zdWJzdHJpbmcoYiksZTt0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MDt2YXIgZj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGEsYiwxKTtpZihmKXt0aGlzLm1vdmVDdXJzb3JUbyhmLmVuZC5yb3csZi5lbmQuY29sdW1uKTtyZXR1cm59aWYoZT10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKGQpKWIrPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCxkPWMuc3Vic3RyaW5nKGIpO2lmKGI+PWMubGVuZ3RoKXt0aGlzLm1vdmVDdXJzb3JUbyhhLGMubGVuZ3RoKSx0aGlzLm1vdmVDdXJzb3JSaWdodCgpLGE8dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSYmdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCk7cmV0dXJufWlmKGU9dGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhkKSliKz10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTA7dGhpcy5tb3ZlQ3Vyc29yVG8oYSxiKX0sdGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbGVjdGlvbkxlYWQucm93LGI9dGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbixjO2lmKGM9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChhLGIsLTEpKXt0aGlzLm1vdmVDdXJzb3JUbyhjLnN0YXJ0LnJvdyxjLnN0YXJ0LmNvbHVtbik7cmV0dXJufXZhciBkPXRoaXMuc2Vzc2lvbi5nZXRGb2xkU3RyaW5nQXQoYSxiLC0xKTtkPT1udWxsJiYoZD10aGlzLmRvYy5nZXRMaW5lKGEpLnN1YnN0cmluZygwLGIpKTt2YXIgZj1lLnN0cmluZ1JldmVyc2UoZCksZzt0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MDtpZihnPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMoZikpYi09dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4LGY9Zi5zbGljZSh0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgpLHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wO2lmKGI8PTApe3RoaXMubW92ZUN1cnNvclRvKGEsMCksdGhpcy5tb3ZlQ3Vyc29yTGVmdCgpLGE+MCYmdGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQoKTtyZXR1cm59aWYoZz10aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKGYpKWItPXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MDt0aGlzLm1vdmVDdXJzb3JUbyhhLGIpfSx0aGlzLm1vdmVDdXJzb3JCeT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zZWxlY3Rpb25MZWFkLnJvdyx0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uKSxkPWI9PT0wJiZ0aGlzLiRkZXNpcmVkQ29sdW1ufHxjLmNvbHVtbixlPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYy5yb3crYSxkKTt0aGlzLm1vdmVDdXJzb3JUbyhlLnJvdyxlLmNvbHVtbitiLGI9PT0wKX0sdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbj1mdW5jdGlvbihhKXt0aGlzLm1vdmVDdXJzb3JUbyhhLnJvdyxhLmNvbHVtbil9LHRoaXMubW92ZUN1cnNvclRvPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGEsYiwxKTtkJiYoYT1kLnN0YXJ0LnJvdyxiPWQuc3RhcnQuY29sdW1uKSx0aGlzLiRwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbk9uQ2hhbmdlPSEwLHRoaXMuc2VsZWN0aW9uTGVhZC5zZXRQb3NpdGlvbihhLGIpLHRoaXMuJHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uT25DaGFuZ2U9ITEsY3x8dGhpcy4kdXBkYXRlRGVzaXJlZENvbHVtbih0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uKX0sdGhpcy5tb3ZlQ3Vyc29yVG9TY3JlZW49ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYSxiKTthPWQucm93LGI9ZC5jb2x1bW4sdGhpcy5tb3ZlQ3Vyc29yVG8oYSxiLGMpfX0pKS5jYWxsKGgucHJvdG90eXBlKSxiLlNlbGVjdGlvbj1ofSksZGVmaW5lKCJhY2UvcmFuZ2UiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuc3RhcnQ9e3JvdzphLGNvbHVtbjpifSx0aGlzLmVuZD17cm93OmMsY29sdW1uOmR9fTsoKGZ1bmN0aW9uKCl7dGhpcy5pc0VlcXVhbD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWEuc3RhcnQucm93JiZ0aGlzLmVuZC5yb3c9PWEuZW5kLnJvdyYmdGhpcy5zdGFydC5jb2x1bW49PWEuc3RhcnQuY29sdW1uJiZ0aGlzLmVuZC5jb2x1bW49PWEuZW5kLmNvbHVtbn0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSYW5nZTogWyIrdGhpcy5zdGFydC5yb3crIi8iK3RoaXMuc3RhcnQuY29sdW1uKyJdIC0+IFsiK3RoaXMuZW5kLnJvdysiLyIrdGhpcy5lbmQuY29sdW1uKyJdIn0sdGhpcy5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvbXBhcmUoYSxiKT09MH0sdGhpcy5jb21wYXJlUmFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLmVuZCxkPWEuc3RhcnQ7cmV0dXJuIGI9dGhpcy5jb21wYXJlKGMucm93LGMuY29sdW1uKSxiPT0xPyhiPXRoaXMuY29tcGFyZShkLnJvdyxkLmNvbHVtbiksYj09MT8yOmI9PTA/MTowKTpiPT0tMT8tMjooYj10aGlzLmNvbXBhcmUoZC5yb3csZC5jb2x1bW4pLGI9PS0xPy0xOmI9PTE/NDI6MCl9LHRoaXMuY29tcGFyZVBvaW50PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBhcmUoYS5yb3csYS5jb2x1bW4pfSx0aGlzLmNvbnRhaW5zUmFuZ2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KGEuc3RhcnQpPT0wJiZ0aGlzLmNvbXBhcmVQb2ludChhLmVuZCk9PTB9LHRoaXMuaXNFbmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lbmQucm93PT1hJiZ0aGlzLmVuZC5jb2x1bW49PWJ9LHRoaXMuaXNTdGFydD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09YSYmdGhpcy5zdGFydC5jb2x1bW49PWJ9LHRoaXMuc2V0U3RhcnQ9ZnVuY3Rpb24oYSxiKXt0eXBlb2YgYT09Im9iamVjdCI/KHRoaXMuc3RhcnQuY29sdW1uPWEuY29sdW1uLHRoaXMuc3RhcnQucm93PWEucm93KToodGhpcy5zdGFydC5yb3c9YSx0aGlzLnN0YXJ0LmNvbHVtbj1iKX0sdGhpcy5zZXRFbmQ9ZnVuY3Rpb24oYSxiKXt0eXBlb2YgYT09Im9iamVjdCI/KHRoaXMuZW5kLmNvbHVtbj1hLmNvbHVtbix0aGlzLmVuZC5yb3c9YS5yb3cpOih0aGlzLmVuZC5yb3c9YSx0aGlzLmVuZC5jb2x1bW49Yil9LHRoaXMuaW5zaWRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29tcGFyZShhLGIpPT0wP3RoaXMuaXNFbmQoYSxiKXx8dGhpcy5pc1N0YXJ0KGEsYik/ITE6ITA6ITF9LHRoaXMuaW5zaWRlU3RhcnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb21wYXJlKGEsYik9PTA/dGhpcy5pc0VuZChhLGIpPyExOiEwOiExfSx0aGlzLmluc2lkZUVuZD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvbXBhcmUoYSxiKT09MD90aGlzLmlzU3RhcnQoYSxiKT8hMTohMDohMX0sdGhpcy5jb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIXRoaXMuaXNNdWx0aUxpbmUoKSYmYT09PXRoaXMuc3RhcnQucm93P2I8dGhpcy5zdGFydC5jb2x1bW4/LTE6Yj50aGlzLmVuZC5jb2x1bW4/MTowOmE8dGhpcy5zdGFydC5yb3c/LTE6YT50aGlzLmVuZC5yb3c/MTp0aGlzLnN0YXJ0LnJvdz09PWE/Yj49dGhpcy5zdGFydC5jb2x1bW4/MDotMTp0aGlzLmVuZC5yb3c9PT1hP2I8PXRoaXMuZW5kLmNvbHVtbj8wOjE6MH0sdGhpcy5jb21wYXJlU3RhcnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWEmJnRoaXMuc3RhcnQuY29sdW1uPT1iPy0xOnRoaXMuY29tcGFyZShhLGIpfSx0aGlzLmNvbXBhcmVFbmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lbmQucm93PT1hJiZ0aGlzLmVuZC5jb2x1bW49PWI/MTp0aGlzLmNvbXBhcmUoYSxiKX0sdGhpcy5jb21wYXJlSW5zaWRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZW5kLnJvdz09YSYmdGhpcy5lbmQuY29sdW1uPT1iPzE6dGhpcy5zdGFydC5yb3c9PWEmJnRoaXMuc3RhcnQuY29sdW1uPT1iPy0xOnRoaXMuY29tcGFyZShhLGIpfSx0aGlzLmNsaXBSb3dzPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5lbmQucm93PmIpdmFyIGM9e3JvdzpiKzEsY29sdW1uOjB9O2lmKHRoaXMuc3RhcnQucm93PmIpdmFyIGU9e3JvdzpiKzEsY29sdW1uOjB9O2lmKHRoaXMuc3RhcnQucm93PGEpdmFyIGU9e3JvdzphLGNvbHVtbjowfTtpZih0aGlzLmVuZC5yb3c8YSl2YXIgYz17cm93OmEsY29sdW1uOjB9O3JldHVybiBkLmZyb21Qb2ludHMoZXx8dGhpcy5zdGFydCxjfHx0aGlzLmVuZCl9LHRoaXMuZXh0ZW5kPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jb21wYXJlKGEsYik7aWYoYz09MClyZXR1cm4gdGhpcztpZihjPT0tMSl2YXIgZT17cm93OmEsY29sdW1uOmJ9O2Vsc2UgdmFyIGY9e3JvdzphLGNvbHVtbjpifTtyZXR1cm4gZC5mcm9tUG9pbnRzKGV8fHRoaXMuc3RhcnQsZnx8dGhpcy5lbmQpfSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PXRoaXMuZW5kLnJvdyYmdGhpcy5zdGFydC5jb2x1bW49PXRoaXMuZW5kLmNvbHVtbn0sdGhpcy5pc011bHRpTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LnJvdyE9PXRoaXMuZW5kLnJvd30sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBkLmZyb21Qb2ludHModGhpcy5zdGFydCx0aGlzLmVuZCl9LHRoaXMuY29sbGFwc2VSb3dzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kLmNvbHVtbj09MD9uZXcgZCh0aGlzLnN0YXJ0LnJvdywwLE1hdGgubWF4KHRoaXMuc3RhcnQucm93LHRoaXMuZW5kLnJvdy0xKSwwKTpuZXcgZCh0aGlzLnN0YXJ0LnJvdywwLHRoaXMuZW5kLnJvdywwKX0sdGhpcy50b1NjcmVlblJhbmdlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpLGM9YS5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5lbmQpO3JldHVybiBuZXcgZChiLnJvdyxiLmNvbHVtbixjLnJvdyxjLmNvbHVtbil9fSkpLmNhbGwoZC5wcm90b3R5cGUpLGQuZnJvbVBvaW50cz1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZChhLnJvdyxhLmNvbHVtbixiLnJvdyxiLmNvbHVtbil9LGIuUmFuZ2U9ZH0pLGRlZmluZSgiYWNlL21vZGUvdGV4dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS91bmljb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9YSgiLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZz1hKCIuLi91bmljb2RlIiksaD1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZCgobmV3IGUpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgZn07KChmdW5jdGlvbigpe3RoaXMudG9rZW5SZT1uZXcgUmVnRXhwKCJeWyIrZy5wYWNrYWdlcy5MK2cucGFja2FnZXMuTW4rZy5wYWNrYWdlcy5NYytnLnBhY2thZ2VzLk5kK2cucGFja2FnZXMuUGMrIlxcJF9dKyIsImciKSx0aGlzLm5vblRva2VuUmU9bmV3IFJlZ0V4cCgiXig/OlteIitnLnBhY2thZ2VzLkwrZy5wYWNrYWdlcy5NbitnLnBhY2thZ2VzLk1jK2cucGFja2FnZXMuTmQrZy5wYWNrYWdlcy5QYysiXFwkX118c10pKyIsImciKSx0aGlzLmdldFRva2VuaXplcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0b2tlbml6ZXJ9LHRoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe30sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIiJ9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7fSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9LHRoaXMuaGlnaGxpZ2h0U2VsZWN0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc2Vzc2lvbjtiLiRzZWxlY3Rpb25PY2N1cnJlbmNlc3x8KGIuJHNlbGVjdGlvbk9jY3VycmVuY2VzPVtdKSxiLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5sZW5ndGgmJnRoaXMuY2xlYXJTZWxlY3Rpb25IaWdobGlnaHQoYSk7dmFyIGM9YS5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKGMuaXNFbXB0eSgpfHxjLmlzTXVsdGlMaW5lKCkpcmV0dXJuO3ZhciBkPWMuc3RhcnQuY29sdW1uLTEsZT1jLmVuZC5jb2x1bW4rMSxmPWIuZ2V0TGluZShjLnN0YXJ0LnJvdyksZz1mLmxlbmd0aCxoPWYuc3Vic3RyaW5nKE1hdGgubWF4KGQsMCksTWF0aC5taW4oZSxnKSk7aWYoZD49MCYmL15bXHdcZF0vLnRlc3QoaCl8fGU8PWcmJi9bXHdcZF0kLy50ZXN0KGgpKXJldHVybjtoPWYuc3Vic3RyaW5nKGMuc3RhcnQuY29sdW1uLGMuZW5kLmNvbHVtbik7aWYoIS9eW1x3XGRdKyQvLnRlc3QoaCkpcmV0dXJuO3ZhciBpPWEuZ2V0Q3Vyc29yUG9zaXRpb24oKSxqPXt3cmFwOiEwLHdob2xlV29yZDohMCxjYXNlU2Vuc2l0aXZlOiEwLG5lZWRsZTpofSxrPWEuJHNlYXJjaC5nZXRPcHRpb25zKCk7YS4kc2VhcmNoLnNldChqKTt2YXIgbD1hLiRzZWFyY2guZmluZEFsbChiKTtsLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoIWEuY29udGFpbnMoaS5yb3csaS5jb2x1bW4pKXt2YXIgYz1iLmFkZE1hcmtlcihhLCJhY2Vfc2VsZWN0ZWRfd29yZCIsInRleHQiKTtiLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5wdXNoKGMpfX0pLGEuJHNlYXJjaC5zZXQoayl9LHRoaXMuY2xlYXJTZWxlY3Rpb25IaWdobGlnaHQ9ZnVuY3Rpb24oYSl7aWYoIWEuc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMpcmV0dXJuO2Euc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMuZm9yRWFjaChmdW5jdGlvbihiKXthLnNlc3Npb24ucmVtb3ZlTWFya2VyKGIpfSksYS5zZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcz1bXX0sdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLiRlbWJlZHMpcmV0dXJuO3RoaXMuJG1vZGVzPXt9O2Zvcih2YXIgYj0wO2I8dGhpcy4kZW1iZWRzLmxlbmd0aDtiKyspYVt0aGlzLiRlbWJlZHNbYl1dJiYodGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2JdXT1uZXcgYVt0aGlzLiRlbWJlZHNbYl1dKTt2YXIgYz1bInRvZ2dsZUNvbW1lbnRMaW5lcyIsImdldE5leHRMaW5lSW5kZW50IiwiY2hlY2tPdXRkZW50IiwiYXV0b091dGRlbnQiLCJ0cmFuc2Zvcm1BY3Rpb24iXTtmb3IodmFyIGI9MDtiPGMubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSl7dmFyIGQ9Y1tiXSxlPWFbZF07YVtjW2JdXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkZWxlZ2F0b3IoZCxhcmd1bWVudHMsZSl9fSkodGhpcyl9LHRoaXMuJGRlbGVnYXRvcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtmb3IodmFyIGU9MDtlPHRoaXMuJGVtYmVkcy5sZW5ndGg7ZSsrKXtpZighdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2VdXSljb250aW51ZTt2YXIgZj1kLnNwbGl0KHRoaXMuJGVtYmVkc1tlXSk7aWYoIWZbMF0mJmZbMV0pe2JbMF09ZlsxXTt2YXIgZz10aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbZV1dO3JldHVybiBnW2FdLmFwcGx5KGcsYil9fXZhciBoPWMuYXBwbHkodGhpcyxiKTtyZXR1cm4gYz9oOnVuZGVmaW5lZH0sdGhpcy50cmFuc2Zvcm1BY3Rpb249ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZih0aGlzLiRiZWhhdmlvdXIpe3ZhciBmPXRoaXMuJGJlaGF2aW91ci5nZXRCZWhhdmlvdXJzKCk7Zm9yKHZhciBnIGluIGYpaWYoZltnXVtiXSl7dmFyIGg9ZltnXVtiXS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoaClyZXR1cm4gaH19fX0pKS5jYWxsKGgucHJvdG90eXBlKSxiLk1vZGU9aH0pLGRlZmluZSgiYWNlL3Rva2VuaXplciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9ZnVuY3Rpb24oYSxiKXtiPWI/ImciK2I6ImciLHRoaXMucnVsZXM9YSx0aGlzLnJlZ0V4cHM9e30sdGhpcy5tYXRjaE1hcHBpbmdzPXt9O2Zvcih2YXIgYyBpbiB0aGlzLnJ1bGVzKXt2YXIgZD10aGlzLnJ1bGVzW2NdLGU9ZCxmPVtdLGc9MCxoPXRoaXMubWF0Y2hNYXBwaW5nc1tjXT17fTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIGo9KG5ldyBSZWdFeHAoIig/OigiK2VbaV0ucmVnZXgrIil8KC4pKSIpKS5leGVjKCJhIikubGVuZ3RoLTIsaz1lW2ldLnJlZ2V4LnJlcGxhY2UoL1xcKFswLTldKykvZyxmdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKHBhcnNlSW50KGIsMTApK2crMSl9KTtoW2ddPXtydWxlOmksbGVuOmp9LGcrPWosZi5wdXNoKGspfXRoaXMucmVnRXhwc1tjXT1uZXcgUmVnRXhwKCIoPzooIitmLmpvaW4oIil8KCIpKyIpfCguKSkiLGIpfX07KChmdW5jdGlvbigpe3RoaXMuZ2V0TGluZVRva2Vucz1mdW5jdGlvbihhLGIpe3ZhciBjPWIsZD10aGlzLnJ1bGVzW2NdLGU9dGhpcy5tYXRjaE1hcHBpbmdzW2NdLGY9dGhpcy5yZWdFeHBzW2NdO2YubGFzdEluZGV4PTA7dmFyIGcsaD1bXSxpPTAsaj17dHlwZTpudWxsLHZhbHVlOiIifTt3aGlsZShnPWYuZXhlYyhhKSl7dmFyIGs9InRleHQiLGw9bnVsbCxtPVtnWzBdXTtmb3IodmFyIG49MDtuPGcubGVuZ3RoLTI7bisrKWlmKGdbbisxXSE9PXVuZGVmaW5lZCl7bD1kW2Vbbl0ucnVsZV0sZVtuXS5sZW4+MSYmKG09Zy5zbGljZShuKzIsbisxK2Vbbl0ubGVuKSksdHlwZW9mIGwudG9rZW49PSJmdW5jdGlvbiI/az1sLnRva2VuLmFwcGx5KHRoaXMsbSk6az1sLnRva2VuO3ZhciBvPWwubmV4dDtvJiZvIT09YyYmKGM9byxkPXRoaXMucnVsZXNbY10sZT10aGlzLm1hdGNoTWFwcGluZ3NbY10saT1mLmxhc3RJbmRleCxmPXRoaXMucmVnRXhwc1tjXSxmLmxhc3RJbmRleD1pKTticmVha31pZihtWzBdKXt0eXBlb2Ygaz09InN0cmluZyImJihtPVttLmpvaW4oIiIpXSxrPVtrXSk7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspKCFsfHxsLm1lcmdlfHxrW25dPT09InRleHQiKSYmai50eXBlPT09a1tuXT9qLnZhbHVlKz1tW25dOihqLnR5cGUmJmgucHVzaChqKSxqPXt0eXBlOmtbbl0sdmFsdWU6bVtuXX0pfWlmKGk9PWEubGVuZ3RoKWJyZWFrO2k9Zi5sYXN0SW5kZXh9cmV0dXJuIGoudHlwZSYmaC5wdXNoKGopLHt0b2tlbnM6aCxzdGF0ZTpjfX19KSkuY2FsbChkLnByb3RvdHlwZSksYi5Ub2tlbml6ZXI9ZH0pLGRlZmluZSgiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9sYW5nIiksZT1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJlbXB0eV9saW5lIixyZWdleDoiXiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiIuKyJ9XX19OygoZnVuY3Rpb24oKXt0aGlzLmFkZFJ1bGVzPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGEpe3ZhciBkPWFbY107Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV07Zi5uZXh0P2YubmV4dD1iK2YubmV4dDpmLm5leHQ9YitjfXRoaXMuJHJ1bGVzW2IrY109ZH19LHRoaXMuZ2V0UnVsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcnVsZXN9LHRoaXMuZW1iZWRSdWxlcz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj0obmV3IGEpLmdldFJ1bGVzKCk7aWYoZSlmb3IodmFyIGc9MDtnPGUubGVuZ3RoO2crKyllW2ddPWIrZVtnXTtlbHNle2U9W107Zm9yKHZhciBoIGluIGYpZS5wdXNoKGIraCl9dGhpcy5hZGRSdWxlcyhmLGIpO2Zvcih2YXIgZz0wO2c8ZS5sZW5ndGg7ZysrKUFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KHRoaXMuJHJ1bGVzW2VbZ11dLGQuZGVlcENvcHkoYykpO3RoaXMuJGVtYmVkc3x8KHRoaXMuJGVtYmVkcz1bXSksdGhpcy4kZW1iZWRzLnB1c2goYil9LHRoaXMuZ2V0RW1iZWRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVtYmVkc319KSkuY2FsbChlLnByb3RvdHlwZSksYi5UZXh0SGlnaGxpZ2h0UnVsZXM9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1mdW5jdGlvbigpe3RoaXMuJGJlaGF2aW91cnM9e319OygoZnVuY3Rpb24oKXt0aGlzLmFkZD1mdW5jdGlvbihhLGIsYyl7c3dpdGNoKHVuZGVmaW5lZCl7Y2FzZSB0aGlzLiRiZWhhdmlvdXJzOnRoaXMuJGJlaGF2aW91cnM9e307Y2FzZSB0aGlzLiRiZWhhdmlvdXJzW2FdOnRoaXMuJGJlaGF2aW91cnNbYV09e319dGhpcy4kYmVoYXZpb3Vyc1thXVtiXT1jfSx0aGlzLmFkZEJlaGF2aW91cnM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpZm9yKHZhciBjIGluIGFbYl0pdGhpcy5hZGQoYixjLGFbYl1bY10pfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihhKXt0aGlzLiRiZWhhdmlvdXJzJiZ0aGlzLiRiZWhhdmlvdXJzW2FdJiZkZWxldGUgdGhpcy4kYmVoYXZpb3Vyc1thXX0sdGhpcy5pbmhlcml0PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpdmFyIGM9KG5ldyBhKS5nZXRCZWhhdmlvdXJzKGIpO2Vsc2UgdmFyIGM9YS5nZXRCZWhhdmlvdXJzKGIpO3RoaXMuYWRkQmVoYXZpb3VycyhjKX0sdGhpcy5nZXRCZWhhdmlvdXJzPWZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiB0aGlzLiRiZWhhdmlvdXJzO3ZhciBiPXt9O2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuJGJlaGF2aW91cnNbYVtjXV0mJihiW2FbY11dPXRoaXMuJGJlaGF2aW91cnNbYVtjXV0pO3JldHVybiBifX0pKS5jYWxsKGQucHJvdG90eXBlKSxiLkJlaGF2aW91cj1kfSksZGVmaW5lKCJhY2UvdW5pY29kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBjPS9cd3s0fS9nO2Zvcih2YXIgZCBpbiBhKWIucGFja2FnZXNbZF09YVtkXS5yZXBsYWNlKGMsIlxcdSQmIil9InVzZSBzdHJpY3QiLGIucGFja2FnZXM9e30sZCh7TDoiMDA0MS0wMDVBMDA2MS0wMDdBMDBBQTAwQjUwMEJBMDBDMC0wMEQ2MDBEOC0wMEY2MDBGOC0wMkMxMDJDNi0wMkQxMDJFMC0wMkU0MDJFQzAyRUUwMzcwLTAzNzQwMzc2MDM3NzAzN0EtMDM3RDAzODYwMzg4LTAzOEEwMzhDMDM4RS0wM0ExMDNBMy0wM0Y1MDNGNy0wNDgxMDQ4QS0wNTI1MDUzMS0wNTU2MDU1OTA1NjEtMDU4NzA1RDAtMDVFQTA1RjAtMDVGMjA2MjEtMDY0QTA2NkUwNjZGMDY3MS0wNkQzMDZENTA2RTUwNkU2MDZFRTA2RUYwNkZBLTA2RkMwNkZGMDcxMDA3MTItMDcyRjA3NEQtMDdBNTA3QjEwN0NBLTA3RUEwN0Y0MDdGNTA3RkEwODAwLTA4MTUwODFBMDgyNDA4MjgwOTA0LTA5MzkwOTNEMDk1MDA5NTgtMDk2MTA5NzEwOTcyMDk3OS0wOTdGMDk4NS0wOThDMDk4RjA5OTAwOTkzLTA5QTgwOUFBLTA5QjAwOUIyMDlCNi0wOUI5MDlCRDA5Q0UwOURDMDlERDA5REYtMDlFMTA5RjAwOUYxMEEwNS0wQTBBMEEwRjBBMTAwQTEzLTBBMjgwQTJBLTBBMzAwQTMyMEEzMzBBMzUwQTM2MEEzODBBMzkwQTU5LTBBNUMwQTVFMEE3Mi0wQTc0MEE4NS0wQThEMEE4Ri0wQTkxMEE5My0wQUE4MEFBQS0wQUIwMEFCMjBBQjMwQUI1LTBBQjkwQUJEMEFEMDBBRTAwQUUxMEIwNS0wQjBDMEIwRjBCMTAwQjEzLTBCMjgwQjJBLTBCMzAwQjMyMEIzMzBCMzUtMEIzOTBCM0QwQjVDMEI1RDBCNUYtMEI2MTBCNzEwQjgzMEI4NS0wQjhBMEI4RS0wQjkwMEI5Mi0wQjk1MEI5OTBCOUEwQjlDMEI5RTBCOUYwQkEzMEJBNDBCQTgtMEJBQTBCQUUtMEJCOTBCRDAwQzA1LTBDMEMwQzBFLTBDMTAwQzEyLTBDMjgwQzJBLTBDMzMwQzM1LTBDMzkwQzNEMEM1ODBDNTkwQzYwMEM2MTBDODUtMEM4QzBDOEUtMEM5MDBDOTItMENBODBDQUEtMENCMzBDQjUtMENCOTBDQkQwQ0RFMENFMDBDRTEwRDA1LTBEMEMwRDBFLTBEMTAwRDEyLTBEMjgwRDJBLTBEMzkwRDNEMEQ2MDBENjEwRDdBLTBEN0YwRDg1LTBEOTYwRDlBLTBEQjEwREIzLTBEQkIwREJEMERDMC0wREM2MEUwMS0wRTMwMEUzMjBFMzMwRTQwLTBFNDYwRTgxMEU4MjBFODQwRTg3MEU4ODBFOEEwRThEMEU5NC0wRTk3MEU5OS0wRTlGMEVBMS0wRUEzMEVBNTBFQTcwRUFBMEVBQjBFQUQtMEVCMDBFQjIwRUIzMEVCRDBFQzAtMEVDNDBFQzYwRURDMEVERDBGMDAwRjQwLTBGNDcwRjQ5LTBGNkMwRjg4LTBGOEIxMDAwLTEwMkExMDNGMTA1MC0xMDU1MTA1QS0xMDVEMTA2MTEwNjUxMDY2MTA2RS0xMDcwMTA3NS0xMDgxMTA4RTEwQTAtMTBDNTEwRDAtMTBGQTEwRkMxMTAwLTEyNDgxMjRBLTEyNEQxMjUwLTEyNTYxMjU4MTI1QS0xMjVEMTI2MC0xMjg4MTI4QS0xMjhEMTI5MC0xMkIwMTJCMi0xMkI1MTJCOC0xMkJFMTJDMDEyQzItMTJDNTEyQzgtMTJENjEyRDgtMTMxMDEzMTItMTMxNTEzMTgtMTM1QTEzODAtMTM4RjEzQTAtMTNGNDE0MDEtMTY2QzE2NkYtMTY3RjE2ODEtMTY5QTE2QTAtMTZFQTE3MDAtMTcwQzE3MEUtMTcxMTE3MjAtMTczMTE3NDAtMTc1MTE3NjAtMTc2QzE3NkUtMTc3MDE3ODAtMTdCMzE3RDcxN0RDMTgyMC0xODc3MTg4MC0xOEE4MThBQTE4QjAtMThGNTE5MDAtMTkxQzE5NTAtMTk2RDE5NzAtMTk3NDE5ODAtMTlBQjE5QzEtMTlDNzFBMDAtMUExNjFBMjAtMUE1NDFBQTcxQjA1LTFCMzMxQjQ1LTFCNEIxQjgzLTFCQTAxQkFFMUJBRjFDMDAtMUMyMzFDNEQtMUM0RjFDNUEtMUM3RDFDRTktMUNFQzFDRUUtMUNGMTFEMDAtMURCRjFFMDAtMUYxNTFGMTgtMUYxRDFGMjAtMUY0NTFGNDgtMUY0RDFGNTAtMUY1NzFGNTkxRjVCMUY1RDFGNUYtMUY3RDFGODAtMUZCNDFGQjYtMUZCQzFGQkUxRkMyLTFGQzQxRkM2LTFGQ0MxRkQwLTFGRDMxRkQ2LTFGREIxRkUwLTFGRUMxRkYyLTFGRjQxRkY2LTFGRkMyMDcxMjA3RjIwOTAtMjA5NDIxMDIyMTA3MjEwQS0yMTEzMjExNTIxMTktMjExRDIxMjQyMTI2MjEyODIxMkEtMjEyRDIxMkYtMjEzOTIxM0MtMjEzRjIxNDUtMjE0OTIxNEUyMTgzMjE4NDJDMDAtMkMyRTJDMzAtMkM1RTJDNjAtMkNFNDJDRUItMkNFRTJEMDAtMkQyNTJEMzAtMkQ2NTJENkYyRDgwLTJEOTYyREEwLTJEQTYyREE4LTJEQUUyREIwLTJEQjYyREI4LTJEQkUyREMwLTJEQzYyREM4LTJEQ0UyREQwLTJERDYyREQ4LTJEREUyRTJGMzAwNTMwMDYzMDMxLTMwMzUzMDNCMzAzQzMwNDEtMzA5NjMwOUQtMzA5RjMwQTEtMzBGQTMwRkMtMzBGRjMxMDUtMzEyRDMxMzEtMzE4RTMxQTAtMzFCNzMxRjAtMzFGRjM0MDAtNERCNTRFMDAtOUZDQkEwMDAtQTQ4Q0E0RDAtQTRGREE1MDAtQTYwQ0E2MTAtQTYxRkE2MkFBNjJCQTY0MC1BNjVGQTY2Mi1BNjZFQTY3Ri1BNjk3QTZBMC1BNkU1QTcxNy1BNzFGQTcyMi1BNzg4QTc4QkE3OENBN0ZCLUE4MDFBODAzLUE4MDVBODA3LUE4MEFBODBDLUE4MjJBODQwLUE4NzNBODgyLUE4QjNBOEYyLUE4RjdBOEZCQTkwQS1BOTI1QTkzMC1BOTQ2QTk2MC1BOTdDQTk4NC1BOUIyQTlDRkFBMDAtQUEyOEFBNDAtQUE0MkFBNDQtQUE0QkFBNjAtQUE3NkFBN0FBQTgwLUFBQUZBQUIxQUFCNUFBQjZBQUI5LUFBQkRBQUMwQUFDMkFBREItQUFEREFCQzAtQUJFMkFDMDAtRDdBM0Q3QjAtRDdDNkQ3Q0ItRDdGQkY5MDAtRkEyREZBMzAtRkE2REZBNzAtRkFEOUZCMDAtRkIwNkZCMTMtRkIxN0ZCMURGQjFGLUZCMjhGQjJBLUZCMzZGQjM4LUZCM0NGQjNFRkI0MEZCNDFGQjQzRkI0NEZCNDYtRkJCMUZCRDMtRkQzREZENTAtRkQ4RkZEOTItRkRDN0ZERjAtRkRGQkZFNzAtRkU3NEZFNzYtRkVGQ0ZGMjEtRkYzQUZGNDEtRkY1QUZGNjYtRkZCRUZGQzItRkZDN0ZGQ0EtRkZDRkZGRDItRkZEN0ZGREEtRkZEQyIsTGw6IjAwNjEtMDA3QTAwQUEwMEI1MDBCQTAwREYtMDBGNjAwRjgtMDBGRjAxMDEwMTAzMDEwNTAxMDcwMTA5MDEwQjAxMEQwMTBGMDExMTAxMTMwMTE1MDExNzAxMTkwMTFCMDExRDAxMUYwMTIxMDEyMzAxMjUwMTI3MDEyOTAxMkIwMTJEMDEyRjAxMzEwMTMzMDEzNTAxMzcwMTM4MDEzQTAxM0MwMTNFMDE0MDAxNDIwMTQ0MDE0NjAxNDgwMTQ5MDE0QjAxNEQwMTRGMDE1MTAxNTMwMTU1MDE1NzAxNTkwMTVCMDE1RDAxNUYwMTYxMDE2MzAxNjUwMTY3MDE2OTAxNkIwMTZEMDE2RjAxNzEwMTczMDE3NTAxNzcwMTdBMDE3QzAxN0UtMDE4MDAxODMwMTg1MDE4ODAxOEMwMThEMDE5MjAxOTUwMTk5LTAxOUIwMTlFMDFBMTAxQTMwMUE1MDFBODAxQUEwMUFCMDFBRDAxQjAwMUI0MDFCNjAxQjkwMUJBMDFCRC0wMUJGMDFDNjAxQzkwMUNDMDFDRTAxRDAwMUQyMDFENDAxRDYwMUQ4MDFEQTAxREMwMUREMDFERjAxRTEwMUUzMDFFNTAxRTcwMUU5MDFFQjAxRUQwMUVGMDFGMDAxRjMwMUY1MDFGOTAxRkIwMUZEMDFGRjAyMDEwMjAzMDIwNTAyMDcwMjA5MDIwQjAyMEQwMjBGMDIxMTAyMTMwMjE1MDIxNzAyMTkwMjFCMDIxRDAyMUYwMjIxMDIyMzAyMjUwMjI3MDIyOTAyMkIwMjJEMDIyRjAyMzEwMjMzLTAyMzkwMjNDMDIzRjAyNDAwMjQyMDI0NzAyNDkwMjRCMDI0RDAyNEYtMDI5MzAyOTUtMDJBRjAzNzEwMzczMDM3NzAzN0ItMDM3RDAzOTAwM0FDLTAzQ0UwM0QwMDNEMTAzRDUtMDNENzAzRDkwM0RCMDNERDAzREYwM0UxMDNFMzAzRTUwM0U3MDNFOTAzRUIwM0VEMDNFRi0wM0YzMDNGNTAzRjgwM0ZCMDNGQzA0MzAtMDQ1RjA0NjEwNDYzMDQ2NTA0NjcwNDY5MDQ2QjA0NkQwNDZGMDQ3MTA0NzMwNDc1MDQ3NzA0NzkwNDdCMDQ3RDA0N0YwNDgxMDQ4QjA0OEQwNDhGMDQ5MTA0OTMwNDk1MDQ5NzA0OTkwNDlCMDQ5RDA0OUYwNEExMDRBMzA0QTUwNEE3MDRBOTA0QUIwNEFEMDRBRjA0QjEwNEIzMDRCNTA0QjcwNEI5MDRCQjA0QkQwNEJGMDRDMjA0QzQwNEM2MDRDODA0Q0EwNENDMDRDRTA0Q0YwNEQxMDREMzA0RDUwNEQ3MDREOTA0REIwNEREMDRERjA0RTEwNEUzMDRFNTA0RTcwNEU5MDRFQjA0RUQwNEVGMDRGMTA0RjMwNEY1MDRGNzA0RjkwNEZCMDRGRDA0RkYwNTAxMDUwMzA1MDUwNTA3MDUwOTA1MEIwNTBEMDUwRjA1MTEwNTEzMDUxNTA1MTcwNTE5MDUxQjA1MUQwNTFGMDUyMTA1MjMwNTI1MDU2MS0wNTg3MUQwMC0xRDJCMUQ2Mi0xRDc3MUQ3OS0xRDlBMUUwMTFFMDMxRTA1MUUwNzFFMDkxRTBCMUUwRDFFMEYxRTExMUUxMzFFMTUxRTE3MUUxOTFFMUIxRTFEMUUxRjFFMjExRTIzMUUyNTFFMjcxRTI5MUUyQjFFMkQxRTJGMUUzMTFFMzMxRTM1MUUzNzFFMzkxRTNCMUUzRDFFM0YxRTQxMUU0MzFFNDUxRTQ3MUU0OTFFNEIxRTREMUU0RjFFNTExRTUzMUU1NTFFNTcxRTU5MUU1QjFFNUQxRTVGMUU2MTFFNjMxRTY1MUU2NzFFNjkxRTZCMUU2RDFFNkYxRTcxMUU3MzFFNzUxRTc3MUU3OTFFN0IxRTdEMUU3RjFFODExRTgzMUU4NTFFODcxRTg5MUU4QjFFOEQxRThGMUU5MTFFOTMxRTk1LTFFOUQxRTlGMUVBMTFFQTMxRUE1MUVBNzFFQTkxRUFCMUVBRDFFQUYxRUIxMUVCMzFFQjUxRUI3MUVCOTFFQkIxRUJEMUVCRjFFQzExRUMzMUVDNTFFQzcxRUM5MUVDQjFFQ0QxRUNGMUVEMTFFRDMxRUQ1MUVENzFFRDkxRURCMUVERDFFREYxRUUxMUVFMzFFRTUxRUU3MUVFOTFFRUIxRUVEMUVFRjFFRjExRUYzMUVGNTFFRjcxRUY5MUVGQjFFRkQxRUZGLTFGMDcxRjEwLTFGMTUxRjIwLTFGMjcxRjMwLTFGMzcxRjQwLTFGNDUxRjUwLTFGNTcxRjYwLTFGNjcxRjcwLTFGN0QxRjgwLTFGODcxRjkwLTFGOTcxRkEwLTFGQTcxRkIwLTFGQjQxRkI2MUZCNzFGQkUxRkMyLTFGQzQxRkM2MUZDNzFGRDAtMUZEMzFGRDYxRkQ3MUZFMC0xRkU3MUZGMi0xRkY0MUZGNjFGRjcyMTBBMjEwRTIxMEYyMTEzMjEyRjIxMzQyMTM5MjEzQzIxM0QyMTQ2LTIxNDkyMTRFMjE4NDJDMzAtMkM1RTJDNjEyQzY1MkM2NjJDNjgyQzZBMkM2QzJDNzEyQzczMkM3NDJDNzYtMkM3QzJDODEyQzgzMkM4NTJDODcyQzg5MkM4QjJDOEQyQzhGMkM5MTJDOTMyQzk1MkM5NzJDOTkyQzlCMkM5RDJDOUYyQ0ExMkNBMzJDQTUyQ0E3MkNBOTJDQUIyQ0FEMkNBRjJDQjEyQ0IzMkNCNTJDQjcyQ0I5MkNCQjJDQkQyQ0JGMkNDMTJDQzMyQ0M1MkNDNzJDQzkyQ0NCMkNDRDJDQ0YyQ0QxMkNEMzJDRDUyQ0Q3MkNEOTJDREIyQ0REMkNERjJDRTEyQ0UzMkNFNDJDRUMyQ0VFMkQwMC0yRDI1QTY0MUE2NDNBNjQ1QTY0N0E2NDlBNjRCQTY0REE2NEZBNjUxQTY1M0E2NTVBNjU3QTY1OUE2NUJBNjVEQTY1RkE2NjNBNjY1QTY2N0E2NjlBNjZCQTY2REE2ODFBNjgzQTY4NUE2ODdBNjg5QTY4QkE2OERBNjhGQTY5MUE2OTNBNjk1QTY5N0E3MjNBNzI1QTcyN0E3MjlBNzJCQTcyREE3MkYtQTczMUE3MzNBNzM1QTczN0E3MzlBNzNCQTczREE3M0ZBNzQxQTc0M0E3NDVBNzQ3QTc0OUE3NEJBNzREQTc0RkE3NTFBNzUzQTc1NUE3NTdBNzU5QTc1QkE3NURBNzVGQTc2MUE3NjNBNzY1QTc2N0E3NjlBNzZCQTc2REE3NkZBNzcxLUE3NzhBNzdBQTc3Q0E3N0ZBNzgxQTc4M0E3ODVBNzg3QTc4Q0ZCMDAtRkIwNkZCMTMtRkIxN0ZGNDEtRkY1QSIsTHU6IjAwNDEtMDA1QTAwQzAtMDBENjAwRDgtMDBERTAxMDAwMTAyMDEwNDAxMDYwMTA4MDEwQTAxMEMwMTBFMDExMDAxMTIwMTE0MDExNjAxMTgwMTFBMDExQzAxMUUwMTIwMDEyMjAxMjQwMTI2MDEyODAxMkEwMTJDMDEyRTAxMzAwMTMyMDEzNDAxMzYwMTM5MDEzQjAxM0QwMTNGMDE0MTAxNDMwMTQ1MDE0NzAxNEEwMTRDMDE0RTAxNTAwMTUyMDE1NDAxNTYwMTU4MDE1QTAxNUMwMTVFMDE2MDAxNjIwMTY0MDE2NjAxNjgwMTZBMDE2QzAxNkUwMTcwMDE3MjAxNzQwMTc2MDE3ODAxNzkwMTdCMDE3RDAxODEwMTgyMDE4NDAxODYwMTg3MDE4OS0wMThCMDE4RS0wMTkxMDE5MzAxOTQwMTk2LTAxOTgwMTlDMDE5RDAxOUYwMUEwMDFBMjAxQTQwMUE2MDFBNzAxQTkwMUFDMDFBRTAxQUYwMUIxLTAxQjMwMUI1MDFCNzAxQjgwMUJDMDFDNDAxQzcwMUNBMDFDRDAxQ0YwMUQxMDFEMzAxRDUwMUQ3MDFEOTAxREIwMURFMDFFMDAxRTIwMUU0MDFFNjAxRTgwMUVBMDFFQzAxRUUwMUYxMDFGNDAxRjYtMDFGODAxRkEwMUZDMDFGRTAyMDAwMjAyMDIwNDAyMDYwMjA4MDIwQTAyMEMwMjBFMDIxMDAyMTIwMjE0MDIxNjAyMTgwMjFBMDIxQzAyMUUwMjIwMDIyMjAyMjQwMjI2MDIyODAyMkEwMjJDMDIyRTAyMzAwMjMyMDIzQTAyM0IwMjNEMDIzRTAyNDEwMjQzLTAyNDYwMjQ4MDI0QTAyNEMwMjRFMDM3MDAzNzIwMzc2MDM4NjAzODgtMDM4QTAzOEMwMzhFMDM4RjAzOTEtMDNBMTAzQTMtMDNBQjAzQ0YwM0QyLTAzRDQwM0Q4MDNEQTAzREMwM0RFMDNFMDAzRTIwM0U0MDNFNjAzRTgwM0VBMDNFQzAzRUUwM0Y0MDNGNzAzRjkwM0ZBMDNGRC0wNDJGMDQ2MDA0NjIwNDY0MDQ2NjA0NjgwNDZBMDQ2QzA0NkUwNDcwMDQ3MjA0NzQwNDc2MDQ3ODA0N0EwNDdDMDQ3RTA0ODAwNDhBMDQ4QzA0OEUwNDkwMDQ5MjA0OTQwNDk2MDQ5ODA0OUEwNDlDMDQ5RTA0QTAwNEEyMDRBNDA0QTYwNEE4MDRBQTA0QUMwNEFFMDRCMDA0QjIwNEI0MDRCNjA0QjgwNEJBMDRCQzA0QkUwNEMwMDRDMTA0QzMwNEM1MDRDNzA0QzkwNENCMDRDRDA0RDAwNEQyMDRENDA0RDYwNEQ4MDREQTA0REMwNERFMDRFMDA0RTIwNEU0MDRFNjA0RTgwNEVBMDRFQzA0RUUwNEYwMDRGMjA0RjQwNEY2MDRGODA0RkEwNEZDMDRGRTA1MDAwNTAyMDUwNDA1MDYwNTA4MDUwQTA1MEMwNTBFMDUxMDA1MTIwNTE0MDUxNjA1MTgwNTFBMDUxQzA1MUUwNTIwMDUyMjA1MjQwNTMxLTA1NTYxMEEwLTEwQzUxRTAwMUUwMjFFMDQxRTA2MUUwODFFMEExRTBDMUUwRTFFMTAxRTEyMUUxNDFFMTYxRTE4MUUxQTFFMUMxRTFFMUUyMDFFMjIxRTI0MUUyNjFFMjgxRTJBMUUyQzFFMkUxRTMwMUUzMjFFMzQxRTM2MUUzODFFM0ExRTNDMUUzRTFFNDAxRTQyMUU0NDFFNDYxRTQ4MUU0QTFFNEMxRTRFMUU1MDFFNTIxRTU0MUU1NjFFNTgxRTVBMUU1QzFFNUUxRTYwMUU2MjFFNjQxRTY2MUU2ODFFNkExRTZDMUU2RTFFNzAxRTcyMUU3NDFFNzYxRTc4MUU3QTFFN0MxRTdFMUU4MDFFODIxRTg0MUU4NjFFODgxRThBMUU4QzFFOEUxRTkwMUU5MjFFOTQxRTlFMUVBMDFFQTIxRUE0MUVBNjFFQTgxRUFBMUVBQzFFQUUxRUIwMUVCMjFFQjQxRUI2MUVCODFFQkExRUJDMUVCRTFFQzAxRUMyMUVDNDFFQzYxRUM4MUVDQTFFQ0MxRUNFMUVEMDFFRDIxRUQ0MUVENjFFRDgxRURBMUVEQzFFREUxRUUwMUVFMjFFRTQxRUU2MUVFODFFRUExRUVDMUVFRTFFRjAxRUYyMUVGNDFFRjYxRUY4MUVGQTFFRkMxRUZFMUYwOC0xRjBGMUYxOC0xRjFEMUYyOC0xRjJGMUYzOC0xRjNGMUY0OC0xRjREMUY1OTFGNUIxRjVEMUY1RjFGNjgtMUY2RjFGQjgtMUZCQjFGQzgtMUZDQjFGRDgtMUZEQjFGRTgtMUZFQzFGRjgtMUZGQjIxMDIyMTA3MjEwQi0yMTBEMjExMC0yMTEyMjExNTIxMTktMjExRDIxMjQyMTI2MjEyODIxMkEtMjEyRDIxMzAtMjEzMzIxM0UyMTNGMjE0NTIxODMyQzAwLTJDMkUyQzYwMkM2Mi0yQzY0MkM2NzJDNjkyQzZCMkM2RC0yQzcwMkM3MjJDNzUyQzdFLTJDODAyQzgyMkM4NDJDODYyQzg4MkM4QTJDOEMyQzhFMkM5MDJDOTIyQzk0MkM5NjJDOTgyQzlBMkM5QzJDOUUyQ0EwMkNBMjJDQTQyQ0E2MkNBODJDQUEyQ0FDMkNBRTJDQjAyQ0IyMkNCNDJDQjYyQ0I4MkNCQTJDQkMyQ0JFMkNDMDJDQzIyQ0M0MkNDNjJDQzgyQ0NBMkNDQzJDQ0UyQ0QwMkNEMjJDRDQyQ0Q2MkNEODJDREEyQ0RDMkNERTJDRTAyQ0UyMkNFQjJDRURBNjQwQTY0MkE2NDRBNjQ2QTY0OEE2NEFBNjRDQTY0RUE2NTBBNjUyQTY1NEE2NTZBNjU4QTY1QUE2NUNBNjVFQTY2MkE2NjRBNjY2QTY2OEE2NkFBNjZDQTY4MEE2ODJBNjg0QTY4NkE2ODhBNjhBQTY4Q0E2OEVBNjkwQTY5MkE2OTRBNjk2QTcyMkE3MjRBNzI2QTcyOEE3MkFBNzJDQTcyRUE3MzJBNzM0QTczNkE3MzhBNzNBQTczQ0E3M0VBNzQwQTc0MkE3NDRBNzQ2QTc0OEE3NEFBNzRDQTc0RUE3NTBBNzUyQTc1NEE3NTZBNzU4QTc1QUE3NUNBNzVFQTc2MEE3NjJBNzY0QTc2NkE3NjhBNzZBQTc2Q0E3NkVBNzc5QTc3QkE3N0RBNzdFQTc4MEE3ODJBNzg0QTc4NkE3OEJGRjIxLUZGM0EiLEx0OiIwMUM1MDFDODAxQ0IwMUYyMUY4OC0xRjhGMUY5OC0xRjlGMUZBOC0xRkFGMUZCQzFGQ0MxRkZDIixMbToiMDJCMC0wMkMxMDJDNi0wMkQxMDJFMC0wMkU0MDJFQzAyRUUwMzc0MDM3QTA1NTkwNjQwMDZFNTA2RTYwN0Y0MDdGNTA3RkEwODFBMDgyNDA4MjgwOTcxMEU0NjBFQzYxMEZDMTdENzE4NDMxQUE3MUM3OC0xQzdEMUQyQy0xRDYxMUQ3ODFEOUItMURCRjIwNzEyMDdGMjA5MC0yMDk0MkM3RDJENkYyRTJGMzAwNTMwMzEtMzAzNTMwM0IzMDlEMzA5RTMwRkMtMzBGRUEwMTVBNEY4LUE0RkRBNjBDQTY3RkE3MTctQTcxRkE3NzBBNzg4QTlDRkFBNzBBQURERkY3MEZGOUVGRjlGIixMbzoiMDFCQjAxQzAtMDFDMzAyOTQwNUQwLTA1RUEwNUYwLTA1RjIwNjIxLTA2M0YwNjQxLTA2NEEwNjZFMDY2RjA2NzEtMDZEMzA2RDUwNkVFMDZFRjA2RkEtMDZGQzA2RkYwNzEwMDcxMi0wNzJGMDc0RC0wN0E1MDdCMTA3Q0EtMDdFQTA4MDAtMDgxNTA5MDQtMDkzOTA5M0QwOTUwMDk1OC0wOTYxMDk3MjA5NzktMDk3RjA5ODUtMDk4QzA5OEYwOTkwMDk5My0wOUE4MDlBQS0wOUIwMDlCMjA5QjYtMDlCOTA5QkQwOUNFMDlEQzA5REQwOURGLTA5RTEwOUYwMDlGMTBBMDUtMEEwQTBBMEYwQTEwMEExMy0wQTI4MEEyQS0wQTMwMEEzMjBBMzMwQTM1MEEzNjBBMzgwQTM5MEE1OS0wQTVDMEE1RTBBNzItMEE3NDBBODUtMEE4RDBBOEYtMEE5MTBBOTMtMEFBODBBQUEtMEFCMDBBQjIwQUIzMEFCNS0wQUI5MEFCRDBBRDAwQUUwMEFFMTBCMDUtMEIwQzBCMEYwQjEwMEIxMy0wQjI4MEIyQS0wQjMwMEIzMjBCMzMwQjM1LTBCMzkwQjNEMEI1QzBCNUQwQjVGLTBCNjEwQjcxMEI4MzBCODUtMEI4QTBCOEUtMEI5MDBCOTItMEI5NTBCOTkwQjlBMEI5QzBCOUUwQjlGMEJBMzBCQTQwQkE4LTBCQUEwQkFFLTBCQjkwQkQwMEMwNS0wQzBDMEMwRS0wQzEwMEMxMi0wQzI4MEMyQS0wQzMzMEMzNS0wQzM5MEMzRDBDNTgwQzU5MEM2MDBDNjEwQzg1LTBDOEMwQzhFLTBDOTAwQzkyLTBDQTgwQ0FBLTBDQjMwQ0I1LTBDQjkwQ0JEMENERTBDRTAwQ0UxMEQwNS0wRDBDMEQwRS0wRDEwMEQxMi0wRDI4MEQyQS0wRDM5MEQzRDBENjAwRDYxMEQ3QS0wRDdGMEQ4NS0wRDk2MEQ5QS0wREIxMERCMy0wREJCMERCRDBEQzAtMERDNjBFMDEtMEUzMDBFMzIwRTMzMEU0MC0wRTQ1MEU4MTBFODIwRTg0MEU4NzBFODgwRThBMEU4RDBFOTQtMEU5NzBFOTktMEU5RjBFQTEtMEVBMzBFQTUwRUE3MEVBQTBFQUIwRUFELTBFQjAwRUIyMEVCMzBFQkQwRUMwLTBFQzQwRURDMEVERDBGMDAwRjQwLTBGNDcwRjQ5LTBGNkMwRjg4LTBGOEIxMDAwLTEwMkExMDNGMTA1MC0xMDU1MTA1QS0xMDVEMTA2MTEwNjUxMDY2MTA2RS0xMDcwMTA3NS0xMDgxMTA4RTEwRDAtMTBGQTExMDAtMTI0ODEyNEEtMTI0RDEyNTAtMTI1NjEyNTgxMjVBLTEyNUQxMjYwLTEyODgxMjhBLTEyOEQxMjkwLTEyQjAxMkIyLTEyQjUxMkI4LTEyQkUxMkMwMTJDMi0xMkM1MTJDOC0xMkQ2MTJEOC0xMzEwMTMxMi0xMzE1MTMxOC0xMzVBMTM4MC0xMzhGMTNBMC0xM0Y0MTQwMS0xNjZDMTY2Ri0xNjdGMTY4MS0xNjlBMTZBMC0xNkVBMTcwMC0xNzBDMTcwRS0xNzExMTcyMC0xNzMxMTc0MC0xNzUxMTc2MC0xNzZDMTc2RS0xNzcwMTc4MC0xN0IzMTdEQzE4MjAtMTg0MjE4NDQtMTg3NzE4ODAtMThBODE4QUExOEIwLTE4RjUxOTAwLTE5MUMxOTUwLTE5NkQxOTcwLTE5NzQxOTgwLTE5QUIxOUMxLTE5QzcxQTAwLTFBMTYxQTIwLTFBNTQxQjA1LTFCMzMxQjQ1LTFCNEIxQjgzLTFCQTAxQkFFMUJBRjFDMDAtMUMyMzFDNEQtMUM0RjFDNUEtMUM3NzFDRTktMUNFQzFDRUUtMUNGMTIxMzUtMjEzODJEMzAtMkQ2NTJEODAtMkQ5NjJEQTAtMkRBNjJEQTgtMkRBRTJEQjAtMkRCNjJEQjgtMkRCRTJEQzAtMkRDNjJEQzgtMkRDRTJERDAtMkRENjJERDgtMkRERTMwMDYzMDNDMzA0MS0zMDk2MzA5RjMwQTEtMzBGQTMwRkYzMTA1LTMxMkQzMTMxLTMxOEUzMUEwLTMxQjczMUYwLTMxRkYzNDAwLTREQjU0RTAwLTlGQ0JBMDAwLUEwMTRBMDE2LUE0OENBNEQwLUE0RjdBNTAwLUE2MEJBNjEwLUE2MUZBNjJBQTYyQkE2NkVBNkEwLUE2RTVBN0ZCLUE4MDFBODAzLUE4MDVBODA3LUE4MEFBODBDLUE4MjJBODQwLUE4NzNBODgyLUE4QjNBOEYyLUE4RjdBOEZCQTkwQS1BOTI1QTkzMC1BOTQ2QTk2MC1BOTdDQTk4NC1BOUIyQUEwMC1BQTI4QUE0MC1BQTQyQUE0NC1BQTRCQUE2MC1BQTZGQUE3MS1BQTc2QUE3QUFBODAtQUFBRkFBQjFBQUI1QUFCNkFBQjktQUFCREFBQzBBQUMyQUFEQkFBRENBQkMwLUFCRTJBQzAwLUQ3QTNEN0IwLUQ3QzZEN0NCLUQ3RkJGOTAwLUZBMkRGQTMwLUZBNkRGQTcwLUZBRDlGQjFERkIxRi1GQjI4RkIyQS1GQjM2RkIzOC1GQjNDRkIzRUZCNDBGQjQxRkI0M0ZCNDRGQjQ2LUZCQjFGQkQzLUZEM0RGRDUwLUZEOEZGRDkyLUZEQzdGREYwLUZERkJGRTcwLUZFNzRGRTc2LUZFRkNGRjY2LUZGNkZGRjcxLUZGOURGRkEwLUZGQkVGRkMyLUZGQzdGRkNBLUZGQ0ZGRkQyLUZGRDdGRkRBLUZGREMiLE06IjAzMDAtMDM2RjA0ODMtMDQ4OTA1OTEtMDVCRDA1QkYwNUMxMDVDMjA1QzQwNUM1MDVDNzA2MTAtMDYxQTA2NEItMDY1RTA2NzAwNkQ2LTA2REMwNkRFLTA2RTQwNkU3MDZFODA2RUEtMDZFRDA3MTEwNzMwLTA3NEEwN0E2LTA3QjAwN0VCLTA3RjMwODE2LTA4MTkwODFCLTA4MjMwODI1LTA4MjcwODI5LTA4MkQwOTAwLTA5MDMwOTNDMDkzRS0wOTRFMDk1MS0wOTU1MDk2MjA5NjMwOTgxLTA5ODMwOUJDMDlCRS0wOUM0MDlDNzA5QzgwOUNCLTA5Q0QwOUQ3MDlFMjA5RTMwQTAxLTBBMDMwQTNDMEEzRS0wQTQyMEE0NzBBNDgwQTRCLTBBNEQwQTUxMEE3MDBBNzEwQTc1MEE4MS0wQTgzMEFCQzBBQkUtMEFDNTBBQzctMEFDOTBBQ0ItMEFDRDBBRTIwQUUzMEIwMS0wQjAzMEIzQzBCM0UtMEI0NDBCNDcwQjQ4MEI0Qi0wQjREMEI1NjBCNTcwQjYyMEI2MzBCODIwQkJFLTBCQzIwQkM2LTBCQzgwQkNBLTBCQ0QwQkQ3MEMwMS0wQzAzMEMzRS0wQzQ0MEM0Ni0wQzQ4MEM0QS0wQzREMEM1NTBDNTYwQzYyMEM2MzBDODIwQzgzMENCQzBDQkUtMENDNDBDQzYtMENDODBDQ0EtMENDRDBDRDUwQ0Q2MENFMjBDRTMwRDAyMEQwMzBEM0UtMEQ0NDBENDYtMEQ0ODBENEEtMEQ0RDBENTcwRDYyMEQ2MzBEODIwRDgzMERDQTBEQ0YtMERENDBERDYwREQ4LTBEREYwREYyMERGMzBFMzEwRTM0LTBFM0EwRTQ3LTBFNEUwRUIxMEVCNC0wRUI5MEVCQjBFQkMwRUM4LTBFQ0QwRjE4MEYxOTBGMzUwRjM3MEYzOTBGM0UwRjNGMEY3MS0wRjg0MEY4NjBGODcwRjkwLTBGOTcwRjk5LTBGQkMwRkM2MTAyQi0xMDNFMTA1Ni0xMDU5MTA1RS0xMDYwMTA2Mi0xMDY0MTA2Ny0xMDZEMTA3MS0xMDc0MTA4Mi0xMDhEMTA4RjEwOUEtMTA5RDEzNUYxNzEyLTE3MTQxNzMyLTE3MzQxNzUyMTc1MzE3NzIxNzczMTdCNi0xN0QzMTdERDE4MEItMTgwRDE4QTkxOTIwLTE5MkIxOTMwLTE5M0IxOUIwLTE5QzAxOUM4MTlDOTFBMTctMUExQjFBNTUtMUE1RTFBNjAtMUE3QzFBN0YxQjAwLTFCMDQxQjM0LTFCNDQxQjZCLTFCNzMxQjgwLTFCODIxQkExLTFCQUExQzI0LTFDMzcxQ0QwLTFDRDIxQ0Q0LTFDRTgxQ0VEMUNGMjFEQzAtMURFNjFERkQtMURGRjIwRDAtMjBGMDJDRUYtMkNGMTJERTAtMkRGRjMwMkEtMzAyRjMwOTkzMDlBQTY2Ri1BNjcyQTY3Q0E2N0RBNkYwQTZGMUE4MDJBODA2QTgwQkE4MjMtQTgyN0E4ODBBODgxQThCNC1BOEM0QThFMC1BOEYxQTkyNi1BOTJEQTk0Ny1BOTUzQTk4MC1BOTgzQTlCMy1BOUMwQUEyOS1BQTM2QUE0M0FBNENBQTREQUE3QkFBQjBBQUIyLUFBQjRBQUI3QUFCOEFBQkVBQUJGQUFDMUFCRTMtQUJFQUFCRUNBQkVERkIxRUZFMDAtRkUwRkZFMjAtRkUyNiIsTW46IjAzMDAtMDM2RjA0ODMtMDQ4NzA1OTEtMDVCRDA1QkYwNUMxMDVDMjA1QzQwNUM1MDVDNzA2MTAtMDYxQTA2NEItMDY1RTA2NzAwNkQ2LTA2REMwNkRGLTA2RTQwNkU3MDZFODA2RUEtMDZFRDA3MTEwNzMwLTA3NEEwN0E2LTA3QjAwN0VCLTA3RjMwODE2LTA4MTkwODFCLTA4MjMwODI1LTA4MjcwODI5LTA4MkQwOTAwLTA5MDIwOTNDMDk0MS0wOTQ4MDk0RDA5NTEtMDk1NTA5NjIwOTYzMDk4MTA5QkMwOUMxLTA5QzQwOUNEMDlFMjA5RTMwQTAxMEEwMjBBM0MwQTQxMEE0MjBBNDcwQTQ4MEE0Qi0wQTREMEE1MTBBNzAwQTcxMEE3NTBBODEwQTgyMEFCQzBBQzEtMEFDNTBBQzcwQUM4MEFDRDBBRTIwQUUzMEIwMTBCM0MwQjNGMEI0MS0wQjQ0MEI0RDBCNTYwQjYyMEI2MzBCODIwQkMwMEJDRDBDM0UtMEM0MDBDNDYtMEM0ODBDNEEtMEM0RDBDNTUwQzU2MEM2MjBDNjMwQ0JDMENCRjBDQzYwQ0NDMENDRDBDRTIwQ0UzMEQ0MS0wRDQ0MEQ0RDBENjIwRDYzMERDQTBERDItMERENDBERDYwRTMxMEUzNC0wRTNBMEU0Ny0wRTRFMEVCMTBFQjQtMEVCOTBFQkIwRUJDMEVDOC0wRUNEMEYxODBGMTkwRjM1MEYzNzBGMzkwRjcxLTBGN0UwRjgwLTBGODQwRjg2MEY4NzBGOTAtMEY5NzBGOTktMEZCQzBGQzYxMDJELTEwMzAxMDMyLTEwMzcxMDM5MTAzQTEwM0QxMDNFMTA1ODEwNTkxMDVFLTEwNjAxMDcxLTEwNzQxMDgyMTA4NTEwODYxMDhEMTA5RDEzNUYxNzEyLTE3MTQxNzMyLTE3MzQxNzUyMTc1MzE3NzIxNzczMTdCNy0xN0JEMTdDNjE3QzktMTdEMzE3REQxODBCLTE4MEQxOEE5MTkyMC0xOTIyMTkyNzE5MjgxOTMyMTkzOS0xOTNCMUExNzFBMTgxQTU2MUE1OC0xQTVFMUE2MDFBNjIxQTY1LTFBNkMxQTczLTFBN0MxQTdGMUIwMC0xQjAzMUIzNDFCMzYtMUIzQTFCM0MxQjQyMUI2Qi0xQjczMUI4MDFCODExQkEyLTFCQTUxQkE4MUJBOTFDMkMtMUMzMzFDMzYxQzM3MUNEMC0xQ0QyMUNENC0xQ0UwMUNFMi0xQ0U4MUNFRDFEQzAtMURFNjFERkQtMURGRjIwRDAtMjBEQzIwRTEyMEU1LTIwRjAyQ0VGLTJDRjEyREUwLTJERkYzMDJBLTMwMkYzMDk5MzA5QUE2NkZBNjdDQTY3REE2RjBBNkYxQTgwMkE4MDZBODBCQTgyNUE4MjZBOEM0QThFMC1BOEYxQTkyNi1BOTJEQTk0Ny1BOTUxQTk4MC1BOTgyQTlCM0E5QjYtQTlCOUE5QkNBQTI5LUFBMkVBQTMxQUEzMkFBMzVBQTM2QUE0M0FBNENBQUIwQUFCMi1BQUI0QUFCN0FBQjhBQUJFQUFCRkFBQzFBQkU1QUJFOEFCRURGQjFFRkUwMC1GRTBGRkUyMC1GRTI2IixNYzoiMDkwMzA5M0UtMDk0MDA5NDktMDk0QzA5NEUwOTgyMDk4MzA5QkUtMDlDMDA5QzcwOUM4MDlDQjA5Q0MwOUQ3MEEwMzBBM0UtMEE0MDBBODMwQUJFLTBBQzAwQUM5MEFDQjBBQ0MwQjAyMEIwMzBCM0UwQjQwMEI0NzBCNDgwQjRCMEI0QzBCNTcwQkJFMEJCRjBCQzEwQkMyMEJDNi0wQkM4MEJDQS0wQkNDMEJENzBDMDEtMEMwMzBDNDEtMEM0NDBDODIwQzgzMENCRTBDQzAtMENDNDBDQzcwQ0M4MENDQTBDQ0IwQ0Q1MENENjBEMDIwRDAzMEQzRS0wRDQwMEQ0Ni0wRDQ4MEQ0QS0wRDRDMEQ1NzBEODIwRDgzMERDRi0wREQxMEREOC0wRERGMERGMjBERjMwRjNFMEYzRjBGN0YxMDJCMTAyQzEwMzExMDM4MTAzQjEwM0MxMDU2MTA1NzEwNjItMTA2NDEwNjctMTA2RDEwODMxMDg0MTA4Ny0xMDhDMTA4RjEwOUEtMTA5QzE3QjYxN0JFLTE3QzUxN0M3MTdDODE5MjMtMTkyNjE5MjktMTkyQjE5MzAxOTMxMTkzMy0xOTM4MTlCMC0xOUMwMTlDODE5QzkxQTE5LTFBMUIxQTU1MUE1NzFBNjExQTYzMUE2NDFBNkQtMUE3MjFCMDQxQjM1MUIzQjFCM0QtMUI0MTFCNDMxQjQ0MUI4MjFCQTExQkE2MUJBNzFCQUExQzI0LTFDMkIxQzM0MUMzNTFDRTExQ0YyQTgyM0E4MjRBODI3QTg4MEE4ODFBOEI0LUE4QzNBOTUyQTk1M0E5ODNBOUI0QTlCNUE5QkFBOUJCQTlCRC1BOUMwQUEyRkFBMzBBQTMzQUEzNEFBNERBQTdCQUJFM0FCRTRBQkU2QUJFN0FCRTlBQkVBQUJFQyIsTWU6IjA0ODgwNDg5MDZERTIwREQtMjBFMDIwRTItMjBFNEE2NzAtQTY3MiIsTjoiMDAzMC0wMDM5MDBCMjAwQjMwMEI5MDBCQy0wMEJFMDY2MC0wNjY5MDZGMC0wNkY5MDdDMC0wN0M5MDk2Ni0wOTZGMDlFNi0wOUVGMDlGNC0wOUY5MEE2Ni0wQTZGMEFFNi0wQUVGMEI2Ni0wQjZGMEJFNi0wQkYyMEM2Ni0wQzZGMEM3OC0wQzdFMENFNi0wQ0VGMEQ2Ni0wRDc1MEU1MC0wRTU5MEVEMC0wRUQ5MEYyMC0wRjMzMTA0MC0xMDQ5MTA5MC0xMDk5MTM2OS0xMzdDMTZFRS0xNkYwMTdFMC0xN0U5MTdGMC0xN0Y5MTgxMC0xODE5MTk0Ni0xOTRGMTlEMC0xOURBMUE4MC0xQTg5MUE5MC0xQTk5MUI1MC0xQjU5MUJCMC0xQkI5MUM0MC0xQzQ5MUM1MC0xQzU5MjA3MDIwNzQtMjA3OTIwODAtMjA4OTIxNTAtMjE4MjIxODUtMjE4OTI0NjAtMjQ5QjI0RUEtMjRGRjI3NzYtMjc5MzJDRkQzMDA3MzAyMS0zMDI5MzAzOC0zMDNBMzE5Mi0zMTk1MzIyMC0zMjI5MzI1MS0zMjVGMzI4MC0zMjg5MzJCMS0zMkJGQTYyMC1BNjI5QTZFNi1BNkVGQTgzMC1BODM1QThEMC1BOEQ5QTkwMC1BOTA5QTlEMC1BOUQ5QUE1MC1BQTU5QUJGMC1BQkY5RkYxMC1GRjE5IixOZDoiMDAzMC0wMDM5MDY2MC0wNjY5MDZGMC0wNkY5MDdDMC0wN0M5MDk2Ni0wOTZGMDlFNi0wOUVGMEE2Ni0wQTZGMEFFNi0wQUVGMEI2Ni0wQjZGMEJFNi0wQkVGMEM2Ni0wQzZGMENFNi0wQ0VGMEQ2Ni0wRDZGMEU1MC0wRTU5MEVEMC0wRUQ5MEYyMC0wRjI5MTA0MC0xMDQ5MTA5MC0xMDk5MTdFMC0xN0U5MTgxMC0xODE5MTk0Ni0xOTRGMTlEMC0xOURBMUE4MC0xQTg5MUE5MC0xQTk5MUI1MC0xQjU5MUJCMC0xQkI5MUM0MC0xQzQ5MUM1MC0xQzU5QTYyMC1BNjI5QThEMC1BOEQ5QTkwMC1BOTA5QTlEMC1BOUQ5QUE1MC1BQTU5QUJGMC1BQkY5RkYxMC1GRjE5IixObDoiMTZFRS0xNkYwMjE2MC0yMTgyMjE4NS0yMTg4MzAwNzMwMjEtMzAyOTMwMzgtMzAzQUE2RTYtQTZFRiIsTm86IjAwQjIwMEIzMDBCOTAwQkMtMDBCRTA5RjQtMDlGOTBCRjAtMEJGMjBDNzgtMEM3RTBENzAtMEQ3NTBGMkEtMEYzMzEzNjktMTM3QzE3RjAtMTdGOTIwNzAyMDc0LTIwNzkyMDgwLTIwODkyMTUwLTIxNUYyMTg5MjQ2MC0yNDlCMjRFQS0yNEZGMjc3Ni0yNzkzMkNGRDMxOTItMzE5NTMyMjAtMzIyOTMyNTEtMzI1RjMyODAtMzI4OTMyQjEtMzJCRkE4MzAtQTgzNSIsUDoiMDAyMS0wMDIzMDAyNS0wMDJBMDAyQy0wMDJGMDAzQTAwM0IwMDNGMDA0MDAwNUItMDA1RDAwNUYwMDdCMDA3RDAwQTEwMEFCMDBCNzAwQkIwMEJGMDM3RTAzODcwNTVBLTA1NUYwNTg5MDU4QTA1QkUwNUMwMDVDMzA1QzYwNUYzMDVGNDA2MDkwNjBBMDYwQzA2MEQwNjFCMDYxRTA2MUYwNjZBLTA2NkQwNkQ0MDcwMC0wNzBEMDdGNy0wN0Y5MDgzMC0wODNFMDk2NDA5NjUwOTcwMERGNDBFNEYwRTVBMEU1QjBGMDQtMEYxMjBGM0EtMEYzRDBGODUwRkQwLTBGRDQxMDRBLTEwNEYxMEZCMTM2MS0xMzY4MTQwMDE2NkQxNjZFMTY5QjE2OUMxNkVCLTE2RUQxNzM1MTczNjE3RDQtMTdENjE3RDgtMTdEQTE4MDAtMTgwQTE5NDQxOTQ1MTlERTE5REYxQTFFMUExRjFBQTAtMUFBNjFBQTgtMUFBRDFCNUEtMUI2MDFDM0ItMUMzRjFDN0UxQzdGMUNEMzIwMTAtMjAyNzIwMzAtMjA0MzIwNDUtMjA1MTIwNTMtMjA1RTIwN0QyMDdFMjA4RDIwOEUyMzI5MjMyQTI3NjgtMjc3NTI3QzUyN0M2MjdFNi0yN0VGMjk4My0yOTk4MjlEOC0yOURCMjlGQzI5RkQyQ0Y5LTJDRkMyQ0ZFMkNGRjJFMDAtMkUyRTJFMzAyRTMxMzAwMS0zMDAzMzAwOC0zMDExMzAxNC0zMDFGMzAzMDMwM0QzMEEwMzBGQkE0RkVBNEZGQTYwRC1BNjBGQTY3M0E2N0VBNkYyLUE2RjdBODc0LUE4NzdBOENFQThDRkE4RjgtQThGQUE5MkVBOTJGQTk1RkE5QzEtQTlDREE5REVBOURGQUE1Qy1BQTVGQUFERUFBREZBQkVCRkQzRUZEM0ZGRTEwLUZFMTlGRTMwLUZFNTJGRTU0LUZFNjFGRTYzRkU2OEZFNkFGRTZCRkYwMS1GRjAzRkYwNS1GRjBBRkYwQy1GRjBGRkYxQUZGMUJGRjFGRkYyMEZGM0ItRkYzREZGM0ZGRjVCRkY1REZGNUYtRkY2NSIsUGQ6IjAwMkQwNThBMDVCRTE0MDAxODA2MjAxMC0yMDE1MkUxNzJFMUEzMDFDMzAzMDMwQTBGRTMxRkUzMkZFNThGRTYzRkYwRCIsUHM6IjAwMjgwMDVCMDA3QjBGM0EwRjNDMTY5QjIwMUEyMDFFMjA0NTIwN0QyMDhEMjMyOTI3NjgyNzZBMjc2QzI3NkUyNzcwMjc3MjI3NzQyN0M1MjdFNjI3RTgyN0VBMjdFQzI3RUUyOTgzMjk4NTI5ODcyOTg5Mjk4QjI5OEQyOThGMjk5MTI5OTMyOTk1Mjk5NzI5RDgyOURBMjlGQzJFMjIyRTI0MkUyNjJFMjgzMDA4MzAwQTMwMEMzMDBFMzAxMDMwMTQzMDE2MzAxODMwMUEzMDFERkQzRUZFMTdGRTM1RkUzN0ZFMzlGRTNCRkUzREZFM0ZGRTQxRkU0M0ZFNDdGRTU5RkU1QkZFNURGRjA4RkYzQkZGNUJGRjVGRkY2MiIsUGU6IjAwMjkwMDVEMDA3RDBGM0IwRjNEMTY5QzIwNDYyMDdFMjA4RTIzMkEyNzY5Mjc2QjI3NkQyNzZGMjc3MTI3NzMyNzc1MjdDNjI3RTcyN0U5MjdFQjI3RUQyN0VGMjk4NDI5ODYyOTg4Mjk4QTI5OEMyOThFMjk5MDI5OTIyOTk0Mjk5NjI5OTgyOUQ5MjlEQjI5RkQyRTIzMkUyNTJFMjcyRTI5MzAwOTMwMEIzMDBEMzAwRjMwMTEzMDE1MzAxNzMwMTkzMDFCMzAxRTMwMUZGRDNGRkUxOEZFMzZGRTM4RkUzQUZFM0NGRTNFRkU0MEZFNDJGRTQ0RkU0OEZFNUFGRTVDRkU1RUZGMDlGRjNERkY1REZGNjBGRjYzIixQaToiMDBBQjIwMTgyMDFCMjAxQzIwMUYyMDM5MkUwMjJFMDQyRTA5MkUwQzJFMUMyRTIwIixQZjoiMDBCQjIwMTkyMDFEMjAzQTJFMDMyRTA1MkUwQTJFMEQyRTFEMkUyMSIsUGM6IjAwNUYyMDNGMjA0MDIwNTRGRTMzRkUzNEZFNEQtRkU0RkZGM0YiLFBvOiIwMDIxLTAwMjMwMDI1LTAwMjcwMDJBMDAyQzAwMkUwMDJGMDAzQTAwM0IwMDNGMDA0MDAwNUMwMEExMDBCNzAwQkYwMzdFMDM4NzA1NUEtMDU1RjA1ODkwNUMwMDVDMzA1QzYwNUYzMDVGNDA2MDkwNjBBMDYwQzA2MEQwNjFCMDYxRTA2MUYwNjZBLTA2NkQwNkQ0MDcwMC0wNzBEMDdGNy0wN0Y5MDgzMC0wODNFMDk2NDA5NjUwOTcwMERGNDBFNEYwRTVBMEU1QjBGMDQtMEYxMjBGODUwRkQwLTBGRDQxMDRBLTEwNEYxMEZCMTM2MS0xMzY4MTY2RDE2NkUxNkVCLTE2RUQxNzM1MTczNjE3RDQtMTdENjE3RDgtMTdEQTE4MDAtMTgwNTE4MDctMTgwQTE5NDQxOTQ1MTlERTE5REYxQTFFMUExRjFBQTAtMUFBNjFBQTgtMUFBRDFCNUEtMUI2MDFDM0ItMUMzRjFDN0UxQzdGMUNEMzIwMTYyMDE3MjAyMC0yMDI3MjAzMC0yMDM4MjAzQi0yMDNFMjA0MS0yMDQzMjA0Ny0yMDUxMjA1MzIwNTUtMjA1RTJDRjktMkNGQzJDRkUyQ0ZGMkUwMDJFMDEyRTA2LTJFMDgyRTBCMkUwRS0yRTE2MkUxODJFMTkyRTFCMkUxRTJFMUYyRTJBLTJFMkUyRTMwMkUzMTMwMDEtMzAwMzMwM0QzMEZCQTRGRUE0RkZBNjBELUE2MEZBNjczQTY3RUE2RjItQTZGN0E4NzQtQTg3N0E4Q0VBOENGQThGOC1BOEZBQTkyRUE5MkZBOTVGQTlDMS1BOUNEQTlERUE5REZBQTVDLUFBNUZBQURFQUFERkFCRUJGRTEwLUZFMTZGRTE5RkUzMEZFNDVGRTQ2RkU0OS1GRTRDRkU1MC1GRTUyRkU1NC1GRTU3RkU1Ri1GRTYxRkU2OEZFNkFGRTZCRkYwMS1GRjAzRkYwNS1GRjA3RkYwQUZGMENGRjBFRkYwRkZGMUFGRjFCRkYxRkZGMjBGRjNDRkY2MUZGNjRGRjY1IixTOiIwMDI0MDAyQjAwM0MtMDAzRTAwNUUwMDYwMDA3QzAwN0UwMEEyLTAwQTkwMEFDMDBBRS0wMEIxMDBCNDAwQjYwMEI4MDBENzAwRjcwMkMyLTAyQzUwMkQyLTAyREYwMkU1LTAyRUIwMkVEMDJFRi0wMkZGMDM3NTAzODQwMzg1MDNGNjA0ODIwNjA2LTA2MDgwNjBCMDYwRTA2MEYwNkU5MDZGRDA2RkUwN0Y2MDlGMjA5RjMwOUZBMDlGQjBBRjEwQjcwMEJGMy0wQkZBMEM3RjBDRjEwQ0YyMEQ3OTBFM0YwRjAxLTBGMDMwRjEzLTBGMTcwRjFBLTBGMUYwRjM0MEYzNjBGMzgwRkJFLTBGQzUwRkM3LTBGQ0MwRkNFMEZDRjBGRDUtMEZEODEwOUUxMDlGMTM2MDEzOTAtMTM5OTE3REIxOTQwMTlFMC0xOUZGMUI2MS0xQjZBMUI3NC0xQjdDMUZCRDFGQkYtMUZDMTFGQ0QtMUZDRjFGREQtMUZERjFGRUQtMUZFRjFGRkQxRkZFMjA0NDIwNTIyMDdBLTIwN0MyMDhBLTIwOEMyMEEwLTIwQjgyMTAwMjEwMTIxMDMtMjEwNjIxMDgyMTA5MjExNDIxMTYtMjExODIxMUUtMjEyMzIxMjUyMTI3MjEyOTIxMkUyMTNBMjEzQjIxNDAtMjE0NDIxNEEtMjE0RDIxNEYyMTkwLTIzMjgyMzJCLTIzRTgyNDAwLTI0MjYyNDQwLTI0NEEyNDlDLTI0RTkyNTAwLTI2Q0QyNkNGLTI2RTEyNkUzMjZFOC0yNkZGMjcwMS0yNzA0MjcwNi0yNzA5MjcwQy0yNzI3MjcyOS0yNzRCMjc0RDI3NEYtMjc1MjI3NTYtMjc1RTI3NjEtMjc2NzI3OTQyNzk4LTI3QUYyN0IxLTI3QkUyN0MwLTI3QzQyN0M3LTI3Q0EyN0NDMjdEMC0yN0U1MjdGMC0yOTgyMjk5OS0yOUQ3MjlEQy0yOUZCMjlGRS0yQjRDMkI1MC0yQjU5MkNFNS0yQ0VBMkU4MC0yRTk5MkU5Qi0yRUYzMkYwMC0yRkQ1MkZGMC0yRkZCMzAwNDMwMTIzMDEzMzAyMDMwMzYzMDM3MzAzRTMwM0YzMDlCMzA5QzMxOTAzMTkxMzE5Ni0zMTlGMzFDMC0zMUUzMzIwMC0zMjFFMzIyQS0zMjUwMzI2MC0zMjdGMzI4QS0zMkIwMzJDMC0zMkZFMzMwMC0zM0ZGNERDMC00REZGQTQ5MC1BNEM2QTcwMC1BNzE2QTcyMEE3MjFBNzg5QTc4QUE4MjgtQTgyQkE4MzYtQTgzOUFBNzctQUE3OUZCMjlGREZDRkRGREZFNjJGRTY0LUZFNjZGRTY5RkYwNEZGMEJGRjFDLUZGMUVGRjNFRkY0MEZGNUNGRjVFRkZFMC1GRkU2RkZFOC1GRkVFRkZGQ0ZGRkQiLFNtOiIwMDJCMDAzQy0wMDNFMDA3QzAwN0UwMEFDMDBCMTAwRDcwMEY3MDNGNjA2MDYtMDYwODIwNDQyMDUyMjA3QS0yMDdDMjA4QS0yMDhDMjE0MC0yMTQ0MjE0QjIxOTAtMjE5NDIxOUEyMTlCMjFBMDIxQTMyMUE2MjFBRTIxQ0UyMUNGMjFEMjIxRDQyMUY0LTIyRkYyMzA4LTIzMEIyMzIwMjMyMTIzN0MyMzlCLTIzQjMyM0RDLTIzRTEyNUI3MjVDMTI1RjgtMjVGRjI2NkYyN0MwLTI3QzQyN0M3LTI3Q0EyN0NDMjdEMC0yN0U1MjdGMC0yN0ZGMjkwMC0yOTgyMjk5OS0yOUQ3MjlEQy0yOUZCMjlGRS0yQUZGMkIzMC0yQjQ0MkI0Ny0yQjRDRkIyOUZFNjJGRTY0LUZFNjZGRjBCRkYxQy1GRjFFRkY1Q0ZGNUVGRkUyRkZFOS1GRkVDIixTYzoiMDAyNDAwQTItMDBBNTA2MEIwOUYyMDlGMzA5RkIwQUYxMEJGOTBFM0YxN0RCMjBBMC0yMEI4QTgzOEZERkNGRTY5RkYwNEZGRTBGRkUxRkZFNUZGRTYiLFNrOiIwMDVFMDA2MDAwQTgwMEFGMDBCNDAwQjgwMkMyLTAyQzUwMkQyLTAyREYwMkU1LTAyRUIwMkVEMDJFRi0wMkZGMDM3NTAzODQwMzg1MUZCRDFGQkYtMUZDMTFGQ0QtMUZDRjFGREQtMUZERjFGRUQtMUZFRjFGRkQxRkZFMzA5QjMwOUNBNzAwLUE3MTZBNzIwQTcyMUE3ODlBNzhBRkYzRUZGNDBGRkUzIixTbzoiMDBBNjAwQTcwMEE5MDBBRTAwQjAwMEI2MDQ4MjA2MEUwNjBGMDZFOTA2RkQwNkZFMDdGNjA5RkEwQjcwMEJGMy0wQkY4MEJGQTBDN0YwQ0YxMENGMjBENzkwRjAxLTBGMDMwRjEzLTBGMTcwRjFBLTBGMUYwRjM0MEYzNjBGMzgwRkJFLTBGQzUwRkM3LTBGQ0MwRkNFMEZDRjBGRDUtMEZEODEwOUUxMDlGMTM2MDEzOTAtMTM5OTE5NDAxOUUwLTE5RkYxQjYxLTFCNkExQjc0LTFCN0MyMTAwMjEwMTIxMDMtMjEwNjIxMDgyMTA5MjExNDIxMTYtMjExODIxMUUtMjEyMzIxMjUyMTI3MjEyOTIxMkUyMTNBMjEzQjIxNEEyMTRDMjE0RDIxNEYyMTk1LTIxOTkyMTlDLTIxOUYyMUExMjFBMjIxQTQyMUE1MjFBNy0yMUFEMjFBRi0yMUNEMjFEMDIxRDEyMUQzMjFENS0yMUYzMjMwMC0yMzA3MjMwQy0yMzFGMjMyMi0yMzI4MjMyQi0yMzdCMjM3RC0yMzlBMjNCNC0yM0RCMjNFMi0yM0U4MjQwMC0yNDI2MjQ0MC0yNDRBMjQ5Qy0yNEU5MjUwMC0yNUI2MjVCOC0yNUMwMjVDMi0yNUY3MjYwMC0yNjZFMjY3MC0yNkNEMjZDRi0yNkUxMjZFMzI2RTgtMjZGRjI3MDEtMjcwNDI3MDYtMjcwOTI3MEMtMjcyNzI3MjktMjc0QjI3NEQyNzRGLTI3NTIyNzU2LTI3NUUyNzYxLTI3NjcyNzk0Mjc5OC0yN0FGMjdCMS0yN0JFMjgwMC0yOEZGMkIwMC0yQjJGMkI0NTJCNDYyQjUwLTJCNTkyQ0U1LTJDRUEyRTgwLTJFOTkyRTlCLTJFRjMyRjAwLTJGRDUyRkYwLTJGRkIzMDA0MzAxMjMwMTMzMDIwMzAzNjMwMzczMDNFMzAzRjMxOTAzMTkxMzE5Ni0zMTlGMzFDMC0zMUUzMzIwMC0zMjFFMzIyQS0zMjUwMzI2MC0zMjdGMzI4QS0zMkIwMzJDMC0zMkZFMzMwMC0zM0ZGNERDMC00REZGQTQ5MC1BNEM2QTgyOC1BODJCQTgzNkE4MzdBODM5QUE3Ny1BQTc5RkRGREZGRTRGRkU4RkZFREZGRUVGRkZDRkZGRCIsWjoiMDAyMDAwQTAxNjgwMTgwRTIwMDAtMjAwQTIwMjgyMDI5MjAyRjIwNUYzMDAwIixaczoiMDAyMDAwQTAxNjgwMTgwRTIwMDAtMjAwQTIwMkYyMDVGMzAwMCIsWmw6IjIwMjgiLFpwOiIyMDI5IixDOiIwMDAwLTAwMUYwMDdGLTAwOUYwMEFEMDM3ODAzNzkwMzdGLTAzODMwMzhCMDM4RDAzQTIwNTI2LTA1MzAwNTU3MDU1ODA1NjAwNTg4MDU4Qi0wNTkwMDVDOC0wNUNGMDVFQi0wNUVGMDVGNS0wNjA1MDYxQzA2MUQwNjIwMDY1RjA2REQwNzBFMDcwRjA3NEIwNzRDMDdCMi0wN0JGMDdGQi0wN0ZGMDgyRTA4MkYwODNGLTA4RkYwOTNBMDkzQjA5NEYwOTU2MDk1NzA5NzMtMDk3ODA5ODAwOTg0MDk4RDA5OEUwOTkxMDk5MjA5QTkwOUIxMDlCMy0wOUI1MDlCQTA5QkIwOUM1MDlDNjA5QzkwOUNBMDlDRi0wOUQ2MDlEOC0wOURCMDlERTA5RTQwOUU1MDlGQy0wQTAwMEEwNDBBMEItMEEwRTBBMTEwQTEyMEEyOTBBMzEwQTM0MEEzNzBBM0EwQTNCMEEzRDBBNDMtMEE0NjBBNDkwQTRBMEE0RS0wQTUwMEE1Mi0wQTU4MEE1RDBBNUYtMEE2NTBBNzYtMEE4MDBBODQwQThFMEE5MjBBQTkwQUIxMEFCNDBBQkEwQUJCMEFDNjBBQ0EwQUNFMEFDRjBBRDEtMEFERjBBRTQwQUU1MEFGMDBBRjItMEIwMDBCMDQwQjBEMEIwRTBCMTEwQjEyMEIyOTBCMzEwQjM0MEIzQTBCM0IwQjQ1MEI0NjBCNDkwQjRBMEI0RS0wQjU1MEI1OC0wQjVCMEI1RTBCNjQwQjY1MEI3Mi0wQjgxMEI4NDBCOEItMEI4RDBCOTEwQjk2LTBCOTgwQjlCMEI5RDBCQTAtMEJBMjBCQTUtMEJBNzBCQUItMEJBRDBCQkEtMEJCRDBCQzMtMEJDNTBCQzkwQkNFMEJDRjBCRDEtMEJENjBCRDgtMEJFNTBCRkItMEMwMDBDMDQwQzBEMEMxMTBDMjkwQzM0MEMzQS0wQzNDMEM0NTBDNDkwQzRFLTBDNTQwQzU3MEM1QS0wQzVGMEM2NDBDNjUwQzcwLTBDNzcwQzgwMEM4MTBDODQwQzhEMEM5MTBDQTkwQ0I0MENCQTBDQkIwQ0M1MENDOTBDQ0UtMENENDBDRDctMENERDBDREYwQ0U0MENFNTBDRjAwQ0YzLTBEMDEwRDA0MEQwRDBEMTEwRDI5MEQzQS0wRDNDMEQ0NTBENDkwRDRFLTBENTYwRDU4LTBENUYwRDY0MEQ2NTBENzYtMEQ3ODBEODAwRDgxMEQ4NDBEOTctMEQ5OTBEQjIwREJDMERCRTBEQkYwREM3LTBEQzkwRENCLTBEQ0UwREQ1MERENzBERTAtMERGMTBERjUtMEUwMDBFM0ItMEUzRTBFNUMtMEU4MDBFODMwRTg1MEU4NjBFODkwRThCMEU4QzBFOEUtMEU5MzBFOTgwRUEwMEVBNDBFQTYwRUE4MEVBOTBFQUMwRUJBMEVCRTBFQkYwRUM1MEVDNzBFQ0UwRUNGMEVEQTBFREIwRURFLTBFRkYwRjQ4MEY2RC0wRjcwMEY4Qy0wRjhGMEY5ODBGQkQwRkNEMEZEOS0wRkZGMTBDNi0xMENGMTBGRC0xMEZGMTI0OTEyNEUxMjRGMTI1NzEyNTkxMjVFMTI1RjEyODkxMjhFMTI4RjEyQjExMkI2MTJCNzEyQkYxMkMxMTJDNjEyQzcxMkQ3MTMxMTEzMTYxMzE3MTM1Qi0xMzVFMTM3RC0xMzdGMTM5QS0xMzlGMTNGNS0xM0ZGMTY5RC0xNjlGMTZGMS0xNkZGMTcwRDE3MTUtMTcxRjE3MzctMTczRjE3NTQtMTc1RjE3NkQxNzcxMTc3NC0xNzdGMTdCNDE3QjUxN0RFMTdERjE3RUEtMTdFRjE3RkEtMTdGRjE4MEYxODFBLTE4MUYxODc4LTE4N0YxOEFCLTE4QUYxOEY2LTE4RkYxOTFELTE5MUYxOTJDLTE5MkYxOTNDLTE5M0YxOTQxLTE5NDMxOTZFMTk2RjE5NzUtMTk3RjE5QUMtMTlBRjE5Q0EtMTlDRjE5REItMTlERDFBMUMxQTFEMUE1RjFBN0QxQTdFMUE4QS0xQThGMUE5QS0xQTlGMUFBRS0xQUZGMUI0Qy0xQjRGMUI3RC0xQjdGMUJBQi0xQkFEMUJCQS0xQkZGMUMzOC0xQzNBMUM0QS0xQzRDMUM4MC0xQ0NGMUNGMy0xQ0ZGMURFNy0xREZDMUYxNjFGMTcxRjFFMUYxRjFGNDYxRjQ3MUY0RTFGNEYxRjU4MUY1QTFGNUMxRjVFMUY3RTFGN0YxRkI1MUZDNTFGRDQxRkQ1MUZEQzFGRjAxRkYxMUZGNTFGRkYyMDBCLTIwMEYyMDJBLTIwMkUyMDYwLTIwNkYyMDcyMjA3MzIwOEYyMDk1LTIwOUYyMEI5LTIwQ0YyMEYxLTIwRkYyMThBLTIxOEYyM0U5LTIzRkYyNDI3LTI0M0YyNDRCLTI0NUYyNkNFMjZFMjI2RTQtMjZFNzI3MDAyNzA1MjcwQTI3MEIyNzI4Mjc0QzI3NEUyNzUzLTI3NTUyNzVGMjc2MDI3OTUtMjc5NzI3QjAyN0JGMjdDQjI3Q0QtMjdDRjJCNEQtMkI0RjJCNUEtMkJGRjJDMkYyQzVGMkNGMi0yQ0Y4MkQyNi0yRDJGMkQ2Ni0yRDZFMkQ3MC0yRDdGMkQ5Ny0yRDlGMkRBNzJEQUYyREI3MkRCRjJEQzcyRENGMkRENzJEREYyRTMyLTJFN0YyRTlBMkVGNC0yRUZGMkZENi0yRkVGMkZGQy0yRkZGMzA0MDMwOTczMDk4MzEwMC0zMTA0MzEyRS0zMTMwMzE4RjMxQjgtMzFCRjMxRTQtMzFFRjMyMUYzMkZGNERCNi00REJGOUZDQy05RkZGQTQ4RC1BNDhGQTRDNy1BNENGQTYyQy1BNjNGQTY2MEE2NjFBNjc0LUE2N0JBNjk4LUE2OUZBNkY4LUE2RkZBNzhELUE3RkFBODJDLUE4MkZBODNBLUE4M0ZBODc4LUE4N0ZBOEM1LUE4Q0RBOERBLUE4REZBOEZDLUE4RkZBOTU0LUE5NUVBOTdELUE5N0ZBOUNFQTlEQS1BOUREQTlFMC1BOUZGQUEzNy1BQTNGQUE0RUFBNEZBQTVBQUE1QkFBN0MtQUE3RkFBQzMtQUFEQUFBRTAtQUJCRkFCRUVBQkVGQUJGQS1BQkZGRDdBNC1EN0FGRDdDNy1EN0NBRDdGQy1GOEZGRkEyRUZBMkZGQTZFRkE2RkZBREEtRkFGRkZCMDctRkIxMkZCMTgtRkIxQ0ZCMzdGQjNERkIzRkZCNDJGQjQ1RkJCMi1GQkQyRkQ0MC1GRDRGRkQ5MEZEOTFGREM4LUZERUZGREZFRkRGRkZFMUEtRkUxRkZFMjctRkUyRkZFNTNGRTY3RkU2Qy1GRTZGRkU3NUZFRkQtRkYwMEZGQkYtRkZDMUZGQzhGRkM5RkZEMEZGRDFGRkQ4RkZEOUZGREQtRkZERkZGRTdGRkVGLUZGRkJGRkZFRkZGRiIsQ2M6IjAwMDAtMDAxRjAwN0YtMDA5RiIsQ2Y6IjAwQUQwNjAwLTA2MDMwNkREMDcwRjE3QjQxN0I1MjAwQi0yMDBGMjAyQS0yMDJFMjA2MC0yMDY0MjA2QS0yMDZGRkVGRkZGRjktRkZGQiIsQ286IkUwMDAtRjhGRiIsQ3M6IkQ4MDAtREZGRiIsQ246IjAzNzgwMzc5MDM3Ri0wMzgzMDM4QjAzOEQwM0EyMDUyNi0wNTMwMDU1NzA1NTgwNTYwMDU4ODA1OEItMDU5MDA1QzgtMDVDRjA1RUItMDVFRjA1RjUtMDVGRjA2MDQwNjA1MDYxQzA2MUQwNjIwMDY1RjA3MEUwNzRCMDc0QzA3QjItMDdCRjA3RkItMDdGRjA4MkUwODJGMDgzRi0wOEZGMDkzQTA5M0IwOTRGMDk1NjA5NTcwOTczLTA5NzgwOTgwMDk4NDA5OEQwOThFMDk5MTA5OTIwOUE5MDlCMTA5QjMtMDlCNTA5QkEwOUJCMDlDNTA5QzYwOUM5MDlDQTA5Q0YtMDlENjA5RDgtMDlEQjA5REUwOUU0MDlFNTA5RkMtMEEwMDBBMDQwQTBCLTBBMEUwQTExMEExMjBBMjkwQTMxMEEzNDBBMzcwQTNBMEEzQjBBM0QwQTQzLTBBNDYwQTQ5MEE0QTBBNEUtMEE1MDBBNTItMEE1ODBBNUQwQTVGLTBBNjUwQTc2LTBBODAwQTg0MEE4RTBBOTIwQUE5MEFCMTBBQjQwQUJBMEFCQjBBQzYwQUNBMEFDRTBBQ0YwQUQxLTBBREYwQUU0MEFFNTBBRjAwQUYyLTBCMDAwQjA0MEIwRDBCMEUwQjExMEIxMjBCMjkwQjMxMEIzNDBCM0EwQjNCMEI0NTBCNDYwQjQ5MEI0QTBCNEUtMEI1NTBCNTgtMEI1QjBCNUUwQjY0MEI2NTBCNzItMEI4MTBCODQwQjhCLTBCOEQwQjkxMEI5Ni0wQjk4MEI5QjBCOUQwQkEwLTBCQTIwQkE1LTBCQTcwQkFCLTBCQUQwQkJBLTBCQkQwQkMzLTBCQzUwQkM5MEJDRTBCQ0YwQkQxLTBCRDYwQkQ4LTBCRTUwQkZCLTBDMDAwQzA0MEMwRDBDMTEwQzI5MEMzNDBDM0EtMEMzQzBDNDUwQzQ5MEM0RS0wQzU0MEM1NzBDNUEtMEM1RjBDNjQwQzY1MEM3MC0wQzc3MEM4MDBDODEwQzg0MEM4RDBDOTEwQ0E5MENCNDBDQkEwQ0JCMENDNTBDQzkwQ0NFLTBDRDQwQ0Q3LTBDREQwQ0RGMENFNDBDRTUwQ0YwMENGMy0wRDAxMEQwNDBEMEQwRDExMEQyOTBEM0EtMEQzQzBENDUwRDQ5MEQ0RS0wRDU2MEQ1OC0wRDVGMEQ2NDBENjUwRDc2LTBENzgwRDgwMEQ4MTBEODQwRDk3LTBEOTkwREIyMERCQzBEQkUwREJGMERDNy0wREM5MERDQi0wRENFMERENTBERDcwREUwLTBERjEwREY1LTBFMDAwRTNCLTBFM0UwRTVDLTBFODAwRTgzMEU4NTBFODYwRTg5MEU4QjBFOEMwRThFLTBFOTMwRTk4MEVBMDBFQTQwRUE2MEVBODBFQTkwRUFDMEVCQTBFQkUwRUJGMEVDNTBFQzcwRUNFMEVDRjBFREEwRURCMEVERS0wRUZGMEY0ODBGNkQtMEY3MDBGOEMtMEY4RjBGOTgwRkJEMEZDRDBGRDktMEZGRjEwQzYtMTBDRjEwRkQtMTBGRjEyNDkxMjRFMTI0RjEyNTcxMjU5MTI1RTEyNUYxMjg5MTI4RTEyOEYxMkIxMTJCNjEyQjcxMkJGMTJDMTEyQzYxMkM3MTJENzEzMTExMzE2MTMxNzEzNUItMTM1RTEzN0QtMTM3RjEzOUEtMTM5RjEzRjUtMTNGRjE2OUQtMTY5RjE2RjEtMTZGRjE3MEQxNzE1LTE3MUYxNzM3LTE3M0YxNzU0LTE3NUYxNzZEMTc3MTE3NzQtMTc3RjE3REUxN0RGMTdFQS0xN0VGMTdGQS0xN0ZGMTgwRjE4MUEtMTgxRjE4NzgtMTg3RjE4QUItMThBRjE4RjYtMThGRjE5MUQtMTkxRjE5MkMtMTkyRjE5M0MtMTkzRjE5NDEtMTk0MzE5NkUxOTZGMTk3NS0xOTdGMTlBQy0xOUFGMTlDQS0xOUNGMTlEQi0xOUREMUExQzFBMUQxQTVGMUE3RDFBN0UxQThBLTFBOEYxQTlBLTFBOUYxQUFFLTFBRkYxQjRDLTFCNEYxQjdELTFCN0YxQkFCLTFCQUQxQkJBLTFCRkYxQzM4LTFDM0ExQzRBLTFDNEMxQzgwLTFDQ0YxQ0YzLTFDRkYxREU3LTFERkMxRjE2MUYxNzFGMUUxRjFGMUY0NjFGNDcxRjRFMUY0RjFGNTgxRjVBMUY1QzFGNUUxRjdFMUY3RjFGQjUxRkM1MUZENDFGRDUxRkRDMUZGMDFGRjExRkY1MUZGRjIwNjUtMjA2OTIwNzIyMDczMjA4RjIwOTUtMjA5RjIwQjktMjBDRjIwRjEtMjBGRjIxOEEtMjE4RjIzRTktMjNGRjI0MjctMjQzRjI0NEItMjQ1RjI2Q0UyNkUyMjZFNC0yNkU3MjcwMDI3MDUyNzBBMjcwQjI3MjgyNzRDMjc0RTI3NTMtMjc1NTI3NUYyNzYwMjc5NS0yNzk3MjdCMDI3QkYyN0NCMjdDRC0yN0NGMkI0RC0yQjRGMkI1QS0yQkZGMkMyRjJDNUYyQ0YyLTJDRjgyRDI2LTJEMkYyRDY2LTJENkUyRDcwLTJEN0YyRDk3LTJEOUYyREE3MkRBRjJEQjcyREJGMkRDNzJEQ0YyREQ3MkRERjJFMzItMkU3RjJFOUEyRUY0LTJFRkYyRkQ2LTJGRUYyRkZDLTJGRkYzMDQwMzA5NzMwOTgzMTAwLTMxMDQzMTJFLTMxMzAzMThGMzFCOC0zMUJGMzFFNC0zMUVGMzIxRjMyRkY0REI2LTREQkY5RkNDLTlGRkZBNDhELUE0OEZBNEM3LUE0Q0ZBNjJDLUE2M0ZBNjYwQTY2MUE2NzQtQTY3QkE2OTgtQTY5RkE2RjgtQTZGRkE3OEQtQTdGQUE4MkMtQTgyRkE4M0EtQTgzRkE4NzgtQTg3RkE4QzUtQThDREE4REEtQThERkE4RkMtQThGRkE5NTQtQTk1RUE5N0QtQTk3RkE5Q0VBOURBLUE5RERBOUUwLUE5RkZBQTM3LUFBM0ZBQTRFQUE0RkFBNUFBQTVCQUE3Qy1BQTdGQUFDMy1BQURBQUFFMC1BQkJGQUJFRUFCRUZBQkZBLUFCRkZEN0E0LUQ3QUZEN0M3LUQ3Q0FEN0ZDLUQ3RkZGQTJFRkEyRkZBNkVGQTZGRkFEQS1GQUZGRkIwNy1GQjEyRkIxOC1GQjFDRkIzN0ZCM0RGQjNGRkI0MkZCNDVGQkIyLUZCRDJGRDQwLUZENEZGRDkwRkQ5MUZEQzgtRkRFRkZERkVGREZGRkUxQS1GRTFGRkUyNy1GRTJGRkU1M0ZFNjdGRTZDLUZFNkZGRTc1RkVGREZFRkVGRjAwRkZCRi1GRkMxRkZDOEZGQzlGRkQwRkZEMUZGRDhGRkQ5RkZERC1GRkRGRkZFN0ZGRUYtRkZGOEZGRkVGRkZGIn0pfSksZGVmaW5lKCJhY2UvZG9jdW1lbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9yYW5nZSIsImFjZS9hbmNob3IiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWEoIi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vYW5jaG9yIikuQW5jaG9yLGg9ZnVuY3Rpb24oYSl7dGhpcy4kbGluZXM9W10sQXJyYXkuaXNBcnJheShhKT90aGlzLmluc2VydExpbmVzKDAsYSk6YS5sZW5ndGg9PTA/dGhpcy4kbGluZXM9WyIiXTp0aGlzLmluc2VydCh7cm93OjAsY29sdW1uOjB9LGEpfTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxlKSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0TGVuZ3RoKCk7dGhpcy5yZW1vdmUobmV3IGYoMCwwLGIsdGhpcy5nZXRMaW5lKGItMSkubGVuZ3RoKSksdGhpcy5pbnNlcnQoe3JvdzowLGNvbHVtbjowfSxhKX0sdGhpcy5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSl9LHRoaXMuY3JlYXRlQW5jaG9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBnKHRoaXMsYSxiKX0sImFhYSIuc3BsaXQoL2EvKS5sZW5ndGg9PTA/dGhpcy4kc3BsaXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXHJcbnxcci9nLCJcbiIpLnNwbGl0KCJcbiIpfTp0aGlzLiRzcGxpdD1mdW5jdGlvbihhKXtyZXR1cm4gYS5zcGxpdCgvXHJcbnxccnxcbi8pfSx0aGlzLiRkZXRlY3ROZXdMaW5lPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7Yj90aGlzLiRhdXRvTmV3TGluZT1iWzFdOnRoaXMuJGF1dG9OZXdMaW5lPSJcbiJ9LHRoaXMuZ2V0TmV3TGluZUNoYXJhY3Rlcj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLiRuZXdMaW5lTW9kZSl7Y2FzZSJ3aW5kb3dzIjpyZXR1cm4iXHJcbiI7Y2FzZSJ1bml4IjpyZXR1cm4iXG4iO2Nhc2UiYXV0byI6cmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lfX0sdGhpcy4kYXV0b05ld0xpbmU9IlxuIix0aGlzLiRuZXdMaW5lTW9kZT0iYXV0byIsdGhpcy5zZXROZXdMaW5lTW9kZT1mdW5jdGlvbihhKXtpZih0aGlzLiRuZXdMaW5lTW9kZT09PWEpcmV0dXJuO3RoaXMuJG5ld0xpbmVNb2RlPWF9LHRoaXMuZ2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbmV3TGluZU1vZGV9LHRoaXMuaXNOZXdMaW5lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT0iXHJcbiJ8fGE9PSJcciJ8fGE9PSJcbiJ9LHRoaXMuZ2V0TGluZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kbGluZXNbYV18fCIifSx0aGlzLmdldExpbmVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGEsYisxKX0sdGhpcy5nZXRBbGxMaW5lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExpbmVzKDAsdGhpcy5nZXRMZW5ndGgoKSl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGxpbmVzLmxlbmd0aH0sdGhpcy5nZXRUZXh0UmFuZ2U9ZnVuY3Rpb24oYSl7aWYoYS5zdGFydC5yb3c9PWEuZW5kLnJvdylyZXR1cm4gdGhpcy4kbGluZXNbYS5zdGFydC5yb3ddLnN1YnN0cmluZyhhLnN0YXJ0LmNvbHVtbixhLmVuZC5jb2x1bW4pO3ZhciBiPVtdO3JldHVybiBiLnB1c2godGhpcy4kbGluZXNbYS5zdGFydC5yb3ddLnN1YnN0cmluZyhhLnN0YXJ0LmNvbHVtbikpLGIucHVzaC5hcHBseShiLHRoaXMuZ2V0TGluZXMoYS5zdGFydC5yb3crMSxhLmVuZC5yb3ctMSkpLGIucHVzaCh0aGlzLiRsaW5lc1thLmVuZC5yb3ddLnN1YnN0cmluZygwLGEuZW5kLmNvbHVtbikpLGIuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSl9LHRoaXMuJGNsaXBQb3NpdGlvbj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldExlbmd0aCgpO3JldHVybiBhLnJvdz49YiYmKGEucm93PU1hdGgubWF4KDAsYi0xKSxhLmNvbHVtbj10aGlzLmdldExpbmUoYi0xKS5sZW5ndGgpLGF9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGEsYil7aWYoYi5sZW5ndGg9PTApcmV0dXJuIGE7YT10aGlzLiRjbGlwUG9zaXRpb24oYSksdGhpcy5nZXRMZW5ndGgoKTw9MSYmdGhpcy4kZGV0ZWN0TmV3TGluZShiKTt2YXIgYz10aGlzLiRzcGxpdChiKSxkPWMuc3BsaWNlKDAsMSlbMF0sZT1jLmxlbmd0aD09MD9udWxsOmMuc3BsaWNlKGMubGVuZ3RoLTEsMSlbMF07cmV0dXJuIGE9dGhpcy5pbnNlcnRJbkxpbmUoYSxkKSxlIT09bnVsbCYmKGE9dGhpcy5pbnNlcnROZXdMaW5lKGEpLGE9dGhpcy5pbnNlcnRMaW5lcyhhLnJvdyxjKSxhPXRoaXMuaW5zZXJ0SW5MaW5lKGEsZXx8IiIpKSxhfSx0aGlzLmluc2VydExpbmVzPWZ1bmN0aW9uKGEsYil7aWYoYi5sZW5ndGg9PTApcmV0dXJue3JvdzphLGNvbHVtbjowfTt2YXIgYz1bYSwwXTtjLnB1c2guYXBwbHkoYyxiKSx0aGlzLiRsaW5lcy5zcGxpY2UuYXBwbHkodGhpcy4kbGluZXMsYyk7dmFyIGQ9bmV3IGYoYSwwLGErYi5sZW5ndGgsMCksZT17YWN0aW9uOiJpbnNlcnRMaW5lcyIscmFuZ2U6ZCxsaW5lczpifTtyZXR1cm4gdGhpcy5fZW1pdCgiY2hhbmdlIix7ZGF0YTplfSksZC5lbmR9LHRoaXMuaW5zZXJ0TmV3TGluZT1mdW5jdGlvbihhKXthPXRoaXMuJGNsaXBQb3NpdGlvbihhKTt2YXIgYj10aGlzLiRsaW5lc1thLnJvd118fCIiO3RoaXMuJGxpbmVzW2Eucm93XT1iLnN1YnN0cmluZygwLGEuY29sdW1uKSx0aGlzLiRsaW5lcy5zcGxpY2UoYS5yb3crMSwwLGIuc3Vic3RyaW5nKGEuY29sdW1uLGIubGVuZ3RoKSk7dmFyIGM9e3JvdzphLnJvdysxLGNvbHVtbjowfSxkPXthY3Rpb246Imluc2VydFRleHQiLHJhbmdlOmYuZnJvbVBvaW50cyhhLGMpLHRleHQ6dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCl9O3JldHVybiB0aGlzLl9lbWl0KCJjaGFuZ2UiLHtkYXRhOmR9KSxjfSx0aGlzLmluc2VydEluTGluZT1mdW5jdGlvbihhLGIpe2lmKGIubGVuZ3RoPT0wKXJldHVybiBhO3ZhciBjPXRoaXMuJGxpbmVzW2Eucm93XXx8IiI7dGhpcy4kbGluZXNbYS5yb3ddPWMuc3Vic3RyaW5nKDAsYS5jb2x1bW4pK2IrYy5zdWJzdHJpbmcoYS5jb2x1bW4pO3ZhciBkPXtyb3c6YS5yb3csY29sdW1uOmEuY29sdW1uK2IubGVuZ3RofSxlPXthY3Rpb246Imluc2VydFRleHQiLHJhbmdlOmYuZnJvbVBvaW50cyhhLGQpLHRleHQ6Yn07cmV0dXJuIHRoaXMuX2VtaXQoImNoYW5nZSIse2RhdGE6ZX0pLGR9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGEpe2Euc3RhcnQ9dGhpcy4kY2xpcFBvc2l0aW9uKGEuc3RhcnQpLGEuZW5kPXRoaXMuJGNsaXBQb3NpdGlvbihhLmVuZCk7aWYoYS5pc0VtcHR5KCkpcmV0dXJuIGEuc3RhcnQ7dmFyIGI9YS5zdGFydC5yb3csYz1hLmVuZC5yb3c7aWYoYS5pc011bHRpTGluZSgpKXt2YXIgZD1hLnN0YXJ0LmNvbHVtbj09MD9iOmIrMSxlPWMtMTthLmVuZC5jb2x1bW4+MCYmdGhpcy5yZW1vdmVJbkxpbmUoYywwLGEuZW5kLmNvbHVtbiksZT49ZCYmdGhpcy5yZW1vdmVMaW5lcyhkLGUpLGQhPWImJih0aGlzLnJlbW92ZUluTGluZShiLGEuc3RhcnQuY29sdW1uLHRoaXMuZ2V0TGluZShiKS5sZW5ndGgpLHRoaXMucmVtb3ZlTmV3TGluZShhLnN0YXJ0LnJvdykpfWVsc2UgdGhpcy5yZW1vdmVJbkxpbmUoYixhLnN0YXJ0LmNvbHVtbixhLmVuZC5jb2x1bW4pO3JldHVybiBhLnN0YXJ0fSx0aGlzLnJlbW92ZUluTGluZT1mdW5jdGlvbihhLGIsYyl7aWYoYj09YylyZXR1cm47dmFyIGQ9bmV3IGYoYSxiLGEsYyksZT10aGlzLmdldExpbmUoYSksZz1lLnN1YnN0cmluZyhiLGMpLGg9ZS5zdWJzdHJpbmcoMCxiKStlLnN1YnN0cmluZyhjLGUubGVuZ3RoKTt0aGlzLiRsaW5lcy5zcGxpY2UoYSwxLGgpO3ZhciBpPXthY3Rpb246InJlbW92ZVRleHQiLHJhbmdlOmQsdGV4dDpnfTtyZXR1cm4gdGhpcy5fZW1pdCgiY2hhbmdlIix7ZGF0YTppfSksZC5zdGFydH0sdGhpcy5yZW1vdmVMaW5lcz1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBmKGEsMCxiKzEsMCksZD10aGlzLiRsaW5lcy5zcGxpY2UoYSxiLWErMSksZT17YWN0aW9uOiJyZW1vdmVMaW5lcyIscmFuZ2U6YyxubDp0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSxsaW5lczpkfTtyZXR1cm4gdGhpcy5fZW1pdCgiY2hhbmdlIix7ZGF0YTplfSksZH0sdGhpcy5yZW1vdmVOZXdMaW5lPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0TGluZShhKSxjPXRoaXMuZ2V0TGluZShhKzEpLGQ9bmV3IGYoYSxiLmxlbmd0aCxhKzEsMCksZT1iK2M7dGhpcy4kbGluZXMuc3BsaWNlKGEsMixlKTt2YXIgZz17YWN0aW9uOiJyZW1vdmVUZXh0IixyYW5nZTpkLHRleHQ6dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCl9O3RoaXMuX2VtaXQoImNoYW5nZSIse2RhdGE6Z30pfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oYSxiKXtpZihiLmxlbmd0aD09MCYmYS5pc0VtcHR5KCkpcmV0dXJuIGEuc3RhcnQ7aWYoYj09dGhpcy5nZXRUZXh0UmFuZ2UoYSkpcmV0dXJuIGEuZW5kO3RoaXMucmVtb3ZlKGEpO2lmKGIpdmFyIGM9dGhpcy5pbnNlcnQoYS5zdGFydCxiKTtlbHNlIGM9YS5zdGFydDtyZXR1cm4gY30sdGhpcy5hcHBseURlbHRhcz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXSxkPWYuZnJvbVBvaW50cyhjLnJhbmdlLnN0YXJ0LGMucmFuZ2UuZW5kKTtjLmFjdGlvbj09Imluc2VydExpbmVzIj90aGlzLmluc2VydExpbmVzKGQuc3RhcnQucm93LGMubGluZXMpOmMuYWN0aW9uPT0iaW5zZXJ0VGV4dCI/dGhpcy5pbnNlcnQoZC5zdGFydCxjLnRleHQpOmMuYWN0aW9uPT0icmVtb3ZlTGluZXMiP3RoaXMucmVtb3ZlTGluZXMoZC5zdGFydC5yb3csZC5lbmQucm93LTEpOmMuYWN0aW9uPT0icmVtb3ZlVGV4dCImJnRoaXMucmVtb3ZlKGQpfX0sdGhpcy5yZXZlcnREZWx0YXM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWEubGVuZ3RoLTE7Yj49MDtiLS0pe3ZhciBjPWFbYl0sZD1mLmZyb21Qb2ludHMoYy5yYW5nZS5zdGFydCxjLnJhbmdlLmVuZCk7Yy5hY3Rpb249PSJpbnNlcnRMaW5lcyI/dGhpcy5yZW1vdmVMaW5lcyhkLnN0YXJ0LnJvdyxkLmVuZC5yb3ctMSk6Yy5hY3Rpb249PSJpbnNlcnRUZXh0Ij90aGlzLnJlbW92ZShkKTpjLmFjdGlvbj09InJlbW92ZUxpbmVzIj90aGlzLmluc2VydExpbmVzKGQuc3RhcnQucm93LGMubGluZXMpOmMuYWN0aW9uPT0icmVtb3ZlVGV4dCImJnRoaXMuaW5zZXJ0KGQuc3RhcnQsYy50ZXh0KX19fSkpLmNhbGwoaC5wcm90b3R5cGUpLGIuRG9jdW1lbnQ9aH0pLGRlZmluZSgiYWNlL2FuY2hvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9vb3AiKSxlPWEoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj1iLkFuY2hvcj1mdW5jdGlvbihhLGIsYyl7dGhpcy5kb2N1bWVudD1hLHR5cGVvZiBjPT0idW5kZWZpbmVkIj90aGlzLnNldFBvc2l0aW9uKGIucm93LGIuY29sdW1uKTp0aGlzLnNldFBvc2l0aW9uKGIsYyksdGhpcy4kb25DaGFuZ2U9dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpLGEub24oImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpfTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxlKSx0aGlzLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csdGhpcy5jb2x1bW4pfSx0aGlzLmdldERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jdW1lbnR9LHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhLGM9Yi5yYW5nZTtpZihjLnN0YXJ0LnJvdz09Yy5lbmQucm93JiZjLnN0YXJ0LnJvdyE9dGhpcy5yb3cpcmV0dXJuO2lmKGMuc3RhcnQucm93PnRoaXMucm93KXJldHVybjtpZihjLnN0YXJ0LnJvdz09dGhpcy5yb3cmJmMuc3RhcnQuY29sdW1uPnRoaXMuY29sdW1uKXJldHVybjt2YXIgZD10aGlzLnJvdyxlPXRoaXMuY29sdW1uO2IuYWN0aW9uPT09Imluc2VydFRleHQiP2Muc3RhcnQucm93PT09ZCYmYy5zdGFydC5jb2x1bW48PWU/Yy5zdGFydC5yb3c9PT1jLmVuZC5yb3c/ZSs9Yy5lbmQuY29sdW1uLWMuc3RhcnQuY29sdW1uOihlLT1jLnN0YXJ0LmNvbHVtbixkKz1jLmVuZC5yb3ctYy5zdGFydC5yb3cpOmMuc3RhcnQucm93IT09Yy5lbmQucm93JiZjLnN0YXJ0LnJvdzxkJiYoZCs9Yy5lbmQucm93LWMuc3RhcnQucm93KTpiLmFjdGlvbj09PSJpbnNlcnRMaW5lcyI/Yy5zdGFydC5yb3c8PWQmJihkKz1jLmVuZC5yb3ctYy5zdGFydC5yb3cpOmIuYWN0aW9uPT0icmVtb3ZlVGV4dCI/Yy5zdGFydC5yb3c9PWQmJmMuc3RhcnQuY29sdW1uPGU/Yy5lbmQuY29sdW1uPj1lP2U9Yy5zdGFydC5jb2x1bW46ZT1NYXRoLm1heCgwLGUtKGMuZW5kLmNvbHVtbi1jLnN0YXJ0LmNvbHVtbikpOmMuc3RhcnQucm93IT09Yy5lbmQucm93JiZjLnN0YXJ0LnJvdzxkPyhjLmVuZC5yb3c9PWQmJihlPU1hdGgubWF4KDAsZS1jLmVuZC5jb2x1bW4pK2Muc3RhcnQuY29sdW1uKSxkLT1jLmVuZC5yb3ctYy5zdGFydC5yb3cpOmMuZW5kLnJvdz09ZCYmKGQtPWMuZW5kLnJvdy1jLnN0YXJ0LnJvdyxlPU1hdGgubWF4KDAsZS1jLmVuZC5jb2x1bW4pK2Muc3RhcnQuY29sdW1uKTpiLmFjdGlvbj09InJlbW92ZUxpbmVzIiYmYy5zdGFydC5yb3c8PWQmJihjLmVuZC5yb3c8PWQ/ZC09Yy5lbmQucm93LWMuc3RhcnQucm93OihkPWMuc3RhcnQucm93LGU9MCkpLHRoaXMuc2V0UG9zaXRpb24oZCxlLCEwKX0sdGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yz9kPXtyb3c6YSxjb2x1bW46Yn06ZD10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGEsYik7aWYodGhpcy5yb3c9PWQucm93JiZ0aGlzLmNvbHVtbj09ZC5jb2x1bW4pcmV0dXJuO3ZhciBlPXtyb3c6dGhpcy5yb3csY29sdW1uOnRoaXMuY29sdW1ufTt0aGlzLnJvdz1kLnJvdyx0aGlzLmNvbHVtbj1kLmNvbHVtbix0aGlzLl9lbWl0KCJjaGFuZ2UiLHtvbGQ6ZSx2YWx1ZTpkfSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKX0sdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudD1mdW5jdGlvbihhLGIpe3ZhciBjPXt9O3JldHVybiBhPj10aGlzLmRvY3VtZW50LmdldExlbmd0aCgpPyhjLnJvdz1NYXRoLm1heCgwLHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCktMSksYy5jb2x1bW49dGhpcy5kb2N1bWVudC5nZXRMaW5lKGMucm93KS5sZW5ndGgpOmE8MD8oYy5yb3c9MCxjLmNvbHVtbj0wKTooYy5yb3c9YSxjLmNvbHVtbj1NYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUoYy5yb3cpLmxlbmd0aCxNYXRoLm1heCgwLGIpKSksYjwwJiYoYy5jb2x1bW49MCksY319KSkuY2FsbChmLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9iYWNrZ3JvdW5kX3Rva2VuaXplciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9vb3AiKSxlPWEoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj1mdW5jdGlvbihhLGIpe3RoaXMucnVubmluZz0hMSx0aGlzLmxpbmVzPVtdLHRoaXMuY3VycmVudExpbmU9MCx0aGlzLnRva2VuaXplcj1hO3ZhciBjPXRoaXM7dGhpcy4kd29ya2VyPWZ1bmN0aW9uKCl7aWYoIWMucnVubmluZylyZXR1cm47dmFyIGE9bmV3IERhdGUsYj1jLmN1cnJlbnRMaW5lLGQ9Yy5kb2MsZT0wLGY9ZC5nZXRMZW5ndGgoKTt3aGlsZShjLmN1cnJlbnRMaW5lPGYpe2MubGluZXNbYy5jdXJyZW50TGluZV09Yy4kdG9rZW5pemVSb3dzKGMuY3VycmVudExpbmUsYy5jdXJyZW50TGluZSlbMF0sYy5jdXJyZW50TGluZSsrLGUrPTE7aWYoZSU1PT0wJiZuZXcgRGF0ZS1hPjIwKXtjLmZpcmVVcGRhdGVFdmVudChiLGMuY3VycmVudExpbmUtMSksYy5ydW5uaW5nPXNldFRpbWVvdXQoYy4kd29ya2VyLDIwKTtyZXR1cm59fWMucnVubmluZz0hMSxjLmZpcmVVcGRhdGVFdmVudChiLGYtMSl9fTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxlKSx0aGlzLnNldFRva2VuaXplcj1mdW5jdGlvbihhKXt0aGlzLnRva2VuaXplcj1hLHRoaXMubGluZXM9W10sdGhpcy5zdGFydCgwKX0sdGhpcy5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLmRvYz1hLHRoaXMubGluZXM9W10sdGhpcy5zdG9wKCl9LHRoaXMuZmlyZVVwZGF0ZUV2ZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9e2ZpcnN0OmEsbGFzdDpifTt0aGlzLl9lbWl0KCJ1cGRhdGUiLHtkYXRhOmN9KX0sdGhpcy5zdGFydD1mdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRMaW5lPU1hdGgubWluKGF8fDAsdGhpcy5jdXJyZW50TGluZSx0aGlzLmRvYy5nZXRMZW5ndGgoKSksdGhpcy5saW5lcy5zcGxpY2UodGhpcy5jdXJyZW50TGluZSx0aGlzLmxpbmVzLmxlbmd0aCksdGhpcy5zdG9wKCksdGhpcy5ydW5uaW5nPXNldFRpbWVvdXQodGhpcy4kd29ya2VyLDcwMCl9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3RoaXMucnVubmluZyYmY2xlYXJUaW1lb3V0KHRoaXMucnVubmluZyksdGhpcy5ydW5uaW5nPSExfSx0aGlzLmdldFRva2Vucz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLiR0b2tlbml6ZVJvd3MoYSxiKX0sdGhpcy5nZXRTdGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kdG9rZW5pemVSb3dzKGEsYSlbMF0uc3RhdGV9LHRoaXMuJHRva2VuaXplUm93cz1mdW5jdGlvbihhLGIpe2lmKCF0aGlzLmRvY3x8aXNOYU4oYSl8fGlzTmFOKGIpKXJldHVyblt7c3RhdGU6InN0YXJ0Iix0b2tlbnM6W119XTt2YXIgYz1bXSxkPSJzdGFydCIsZT0hMTthPjAmJnRoaXMubGluZXNbYS0xXT8oZD10aGlzLmxpbmVzW2EtMV0uc3RhdGUsZT0hMCk6YT09MD8oZD0ic3RhcnQiLGU9ITApOnRoaXMubGluZXMubGVuZ3RoPjAmJihkPXRoaXMubGluZXNbdGhpcy5saW5lcy5sZW5ndGgtMV0uc3RhdGUpO3ZhciBmPXRoaXMuZG9jLmdldExpbmVzKGEsYik7Zm9yKHZhciBnPWE7Zzw9YjtnKyspaWYoIXRoaXMubGluZXNbZ10pe3ZhciBoPXRoaXMudG9rZW5pemVyLmdldExpbmVUb2tlbnMoZltnLWFdfHwiIixkKSxkPWguc3RhdGU7Yy5wdXNoKGgpLGUmJih0aGlzLmxpbmVzW2ddPWgpfWVsc2V7dmFyIGg9dGhpcy5saW5lc1tnXTtkPWguc3RhdGUsYy5wdXNoKGgpfXJldHVybiBjfX0pKS5jYWxsKGYucHJvdG90eXBlKSxiLkJhY2tncm91bmRUb2tlbml6ZXI9Zn0pLGRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkX2xpbmUiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLCJhY2UvdG9rZW5faXRlcmF0b3IiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gaCgpe3RoaXMuZ2V0Rm9sZEF0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmdldEZvbGRMaW5lKGEpO2lmKCFkKXJldHVybiBudWxsO3ZhciBlPWQuZm9sZHM7Zm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07aWYoZy5yYW5nZS5jb250YWlucyhhLGIpKXtpZihjPT0xJiZnLnJhbmdlLmlzRW5kKGEsYikpY29udGludWU7aWYoYz09LTEmJmcucmFuZ2UuaXNTdGFydChhLGIpKWNvbnRpbnVlO3JldHVybiBnfX19LHRoaXMuZ2V0Rm9sZHNJblJhbmdlPWZ1bmN0aW9uKGEpe2E9YS5jbG9uZSgpO3ZhciBiPWEuc3RhcnQsYz1hLmVuZCxkPXRoaXMuJGZvbGREYXRhLGU9W107Yi5jb2x1bW4rPTEsYy5jb2x1bW4tPTE7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPWRbZl0ucmFuZ2UuY29tcGFyZVJhbmdlKGEpO2lmKGc9PTIpY29udGludWU7aWYoZz09LTIpYnJlYWs7dmFyIGg9ZFtmXS5mb2xkcztmb3IodmFyIGk9MDtpPGgubGVuZ3RoO2krKyl7dmFyIGo9aFtpXTtnPWoucmFuZ2UuY29tcGFyZVJhbmdlKGEpO2lmKGc9PS0yKWJyZWFrO2lmKGc9PTIpY29udGludWU7aWYoZz09NDIpYnJlYWs7ZS5wdXNoKGopfX1yZXR1cm4gZX0sdGhpcy5nZXRBbGxGb2xkcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGMoYil7YS5wdXNoKGIpO2lmKCFiLnN1YkZvbGRzKXJldHVybjtmb3IodmFyIGQ9MDtkPGIuc3ViRm9sZHMubGVuZ3RoO2QrKyljKGIuc3ViRm9sZHNbZF0pfXZhciBhPVtdLGI9dGhpcy4kZm9sZERhdGE7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspZm9yKHZhciBlPTA7ZTxiW2RdLmZvbGRzLmxlbmd0aDtlKyspYyhiW2RdLmZvbGRzW2VdKTtyZXR1cm4gYX0sdGhpcy5nZXRGb2xkU3RyaW5nQXQ9ZnVuY3Rpb24oYSxiLGMsZCl7ZD1kfHx0aGlzLmdldEZvbGRMaW5lKGEpO2lmKCFkKXJldHVybiBudWxsO3ZhciBlPXtlbmQ6e2NvbHVtbjowfX0sZixnO2Zvcih2YXIgaD0wO2g8ZC5mb2xkcy5sZW5ndGg7aCsrKXtnPWQuZm9sZHNbaF07dmFyIGk9Zy5yYW5nZS5jb21wYXJlRW5kKGEsYik7aWYoaT09LTEpe2Y9dGhpcy5nZXRMaW5lKGcuc3RhcnQucm93KS5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGcuc3RhcnQuY29sdW1uKTticmVha31pZihpPT09MClyZXR1cm4gbnVsbDtlPWd9cmV0dXJuIGZ8fChmPXRoaXMuZ2V0TGluZShnLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbikpLGM9PS0xP2Yuc3Vic3RyaW5nKDAsYi1lLmVuZC5jb2x1bW4pOmM9PTE/Zi5zdWJzdHJpbmcoYi1lLmVuZC5jb2x1bW4pOmZ9LHRoaXMuZ2V0Rm9sZExpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRmb2xkRGF0YSxkPTA7YiYmKGQ9Yy5pbmRleE9mKGIpKSxkPT0tMSYmKGQ9MCk7Zm9yKGQ7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07aWYoZS5zdGFydC5yb3c8PWEmJmUuZW5kLnJvdz49YSlyZXR1cm4gZTtpZihlLmVuZC5yb3c+YSlyZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0sdGhpcy5nZXROZXh0Rm9sZExpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRmb2xkRGF0YSxkPTA7YiYmKGQ9Yy5pbmRleE9mKGIpKSxkPT0tMSYmKGQ9MCk7Zm9yKGQ7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07aWYoZS5lbmQucm93Pj1hKXJldHVybiBlfXJldHVybiBudWxsfSx0aGlzLmdldEZvbGRlZFJvd0NvdW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kZm9sZERhdGEsZD1iLWErMTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXSxnPWYuZW5kLnJvdyxoPWYuc3RhcnQucm93O2lmKGc+PWIpe2g8YiYmKGg+PWE/ZC09Yi1oOmQ9MCk7YnJlYWt9Zz49YSYmKGg+PWE/ZC09Zy1oOmQtPWctYSsxKX1yZXR1cm4gZH0sdGhpcy4kYWRkRm9sZExpbmU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJGZvbGREYXRhLnB1c2goYSksdGhpcy4kZm9sZERhdGEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0YXJ0LnJvdy1iLnN0YXJ0LnJvd30pLGF9LHRoaXMuYWRkRm9sZD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuJGZvbGREYXRhLGQ9ITEsZzthIGluc3RhbmNlb2YgZj9nPWE6Zz1uZXcgZihiLGEpLHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQoZy5yYW5nZSk7dmFyIGg9Zy5zdGFydC5yb3csaT1nLnN0YXJ0LmNvbHVtbixqPWcuZW5kLnJvdyxrPWcuZW5kLmNvbHVtbjtpZihnLnBsYWNlaG9sZGVyLmxlbmd0aDwyKXRocm93IlBsYWNlaG9sZGVyIGhhcyB0byBiZSBhdCBsZWFzdCAyIGNoYXJhY3RlcnMiO2lmKGg9PWomJmstaTwyKXRocm93IlRoZSByYW5nZSBoYXMgdG8gYmUgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIHdpZHRoIjt2YXIgbD10aGlzLmdldEZvbGRBdChoLGksMSksbT10aGlzLmdldEZvbGRBdChqLGssLTEpO2lmKGwmJm09PWwpcmV0dXJuIGwuYWRkU3ViRm9sZChnKTtpZihsJiYhbC5yYW5nZS5pc1N0YXJ0KGgsaSl8fG0mJiFtLnJhbmdlLmlzRW5kKGosaykpdGhyb3ciQSBmb2xkIGNhbid0IGludGVyc2VjdCBhbHJlYWR5IGV4aXN0aW5nIGZvbGQiK2cucmFuZ2UrbC5yYW5nZTt2YXIgbj10aGlzLmdldEZvbGRzSW5SYW5nZShnLnJhbmdlKTtuLmxlbmd0aD4wJiYodGhpcy5yZW1vdmVGb2xkcyhuKSxnLnN1YkZvbGRzPW4pO2Zvcih2YXIgbz0wO288Yy5sZW5ndGg7bysrKXt2YXIgcD1jW29dO2lmKGo9PXAuc3RhcnQucm93KXtwLmFkZEZvbGQoZyksZD0hMDticmVha31pZihoPT1wLmVuZC5yb3cpe3AuYWRkRm9sZChnKSxkPSEwO2lmKCFnLnNhbWVSb3cpe3ZhciBxPWNbbysxXTtpZihxJiZxLnN0YXJ0LnJvdz09ail7cC5tZXJnZShxKTticmVha319YnJlYWt9aWYoajw9cC5zdGFydC5yb3cpYnJlYWt9cmV0dXJuIGR8fChwPXRoaXMuJGFkZEZvbGRMaW5lKG5ldyBlKHRoaXMuJGZvbGREYXRhLGcpKSksdGhpcy4kdXNlV3JhcE1vZGUmJnRoaXMuJHVwZGF0ZVdyYXBEYXRhKHAuc3RhcnQucm93LHAuc3RhcnQucm93KSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTpnfSksZ30sdGhpcy5hZGRGb2xkcz1mdW5jdGlvbihhKXthLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5hZGRGb2xkKGEpfSx0aGlzKX0sdGhpcy5yZW1vdmVGb2xkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZm9sZExpbmUsYz1iLnN0YXJ0LnJvdyxkPWIuZW5kLnJvdyxlPXRoaXMuJGZvbGREYXRhLGY9Yi5mb2xkcztpZihmLmxlbmd0aD09MSllLnNwbGljZShlLmluZGV4T2YoYiksMSk7ZWxzZSBpZihiLnJhbmdlLmlzRW5kKGEuZW5kLnJvdyxhLmVuZC5jb2x1bW4pKWYucG9wKCksYi5lbmQucm93PWZbZi5sZW5ndGgtMV0uZW5kLnJvdyxiLmVuZC5jb2x1bW49ZltmLmxlbmd0aC0xXS5lbmQuY29sdW1uO2Vsc2UgaWYoYi5yYW5nZS5pc1N0YXJ0KGEuc3RhcnQucm93LGEuc3RhcnQuY29sdW1uKSlmLnNoaWZ0KCksYi5zdGFydC5yb3c9ZlswXS5zdGFydC5yb3csYi5zdGFydC5jb2x1bW49ZlswXS5zdGFydC5jb2x1bW47ZWxzZSBpZihhLnNhbWVSb3cpZi5zcGxpY2UoZi5pbmRleE9mKGEpLDEpO2Vsc2V7dmFyIGc9Yi5zcGxpdChhLnN0YXJ0LnJvdyxhLnN0YXJ0LmNvbHVtbik7Zj1nLmZvbGRzLGYuc2hpZnQoKSxnLnN0YXJ0LnJvdz1mWzBdLnN0YXJ0LnJvdyxnLnN0YXJ0LmNvbHVtbj1mWzBdLnN0YXJ0LmNvbHVtbn10aGlzLiR1c2VXcmFwTW9kZSYmdGhpcy4kdXBkYXRlV3JhcERhdGEoYyxkKSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTphfSl9LHRoaXMucmVtb3ZlRm9sZHM9ZnVuY3Rpb24oYSl7dmFyIGI9W107Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2IuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLnJlbW92ZUZvbGQoYSl9LHRoaXMpLHRoaXMuJG1vZGlmaWVkPSEwfSx0aGlzLmV4cGFuZEZvbGQ9ZnVuY3Rpb24oYSl7dGhpcy5yZW1vdmVGb2xkKGEpLGEuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLmFkZEZvbGQoYSl9LHRoaXMpLGEuc3ViRm9sZHM9W119LHRoaXMuZXhwYW5kRm9sZHM9ZnVuY3Rpb24oYSl7YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMuZXhwYW5kRm9sZChhKX0sdGhpcyl9LHRoaXMudW5mb2xkPWZ1bmN0aW9uKGEsYil7dmFyIGMsZTthPT1udWxsP2M9bmV3IGQoMCwwLHRoaXMuZ2V0TGVuZ3RoKCksMCk6dHlwZW9mIGE9PSJudW1iZXIiP2M9bmV3IGQoYSwwLGEsdGhpcy5nZXRMaW5lKGEpLmxlbmd0aCk6InJvdyJpbiBhP2M9ZC5mcm9tUG9pbnRzKGEsYSk6Yz1hLGU9dGhpcy5nZXRGb2xkc0luUmFuZ2UoYyk7aWYoYil0aGlzLnJlbW92ZUZvbGRzKGUpO2Vsc2Ugd2hpbGUoZS5sZW5ndGgpdGhpcy5leHBhbmRGb2xkcyhlKSxlPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGMpfSx0aGlzLmlzUm93Rm9sZGVkPWZ1bmN0aW9uKGEsYil7cmV0dXJuISF0aGlzLmdldEZvbGRMaW5lKGEsYil9LHRoaXMuZ2V0Um93Rm9sZEVuZD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0Rm9sZExpbmUoYSxiKTtyZXR1cm4gYz9jLmVuZC5yb3c6YX0sdGhpcy5nZXRGb2xkRGlzcGxheUxpbmU9ZnVuY3Rpb24oYSxiLGMsZCxlKXtkPT1udWxsJiYoZD1hLnN0YXJ0LnJvdyxlPTApLGI9PW51bGwmJihiPWEuZW5kLnJvdyxjPXRoaXMuZ2V0TGluZShiKS5sZW5ndGgpO3ZhciBmPXRoaXMuZG9jLGc9IiI7cmV0dXJuIGEud2FsayhmdW5jdGlvbihhLGIsYyxoKXtpZihiPGQpcmV0dXJuO2lmKGI9PWQpe2lmKGM8ZSlyZXR1cm47aD1NYXRoLm1heChlLGgpfWE/Zys9YTpnKz1mLmdldExpbmUoYikuc3Vic3RyaW5nKGgsYyl9LmJpbmQodGhpcyksYixjKSxnfSx0aGlzLmdldERpc3BsYXlMaW5lPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuZ2V0Rm9sZExpbmUoYSk7aWYoIWUpe3ZhciBmO3JldHVybiBmPXRoaXMuZG9jLmdldExpbmUoYSksZi5zdWJzdHJpbmcoZHx8MCxifHxmLmxlbmd0aCl9cmV0dXJuIHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGUsYSxiLGMsZCl9LHRoaXMuJGNsb25lRm9sZERhdGE9ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gYT10aGlzLiRmb2xkRGF0YS5tYXAoZnVuY3Rpb24oYil7dmFyIGM9Yi5mb2xkcy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xvbmUoKX0pO3JldHVybiBuZXcgZShhLGMpfSksYX0sdGhpcy50b2dnbGVGb2xkPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2VsZWN0aW9uLGM9Yi5nZXRSYW5nZSgpLGQsZTtpZihjLmlzRW1wdHkoKSl7dmFyIGY9Yy5zdGFydDtkPXRoaXMuZ2V0Rm9sZEF0KGYucm93LGYuY29sdW1uKTtpZihkKXt0aGlzLmV4cGFuZEZvbGQoZCk7cmV0dXJufShlPXRoaXMuZmluZE1hdGNoaW5nQnJhY2tldChmKSk/Yy5jb21wYXJlUG9pbnQoZSk9PTE/Yy5lbmQ9ZTooYy5zdGFydD1lLGMuc3RhcnQuY29sdW1uKyssYy5lbmQuY29sdW1uLS0pOihlPXRoaXMuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmYucm93LGNvbHVtbjpmLmNvbHVtbisxfSkpPyhjLmNvbXBhcmVQb2ludChlKT09MT9jLmVuZD1lOmMuc3RhcnQ9ZSxjLnN0YXJ0LmNvbHVtbisrKTpjPXRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZShmLnJvdyxmLmNvbHVtbil8fGN9ZWxzZXt2YXIgZz10aGlzLmdldEZvbGRzSW5SYW5nZShjKTtpZihhJiZnLmxlbmd0aCl7dGhpcy5leHBhbmRGb2xkcyhnKTtyZXR1cm59Zy5sZW5ndGg9PTEmJihkPWdbMF0pfWR8fChkPXRoaXMuZ2V0Rm9sZEF0KGMuc3RhcnQucm93LGMuc3RhcnQuY29sdW1uKSk7aWYoZCYmZC5yYW5nZS50b1N0cmluZygpPT1jLnRvU3RyaW5nKCkpe3RoaXMuZXhwYW5kRm9sZChkKTtyZXR1cm59dmFyIGg9Ii4uLiI7aWYoIWMuaXNNdWx0aUxpbmUoKSl7aD10aGlzLmdldFRleHRSYW5nZShjKTtpZihoLmxlbmd0aDw0KXJldHVybjtoPWgudHJpbSgpLnN1YnN0cmluZygwLDIpKyIuLiJ9dGhpcy5hZGRGb2xkKGgsYyl9LHRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZT1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBnKHRoaXMsYSxiKSxlPWMuZ2V0Q3VycmVudFRva2VuKCk7aWYoZSYmL15jb21tZW50fHN0cmluZy8udGVzdChlLnR5cGUpKXt2YXIgZj1uZXcgZCxoPW5ldyBSZWdFeHAoZS50eXBlLnJlcGxhY2UoL1wuLiovLCJcXC4iKSk7ZG8gZT1jLnN0ZXBCYWNrd2FyZCgpO3doaWxlKGUmJmgudGVzdChlLnR5cGUpKTtjLnN0ZXBGb3J3YXJkKCksZi5zdGFydC5yb3c9Yy5nZXRDdXJyZW50VG9rZW5Sb3coKSxmLnN0YXJ0LmNvbHVtbj1jLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpKzIsYz1uZXcgZyh0aGlzLGEsYik7ZG8gZT1jLnN0ZXBGb3J3YXJkKCk7d2hpbGUoZSYmaC50ZXN0KGUudHlwZSkpO3JldHVybiBlPWMuc3RlcEJhY2t3YXJkKCksZi5lbmQucm93PWMuZ2V0Q3VycmVudFRva2VuUm93KCksZi5lbmQuY29sdW1uPWMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrZS52YWx1ZS5sZW5ndGgsZn19LHRoaXMuZm9sZEFsbD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZm9sZFdpZGdldHM7Yj1ifHx0aGlzLmdldExlbmd0aCgpO2Zvcih2YXIgZD1hfHwwO2Q8YjtkKyspe2NbZF09PW51bGwmJihjW2RdPXRoaXMuZ2V0Rm9sZFdpZGdldChkKSk7aWYoY1tkXSE9InN0YXJ0Iiljb250aW51ZTt2YXIgZT10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShkKTtpZihlJiZlLmVuZC5yb3c8Yil0cnl7dGhpcy5hZGRGb2xkKCIuLi4iLGUpfWNhdGNoKGYpe319fSx0aGlzLiRmb2xkU3R5bGVzPXttYW51YWw6MSxtYXJrYmVnaW46MSxtYXJrYmVnaW5lbmQ6MX0sdGhpcy4kZm9sZFN0eWxlPSJtYXJrYmVnaW4iLHRoaXMuc2V0Rm9sZFN0eWxlPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLiRmb2xkU3R5bGVzW2FdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb2xkIHN0eWxlOiAiK2ErIlsiK09iamVjdC5rZXlzKHRoaXMuJGZvbGRTdHlsZXMpLmpvaW4oIiwgIikrIl0iKTtpZih0aGlzLiRmb2xkU3R5bGU9PWEpcmV0dXJuO3RoaXMuJGZvbGRTdHlsZT1hLGE9PSJtYW51YWwiJiZ0aGlzLnVuZm9sZCgpO3ZhciBiPXRoaXMuJGZvbGRNb2RlO3RoaXMuJHNldEZvbGRpbmcobnVsbCksdGhpcy4kc2V0Rm9sZGluZyhiKX0sdGhpcy4kc2V0Rm9sZGluZz1mdW5jdGlvbihhKXtpZih0aGlzLiRmb2xkTW9kZT09YSlyZXR1cm47dGhpcy4kZm9sZE1vZGU9YSx0aGlzLnJlbW92ZUxpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLl9lbWl0KCJjaGFuZ2VBbm5vdGF0aW9uIik7aWYoIWF8fHRoaXMuJGZvbGRTdHlsZT09Im1hbnVhbCIpe3RoaXMuZm9sZFdpZGdldHM9bnVsbDtyZXR1cm59dGhpcy5mb2xkV2lkZ2V0cz1bXSx0aGlzLmdldEZvbGRXaWRnZXQ9YS5nZXRGb2xkV2lkZ2V0LmJpbmQoYSx0aGlzLHRoaXMuJGZvbGRTdHlsZSksdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9YS5nZXRGb2xkV2lkZ2V0UmFuZ2UuYmluZChhLHRoaXMsdGhpcy4kZm9sZFN0eWxlKSx0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cz10aGlzLnVwZGF0ZUZvbGRXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5vbigiY2hhbmdlIix0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyl9LHRoaXMub25Gb2xkV2lkZ2V0Q2xpY2s9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldEZvbGRXaWRnZXQoYSksZD10aGlzLmdldExpbmUoYSksZT1iLnNoaWZ0S2V5LGY9ZXx8Yi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5LGc7Yz09ImVuZCI/Zz10aGlzLmdldEZvbGRBdChhLDAsLTEpOmc9dGhpcy5nZXRGb2xkQXQoYSxkLmxlbmd0aCwxKTtpZihnKXtmP3RoaXMucmVtb3ZlRm9sZChnKTp0aGlzLmV4cGFuZEZvbGQoZyk7cmV0dXJufXZhciBoPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGEpO2lmKGgpe2lmKCFoLmlzTXVsdGlMaW5lKCkpe2c9dGhpcy5nZXRGb2xkQXQoaC5zdGFydC5yb3csaC5zdGFydC5jb2x1bW4sMSk7aWYoZyYmaC5pc0VlcXVhbChnLnJhbmdlKSl7dGhpcy5yZW1vdmVGb2xkKGcpO3JldHVybn19ZXx8dGhpcy5hZGRGb2xkKCIuLi4iLGgpLGYmJnRoaXMuZm9sZEFsbChoLnN0YXJ0LnJvdysxLGguZW5kLnJvdyl9ZWxzZSBmJiZ0aGlzLmZvbGRBbGwoYSsxLHRoaXMuZ2V0TGVuZ3RoKCkpLGIudGFyZ2V0LmNsYXNzTmFtZSs9IiBpbnZhbGlkIn0sdGhpcy51cGRhdGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGEsYz1iLnJhbmdlLGQ9Yy5zdGFydC5yb3csZT1jLmVuZC5yb3ctZDtpZihlPT09MCl0aGlzLmZvbGRXaWRnZXRzW2RdPW51bGw7ZWxzZSBpZihiLmFjdGlvbj09InJlbW92ZVRleHQifHxiLmFjdGlvbj09InJlbW92ZUxpbmVzIil0aGlzLmZvbGRXaWRnZXRzLnNwbGljZShkLGUrMSxudWxsKTtlbHNle3ZhciBmPUFycmF5KGUrMSk7Zi51bnNoaWZ0KGQsMSksdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UuYXBwbHkodGhpcy5mb2xkV2lkZ2V0cyxmKX19fSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9YSgiLi9mb2xkX2xpbmUiKS5Gb2xkTGluZSxmPWEoIi4vZm9sZCIpLkZvbGQsZz1hKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7Yi5Gb2xkaW5nPWh9KSxkZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoYSxiKXt0aGlzLmZvbGREYXRhPWEsQXJyYXkuaXNBcnJheShiKT90aGlzLmZvbGRzPWI6Yj10aGlzLmZvbGRzPVtiXTt2YXIgYz1iW2IubGVuZ3RoLTFdO3RoaXMucmFuZ2U9bmV3IGQoYlswXS5zdGFydC5yb3csYlswXS5zdGFydC5jb2x1bW4sYy5lbmQucm93LGMuZW5kLmNvbHVtbiksdGhpcy5zdGFydD10aGlzLnJhbmdlLnN0YXJ0LHRoaXMuZW5kPXRoaXMucmFuZ2UuZW5kLHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldEZvbGRMaW5lKHRoaXMpfSx0aGlzKX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZTsoKGZ1bmN0aW9uKCl7dGhpcy5zaGlmdFJvdz1mdW5jdGlvbihhKXt0aGlzLnN0YXJ0LnJvdys9YSx0aGlzLmVuZC5yb3crPWEsdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2Iuc3RhcnQucm93Kz1hLGIuZW5kLnJvdys9YX0pfSx0aGlzLmFkZEZvbGQ9ZnVuY3Rpb24oYSl7aWYoYS5zYW1lUm93KXtpZihhLnN0YXJ0LnJvdzx0aGlzLnN0YXJ0Um93fHxhLmVuZFJvdz50aGlzLmVuZFJvdyl0aHJvdyJDYW4ndCBhZGQgYSBmb2xkIHRvIHRoaXMgRm9sZExpbmUgYXMgaXQgaGFzIG5vIGNvbm5lY3Rpb24iO3RoaXMuZm9sZHMucHVzaChhKSx0aGlzLmZvbGRzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4tYS5yYW5nZS5jb21wYXJlRW5kKGIuc3RhcnQucm93LGIuc3RhcnQuY29sdW1uKX0pLHRoaXMucmFuZ2UuY29tcGFyZUVuZChhLnN0YXJ0LnJvdyxhLnN0YXJ0LmNvbHVtbik+MD8odGhpcy5lbmQucm93PWEuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49YS5lbmQuY29sdW1uKTp0aGlzLnJhbmdlLmNvbXBhcmVTdGFydChhLmVuZC5yb3csYS5lbmQuY29sdW1uKTwwJiYodGhpcy5zdGFydC5yb3c9YS5zdGFydC5yb3csdGhpcy5zdGFydC5jb2x1bW49YS5zdGFydC5jb2x1bW4pfWVsc2UgaWYoYS5zdGFydC5yb3c9PXRoaXMuZW5kLnJvdyl0aGlzLmZvbGRzLnB1c2goYSksdGhpcy5lbmQucm93PWEuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49YS5lbmQuY29sdW1uO2Vsc2V7aWYoYS5lbmQucm93IT10aGlzLnN0YXJ0LnJvdyl0aHJvdyJUcnlpbmcgdG8gYWRkIGZvbGQgdG8gRm9sZFJvdyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG1hdGNoaW5nIHJvdyI7dGhpcy5mb2xkcy51bnNoaWZ0KGEpLHRoaXMuc3RhcnQucm93PWEuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWEuc3RhcnQuY29sdW1ufWEuZm9sZExpbmU9dGhpc30sdGhpcy5jb250YWluc1Jvdz1mdW5jdGlvbihhKXtyZXR1cm4gYT49dGhpcy5zdGFydC5yb3cmJmE8PXRoaXMuZW5kLnJvd30sdGhpcy53YWxrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wLGU9dGhpcy5mb2xkcyxmLGcsaCxpPSEwO2I9PW51bGwmJihiPXRoaXMuZW5kLnJvdyxjPXRoaXMuZW5kLmNvbHVtbik7Zm9yKHZhciBqPTA7ajxlLmxlbmd0aDtqKyspe2Y9ZVtqXSxnPWYucmFuZ2UuY29tcGFyZVN0YXJ0KGIsYyk7aWYoZz09LTEpe2EobnVsbCxiLGMsZCxpKTtyZXR1cm59aD1hKG51bGwsZi5zdGFydC5yb3csZi5zdGFydC5jb2x1bW4sZCxpKSxoPSFoJiZhKGYucGxhY2Vob2xkZXIsZi5zdGFydC5yb3csZi5zdGFydC5jb2x1bW4sZCk7aWYoaHx8Zz09MClyZXR1cm47aT0hZi5zYW1lUm93LGQ9Zi5lbmQuY29sdW1ufWEobnVsbCxiLGMsZCxpKX0sdGhpcy5nZXROZXh0Rm9sZFRvPWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtmb3IodmFyIGU9MDtlPHRoaXMuZm9sZHMubGVuZ3RoO2UrKyl7Yz10aGlzLmZvbGRzW2VdLGQ9Yy5yYW5nZS5jb21wYXJlRW5kKGEsYik7aWYoZD09LTEpcmV0dXJue2ZvbGQ6YyxraW5kOiJhZnRlciJ9O2lmKGQ9PTApcmV0dXJue2ZvbGQ6YyxraW5kOiJpbnNpZGUifX1yZXR1cm4gbnVsbH0sdGhpcy5hZGRSZW1vdmVDaGFycz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5nZXROZXh0Rm9sZFRvKGEsYiksZSxmO2lmKGQpe2U9ZC5mb2xkO2lmKGQua2luZD09Imluc2lkZSImJmUuc3RhcnQuY29sdW1uIT1iJiZlLnN0YXJ0LnJvdyE9YSl0aHJvdyJNb3ZpbmcgY2hhcmFjdGVycyBpbnNpZGUgb2YgYSBmb2xkIHNob3VsZCBuZXZlciBiZSByZWFjaGVkIjtpZihlLnN0YXJ0LnJvdz09YSl7Zj10aGlzLmZvbGRzO3ZhciBnPWYuaW5kZXhPZihlKTtnPT0wJiYodGhpcy5zdGFydC5jb2x1bW4rPWMpO2ZvcihnO2c8Zi5sZW5ndGg7ZysrKXtlPWZbZ10sZS5zdGFydC5jb2x1bW4rPWM7aWYoIWUuc2FtZVJvdylyZXR1cm47ZS5lbmQuY29sdW1uKz1jfXRoaXMuZW5kLmNvbHVtbis9Y319fSx0aGlzLnNwbGl0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXROZXh0Rm9sZFRvKGEsYikuZm9sZCxkPXRoaXMuZm9sZHMsZj10aGlzLmZvbGREYXRhO2lmKCFjKXJldHVybiBudWxsO3ZhciBnPWQuaW5kZXhPZihjKSxoPWRbZy0xXTt0aGlzLmVuZC5yb3c9aC5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1oLmVuZC5jb2x1bW4sZD1kLnNwbGljZShnLGQubGVuZ3RoLWcpO3ZhciBpPW5ldyBlKGYsZCk7cmV0dXJuIGYuc3BsaWNlKGYuaW5kZXhPZih0aGlzKSsxLDAsaSksaX0sdGhpcy5tZXJnZT1mdW5jdGlvbihhKXt2YXIgYj1hLmZvbGRzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuYWRkRm9sZChiW2NdKTt2YXIgZD10aGlzLmZvbGREYXRhO2Quc3BsaWNlKGQuaW5kZXhPZihhKSwxKX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPVt0aGlzLnJhbmdlLnRvU3RyaW5nKCkrIjogWyJdO3JldHVybiB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oYil7YS5wdXNoKCIgICIrYi50b1N0cmluZygpKX0pLGEucHVzaCgiXSIpLGEuam9pbigiXG4iKX0sdGhpcy5pZHhUb1Bvc2l0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPTAsYztmb3IodmFyIGQ9MDtkPHRoaXMuZm9sZHMubGVuZ3RoO2QrKyl7dmFyIGM9dGhpcy5mb2xkc1tkXTthLT1jLnN0YXJ0LmNvbHVtbi1iO2lmKGE8MClyZXR1cm57cm93OmMuc3RhcnQucm93LGNvbHVtbjpjLnN0YXJ0LmNvbHVtbithfTthLT1jLnBsYWNlaG9sZGVyLmxlbmd0aDtpZihhPDApcmV0dXJuIGMuc3RhcnQ7Yj1jLmVuZC5jb2x1bW59cmV0dXJue3Jvdzp0aGlzLmVuZC5yb3csY29sdW1uOnRoaXMuZW5kLmNvbHVtbithfX19KSkuY2FsbChlLnByb3RvdHlwZSksYi5Gb2xkTGluZT1lfSksZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWIuRm9sZD1mdW5jdGlvbihhLGIpe3RoaXMuZm9sZExpbmU9bnVsbCx0aGlzLnBsYWNlaG9sZGVyPWIsdGhpcy5yYW5nZT1hLHRoaXMuc3RhcnQ9YS5zdGFydCx0aGlzLmVuZD1hLmVuZCx0aGlzLnNhbWVSb3c9YS5zdGFydC5yb3c9PWEuZW5kLnJvdyx0aGlzLnN1YkZvbGRzPVtdfTsoKGZ1bmN0aW9uKCl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiciJyt0aGlzLnBsYWNlaG9sZGVyKyciICcrdGhpcy5yYW5nZS50b1N0cmluZygpfSx0aGlzLnNldEZvbGRMaW5lPWZ1bmN0aW9uKGEpe3RoaXMuZm9sZExpbmU9YSx0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oYil7Yi5zZXRGb2xkTGluZShhKX0pfSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yYW5nZS5jbG9uZSgpLGI9bmV3IGQoYSx0aGlzLnBsYWNlaG9sZGVyKTtyZXR1cm4gdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Iuc3ViRm9sZHMucHVzaChhLmNsb25lKCkpfSksYn0sdGhpcy5hZGRTdWJGb2xkPWZ1bmN0aW9uKGEpe2lmKHRoaXMucmFuZ2UuaXNFZXF1YWwoYSkpcmV0dXJuIHRoaXM7aWYoIXRoaXMucmFuZ2UuY29udGFpbnNSYW5nZShhKSl0aHJvdyJBIGZvbGQgY2FuJ3QgaW50ZXJzZWN0IGFscmVhZHkgZXhpc3RpbmcgZm9sZCIrYS5yYW5nZSt0aGlzLnJhbmdlO3ZhciBiPWEucmFuZ2Uuc3RhcnQucm93LGM9YS5yYW5nZS5zdGFydC5jb2x1bW47Zm9yKHZhciBkPTAsZT0tMTtkPHRoaXMuc3ViRm9sZHMubGVuZ3RoO2QrKyl7ZT10aGlzLnN1YkZvbGRzW2RdLnJhbmdlLmNvbXBhcmUoYixjKTtpZihlIT0xKWJyZWFrfXZhciBmPXRoaXMuc3ViRm9sZHNbZF07aWYoZT09MClyZXR1cm4gZi5hZGRTdWJGb2xkKGEpO3ZhciBiPWEucmFuZ2UuZW5kLnJvdyxjPWEucmFuZ2UuZW5kLmNvbHVtbjtmb3IodmFyIGc9ZCxlPS0xO2c8dGhpcy5zdWJGb2xkcy5sZW5ndGg7ZysrKXtlPXRoaXMuc3ViRm9sZHNbZ10ucmFuZ2UuY29tcGFyZShiLGMpO2lmKGUhPTEpYnJlYWt9dmFyIGg9dGhpcy5zdWJGb2xkc1tnXTtpZihlPT0wKXRocm93IkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIithLnJhbmdlK3RoaXMucmFuZ2U7dmFyIGk9dGhpcy5zdWJGb2xkcy5zcGxpY2UoZCxnLWQsYSk7cmV0dXJuIGEuc2V0Rm9sZExpbmUodGhpcy5mb2xkTGluZSksYX19KSkuY2FsbChkLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS90b2tlbl9pdGVyYXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJHNlc3Npb249YSx0aGlzLiRyb3c9Yix0aGlzLiRyb3dUb2tlbnM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnM7dmFyIGQ9YS5nZXRUb2tlbkF0KGIsYyk7dGhpcy4kdG9rZW5JbmRleD1kP2QuaW5kZXg6LTF9OygoZnVuY3Rpb24oKXt0aGlzLnN0ZXBCYWNrd2FyZD1mdW5jdGlvbigpe3RoaXMuJHRva2VuSW5kZXgtPTE7d2hpbGUodGhpcy4kdG9rZW5JbmRleDwwKXt0aGlzLiRyb3ctPTE7aWYodGhpcy4kcm93PDApcmV0dXJuIHRoaXMuJHJvdz0wLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyx0aGlzLiRyb3cpWzBdLnRva2Vucyx0aGlzLiR0b2tlbkluZGV4PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgtMX1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLnN0ZXBGb3J3YXJkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kc2Vzc2lvbi5nZXRMZW5ndGgoKTt0aGlzLiR0b2tlbkluZGV4Kz0xO3doaWxlKHRoaXMuJHRva2VuSW5kZXg+PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgpe3RoaXMuJHJvdys9MTtpZih0aGlzLiRyb3c+PWEpcmV0dXJuIHRoaXMuJHJvdz1hLTEsbnVsbDt0aGlzLiRyb3dUb2tlbnM9dGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93LHRoaXMuJHJvdylbMF0udG9rZW5zLHRoaXMuJHRva2VuSW5kZXg9MH1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuZ2V0Q3VycmVudFRva2VuUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvd30sdGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW49ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRyb3dUb2tlbnMsYj10aGlzLiR0b2tlbkluZGV4LGM9YVtiXS5zdGFydDtpZihjIT09dW5kZWZpbmVkKXJldHVybiBjO2M9MDt3aGlsZShiPjApYi09MSxjKz1hW2JdLnZhbHVlLmxlbmd0aDtyZXR1cm4gY319KSkuY2FsbChkLnByb3RvdHlwZSksYi5Ub2tlbkl0ZXJhdG9yPWR9KSxkZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0PWZ1bmN0aW9uKGEpe2lmKGEuY29sdW1uPT0wKXJldHVybiBudWxsO3ZhciBiPXRoaXMuZ2V0TGluZShhLnJvdykuY2hhckF0KGEuY29sdW1uLTEpO2lmKGI9PSIiKXJldHVybiBudWxsO3ZhciBjPWIubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pO3JldHVybiBjP2NbMV0/dGhpcy4kZmluZENsb3NpbmdCcmFja2V0KGNbMV0sYSk6dGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KGNbMl0sYSk6bnVsbH0sdGhpcy4kYnJhY2tldHM9eyIpIjoiKCIsIigiOiIpIiwiXSI6IlsiLCJbIjoiXSIsInsiOiJ9IiwifSI6InsifSx0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRicmFja2V0c1thXSxlPTEsZj1uZXcgZCh0aGlzLGIucm93LGIuY29sdW1uKSxnPWYuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWcpcmV0dXJuIG51bGw7dmFyIGg9bmV3IFJlZ0V4cCgiKFxcLj8iK2cudHlwZS5yZXBsYWNlKCIuIiwifCIpLnJlcGxhY2UoInJwYXJlbiIsImxwYXJlbnxycGFyZW4iKSsiKSsiKSxpPWIuY29sdW1uLWYuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMixqPWcudmFsdWU7Zm9yKDs7KXt3aGlsZShpPj0wKXt2YXIgaz1qLmNoYXJBdChpKTtpZihrPT1jKXtlLT0xO2lmKGU9PTApcmV0dXJue3JvdzpmLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjppK2YuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2Ugaz09YSYmKGUrPTEpO2ktPTF9ZG8gZz1mLnN0ZXBCYWNrd2FyZCgpO3doaWxlKGcmJiFoLnRlc3QoZy50eXBlKSk7aWYoZz09bnVsbClicmVhaztqPWcudmFsdWUsaT1qLmxlbmd0aC0xfXJldHVybiBudWxsfSx0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRicmFja2V0c1thXSxlPTEsZj1uZXcgZCh0aGlzLGIucm93LGIuY29sdW1uKSxnPWYuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWcpcmV0dXJuIG51bGw7dmFyIGg9bmV3IFJlZ0V4cCgiKFxcLj8iK2cudHlwZS5yZXBsYWNlKCIuIiwifCIpLnJlcGxhY2UoImxwYXJlbiIsImxwYXJlbnxycGFyZW4iKSsiKSsiKSxpPWIuY29sdW1uLWYuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7Zm9yKDs7KXt2YXIgaj1nLnZhbHVlLGs9ai5sZW5ndGg7d2hpbGUoaTxrKXt2YXIgbD1qLmNoYXJBdChpKTtpZihsPT1jKXtlLT0xO2lmKGU9PTApcmV0dXJue3JvdzpmLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjppK2YuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2UgbD09YSYmKGUrPTEpO2krPTF9ZG8gZz1mLnN0ZXBGb3J3YXJkKCk7d2hpbGUoZyYmIWgudGVzdChnLnR5cGUpKTtpZihnPT1udWxsKWJyZWFrO2k9MH1yZXR1cm4gbnVsbH19InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjtiLkJyYWNrZXRNYXRjaD1lfSksZGVmaW5lKCJhY2Uvc2VhcmNoIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL2xhbmciKSxlPWEoIi4vbGliL29vcCIpLGY9YSgiLi9yYW5nZSIpLlJhbmdlLGc9ZnVuY3Rpb24oKXt0aGlzLiRvcHRpb25zPXtuZWVkbGU6IiIsYmFja3dhcmRzOiExLHdyYXA6ITEsY2FzZVNlbnNpdGl2ZTohMSx3aG9sZVdvcmQ6ITEsc2NvcGU6Zy5BTEwscmVnRXhwOiExfX07Zy5BTEw9MSxnLlNFTEVDVElPTj0yLGZ1bmN0aW9uKCl7dGhpcy5zZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGUubWl4aW4odGhpcy4kb3B0aW9ucyxhKSx0aGlzfSx0aGlzLmdldE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZC5jb3B5T2JqZWN0KHRoaXMuJG9wdGlvbnMpfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuJG9wdGlvbnMubmVlZGxlKXJldHVybiBudWxsO2lmKHRoaXMuJG9wdGlvbnMuYmFja3dhcmRzKXZhciBiPXRoaXMuJGJhY2t3YXJkTWF0Y2hJdGVyYXRvcihhKTtlbHNlIGI9dGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3IoYSk7dmFyIGM9bnVsbDtyZXR1cm4gYi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBjPWEsITB9KSxjfSx0aGlzLmZpbmRBbGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kb3B0aW9ucztpZighYi5uZWVkbGUpcmV0dXJuW107aWYoYi5iYWNrd2FyZHMpdmFyIGM9dGhpcy4kYmFja3dhcmRNYXRjaEl0ZXJhdG9yKGEpO2Vsc2UgYz10aGlzLiRmb3J3YXJkTWF0Y2hJdGVyYXRvcihhKTt2YXIgZD0hYi5zdGFydCYmYi53cmFwJiZiLnNjb3BlPT1nLkFMTDtkJiYoYi5zdGFydD17cm93OjAsY29sdW1uOjB9KTt2YXIgZT1bXTtyZXR1cm4gYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2UucHVzaChhKX0pLGQmJihiLnN0YXJ0PW51bGwpLGV9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuJGFzc2VtYmxlUmVnRXhwKCksZD1jLmV4ZWMoYSk7cmV0dXJuIGQmJmRbMF0ubGVuZ3RoPT1hLmxlbmd0aD90aGlzLiRvcHRpb25zLnJlZ0V4cD9hLnJlcGxhY2UoYyxiKTpiOm51bGx9LHRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGFzc2VtYmxlUmVnRXhwKCksYz10aGlzO3JldHVybntmb3JFYWNoOmZ1bmN0aW9uKGQpe2MuJGZvcndhcmRMaW5lSXRlcmF0b3IoYSkuZm9yRWFjaChmdW5jdGlvbihhLGUsZil7ZSYmKGE9YS5zdWJzdHJpbmcoZSkpO3ZhciBnPVtdO2EucmVwbGFjZShiLGZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTJdO3JldHVybiBnLnB1c2goe3N0cjphLG9mZnNldDplK2J9KSxhfSk7Zm9yKHZhciBoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBpPWdbaF0saj1jLiRyYW5nZUZyb21NYXRjaChmLGkub2Zmc2V0LGkuc3RyLmxlbmd0aCk7aWYoZChqKSlyZXR1cm4hMH19KX19fSx0aGlzLiRiYWNrd2FyZE1hdGNoSXRlcmF0b3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kYXNzZW1ibGVSZWdFeHAoKSxjPXRoaXM7cmV0dXJue2ZvckVhY2g6ZnVuY3Rpb24oZCl7Yy4kYmFja3dhcmRMaW5lSXRlcmF0b3IoYSkuZm9yRWFjaChmdW5jdGlvbihhLGUsZil7ZSYmKGE9YS5zdWJzdHJpbmcoZSkpO3ZhciBnPVtdO2EucmVwbGFjZShiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGcucHVzaCh7c3RyOmEsb2Zmc2V0OmUrYn0pLGF9KTtmb3IodmFyIGg9Zy5sZW5ndGgtMTtoPj0wO2gtLSl7dmFyIGk9Z1toXSxqPWMuJHJhbmdlRnJvbU1hdGNoKGYsaS5vZmZzZXQsaS5zdHIubGVuZ3RoKTtpZihkKGopKXJldHVybiEwfX0pfX19LHRoaXMuJHJhbmdlRnJvbU1hdGNoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IGYoYSxiLGEsYitjKX0sdGhpcy4kYXNzZW1ibGVSZWdFeHA9ZnVuY3Rpb24oKXtpZih0aGlzLiRvcHRpb25zLnJlZ0V4cCl2YXIgYT10aGlzLiRvcHRpb25zLm5lZWRsZTtlbHNlIGE9ZC5lc2NhcGVSZWdFeHAodGhpcy4kb3B0aW9ucy5uZWVkbGUpO3RoaXMuJG9wdGlvbnMud2hvbGVXb3JkJiYoYT0iXFxiIithKyJcXGIiKTt2YXIgYj0iZyI7dGhpcy4kb3B0aW9ucy5jYXNlU2Vuc2l0aXZlfHwoYis9ImkiKTt2YXIgYz1uZXcgUmVnRXhwKGEsYik7cmV0dXJuIGN9LHRoaXMuJGZvcndhcmRMaW5lSXRlcmF0b3I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhlKXt2YXIgZj1hLmdldExpbmUoZSk7cmV0dXJuIGImJmU9PWMuZW5kLnJvdyYmKGY9Zi5zdWJzdHJpbmcoMCxjLmVuZC5jb2x1bW4pKSxqJiZlPT1kLnJvdyYmKGY9Zi5zdWJzdHJpbmcoMCxkLmNvbHVtbikpLGZ9dmFyIGI9dGhpcy4kb3B0aW9ucy5zY29wZT09Zy5TRUxFQ1RJT04sYz10aGlzLiRvcHRpb25zLnJhbmdlfHxhLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCksZD10aGlzLiRvcHRpb25zLnN0YXJ0fHxjW2I/InN0YXJ0IjoiZW5kIl0sZT1iP2Muc3RhcnQucm93OjAsZj1iP2Muc3RhcnQuY29sdW1uOjAsaD1iP2MuZW5kLnJvdzphLmdldExlbmd0aCgpLTEsaT10aGlzLiRvcHRpb25zLndyYXAsaj0hMTtyZXR1cm57Zm9yRWFjaDpmdW5jdGlvbihhKXt2YXIgYj1kLnJvdyxjPWsoYiksZz1kLmNvbHVtbixsPSExO2o9ITE7d2hpbGUoIWEoYyxnLGIpKXtpZihsKXJldHVybjtiKyssZz0wO2lmKGI+aCl7aWYoIWkpcmV0dXJuO2I9ZSxnPWYsaj0hMH1iPT1kLnJvdyYmKGw9ITApLGM9ayhiKX19fX0sdGhpcy4kYmFja3dhcmRMaW5lSXRlcmF0b3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kb3B0aW9ucy5zY29wZT09Zy5TRUxFQ1RJT04sYz10aGlzLiRvcHRpb25zLnJhbmdlfHxhLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCksZD10aGlzLiRvcHRpb25zLnN0YXJ0fHxjW2I/ImVuZCI6InN0YXJ0Il0sZT1iP2Muc3RhcnQucm93OjAsZj1iP2Muc3RhcnQuY29sdW1uOjAsaD1iP2MuZW5kLnJvdzphLmdldExlbmd0aCgpLTEsaT10aGlzLiRvcHRpb25zLndyYXA7cmV0dXJue2ZvckVhY2g6ZnVuY3Rpb24oZyl7dmFyIGo9ZC5yb3csaz1hLmdldExpbmUoaikuc3Vic3RyaW5nKDAsZC5jb2x1bW4pLGw9MCxtPSExLG49ITE7d2hpbGUoIWcoayxsLGopKXtpZihtKXJldHVybjtqLS0sbD0wO2lmKGo8ZSl7aWYoIWkpcmV0dXJuO2o9aCxuPSEwfWo9PWQucm93JiYobT0hMCksaz1hLmdldExpbmUoaiksYiYmKGo9PWU/bD1mOmo9PWgmJihrPWsuc3Vic3RyaW5nKDAsYy5lbmQuY29sdW1uKSkpLG4mJmo9PWQucm93JiYobD1kLmNvbHVtbil9fX19fS5jYWxsKGcucHJvdG90eXBlKSxiLlNlYXJjaD1nfSksZGVmaW5lKCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIva2V5cyIpLGU9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ3BsYXRmb3JtJyBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciAnbWFjJyBvciAnd2luJyIpO3RoaXMucGxhdGZvcm09YSx0aGlzLmNvbW1hbmRzPXt9LHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nPXt9LGImJmIuZm9yRWFjaCh0aGlzLmFkZENvbW1hbmQsdGhpcyl9OygoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYyxlKXt2YXIgZixnPTAsaD1iKGEpO2Zvcih2YXIgaT0wLGo9aC5sZW5ndGg7aTxqO2krKylkLktFWV9NT0RTW2hbaV1dP2d8PWQuS0VZX01PRFNbaFtpXV06Zj1oW2ldfHwiLSI7cmV0dXJue2tleTpmLGhhc2hJZDpnfX1mdW5jdGlvbiBiKGEsYil7cmV0dXJuIGEudG9Mb3dlckNhc2UoKS50cmltKCkuc3BsaXQobmV3IFJlZ0V4cCgiW1xccyBdKlxcLVtcXHMgXSoiLCJnIiksOTk5KX10aGlzLmFkZENvbW1hbmQ9ZnVuY3Rpb24oYSl7dGhpcy5jb21tYW5kc1thLm5hbWVdJiZ0aGlzLnJlbW92ZUNvbW1hbmQoYSksdGhpcy5jb21tYW5kc1thLm5hbWVdPWEsYS5iaW5kS2V5JiZ0aGlzLl9idWlsZEtleUhhc2goYSl9LHRoaXMucmVtb3ZlQ29tbWFuZD1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYT09InN0cmluZyI/YTphLm5hbWU7YT10aGlzLmNvbW1hbmRzW2JdLGRlbGV0ZSB0aGlzLmNvbW1hbmRzW2JdO3ZhciBjPXRoaXMuY29tbW1hbmRLZXlCaW5kaW5nO2Zvcih2YXIgZCBpbiBjKWZvcih2YXIgZSBpbiBjW2RdKWNbZF1bZV09PWEmJmRlbGV0ZSBjW2RdW2VdfSx0aGlzLmFkZENvbW1hbmRzPWZ1bmN0aW9uKGEpe09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGM9YVtiXTtpZih0eXBlb2YgYz09InN0cmluZyIpcmV0dXJuIHRoaXMuYmluZEtleShjLGIpO3R5cGVvZiBjPT0iZnVuY3Rpb24iJiYoYz17ZXhlYzpjfSksYy5uYW1lfHwoYy5uYW1lPWIpLHRoaXMuYWRkQ29tbWFuZChjKX0sdGhpcyl9LHRoaXMucmVtb3ZlQ29tbWFuZHM9ZnVuY3Rpb24oYSl7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLnJlbW92ZUNvbW1hbmQoYVtiXSl9LHRoaXMpfSx0aGlzLmJpbmRLZXk9ZnVuY3Rpb24oYixjKXtpZighYilyZXR1cm47dmFyIGQ9dGhpcy5jb21tbWFuZEtleUJpbmRpbmc7Yi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGU9YShiLGMpLGY9ZS5oYXNoSWQ7KGRbZl18fChkW2ZdPXt9KSlbZS5rZXldPWN9KX0sdGhpcy5iaW5kS2V5cz1mdW5jdGlvbihhKXtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuYmluZEtleShiLGFbYl0pfSx0aGlzKX0sdGhpcy5fYnVpbGRLZXlIYXNoPWZ1bmN0aW9uKGEpe3ZhciBiPWEuYmluZEtleTtpZighYilyZXR1cm47dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciP2I6Ylt0aGlzLnBsYXRmb3JtXTt0aGlzLmJpbmRLZXkoYyxhKX0sdGhpcy5maW5kS2V5Q29tbWFuZD1mdW5jdGlvbihiLGMpe3R5cGVvZiBjPT0ibnVtYmVyIiYmKGM9ZC5rZXlDb2RlVG9TdHJpbmcoYykpO3ZhciBlPXRoaXMuY29tbW1hbmRLZXlCaW5kaW5nO3JldHVybiBlW2JdJiZlW2JdW2MudG9Mb3dlckNhc2UoKV19LHRoaXMuZXhlYz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9dGhpcy5jb21tYW5kc1thXSksYT9iJiZiLiRyZWFkT25seSYmIWEucmVhZE9ubHk/ITE6KGEuZXhlYyhiLGN8fHt9KSwhMCk6ITF9LHRoaXMudG9nZ2xlUmVjb3JkaW5nPWZ1bmN0aW9uKCl7aWYodGhpcy4kaW5SZXBsYXkpcmV0dXJuO3JldHVybiB0aGlzLnJlY29yZGluZz8odGhpcy5tYWNyby5wb3AoKSx0aGlzLmV4ZWM9dGhpcy5ub3JtYWxfZXhlYyx0aGlzLm1hY3JvLmxlbmd0aHx8KHRoaXMubWFjcm89dGhpcy5vbGRNYWNybyksdGhpcy5yZWNvcmRpbmc9ITEpOih0aGlzLm9sZE1hY3JvPXRoaXMubWFjcm8sdGhpcy5tYWNybz1bXSx0aGlzLm5vcm1hbF9leGVjPXRoaXMuZXhlYyx0aGlzLmV4ZWM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm1hY3JvLnB1c2goW2EsY10pLHRoaXMubm9ybWFsX2V4ZWMoYSxiLGMpfSx0aGlzLnJlY29yZGluZz0hMCl9LHRoaXMucmVwbGF5PWZ1bmN0aW9uKGEpe2lmKHRoaXMuJGluUmVwbGF5fHwhdGhpcy5tYWNybylyZXR1cm47aWYodGhpcy5yZWNvcmRpbmcpcmV0dXJuIHRoaXMudG9nZ2xlUmVjb3JkaW5nKCk7dHJ5e3RoaXMuJGluUmVwbGF5PSEwLHRoaXMubWFjcm8uZm9yRWFjaChmdW5jdGlvbihiKXt0eXBlb2YgYj09InN0cmluZyI/dGhpcy5leGVjKGIsYSk6dGhpcy5leGVjKGJbMF0sYSxiWzFdKX0sdGhpcyl9ZmluYWxseXt0aGlzLiRpblJlcGxheT0hMX19LHRoaXMudHJpbU1hY3JvPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGFbMF0hPSJzdHJpbmciJiYoYVswXT1hWzBdLm5hbWUpLGFbMV18fChhPWFbMF0pLGF9KX19KSkuY2FsbChlLnByb3RvdHlwZSksYi5Db21tYW5kTWFuYWdlcj1lfSksZGVmaW5lKCJhY2UvdW5kb21hbmFnZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfTsoKGZ1bmN0aW9uKCl7dGhpcy5leGVjdXRlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuYXJnc1swXTt0aGlzLiRkb2M9YS5hcmdzWzFdLHRoaXMuJHVuZG9TdGFjay5wdXNoKGIpLHRoaXMuJHJlZG9TdGFjaz1bXX0sdGhpcy51bmRvPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJHVuZG9TdGFjay5wb3AoKSxjPW51bGw7cmV0dXJuIGImJihjPXRoaXMuJGRvYy51bmRvQ2hhbmdlcyhiLGEpLHRoaXMuJHJlZG9TdGFjay5wdXNoKGIpKSxjfSx0aGlzLnJlZG89ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcmVkb1N0YWNrLnBvcCgpLGM9bnVsbDtyZXR1cm4gYiYmKGM9dGhpcy4kZG9jLnJlZG9DaGFuZ2VzKGIsYSksdGhpcy4kdW5kb1N0YWNrLnB1c2goYikpLGN9LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLiR1bmRvU3RhY2s9W10sdGhpcy4kcmVkb1N0YWNrPVtdfSx0aGlzLmhhc1VuZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdW5kb1N0YWNrLmxlbmd0aD4wfSx0aGlzLmhhc1JlZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmVkb1N0YWNrLmxlbmd0aD4wfX0pKS5jYWxsKGQucHJvdG90eXBlKSxiLlVuZG9NYW5hZ2VyPWR9KSxkZWZpbmUoImFjZS92aXJ0dWFsX3JlbmRlcmVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9sYXllci9ndXR0ZXIiLCJhY2UvbGF5ZXIvbWFya2VyIiwiYWNlL2xheWVyL3RleHQiLCJhY2UvbGF5ZXIvY3Vyc29yIiwiYWNlL3Njcm9sbGJhciIsImFjZS9yZW5kZXJsb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwidGV4dCFhY2UvY3NzL2VkaXRvci5jc3MiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvZG9tIiksZj1hKCIuL2xpYi9ldmVudCIpLGc9YSgiLi9saWIvdXNlcmFnZW50IiksaD1hKCIuL2xheWVyL2d1dHRlciIpLkd1dHRlcixpPWEoIi4vbGF5ZXIvbWFya2VyIikuTWFya2VyLGo9YSgiLi9sYXllci90ZXh0IikuVGV4dCxrPWEoIi4vbGF5ZXIvY3Vyc29yIikuQ3Vyc29yLGw9YSgiLi9zY3JvbGxiYXIiKS5TY3JvbGxCYXIsbT1hKCIuL3JlbmRlcmxvb3AiKS5SZW5kZXJMb29wLG49YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWEoInRleHQhLi9jc3MvZWRpdG9yLmNzcyIpO2UuaW1wb3J0Q3NzU3RyaW5nKG8sImFjZV9lZGl0b3IiKTt2YXIgcD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7dGhpcy5jb250YWluZXI9YSxlLmFkZENzc0NsYXNzKGEsImFjZV9lZGl0b3IiKSx0aGlzLnNldFRoZW1lKGIpLHRoaXMuJGd1dHRlcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJGd1dHRlci5jbGFzc05hbWU9ImFjZV9ndXR0ZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJGd1dHRlciksdGhpcy5zY3JvbGxlcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2Nyb2xsZXIpLHRoaXMuY29udGVudD1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29udGVudC5jbGFzc05hbWU9ImFjZV9jb250ZW50Iix0aGlzLnNjcm9sbGVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudCksdGhpcy4kZ3V0dGVyTGF5ZXI9bmV3IGgodGhpcy4kZ3V0dGVyKSx0aGlzLiRndXR0ZXJMYXllci5vbigiY2hhbmdlR3V0dGVyV2lkdGgiLHRoaXMub25SZXNpemUuYmluZCh0aGlzLCEwKSksdGhpcy4kbWFya2VyQmFjaz1uZXcgaSh0aGlzLmNvbnRlbnQpO3ZhciBkPXRoaXMuJHRleHRMYXllcj1uZXcgaih0aGlzLmNvbnRlbnQpO3RoaXMuY2FudmFzPWQuZWxlbWVudCx0aGlzLiRtYXJrZXJGcm9udD1uZXcgaSh0aGlzLmNvbnRlbnQpLHRoaXMuY2hhcmFjdGVyV2lkdGg9ZC5nZXRDaGFyYWN0ZXJXaWR0aCgpLHRoaXMubGluZUhlaWdodD1kLmdldExpbmVIZWlnaHQoKSx0aGlzLiRjdXJzb3JMYXllcj1uZXcgayh0aGlzLmNvbnRlbnQpLHRoaXMuJGN1cnNvclBhZGRpbmc9OCx0aGlzLiRob3JpelNjcm9sbD0hMCx0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGU9ITAsdGhpcy5zY3JvbGxCYXI9bmV3IGwoYSksdGhpcy5zY3JvbGxCYXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmdW5jdGlvbihhKXtjLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGEuZGF0YSl9KSx0aGlzLnNjcm9sbFRvcD0wLHRoaXMuc2Nyb2xsTGVmdD0wLGYuYWRkTGlzdGVuZXIodGhpcy5zY3JvbGxlciwic2Nyb2xsIixmdW5jdGlvbigpe3ZhciBhPWMuc2Nyb2xsZXIuc2Nyb2xsTGVmdDtjLnNjcm9sbExlZnQ9YSxjLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChhKX0pLHRoaXMuY3Vyc29yUG9zPXtyb3c6MCxjb2x1bW46MH0sdGhpcy4kdGV4dExheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUNoYXJhY3RlclNpemUiLGZ1bmN0aW9uKCl7Yy5jaGFyYWN0ZXJXaWR0aD1kLmdldENoYXJhY3RlcldpZHRoKCksYy5saW5lSGVpZ2h0PWQuZ2V0TGluZUhlaWdodCgpLGMuJHVwZGF0ZVByaW50TWFyZ2luKCksYy5vblJlc2l6ZSghMCksYy4kbG9vcC5zY2hlZHVsZShjLkNIQU5HRV9GVUxMKX0pLHRoaXMuJHNpemU9e3dpZHRoOjAsaGVpZ2h0OjAsc2Nyb2xsZXJIZWlnaHQ6MCxzY3JvbGxlcldpZHRoOjB9LHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOjEscGFkZGluZzowLGZpcnN0Um93OjAsZmlyc3RSb3dTY3JlZW46MCxsYXN0Um93OjAsbGluZUhlaWdodDoxLGNoYXJhY3RlcldpZHRoOjEsbWluSGVpZ2h0OjEsbWF4SGVpZ2h0OjEsb2Zmc2V0OjAsaGVpZ2h0OjF9LHRoaXMuJGxvb3A9bmV3IG0odGhpcy4kcmVuZGVyQ2hhbmdlcy5iaW5kKHRoaXMpLHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy5zZXRQYWRkaW5nKDQpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9OygoZnVuY3Rpb24oKXt0aGlzLnNob3dHdXR0ZXI9ITAsdGhpcy5DSEFOR0VfQ1VSU09SPTEsdGhpcy5DSEFOR0VfTUFSS0VSPTIsdGhpcy5DSEFOR0VfR1VUVEVSPTQsdGhpcy5DSEFOR0VfU0NST0xMPTgsdGhpcy5DSEFOR0VfTElORVM9MTYsdGhpcy5DSEFOR0VfVEVYVD0zMix0aGlzLkNIQU5HRV9TSVpFPTY0LHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLPTEyOCx0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQ9MjU2LHRoaXMuQ0hBTkdFX0ZVTEw9NTEyLHRoaXMuQ0hBTkdFX0hfU0NST0xMPTEwMjQsZC5pbXBsZW1lbnQodGhpcyxuKSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWEsdGhpcy4kY3Vyc29yTGF5ZXIuc2V0U2Vzc2lvbihhKSx0aGlzLiRtYXJrZXJCYWNrLnNldFNlc3Npb24oYSksdGhpcy4kbWFya2VyRnJvbnQuc2V0U2Vzc2lvbihhKSx0aGlzLiRndXR0ZXJMYXllci5zZXRTZXNzaW9uKGEpLHRoaXMuJHRleHRMYXllci5zZXRTZXNzaW9uKGEpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCl9LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oYSxiKXtiPT09dW5kZWZpbmVkJiYoYj1JbmZpbml0eSksdGhpcy4kY2hhbmdlZExpbmVzPyh0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c+YSYmKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz1hKSx0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzxiJiYodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c9YikpOnRoaXMuJGNoYW5nZWRMaW5lcz17Zmlyc3RSb3c6YSxsYXN0Um93OmJ9LHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTElORVMpfSx0aGlzLnVwZGF0ZVRleHQ9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSx0aGlzLnVwZGF0ZUZ1bGw9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpfSx0aGlzLnVwZGF0ZUZvbnRTaXplPWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sdGhpcy5vblJlc2l6ZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLkNIQU5HRV9TSVpFLGM9dGhpcy4kc2l6ZSxkPWUuZ2V0SW5uZXJIZWlnaHQodGhpcy5jb250YWluZXIpO2lmKGF8fGMuaGVpZ2h0IT1kKWMuaGVpZ2h0PWQsdGhpcy5zY3JvbGxlci5zdHlsZS5oZWlnaHQ9ZCsicHgiLGMuc2Nyb2xsZXJIZWlnaHQ9dGhpcy5zY3JvbGxlci5jbGllbnRIZWlnaHQsdGhpcy5zY3JvbGxCYXIuc2V0SGVpZ2h0KGMuc2Nyb2xsZXJIZWlnaHQpLHRoaXMuc2Vzc2lvbiYmKHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5nZXRTY3JvbGxUb3AoKSksYnw9dGhpcy5DSEFOR0VfRlVMTCk7dmFyIGY9ZS5nZXRJbm5lcldpZHRoKHRoaXMuY29udGFpbmVyKTtpZihhfHxjLndpZHRoIT1mKXtjLndpZHRoPWY7dmFyIGc9dGhpcy5zaG93R3V0dGVyP3RoaXMuJGd1dHRlci5vZmZzZXRXaWR0aDowO3RoaXMuc2Nyb2xsZXIuc3R5bGUubGVmdD1nKyJweCIsYy5zY3JvbGxlcldpZHRoPU1hdGgubWF4KDAsZi1nLXRoaXMuc2Nyb2xsQmFyLmdldFdpZHRoKCkpLHRoaXMuc2Nyb2xsZXIuc3R5bGUud2lkdGg9Yy5zY3JvbGxlcldpZHRoKyJweCI7aWYodGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCl8fGEpYnw9dGhpcy5DSEFOR0VfRlVMTH10aGlzLiRsb29wLnNjaGVkdWxlKGIpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC10aGlzLiRwYWRkaW5nKjIsYj1NYXRoLmZsb29yKGEvdGhpcy5jaGFyYWN0ZXJXaWR0aCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5hZGp1c3RXcmFwTGltaXQoYil9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oYSl7dGhpcy4kdGV4dExheWVyLnNldFNob3dJbnZpc2libGVzKGEpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRleHRMYXllci5zaG93SW52aXNpYmxlc30sdGhpcy4kc2hvd1ByaW50TWFyZ2luPSEwLHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGEpe3RoaXMuJHNob3dQcmludE1hcmdpbj1hLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dQcmludE1hcmdpbn0sdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW49ODAsdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihhKXt0aGlzLiRwcmludE1hcmdpbkNvbHVtbj1hLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW59LHRoaXMuZ2V0U2hvd0d1dHRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNob3dHdXR0ZXJ9LHRoaXMuc2V0U2hvd0d1dHRlcj1mdW5jdGlvbihhKXtpZih0aGlzLnNob3dHdXR0ZXI9PT1hKXJldHVybjt0aGlzLiRndXR0ZXIuc3R5bGUuZGlzcGxheT1hPyJibG9jayI6Im5vbmUiLHRoaXMuc2hvd0d1dHRlcj1hLHRoaXMub25SZXNpemUoITApfSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbj1mdW5jdGlvbigpe3ZhciBhO2lmKCF0aGlzLiRzaG93UHJpbnRNYXJnaW4mJiF0aGlzLiRwcmludE1hcmdpbkVsKXJldHVybjt0aGlzLiRwcmludE1hcmdpbkVsfHwoYT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuY2xhc3NOYW1lPSJhY2VfcHJpbnRfbWFyZ2luX2xheWVyIix0aGlzLiRwcmludE1hcmdpbkVsPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kcHJpbnRNYXJnaW5FbC5jbGFzc05hbWU9ImFjZV9wcmludF9tYXJnaW4iLGEuYXBwZW5kQ2hpbGQodGhpcy4kcHJpbnRNYXJnaW5FbCksdGhpcy5jb250ZW50Lmluc2VydEJlZm9yZShhLHRoaXMuJHRleHRMYXllci5lbGVtZW50KSk7dmFyIGI9dGhpcy4kcHJpbnRNYXJnaW5FbC5zdHlsZTtiLmxlZnQ9dGhpcy5jaGFyYWN0ZXJXaWR0aCp0aGlzLiRwcmludE1hcmdpbkNvbHVtbit0aGlzLiRwYWRkaW5nKyJweCIsYi52aXNpYmlsaXR5PXRoaXMuJHNob3dQcmludE1hcmdpbj8idmlzaWJsZSI6ImhpZGRlbiJ9LHRoaXMuZ2V0Q29udGFpbmVyRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy5nZXRNb3VzZUV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudH0sdGhpcy5nZXRUZXh0QXJlYUNvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy5tb3ZlVGV4dEFyZWFUb0N1cnNvcj1mdW5jdGlvbihhKXtpZihnLmlzSUUpcmV0dXJuO2lmKHRoaXMubGF5ZXJDb25maWcubGFzdFJvdz09PTApcmV0dXJuO3ZhciBiPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oKTtpZighYilyZXR1cm47dmFyIGM9dGhpcy5jb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy5sYXllckNvbmZpZy5vZmZzZXQ7YS5zdHlsZS5sZWZ0PWMubGVmdCtiLmxlZnQrInB4IixhLnN0eWxlLnRvcD1jLnRvcCtiLnRvcC10aGlzLnNjcm9sbFRvcCtkKyJweCJ9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3d9LHRoaXMuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdysodGhpcy5sYXllckNvbmZpZy5vZmZzZXQ9PT0wPzA6MSl9LHRoaXMuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3ZhciBhPU1hdGguZmxvb3IoKHRoaXMubGF5ZXJDb25maWcuaGVpZ2h0K3RoaXMubGF5ZXJDb25maWcub2Zmc2V0KS90aGlzLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpO3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93LTErYX0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3d9LHRoaXMuJHBhZGRpbmc9bnVsbCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oYSl7dGhpcy4kcGFkZGluZz1hLHRoaXMuJHRleHRMYXllci5zZXRQYWRkaW5nKGEpLHRoaXMuJGN1cnNvckxheWVyLnNldFBhZGRpbmcoYSksdGhpcy4kbWFya2VyRnJvbnQuc2V0UGFkZGluZyhhKSx0aGlzLiRtYXJrZXJCYWNrLnNldFBhZGRpbmcoYSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSx0aGlzLmdldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZX0sdGhpcy5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbihhKXt0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUhPWEmJih0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGU9YSwoIXRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZXx8IXRoaXMuJGhvcml6U2Nyb2xsKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpKX0sdGhpcy4kdXBkYXRlU2Nyb2xsQmFyPWZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxCYXIuc2V0SW5uZXJIZWlnaHQodGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQpLHRoaXMuc2Nyb2xsQmFyLnNldFNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCl9LHRoaXMuJHJlbmRlckNoYW5nZXM9ZnVuY3Rpb24oYSl7aWYoIWF8fCF0aGlzLnNlc3Npb258fCF0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aClyZXR1cm47KGEmdGhpcy5DSEFOR0VfRlVMTHx8YSZ0aGlzLkNIQU5HRV9TSVpFfHxhJnRoaXMuQ0hBTkdFX1RFWFR8fGEmdGhpcy5DSEFOR0VfTElORVN8fGEmdGhpcy5DSEFOR0VfU0NST0xMKSYmdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCk7aWYoYSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCl7dGhpcy5zY3JvbGxlci5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsTGVmdDt2YXIgYj10aGlzLnNjcm9sbGVyLnNjcm9sbExlZnQ7dGhpcy5zY3JvbGxMZWZ0PWIsdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoYil9aWYoYSZ0aGlzLkNIQU5HRV9GVUxMKXt0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpLHRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpLHRoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy5zaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kbWFya2VyQmFjay51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTtyZXR1cm59aWYoYSZ0aGlzLkNIQU5HRV9TQ1JPTEwpe3RoaXMuJHVwZGF0ZVNjcm9sbEJhcigpLGEmdGhpcy5DSEFOR0VfVEVYVHx8YSZ0aGlzLkNIQU5HRV9MSU5FUz90aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOnRoaXMuJHRleHRMYXllci5zY3JvbGxMaW5lcyh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLnNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpO3JldHVybn1hJnRoaXMuQ0hBTkdFX1RFWFQ/KHRoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy5zaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZykpOmEmdGhpcy5DSEFOR0VfTElORVM/dGhpcy4kdXBkYXRlTGluZXMoKSYmKHRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpLHRoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpKTphJnRoaXMuQ0hBTkdFX0dVVFRFUiYmdGhpcy5zaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksYSZ0aGlzLkNIQU5HRV9DVVJTT1ImJnRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSxhJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKSYmdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLGEmKHRoaXMuQ0hBTkdFX01BUktFUnx0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSykmJnRoaXMuJG1hcmtlckJhY2sudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLGEmdGhpcy5DSEFOR0VfU0laRSYmdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCl9LHRoaXMuJGNvbXB1dGVMYXllckNvbmZpZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbixiPXRoaXMuc2Nyb2xsVG9wJXRoaXMubGluZUhlaWdodCxjPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQrdGhpcy5saW5lSGVpZ2h0LGQ9dGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSxlPXRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZXx8dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWQ8MCxmPXRoaXMuJGhvcml6U2Nyb2xsIT09ZTt0aGlzLiRob3JpelNjcm9sbD1lLGYmJih0aGlzLnNjcm9sbGVyLnN0eWxlLm92ZXJmbG93WD1lPyJzY3JvbGwiOiJoaWRkZW4iLGV8fHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KDApKTt2YXIgZz10aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGVuZ3RoKCkqdGhpcy5saW5lSGVpZ2h0O3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoTWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLnNjcm9sbFRvcCxnLXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpKSk7dmFyIGg9TWF0aC5jZWlsKGMvdGhpcy5saW5lSGVpZ2h0KS0xLGk9TWF0aC5tYXgoMCxNYXRoLnJvdW5kKCh0aGlzLnNjcm9sbFRvcC1iKS90aGlzLmxpbmVIZWlnaHQpKSxqPWkraCxrLGwsbT17bGluZUhlaWdodDp0aGlzLmxpbmVIZWlnaHR9O2k9YS5zY3JlZW5Ub0RvY3VtZW50Um93KGksMCk7dmFyIG49YS5nZXRGb2xkTGluZShpKTtuJiYoaT1uLnN0YXJ0LnJvdyksaz1hLmRvY3VtZW50VG9TY3JlZW5Sb3coaSwwKSxsPWEuZ2V0Um93SGVpZ2h0KG0saSksaj1NYXRoLm1pbihhLnNjcmVlblRvRG9jdW1lbnRSb3coaiwwKSxhLmdldExlbmd0aCgpLTEpLGM9dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCthLmdldFJvd0hlaWdodChtLGopK2wsYj10aGlzLnNjcm9sbFRvcC1rKnRoaXMubGluZUhlaWdodCx0aGlzLmxheWVyQ29uZmlnPXt3aWR0aDpkLHBhZGRpbmc6dGhpcy4kcGFkZGluZyxmaXJzdFJvdzppLGZpcnN0Um93U2NyZWVuOmssbGFzdFJvdzpqLGxpbmVIZWlnaHQ6dGhpcy5saW5lSGVpZ2h0LGNoYXJhY3RlcldpZHRoOnRoaXMuY2hhcmFjdGVyV2lkdGgsbWluSGVpZ2h0OmMsbWF4SGVpZ2h0Omcsb2Zmc2V0OmIsaGVpZ2h0OnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHR9LHRoaXMuJGd1dHRlckxheWVyLmVsZW1lbnQuc3R5bGUubWFyZ2luVG9wPS1iKyJweCIsdGhpcy5jb250ZW50LnN0eWxlLm1hcmdpblRvcD0tYisicHgiLHRoaXMuY29udGVudC5zdHlsZS53aWR0aD1kKzIqdGhpcy4kcGFkZGluZysicHgiLHRoaXMuY29udGVudC5zdHlsZS5oZWlnaHQ9YysicHgiLGYmJnRoaXMub25SZXNpemUoITApfSx0aGlzLiR1cGRhdGVMaW5lcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdyxiPXRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93O3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsO3ZhciBjPXRoaXMubGF5ZXJDb25maWc7aWYoYy53aWR0aCE9dGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSlyZXR1cm4gdGhpcy4kdGV4dExheWVyLnVwZGF0ZShjKTtpZihhPmMubGFzdFJvdysxKXJldHVybjtpZihiPGMuZmlyc3RSb3cpcmV0dXJuO2lmKGI9PT1JbmZpbml0eSl7dGhpcy5zaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUoYyksdGhpcy4kdGV4dExheWVyLnVwZGF0ZShjKTtyZXR1cm59cmV0dXJuIHRoaXMuJHRleHRMYXllci51cGRhdGVMaW5lcyhjLGEsYiksITB9LHRoaXMuJGdldExvbmdlc3RMaW5lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXNzaW9uLmdldFNjcmVlbldpZHRoKCk7cmV0dXJuIHRoaXMuJHRleHRMYXllci5zaG93SW52aXNpYmxlcyYmKGErPTEpLE1hdGgubWF4KHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC0yKnRoaXMuJHBhZGRpbmcsTWF0aC5yb3VuZChhKnRoaXMuY2hhcmFjdGVyV2lkdGgpKX0sdGhpcy51cGRhdGVGcm9udE1hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLiRtYXJrZXJGcm9udC5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKCEwKSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpfSx0aGlzLnVwZGF0ZUJhY2tNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyQmFjay5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oYSxiKXt0aGlzLiRndXR0ZXJMYXllci5hZGRHdXR0ZXJEZWNvcmF0aW9uKGEsYiksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oYSxiKXt0aGlzLiRndXR0ZXJMYXllci5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uKGEsYiksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnNldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKGEpe3RoaXMuJGd1dHRlckxheWVyLnNldEJyZWFrcG9pbnRzKGEpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihhKXt0aGlzLiRndXR0ZXJMYXllci5zZXRBbm5vdGF0aW9ucyhhKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMudXBkYXRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9DVVJTT1IpfSx0aGlzLmhpZGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5oaWRlQ3Vyc29yKCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckxheWVyLnNob3dDdXJzb3IoKX0sdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldz1mdW5jdGlvbigpe2lmKHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ9PT0wKXJldHVybjt2YXIgYT10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKCksYj1hLmxlZnQsYz1hLnRvcDt0aGlzLnNjcm9sbFRvcD5jJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGMpLHRoaXMuc2Nyb2xsVG9wK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ8Yyt0aGlzLmxpbmVIZWlnaHQmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoYyt0aGlzLmxpbmVIZWlnaHQtdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCk7dmFyIGQ9dGhpcy5zY3JvbGxMZWZ0O2Q+YiYmKGI8dGhpcy4kcGFkZGluZysyKnRoaXMubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgmJihiPTApLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KGIpKSxkK3RoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aDxiK3RoaXMuY2hhcmFjdGVyV2lkdGgmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KE1hdGgucm91bmQoYit0aGlzLmNoYXJhY3RlcldpZHRoLXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCkpfSx0aGlzLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCl9LHRoaXMuZ2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpfSx0aGlzLmdldFNjcm9sbFRvcFJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRvcC90aGlzLmxpbmVIZWlnaHR9LHRoaXMuZ2V0U2Nyb2xsQm90dG9tUm93PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcigodGhpcy5zY3JvbGxUb3ArdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkvdGhpcy5saW5lSGVpZ2h0KS0xKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGEqdGhpcy5saW5lSGVpZ2h0KX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6YSxjb2x1bW46MH0pLGQ9Yy50b3A7YiYmKGQtPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQvMiksdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChkKX0sdGhpcy5zY3JvbGxUb1k9ZnVuY3Rpb24oYSl7dGhpcy5zY3JvbGxUb3AhPT1hJiYodGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpLHRoaXMuc2Nyb2xsVG9wPWEpfSx0aGlzLnNjcm9sbFRvWD1mdW5jdGlvbihhKXthPD10aGlzLiRwYWRkaW5nJiYoYT0wKSx0aGlzLnNjcm9sbExlZnQhPT1hJiYodGhpcy5zY3JvbGxMZWZ0PWEpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfSF9TQ1JPTEwpfSx0aGlzLnNjcm9sbEJ5PWZ1bmN0aW9uKGEsYil7YiYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrYiksYSYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSthKX0sdGhpcy5pc1Njcm9sbGFibGVCeT1mdW5jdGlvbihhLGIpe2lmKGI8MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpPjApcmV0dXJuITA7aWYoYj4wJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodDx0aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodClyZXR1cm4hMH0sdGhpcy5zY3JlZW5Ub1RleHRDb29yZGluYXRlcz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLnJvdW5kKChhK3RoaXMuc2Nyb2xsTGVmdC1jLmxlZnQtdGhpcy4kcGFkZGluZy1lLmdldFBhZ2VTY3JvbGxMZWZ0KCkpL3RoaXMuY2hhcmFjdGVyV2lkdGgpLGY9TWF0aC5mbG9vcigoYit0aGlzLnNjcm9sbFRvcC1jLnRvcC1lLmdldFBhZ2VTY3JvbGxUb3AoKSkvdGhpcy5saW5lSGVpZ2h0KTtyZXR1cm4gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihmLE1hdGgubWF4KGQsMCkpfSx0aGlzLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYSxiKSxlPXRoaXMuJHBhZGRpbmcrTWF0aC5yb3VuZChkLmNvbHVtbip0aGlzLmNoYXJhY3RlcldpZHRoKSxmPWQucm93KnRoaXMubGluZUhlaWdodDtyZXR1cm57cGFnZVg6Yy5sZWZ0K2UtdGhpcy5zY3JvbGxMZWZ0LHBhZ2VZOmMudG9wK2YtdGhpcy5zY3JvbGxUb3B9fSx0aGlzLnZpc3VhbGl6ZUZvY3VzPWZ1bmN0aW9uKCl7ZS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2ZvY3VzIil9LHRoaXMudmlzdWFsaXplQmx1cj1mdW5jdGlvbigpe2UucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnNob3dDb21wb3NpdGlvbj1mdW5jdGlvbihhKXt0aGlzLiRjb21wb3NpdGlvbnx8KHRoaXMuJGNvbXBvc2l0aW9uPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kY29tcG9zaXRpb24uY2xhc3NOYW1lPSJhY2VfY29tcG9zaXRpb24iLHRoaXMuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLiRjb21wb3NpdGlvbikpLHRoaXMuJGNvbXBvc2l0aW9uLmlubmVySFRNTD0iJiMxNjA7Ijt2YXIgYj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKCksYz10aGlzLiRjb21wb3NpdGlvbi5zdHlsZTtjLnRvcD1iLnRvcCsicHgiLGMubGVmdD1iLmxlZnQrdGhpcy4kcGFkZGluZysicHgiLGMuaGVpZ2h0PXRoaXMubGluZUhlaWdodCsicHgiLHRoaXMuaGlkZUN1cnNvcigpfSx0aGlzLnNldENvbXBvc2l0aW9uVGV4dD1mdW5jdGlvbihhKXtlLnNldElubmVyVGV4dCh0aGlzLiRjb21wb3NpdGlvbixhKX0sdGhpcy5oaWRlQ29tcG9zaXRpb249ZnVuY3Rpb24oKXt0aGlzLnNob3dDdXJzb3IoKTtpZighdGhpcy4kY29tcG9zaXRpb24pcmV0dXJuO3ZhciBhPXRoaXMuJGNvbXBvc2l0aW9uLnN0eWxlO2EudG9wPSItMTAwMDBweCIsYS5sZWZ0PSItMTAwMDBweCJ9LHRoaXMuc2V0VGhlbWU9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChhKXtlLmltcG9ydENzc1N0cmluZyhhLmNzc1RleHQsYS5jc3NDbGFzcyxjLmNvbnRhaW5lci5vd25lckRvY3VtZW50KSxjLiR0aGVtZSYmZS5yZW1vdmVDc3NDbGFzcyhjLmNvbnRhaW5lcixjLiR0aGVtZSksYy4kdGhlbWU9YT9hLmNzc0NsYXNzOm51bGwsYy4kdGhlbWUmJmUuYWRkQ3NzQ2xhc3MoYy5jb250YWluZXIsYy4kdGhlbWUpLGEmJmEuaXNEYXJrP2UuYWRkQ3NzQ2xhc3MoYy5jb250YWluZXIsImFjZV9kYXJrIik6ZS5yZW1vdmVDc3NDbGFzcyhjLmNvbnRhaW5lciwiYWNlX2RhcmsiKSxjLiRzaXplJiYoYy4kc2l6ZS53aWR0aD0wLGMub25SZXNpemUoKSl9dmFyIGM9dGhpczt0aGlzLiR0aGVtZVZhbHVlPWIsIWJ8fHR5cGVvZiBiPT0ic3RyaW5nIj8oYj1ifHwiYWNlL3RoZW1lL3RleHRtYXRlIixhKFtiXSxmdW5jdGlvbihhKXtkKGEpfSkpOmQoYil9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGhlbWVWYWx1ZX0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihiKXtlLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLGIpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oYil7ZS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixiKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmRlc3Ryb3koKSx0aGlzLiRjdXJzb3JMYXllci5kZXN0cm95KCl9fSkpLmNhbGwocC5wcm90b3R5cGUpLGIuVmlydHVhbFJlbmRlcmVyPXB9KSxkZWZpbmUoImFjZS9sYXllci9ndXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvZG9tIiksZT1hKCIuLi9saWIvb29wIiksZj1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixnPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfZ3V0dGVyLWxheWVyIixhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5zZXRTaG93Rm9sZFdpZGdldHModGhpcy4kc2hvd0ZvbGRXaWRnZXRzKSx0aGlzLmd1dHRlcldpZHRoPTAsdGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy4kYW5ub3RhdGlvbnM9W10sdGhpcy4kZGVjb3JhdGlvbnM9W119OygoZnVuY3Rpb24oKXtlLmltcGxlbWVudCh0aGlzLGYpLHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZGVjb3JhdGlvbnNbYV18fCh0aGlzLiRkZWNvcmF0aW9uc1thXT0iIiksdGhpcy4kZGVjb3JhdGlvbnNbYV0rPSIgYWNlXyIrYn0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZGVjb3JhdGlvbnNbYV09dGhpcy4kZGVjb3JhdGlvbnNbYV0ucmVwbGFjZSgiIGFjZV8iK2IsIiIpfSx0aGlzLnNldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKGEpe3RoaXMuJGJyZWFrcG9pbnRzPWEuY29uY2F0KCl9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oYSl7dGhpcy4kYW5ub3RhdGlvbnM9W107Zm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXTtpZighYyljb250aW51ZTt2YXIgZD10aGlzLiRhbm5vdGF0aW9uc1tiXT17dGV4dDpbXX07Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV0sZz1mLnRleHQucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjODIxNzsiKS5yZXBsYWNlKC88LywiJmx0OyIpO2QudGV4dC5pbmRleE9mKGcpPT09LTEmJmQudGV4dC5wdXNoKGcpO3ZhciBoPWYudHlwZTtoPT0iZXJyb3IiP2QuY2xhc3NOYW1lPSJhY2VfZXJyb3IiOmg9PSJ3YXJuaW5nIiYmZC5jbGFzc05hbWUhPSJhY2VfZXJyb3IiP2QuY2xhc3NOYW1lPSJhY2Vfd2FybmluZyI6aD09ImluZm8iJiYhZC5jbGFzc05hbWUmJihkLmNsYXNzTmFtZT0iYWNlX2luZm8iKX19fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLiRjb25maWc9YTt2YXIgYj17Y2xhc3NOYW1lOiIiLHRleHQ6W119LGM9W10sZT1hLmZpcnN0Um93LGY9YS5sYXN0Um93LGc9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShlKSxoPWc/Zy5zdGFydC5yb3c6SW5maW5pdHksaT10aGlzLiRzaG93Rm9sZFdpZGdldHMmJnRoaXMuc2Vzc2lvbi5mb2xkV2lkZ2V0cztmb3IoOzspe2U+aCYmKGU9Zy5lbmQucm93KzEsZz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGUsZyksaD1nP2cuc3RhcnQucm93OkluZmluaXR5KTtpZihlPmYpYnJlYWs7dmFyIGo9dGhpcy4kYW5ub3RhdGlvbnNbZV18fGI7Yy5wdXNoKCI8ZGl2IGNsYXNzPSdhY2VfZ3V0dGVyLWNlbGwiLHRoaXMuJGRlY29yYXRpb25zW2VdfHwiIix0aGlzLiRicmVha3BvaW50c1tlXT8iIGFjZV9icmVha3BvaW50ICI6IiAiLGouY2xhc3NOYW1lLCInIHRpdGxlPSciLGoudGV4dC5qb2luKCJcbiIpLCInIHN0eWxlPSdoZWlnaHQ6IixhLmxpbmVIZWlnaHQsInB4Oyc+IixlKzEpO2lmKGkpe3ZhciBrPWlbZV07az09bnVsbCYmKGs9aVtlXT10aGlzLnNlc3Npb24uZ2V0Rm9sZFdpZGdldChlKSksayYmYy5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ZvbGQtd2lkZ2V0ICIsayxrPT0ic3RhcnQiJiZlPT1oJiZlPGcuZW5kLnJvdz8iIGNsb3NlZCI6IiBvcGVuIiwiJz48L3NwYW4+Iil9dmFyIGw9dGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aChlKS0xO3doaWxlKGwtLSljLnB1c2goIjwvZGl2PjxkaXYgY2xhc3M9J2FjZV9ndXR0ZXItY2VsbCcgc3R5bGU9J2hlaWdodDoiLGEubGluZUhlaWdodCwicHgnPsKmIik7Yy5wdXNoKCI8L2Rpdj4iKSxlKyt9dGhpcy5lbGVtZW50PWQuc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCxjLmpvaW4oIiIpKSx0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWEubWluSGVpZ2h0KyJweCI7dmFyIG09dGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoO20hPT10aGlzLmd1dHRlcldpZHRoJiYodGhpcy5ndXR0ZXJXaWR0aD1tLHRoaXMuX2VtaXQoImNoYW5nZUd1dHRlcldpZHRoIixtKSl9LHRoaXMuJHNob3dGb2xkV2lkZ2V0cz0hMCx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihhKXthP2QuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIik6ZC5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9mb2xkaW5nLWVuYWJsZWQiKSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9YX0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd0ZvbGRXaWRnZXRzfX0pKS5jYWxsKGcucHJvdG90eXBlKSxiLkd1dHRlcj1nfSksZGVmaW5lKCJhY2UvbGF5ZXIvbWFya2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1hKCIuLi9saWIvZG9tIiksZj1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX21hcmtlci1sYXllciIsYS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpfTsoKGZ1bmN0aW9uKCl7dGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihhKXt0aGlzLiRwYWRkaW5nPWF9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YX0sdGhpcy5zZXRNYXJrZXJzPWZ1bmN0aW9uKGEpe3RoaXMubWFya2Vycz1hfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXt2YXIgYT1hfHx0aGlzLmNvbmZpZztpZighYSlyZXR1cm47dGhpcy5jb25maWc9YTt2YXIgYj1bXTtmb3IodmFyIGMgaW4gdGhpcy5tYXJrZXJzKXt2YXIgZD10aGlzLm1hcmtlcnNbY10sZj1kLnJhbmdlLmNsaXBSb3dzKGEuZmlyc3RSb3csYS5sYXN0Um93KTtpZihmLmlzRW1wdHkoKSljb250aW51ZTtmPWYudG9TY3JlZW5SYW5nZSh0aGlzLnNlc3Npb24pO2lmKGQucmVuZGVyZXIpe3ZhciBnPXRoaXMuJGdldFRvcChmLnN0YXJ0LnJvdyxhKSxoPU1hdGgucm91bmQodGhpcy4kcGFkZGluZytmLnN0YXJ0LmNvbHVtbiphLmNoYXJhY3RlcldpZHRoKTtkLnJlbmRlcmVyKGIsZixoLGcsYSl9ZWxzZSBmLmlzTXVsdGlMaW5lKCk/ZC50eXBlPT0idGV4dCI/dGhpcy5kcmF3VGV4dE1hcmtlcihiLGYsZC5jbGF6eixhKTp0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXIoYixmLGQuY2xhenosYSxkLnR5cGUpOnRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoYixmLGQuY2xhenosYSxudWxsLGQudHlwZSl9dGhpcy5lbGVtZW50PWUuc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCxiLmpvaW4oIiIpKX0sdGhpcy4kZ2V0VG9wPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEtYi5maXJzdFJvd1NjcmVlbikqYi5saW5lSGVpZ2h0fSx0aGlzLmRyYXdUZXh0TWFya2VyPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPWIuc3RhcnQucm93LGc9bmV3IGQoZixiLnN0YXJ0LmNvbHVtbixmLHRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGYpKTt0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKGEsZyxjLGUsMSwidGV4dCIpLGY9Yi5lbmQucm93LGc9bmV3IGQoZiwwLGYsYi5lbmQuY29sdW1uKSx0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKGEsZyxjLGUsMCwidGV4dCIpO2ZvcihmPWIuc3RhcnQucm93KzE7ZjxiLmVuZC5yb3c7ZisrKWcuc3RhcnQucm93PWYsZy5lbmQucm93PWYsZy5lbmQuY29sdW1uPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGYpLHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoYSxnLGMsZSwxLCJ0ZXh0Iil9LHRoaXMuZHJhd011bHRpTGluZU1hcmtlcj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWU9PT0iYmFja2dyb3VuZCI/MDp0aGlzLiRwYWRkaW5nLGc9ZC53aWR0aCsyKnRoaXMuJHBhZGRpbmctZixoPWQubGluZUhlaWdodCxpPU1hdGgucm91bmQoZy1iLnN0YXJ0LmNvbHVtbipkLmNoYXJhY3RlcldpZHRoKSxqPXRoaXMuJGdldFRvcChiLnN0YXJ0LnJvdyxkKSxrPU1hdGgucm91bmQoZitiLnN0YXJ0LmNvbHVtbipkLmNoYXJhY3RlcldpZHRoKTthLnB1c2goIjxkaXYgY2xhc3M9JyIsYywiJyBzdHlsZT0nIiwiaGVpZ2h0OiIsaCwicHg7Iiwid2lkdGg6IixpLCJweDsiLCJ0b3A6IixqLCJweDsiLCJsZWZ0OiIsaywicHg7Jz48L2Rpdj4iKSxqPXRoaXMuJGdldFRvcChiLmVuZC5yb3csZCksaT1NYXRoLnJvdW5kKGIuZW5kLmNvbHVtbipkLmNoYXJhY3RlcldpZHRoKSxhLnB1c2goIjxkaXYgY2xhc3M9JyIsYywiJyBzdHlsZT0nIiwiaGVpZ2h0OiIsaCwicHg7Iiwid2lkdGg6IixpLCJweDsiLCJ0b3A6IixqLCJweDsiLCJsZWZ0OiIsZiwicHg7Jz48L2Rpdj4iKSxoPShiLmVuZC5yb3ctYi5zdGFydC5yb3ctMSkqZC5saW5lSGVpZ2h0O2lmKGg8MClyZXR1cm47aj10aGlzLiRnZXRUb3AoYi5zdGFydC5yb3crMSxkKSxhLnB1c2goIjxkaXYgY2xhc3M9JyIsYywiJyBzdHlsZT0nIiwiaGVpZ2h0OiIsaCwicHg7Iiwid2lkdGg6IixnLCJweDsiLCJ0b3A6IixqLCJweDsiLCJsZWZ0OiIsZiwicHg7Jz48L2Rpdj4iKX0sdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcj1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9Zj09PSJiYWNrZ3JvdW5kIj8wOnRoaXMuJHBhZGRpbmcsaD1kLmxpbmVIZWlnaHQ7aWYoZj09PSJiYWNrZ3JvdW5kIil2YXIgaT1kLndpZHRoO2Vsc2UgaT1NYXRoLnJvdW5kKChiLmVuZC5jb2x1bW4rKGV8fDApLWIuc3RhcnQuY29sdW1uKSpkLmNoYXJhY3RlcldpZHRoKTt2YXIgaj10aGlzLiRnZXRUb3AoYi5zdGFydC5yb3csZCksaz1NYXRoLnJvdW5kKGcrYi5zdGFydC5jb2x1bW4qZC5jaGFyYWN0ZXJXaWR0aCk7YS5wdXNoKCI8ZGl2IGNsYXNzPSciLGMsIicgc3R5bGU9JyIsImhlaWdodDoiLGgsInB4OyIsIndpZHRoOiIsaSwicHg7IiwidG9wOiIsaiwicHg7IiwibGVmdDoiLGssInB4Oyc+PC9kaXY+Iil9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuTWFya2VyPWZ9KSxkZWZpbmUoImFjZS9sYXllci90ZXh0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZG9tIiksZj1hKCIuLi9saWIvbGFuZyIpLGc9YSgiLi4vbGliL3VzZXJhZ2VudCIpLGg9YSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsaT1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX3RleHQtbGF5ZXIiLGEuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLiRjaGFyYWN0ZXJTaXplPXRoaXMuJG1lYXN1cmVTaXplcygpfHx7d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzKCl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGgpLHRoaXMuRU9GX0NIQVI9IsK2Iix0aGlzLkVPTF9DSEFSPSLCrCIsdGhpcy5UQUJfQ0hBUj0i4oaSIix0aGlzLlNQQUNFX0NIQVI9IsK3Iix0aGlzLiRwYWRkaW5nPTAsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGEpe3RoaXMuJHBhZGRpbmc9YSx0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZz0iMCAiK2ErInB4In0sdGhpcy5nZXRMaW5lSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0fHwxfSx0aGlzLmdldENoYXJhY3RlcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUud2lkdGh8fDF9LHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJG1lYXN1cmVTaXplcygpO2EmJih0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoIT09YS53aWR0aHx8dGhpcy4kY2hhcmFjdGVyU2l6ZS5oZWlnaHQhPT1hLmhlaWdodCkmJih0aGlzLiRjaGFyYWN0ZXJTaXplPWEsdGhpcy5fZW1pdCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIse2RhdGE6YX0pKX0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2EuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSw1MDApfSx0aGlzLiRmb250U3R5bGVzPXtmb250RmFtaWx5OjEsZm9udFNpemU6MSxmb250V2VpZ2h0OjEsZm9udFN0eWxlOjEsbGluZUhlaWdodDoxfSx0aGlzLiRtZWFzdXJlU2l6ZXM9ZnVuY3Rpb24oKXt2YXIgYT0xZTM7aWYoIXRoaXMuJG1lYXN1cmVOb2RlKXt2YXIgYj10aGlzLiRtZWFzdXJlTm9kZT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9Yi5zdHlsZTtjLndpZHRoPWMuaGVpZ2h0PSJhdXRvIixjLmxlZnQ9Yy50b3A9LWEqNDArInB4IixjLnZpc2liaWxpdHk9ImhpZGRlbiIsYy5wb3NpdGlvbj0iYWJzb2x1dGUiLGMub3ZlcmZsb3c9InZpc2libGUiLGMud2hpdGVTcGFjZT0ibm93cmFwIixiLmlubmVySFRNTD1mLnN0cmluZ1JlcGVhdCgiWHkiLGEpO2lmKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkpdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTtlbHNle3ZhciBkPXRoaXMuZWxlbWVudC5wYXJlbnROb2RlO3doaWxlKCFlLmhhc0Nzc0NsYXNzKGQsImFjZV9lZGl0b3IiKSlkPWQucGFyZW50Tm9kZTtkLmFwcGVuZENoaWxkKGIpfX1pZighdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKXJldHVybiBudWxsO3ZhciBjPXRoaXMuJG1lYXN1cmVOb2RlLnN0eWxlLGc9ZS5jb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCk7Zm9yKHZhciBoIGluIHRoaXMuJGZvbnRTdHlsZXMpY1toXT1nW2hdO3ZhciBpPXtoZWlnaHQ6dGhpcy4kbWVhc3VyZU5vZGUub2Zmc2V0SGVpZ2h0LHdpZHRoOnRoaXMuJG1lYXN1cmVOb2RlLm9mZnNldFdpZHRoLyhhKjIpfTtyZXR1cm4gaS53aWR0aD09MCYmaS5oZWlnaHQ9PTA/bnVsbDppfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWF9LHRoaXMuc2hvd0ludmlzaWJsZXM9ITEsdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zaG93SW52aXNpYmxlcz09YT8hMToodGhpcy5zaG93SW52aXNpYmxlcz1hLCEwKX0sdGhpcy4kdGFiU3RyaW5ncz1bXSx0aGlzLiRjb21wdXRlVGFiU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKSxiPXRoaXMuJHRhYlN0cmluZ3M9WzBdO2Zvcih2YXIgYz0xO2M8YSsxO2MrKyl0aGlzLnNob3dJbnZpc2libGVzP2IucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIrdGhpcy5UQUJfQ0hBUisobmV3IEFycmF5KGMpKS5qb2luKCImIzE2MDsiKSsiPC9zcGFuPiIpOmIucHVzaCgobmV3IEFycmF5KGMrMSkpLmpvaW4oIiYjMTYwOyIpKX0sdGhpcy51cGRhdGVMaW5lcz1mdW5jdGlvbihhLGIsYyl7dGhpcy4kY29tcHV0ZVRhYlN0cmluZygpLCh0aGlzLmNvbmZpZy5sYXN0Um93IT1hLmxhc3RSb3d8fHRoaXMuY29uZmlnLmZpcnN0Um93IT1hLmZpcnN0Um93KSYmdGhpcy5zY3JvbGxMaW5lcyhhKSx0aGlzLmNvbmZpZz1hO3ZhciBkPU1hdGgubWF4KGIsYS5maXJzdFJvdyksZj1NYXRoLm1pbihjLGEubGFzdFJvdyksZz10aGlzLmVsZW1lbnQuY2hpbGROb2RlcyxoPTA7Zm9yKHZhciBpPWEuZmlyc3RSb3c7aTxkO2krKyl7dmFyIGo9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKGkpO2lmKGope2lmKGouY29udGFpbnNSb3coZCkpe2Q9ai5zdGFydC5yb3c7YnJlYWt9aT1qLmVuZC5yb3d9aCsrfWZvcih2YXIgaz1kO2s8PWY7aysrKXt2YXIgbD1nW2grK107aWYoIWwpY29udGludWU7dmFyIG09W10sbj10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGssayk7dGhpcy4kcmVuZGVyTGluZShtLGssblswXS50b2tlbnMsIXRoaXMuJHVzZUxpbmVHcm91cHMoKSksbD1lLnNldElubmVySHRtbChsLG0uam9pbigiIikpLGs9dGhpcy5zZXNzaW9uLmdldFJvd0ZvbGRFbmQoayl9fSx0aGlzLnNjcm9sbExpbmVzPWZ1bmN0aW9uKGEpe3RoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKTt2YXIgYj10aGlzLmNvbmZpZzt0aGlzLmNvbmZpZz1hO2lmKCFifHxiLmxhc3RSb3c8YS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoYSk7aWYoYS5sYXN0Um93PGIuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGEpO3ZhciBjPXRoaXMuZWxlbWVudDtpZihiLmZpcnN0Um93PGEuZmlyc3RSb3cpZm9yKHZhciBkPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChiLmZpcnN0Um93LGEuZmlyc3RSb3ctMSk7ZD4wO2QtLSljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7aWYoYi5sYXN0Um93PmEubGFzdFJvdylmb3IodmFyIGQ9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KGEubGFzdFJvdysxLGIubGFzdFJvdyk7ZD4wO2QtLSljLnJlbW92ZUNoaWxkKGMubGFzdENoaWxkKTtpZihhLmZpcnN0Um93PGIuZmlyc3RSb3cpe3ZhciBlPXRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoYSxhLmZpcnN0Um93LGIuZmlyc3RSb3ctMSk7Yy5maXJzdENoaWxkP2MuaW5zZXJ0QmVmb3JlKGUsYy5maXJzdENoaWxkKTpjLmFwcGVuZENoaWxkKGUpfWlmKGEubGFzdFJvdz5iLmxhc3RSb3cpe3ZhciBlPXRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoYSxiLmxhc3RSb3crMSxhLmxhc3RSb3cpO2MuYXBwZW5kQ2hpbGQoZSl9fSx0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZj1iLGc9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShmKSxoPWc/Zy5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXtmPmgmJihmPWcuZW5kLnJvdysxLGc9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShmLGcpLGg9Zz9nLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYoZj5jKWJyZWFrO3ZhciBpPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksaj1bXSxrPXRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMoZixmKTtrLmxlbmd0aD09MSYmdGhpcy4kcmVuZGVyTGluZShqLGYsa1swXS50b2tlbnMsITEpLGkuaW5uZXJIVE1MPWouam9pbigiIik7aWYodGhpcy4kdXNlTGluZUdyb3VwcygpKWkuY2xhc3NOYW1lPSJhY2VfbGluZV9ncm91cCIsZC5hcHBlbmRDaGlsZChpKTtlbHNle3ZhciBsPWkuY2hpbGROb2Rlczt3aGlsZShsLmxlbmd0aClkLmFwcGVuZENoaWxkKGxbMF0pfWYrK31yZXR1cm4gZH0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy4kY29tcHV0ZVRhYlN0cmluZygpLHRoaXMuY29uZmlnPWE7dmFyIGI9W10sYz1hLmZpcnN0Um93LGQ9YS5sYXN0Um93LGY9YyxnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZiksaD1nP2cuc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7Zj5oJiYoZj1nLmVuZC5yb3crMSxnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZixnKSxoPWc/Zy5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGY+ZClicmVhazt0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJmIucHVzaCgiPGRpdiBjbGFzcz0nYWNlX2xpbmVfZ3JvdXAnPiIpO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMoZixmKTtpLmxlbmd0aD09MSYmdGhpcy4kcmVuZGVyTGluZShiLGYsaVswXS50b2tlbnMsITEpLHRoaXMuJHVzZUxpbmVHcm91cHMoKSYmYi5wdXNoKCI8L2Rpdj4iKSxmKyt9dGhpcy5lbGVtZW50PWUuc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCxiLmpvaW4oIiIpKX0sdGhpcy4kdGV4dFRva2VuPXt0ZXh0OiEwLHJwYXJlbjohMCxscGFyZW46ITB9LHRoaXMuJHJlbmRlclRva2VuPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMsZj0vXHR8Jnw8fCggKyl8KFtcdlxmIFx1MDBhMFx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAwYlx1MjAyOFx1MjAyOVx1MzAwMF0pfFtcdTExMDAtXHUxMTVGXXxbXHUxMUEzLVx1MTFBN118W1x1MTFGQS1cdTExRkZdfFtcdTIzMjktXHUyMzJBXXxbXHUyRTgwLVx1MkU5OV18W1x1MkU5Qi1cdTJFRjNdfFtcdTJGMDAtXHUyRkQ1XXxbXHUyRkYwLVx1MkZGQl18W1x1MzAwMC1cdTMwM0VdfFtcdTMwNDEtXHUzMDk2XXxbXHUzMDk5LVx1MzBGRl18W1x1MzEwNS1cdTMxMkRdfFtcdTMxMzEtXHUzMThFXXxbXHUzMTkwLVx1MzFCQV18W1x1MzFDMC1cdTMxRTNdfFtcdTMxRjAtXHUzMjFFXXxbXHUzMjIwLVx1MzI0N118W1x1MzI1MC1cdTMyRkVdfFtcdTMzMDAtXHU0REJGXXxbXHU0RTAwLVx1QTQ4Q118W1x1QTQ5MC1cdUE0QzZdfFtcdUE5NjAtXHVBOTdDXXxbXHVBQzAwLVx1RDdBM118W1x1RDdCMC1cdUQ3QzZdfFtcdUQ3Q0ItXHVEN0ZCXXxbXHVGOTAwLVx1RkFGRl18W1x1RkUxMC1cdUZFMTldfFtcdUZFMzAtXHVGRTUyXXxbXHVGRTU0LVx1RkU2Nl18W1x1RkU2OC1cdUZFNkJdfFtcdUZGMDEtXHVGRjYwXXxbXHVGRkUwLVx1RkZFNl0vZyxoPWZ1bmN0aW9uKGEsYyxkLGYsaCl7aWYoYS5jaGFyQ29kZUF0KDApPT0zMilyZXR1cm4obmV3IEFycmF5KGEubGVuZ3RoKzEpKS5qb2luKCImIzE2MDsiKTtpZihhPT0iXHQiKXt2YXIgaT1lLnNlc3Npb24uZ2V0U2NyZWVuVGFiU2l6ZShiK2YpO3JldHVybiBiKz1pLTEsZS4kdGFiU3RyaW5nc1tpXX1pZihhPT0iJiIpcmV0dXJuIGcuaXNPbGRHZWNrbz8iJiI6IiZhbXA7IjtpZihhPT0iPCIpcmV0dXJuIiZsdDsiO2lmKGE9PSLjgIAiKXt2YXIgaj1lLnNob3dJbnZpc2libGVzPyJhY2VfY2prIGFjZV9pbnZpc2libGUiOiJhY2VfY2prIixrPWUuc2hvd0ludmlzaWJsZXM/ZS5TUEFDRV9DSEFSOiIiO3JldHVybiBiKz0xLCI8c3BhbiBjbGFzcz0nIitqKyInIHN0eWxlPSd3aWR0aDoiK2UuY29uZmlnLmNoYXJhY3RlcldpZHRoKjIrInB4Jz4iK2srIjwvc3Bhbj4ifWlmKGEubWF0Y2goL1tcdlxmIFx1MDBhMFx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAwYlx1MjAyOFx1MjAyOVx1MzAwMF0vKSl7aWYoZS5zaG93SW52aXNpYmxlcyl7dmFyIGs9KG5ldyBBcnJheShhLmxlbmd0aCsxKSkuam9pbihlLlNQQUNFX0NIQVIpO3JldHVybiI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+IitrKyI8L3NwYW4+In1yZXR1cm4iJiMxNjA7In1yZXR1cm4gYis9MSwiPHNwYW4gY2xhc3M9J2FjZV9jamsnIHN0eWxlPSd3aWR0aDoiK2UuY29uZmlnLmNoYXJhY3RlcldpZHRoKjIrInB4Jz4iK2ErIjwvc3Bhbj4ifSxpPWQucmVwbGFjZShmLGgpO2lmKCF0aGlzLiR0ZXh0VG9rZW5bYy50eXBlXSl7dmFyIGo9ImFjZV8iK2MudHlwZS5yZXBsYWNlKC9cLi9nLCIgYWNlXyIpLGs9IiI7Yy50eXBlPT0iZm9sZCImJihrPSIgc3R5bGU9J3dpZHRoOiIrYy52YWx1ZS5sZW5ndGgqdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgrInB4OycgIiksYS5wdXNoKCI8c3BhbiBjbGFzcz0nIixqLCInIixrLCI+IixpLCI8L3NwYW4+Iil9ZWxzZSBhLnB1c2goaSk7cmV0dXJuIGIrZC5sZW5ndGh9LHRoaXMuJHJlbmRlckxpbmVDb3JlPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9MCxnPTAsaCxpPTAsaj10aGlzOyFkfHxkLmxlbmd0aD09MD9oPU51bWJlci5NQVhfVkFMVUU6aD1kWzBdLGV8fGEucHVzaCgiPGRpdiBjbGFzcz0nYWNlX2xpbmUnIHN0eWxlPSdoZWlnaHQ6Iix0aGlzLmNvbmZpZy5saW5lSGVpZ2h0LCJweCIsIic+Iik7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspe3ZhciBsPWNba10sbT1sLnZhbHVlO2lmKGYrbS5sZW5ndGg8aClpPWouJHJlbmRlclRva2VuKGEsaSxsLG0pLGYrPW0ubGVuZ3RoO2Vsc2V7d2hpbGUoZittLmxlbmd0aD49aClpPWouJHJlbmRlclRva2VuKGEsaSxsLG0uc3Vic3RyaW5nKDAsaC1mKSksbT1tLnN1YnN0cmluZyhoLWYpLGY9aCxlfHxhLnB1c2goIjwvZGl2PiIsIjxkaXYgY2xhc3M9J2FjZV9saW5lJyBzdHlsZT0naGVpZ2h0OiIsdGhpcy5jb25maWcubGluZUhlaWdodCwicHgiLCInPiIpLGcrKyxpPTAsaD1kW2ddfHxOdW1iZXIuTUFYX1ZBTFVFO20ubGVuZ3RoIT0wJiYoZis9bS5sZW5ndGgsaT1qLiRyZW5kZXJUb2tlbihhLGksbCxtKSl9fXRoaXMuc2hvd0ludmlzaWJsZXMmJihiIT09dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTE/YS5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+Iit0aGlzLkVPTF9DSEFSKyI8L3NwYW4+Iik6YS5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+Iit0aGlzLkVPRl9DSEFSKyI8L3NwYW4+IikpLGV8fGEucHVzaCgiPC9kaXY+Iil9LHRoaXMuJHJlbmRlckxpbmU9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIXRoaXMuc2Vzc2lvbi5pc1Jvd0ZvbGRlZChiKSl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFJvd1NwbGl0RGF0YShiKTt0aGlzLiRyZW5kZXJMaW5lQ29yZShhLGIsYyxlLGQpfWVsc2UgdGhpcy4kcmVuZGVyRm9sZExpbmUoYSxiLGMsZCl9LHRoaXMuJHJlbmRlckZvbGRMaW5lPWZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGgoYSxiLGMpe3ZhciBkPTAsZT0wO3doaWxlKGUrYVtkXS52YWx1ZS5sZW5ndGg8Yil7ZSs9YVtkXS52YWx1ZS5sZW5ndGgsZCsrO2lmKGQ9PWEubGVuZ3RoKXJldHVybn1pZihlIT1iKXt2YXIgZj1hW2RdLnZhbHVlLnN1YnN0cmluZyhiLWUpO2YubGVuZ3RoPmMtYiYmKGY9Zi5zdWJzdHJpbmcoMCxjLWIpKSxnLnB1c2goe3R5cGU6YVtkXS50eXBlLHZhbHVlOmZ9KSxlPWIrZi5sZW5ndGgsZCs9MX13aGlsZShlPGMpe3ZhciBmPWFbZF0udmFsdWU7Zi5sZW5ndGgrZT5jJiYoZj1mLnN1YnN0cmluZygwLGMtZSkpLGcucHVzaCh7dHlwZTphW2RdLnR5cGUsdmFsdWU6Zn0pLGUrPWYubGVuZ3RoLGQrPTF9fXZhciBlPXRoaXMuc2Vzc2lvbixmPWUuZ2V0Rm9sZExpbmUoYiksZz1bXTtmLndhbGsoZnVuY3Rpb24oYSxiLGQsZSxmKXthP2cucHVzaCh7dHlwZToiZm9sZCIsdmFsdWU6YX0pOihmJiYoYz10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGIsYilbMF0udG9rZW5zKSxjLmxlbmd0aCE9MCYmaChjLGUsZCkpfS5iaW5kKHRoaXMpLGYuZW5kLnJvdyx0aGlzLnNlc3Npb24uZ2V0TGluZShmLmVuZC5yb3cpLmxlbmd0aCk7dmFyIGk9dGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZT90aGlzLnNlc3Npb24uJHdyYXBEYXRhW2JdOm51bGw7dGhpcy4kcmVuZGVyTGluZUNvcmUoYSxiLGcsaSxkKX0sdGhpcy4kdXNlTGluZUdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciksdGhpcy4kbWVhc3VyZU5vZGUmJnRoaXMuJG1lYXN1cmVOb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kbWVhc3VyZU5vZGUpLGRlbGV0ZSB0aGlzLiRtZWFzdXJlTm9kZX19KSkuY2FsbChpLnByb3RvdHlwZSksYi5UZXh0PWl9KSxkZWZpbmUoImFjZS9sYXllci9jdXJzb3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpLGU9ZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50PWQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9jdXJzb3ItbGF5ZXIiLGEuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLmN1cnNvcj1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY3Vyc29yLmNsYXNzTmFtZT0iYWNlX2N1cnNvciBhY2VfaGlkZGVuIix0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jdXJzb3IpLHRoaXMuaXNWaXNpYmxlPSExfTsoKGZ1bmN0aW9uKCl7dGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihhKXt0aGlzLiRwYWRkaW5nPWF9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy5pc1Zpc2libGU9ITEsZC5hZGRDc3NDbGFzcyh0aGlzLmN1cnNvciwiYWNlX2hpZGRlbiIpLGNsZWFySW50ZXJ2YWwodGhpcy5ibGlua0lkKX0sdGhpcy5zaG93Q3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy5pc1Zpc2libGU9ITAsZC5yZW1vdmVDc3NDbGFzcyh0aGlzLmN1cnNvciwiYWNlX2hpZGRlbiIpLHRoaXMuY3Vyc29yLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMucmVzdGFydFRpbWVyPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmJsaW5rSWQpO2lmKCF0aGlzLmlzVmlzaWJsZSlyZXR1cm47dmFyIGE9dGhpcy5jdXJzb3I7dGhpcy5ibGlua0lkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7YS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUifSw0MDApfSwxZTMpfSx0aGlzLmdldFBpeGVsUG9zaXRpb249ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5jb25maWd8fCF0aGlzLnNlc3Npb24pcmV0dXJue2xlZnQ6MCx0b3A6MH07YXx8KGE9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKSk7dmFyIGM9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihhKSxkPU1hdGgucm91bmQodGhpcy4kcGFkZGluZytjLmNvbHVtbip0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCksZT0oYy5yb3ctKGI/dGhpcy5jb25maWcuZmlyc3RSb3dTY3JlZW46MCkpKnRoaXMuY29uZmlnLmxpbmVIZWlnaHQ7cmV0dXJue2xlZnQ6ZCx0b3A6ZX19LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMuY29uZmlnPWEsdGhpcy5waXhlbFBvcz10aGlzLmdldFBpeGVsUG9zaXRpb24obnVsbCwhMCksdGhpcy5jdXJzb3Iuc3R5bGUubGVmdD10aGlzLnBpeGVsUG9zLmxlZnQrInB4Iix0aGlzLmN1cnNvci5zdHlsZS50b3A9dGhpcy5waXhlbFBvcy50b3ArInB4Iix0aGlzLmN1cnNvci5zdHlsZS53aWR0aD1hLmNoYXJhY3RlcldpZHRoKyJweCIsdGhpcy5jdXJzb3Iuc3R5bGUuaGVpZ2h0PWEubGluZUhlaWdodCsicHgiO3ZhciBiPXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKTtiIT10aGlzLm92ZXJ3cml0ZSYmKHRoaXMub3ZlcndyaXRlPWIsYj9kLmFkZENzc0NsYXNzKHRoaXMuY3Vyc29yLCJhY2Vfb3ZlcndyaXRlIik6ZC5yZW1vdmVDc3NDbGFzcyh0aGlzLmN1cnNvciwiYWNlX292ZXJ3cml0ZSIpKSx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuYmxpbmtJZCl9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuQ3Vyc29yPWV9KSxkZWZpbmUoImFjZS9zY3JvbGxiYXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9kb20iKSxmPWEoIi4vbGliL2V2ZW50IiksZz1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGg9ZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50PWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX3NiIix0aGlzLmlubmVyPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW5uZXIpLGEuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLndpZHRoPWUuc2Nyb2xsYmFyV2lkdGgoYS5vd25lckRvY3VtZW50KSx0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9KHRoaXMud2lkdGh8fDE1KSs1KyJweCIsZi5hZGRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsInNjcm9sbCIsdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpKX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZyksdGhpcy5vblNjcm9sbD1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInNjcm9sbCIse2RhdGE6dGhpcy5lbGVtZW50LnNjcm9sbFRvcH0pfSx0aGlzLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGh9LHRoaXMuc2V0SGVpZ2h0PWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9YSsicHgifSx0aGlzLnNldElubmVySGVpZ2h0PWZ1bmN0aW9uKGEpe3RoaXMuaW5uZXIuc3R5bGUuaGVpZ2h0PWErInB4In0sdGhpcy5zZXRTY3JvbGxUb3A9ZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50LnNjcm9sbFRvcD1hfX0pKS5jYWxsKGgucHJvdG90eXBlKSxiLlNjcm9sbEJhcj1ofSksZGVmaW5lKCJhY2UvcmVuZGVybG9vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL2V2ZW50IiksZT1mdW5jdGlvbihhLGIpe3RoaXMub25SZW5kZXI9YSx0aGlzLnBlbmRpbmc9ITEsdGhpcy5jaGFuZ2VzPTAsdGhpcy53aW5kb3c9Ynx8d2luZG93fTsoKGZ1bmN0aW9uKCl7dGhpcy5zY2hlZHVsZT1mdW5jdGlvbihhKXt0aGlzLmNoYW5nZXM9dGhpcy5jaGFuZ2VzfGE7aWYoIXRoaXMucGVuZGluZyl7dGhpcy5wZW5kaW5nPSEwO3ZhciBiPXRoaXM7ZC5uZXh0VGljayhmdW5jdGlvbigpe2IucGVuZGluZz0hMTt2YXIgYTt3aGlsZShhPWIuY2hhbmdlcyliLmNoYW5nZXM9MCxiLm9uUmVuZGVyKGEpfSx0aGlzLndpbmRvdyl9fX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLlJlbmRlckxvb3A9ZX0pLGRlZmluZSgidGV4dCFhY2UvY3NzL2VkaXRvci5jc3MiLFtdLCJAaW1wb3J0IHVybCgvL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2FucytNb25vKTtcblxuXG4uYWNlX2VkaXRvciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnTWVubG8nLCAnVWJ1bnR1IE1vbm8nLCAnRHJvaWQgU2FucyBNb25vJywgJ0NvbnNvbGFzJywgbW9ub3NwYWNlO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLmFjZV9zY3JvbGxlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XG59XG5cbi5hY2VfY29udGVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBjdXJzb3I6IHRleHQ7XG59XG5cbi5hY2VfY29tcG9zaXRpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kOiAjNTU1O1xuICAgIGNvbG9yOiAjREREO1xuICAgIHotaW5kZXg6IDQ7XG59XG5cbi5hY2VfZ3V0dGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3cgOiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmFjZV9ndXR0ZXItY2VsbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxOXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cblxuLmFjZV9ndXR0ZXItY2VsbC5hY2VfZXJyb3Ige1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmLEdJRjg5YSUxMCUwMCUxMCUwMCVENSUwMCUwMCVGNW9yJUY1JTg3JTg4JUY1bnIlRjRucyVFQm1xJUY1eiU3RiVEREpUJURFS1MlREZPVyVGMVljJUYyYWglQ0UoNyVDRSk4JUQxOEUlREQlNDBNJUYyS1olRUJVJTYwJUY0JTYwbSVEQ2lyJUM4JTE2KCVDOCUxOSolQ0UlMjU1JUYxJTNGUiVGMSUzRlMlRTYlQUIlQjUlQ0ElNURJJUNFbiU1RSVGNyVBMiU5QSVDOUclM0UlRTBhJTVCJUY3JTg5JTg1JUY1eXklRjYlODIlODAlRUQlODIlODAlRkYlQkYlQkYlRTMlQzQlQzQlRkYlRkYlRkYlRkYlRkYlRkYlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAhJUY5JTA0JTAxJTAwJTAwJTI1JTAwJTJDJTAwJTAwJTAwJTAwJTEwJTAwJTEwJTAwJTAwJTA2cCVDMCU5MnBIJTJDJTFBJThGJUM4JUQySCU5MyVFMWQ0JTIzJUU0JTg4JUQzJTA5bUIlMUROJUI0OCVGNSU5MCU0MCU2MCU5MkclNUIlOTQlMjAlM0UlMjIlRDIlODclMjQlRkElMjAlMjQlQzUlMDZBJTAwJTIwJUIxJTA3JTAyQiVBMzglODlYLnYlMTclODIlMTElMTNxJTEwJTBGaSUyNCUwRiU4QiUxMCU3QkQlMTIlMEVpJTA5JTkyJTA5JTBFcEQlMTglMTUlMjQlMEElOUNpJTA1JTBDJTE4RiUxOCUwQiUwNyUwNCUwMSUwNCUwNiVBMEglMTglMTIlMEQlMTQlMEQlMTIlQTFJJUIzJUI0JUI1SUElMDAlM0JcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xufVxuXG4uYWNlX2d1dHRlci1jZWxsLmFjZV93YXJuaW5nIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL2dpZixHSUY4OWElMTAlMDAlMTAlMDAlRDUlMDAlMDAlRkYlREJyJUZGJURFJTgxJUZGJUUyJThEJUZGJUUyJThGJUZGJUU0JTk2JUZGJUUzJTk3JUZGJUU1JTlEJUZGJUU2JTlFJUZGJUVFJUMxJUZGJUM4WiVGRiVDRGslRkYlRDBzJUZGJUQ0JTgxJUZGJUQ1JTgyJUZGJUQ1JTgzJUZGJURDJTk3JUZGJURFJTlEJUZGJUU3JUI4JUZGJUNDbCU3QlElMTMlODBVJTE1JTgyVyUxNiU4MVUlMTYlODklNUIlMTglODclNUIlMTglOEMlNUUlMUElOTRkJTFEJUM1JTgzLSVDOSU4NyUyRiVDNiU4NC4lQzYlODUuJUNEJThCMiVDOSU4NzElQ0IlOEEzJUNEJThCNSVEQyU5OCUzRiVERiU5QkIlRTAlOUNDJUUxJUE1VSVDQiU4NzElQ0YlOEI1JUQxJThENiVEQiU5NyU0MCVERiU5QUIlREQlOTlCJUUzJUIwcCVFNyVDQyVBRSVGRiVGRiVGRiUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCElRjklMDQlMDElMDAlMDAlMkYlMDAlMkMlMDAlMDAlMDAlMDAlMTAlMDAlMTAlMDAlMDAlMDZhJUMwJTk3cEglMkMlMUElOEZIJUExJUFCVHIlMjUlODclMkIlMDQlODIlRjQlN0MlQjlYJTkxJTA4JUNCJTk5JTFDISUyNiUxMyU4NCppSjkoJTE1RyVDQSU4NCUxNCUwMSUxQSU5NyUwQyUwMyU4MCUzQSU5QSUzRSU4MSU4NCUzRSUxMSUwOCVCMSU4QiUyMCUwMiUxMiUwRiUxOCUxQSUwRiUwQSUwMydGJTFDJTA0JTBCJTEwJTE2JTE4JTEwJTBCJTA1JTFDRiUxRC0lMDYlMDclOUElOUEtJTFFRyUxQiVBMCVBMSVBMFUlQTQlQTUlQTZCQSUwMCUzQlwiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7XG59XG5cbi5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTVFBQUFBQUFFRkJRVkpTVWw1ZVhtUmtaR3RyYTM5L2Y0V0ZoWW1KaVpHUmthYW1wcnk4dk1QRHc4ek16TlhWMWR6YzNPVGs1T3JxNnZEdzhQLy8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFrQUFCUUFMQUFBQUFBUUFCQUFBQVV1SUNXT1pHbWVhQm1sNVhHd0ZDUVNCR3lYUlNBd3RxUUlpUnVpd0lNNUJvWVZiRUZJeUdDUW9lSkdyVnB0SVFBN1wiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7XG59XG5cbi5hY2VfZWRpdG9yIC5hY2Vfc2Ige1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIHJpZ2h0OiAwO1xufVxuXG4uYWNlX2VkaXRvciAuYWNlX3NiIGRpdiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxcHg7XG4gICAgbGVmdDogMDtcbn1cblxuLmFjZV9lZGl0b3IgLmFjZV9wcmludF9tYXJnaW5fbGF5ZXIge1xuICAgIHotaW5kZXg6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uYWNlX2VkaXRvciAuYWNlX3ByaW50X21hcmdpbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLmFjZV9lZGl0b3IgdGV4dGFyZWEge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB6LWluZGV4OiAwO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICByZXNpemU6IG5vbmU7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uYWNlX2xheWVyIHtcbiAgICB6LWluZGV4OiAxO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAvKiBzZXR0aW5nIHBvaW50ZXItZXZlbnRzOiBhdXRvOyBvbiBub2RlIHVuZGVyIHRoZSBtb3VzZSwgd2hpY2ggY2hhbmdlc1xuICAgICAgICBkdXJpbmcgc2Nyb2xsLCB3aWxsIGJyZWFrIG1vdXNlIHdoZWVsIHNjcm9sbGluZyBpbiBTYWZhcmkgKi9cbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFjZV9ndXR0ZXIgLmFjZV9sYXllciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1pbi13aWR0aDogNDBweDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLmFjZV90ZXh0LWxheWVyIHtcbiAgICBjb2xvcjogYmxhY2s7XG59XG5cbi5hY2VfY2prIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uYWNlX2N1cnNvci1sYXllciB7XG4gICAgei1pbmRleDogNDtcbn1cblxuLmFjZV9jdXJzb3Ige1xuICAgIHotaW5kZXg6IDQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uYWNlX2N1cnNvci5hY2VfaGlkZGVuIHtcbiAgICBvcGFjaXR5OiAwLjI7XG59XG5cbi5hY2VfbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMztcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiA0O1xufVxuXG4uYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiA1O1xufVxuXG4uYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMjtcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogNjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5hY2VfbGluZSAuYWNlX2ZvbGQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgaGVpZ2h0OiAxMXB4O1xuICAgIG1hcmdpbi10b3A6IC0ycHg7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgIGJhY2tncm91bmQtaW1hZ2U6IFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwNyUwOCUwNiUwMCUwMCUwMCVDNCVERCU4MEMlMDAlMDAlMDMlMUVpQ0NQSUNDJTIwUHJvZmlsZSUwMCUwMHglMDElODVUJURGayVEM1AlMTQlRkUlREFlJTlEJUIwJUUxJThCJTNBZyUxMSUwOSUzRWglOTFuZFN0QyU5QyVCNmtXJUJBJUNEWiVFQTYlQjchSCU5QiVBNm0lNUMlOUElQzYlMjQlRUR+JUIwJTA3JUQ5JThCbyUzQSVDNXclRjElMDclM0UlRjklMDclMEMlRDklODNvJTdCJTkyJTBEJUM2JTE0YSVGOCVBQyU4OCUyMkwlRjYlMjIlQjMlOUUlOUI0TSdTJTAzJUI5JUY3JUJCJURGJUY5JUVFOSclRTclRTQlNUUlQTAlRjlxWiVEMyUxNCUyRiUwRiUxNFVTTyVDNSVDMiVGQyVDNCVFNCUxNCVERiVGMiUwMSU1RSUxQ0MlMkIlRkNoTSU4QiU4NiUxNkolMjZHJTQwJTBGJUQzJUIyeSVFRiVCMyVGMyUwRSUxRSVDNmx0JUVFbyVERiVBQiVGRWMlRDUlOUElOTUlMEMlMTElRjAlMUMlMjAlQkUlOTQ1JUM0JTIyJUUxWSVBMGklNUMlRDR0JTEzJUUwJUQ2JTg5JUVGJTlEMTUlQzIlQ0RMc1glQTclMDQlMDklMUZnOG9jJTgxJUUxJThDJThEJTIzJTk2ZjQ1JTQwJTlBJTA5JUMyJTA3JUM1QiUzQUslQjglNDA4JTk4aSVFMCVGMyUwRCVEOCVDRSU4MSUxNCVFNCclMjYlQTklOTIuJThCJTNDJUFCRVIlMkYlRTVkRSVCMiUwQyVGNiVGMCUxRnMlODMlRjJfJUIwJUE4JTk0JUU5JTlCJUFEJUU3JTEwJThEbSU5QSUxOU4lRDElN0MlOEElREUlMUY5JTdEcCU4QyVFNiUwMCVENSVDMSUzRl8lMTglQkRBJUI4JTlEcFg2JUUzJUEzNX5CJUNEJTI0JUFFJTExJTI2JUJEJUU3JUVFdGklOTglRURlJTlBJTk3WSklMTIlMjUlMUMlMjQlQkNiVCVBRTNsaSVFNiUwQiUwMyU4OSU5QSVFNiVEMyVFRCVGNFAlOTIlQjAlOUY0JUJGNDNZJUYzJUUzJUVEUCU5NSUwNCVFQjElQzUlRjUlRjZLRiVGNCVCQSVCRCVENyVEQiU5MSU5MyUwNyVFMzUlM0UlQTcpJUQ2JTdGJTQwJUZFJUJEJUY3JUY1ciU4QSVFNXklOTIlRjAlRUIlQjQlMUUlOEQlRDUlRjQlNUIlOTIlM0FWJURCJURCJUU0JUNEJUE2JTIzJUMzJUM0d1ElM0YlMDNIQiU4MiU4RSUxQ2QoJUUwJTkxQiUwQ2ElOUFjJUM0JUFBJUY4TCUxNiUxOSUyMkolQTQlRDJpdFR5JUIyOCVENiUzQiglOTMlOTYlRUQlMUNHeCVDOV8lMEUlQjglNUUlMTYlRjUlNUIlQjIlQjglRjYlRTAlRkIlOUUlREQlMjUlRDclOEUlQkMlMTUlODUlQzUlQjclQTMlRDhRJUVEJUI1JTgxJUU5JUJBJUIyJTEzJTlBJTFCJTdGdWElQTUlQTNuJUUxNyVCOSVFNSU5QiUxQm0lQUIlMEIlMDhRJUZFJThBJUU1JUIxSCU1RWUlQ0FPJTgyUSVEN3U2JUU2JTkwUyU5NyVGQ3UlMEIlQ0YyJTk0JUVFJTI1diUxMlglMEMlQkElQUMlRjAlNUUlRjgqbCUwQU8lODUlMTclQzIlOTclQkYlRDQlQzglQ0UlREUlQUQlMTElQ0IlODBxJTJDJTNFJUFCJTlFUyVDRCVDNiVFQyUyNSVEMkwlRDIlRUJkJUI4JUJGJThBJUY1QiVDNiUxOCVGOSU5MDFDWiU5RCVCRSUyNE0lOUMlOEE5JUYyJURBUCUwQiclMDZ3JTgyJUVCJUU2JUUyJTVDJTJGJUQ3JTA3JTlFJUJCJUNDJTVEJUUxJUZBJUI5JTA4JUFELnIlMjMlOEUlQzIlMTclRjVFJTdDISVGMCVCRTMlQkUlM0VfJUI3byU4OGElQTclREIlQkUlRDNkJUVCJUEzMVolRUIlQkIlRDMlOTElQkElQTIlQjF6JTk0JThGJURCJyVGNiUzRCU4RSVBQSUxMyUxOSVCMiVCMSVCRSVCMX5WJTA4JTJCJUI0JUEyY2pKJUIzdE8lMDAlMDMlMjVtTiU5NyVGMyUwNSU5MyVFRiUxMSU4NCUwQiU3QyU4OCVBRS0lODklOEYlQUJiVyU5ME8lMkIlMEFvJTk5JTBDJTVFJTk3JTBDSSVBRkglRDkuJUIwJTNCJThGJUVEJTAzJUI2UyVENiU1RCVFNmlfczklRjMqcCVFOSUxQiVGRCVDMyVFQi43VSUwNiU1RSUxOSVDMCVEMXMuJTE3JUEwM3UlRTQlMDklQjAlN0MlNUUlMkMlRUIlMTUlREIlMUYlM0MlOUUlQjclODAlOTElM0IlREJjJUFEJTNEbWElQkElOEIlM0VWJUFCJURCdC4lNUIlMUUlMDElQkIlMEYlQUIlRDUlOUYlQ0YlQUElRDUlREQlRTclRTQlN0YlMEJ4JUEzJUZDJTA2JUE5JTIzJTBBJUQ2JUMyJUExXzIlMDAlMDAlMDAlMDlwSFlzJTAwJTAwJTBCJTEzJTAwJTAwJTBCJTEzJTAxJTAwJTlBJTlDJTE4JTAwJTAwJTAwJTNBSURBVDglMTFjJUZDJUZGJUZGJTdGJTE4JTAzJTFBJTYwJTAxJUYyJTNGJUEwJTg5MSU4MCUwNCVGRiUxMS0lRjglMTclOUJKJUUyJTA1JUIxWkQlODF2JTI2dCVFNyU4MCVGOCVBMyU4MmglQTEyJTFBJTIwJUEzJTAxJTAyJTBGJTAxJUJBJTI1JTA2JTAwJTE5JUMwJTBEJUFFRiVENSUzRVMlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgXG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uYWNlX2RhcmsgLmFjZV9mb2xkIHtcbn1cblxuLmFjZV9mb2xkOmhvdmVye1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwNyUwOCUwNiUwMCUwMCUwMCVDNCVERCU4MEMlMDAlMDAlMDMlMUVpQ0NQSUNDJTIwUHJvZmlsZSUwMCUwMHglMDElODVUJURGayVEM1AlMTQlRkUlREFlJTlEJUIwJUUxJThCJTNBZyUxMSUwOSUzRWglOTFuZFN0QyU5QyVCNmtXJUJBJUNEWiVFQTYlQjchSCU5QiVBNm0lNUMlOUElQzYlMjQlRUR+JUIwJTA3JUQ5JThCbyUzQSVDNXclRjElMDclM0UlRjklMDclMEMlRDklODNvJTdCJTkyJTBEJUM2JTE0YSVGOCVBQyU4OCUyMkwlRjYlMjIlQjMlOUUlOUI0TSdTJTAzJUI5JUY3JUJCJURGJUY5JUVFOSclRTclRTQlNUUlQTAlRjlxWiVEMyUxNCUyRiUwRiUxNFVTTyVDNSVDMiVGQyVDNCVFNCUxNCVERiVGMiUwMSU1RSUxQ0MlMkIlRkNoTSU4QiU4NiUxNkolMjZHJTQwJTBGJUQzJUIyeSVFRiVCMyVGMyUwRSUxRSVDNmx0JUVFbyVERiVBQiVGRWMlRDUlOUElOTUlMEMlMTElRjAlMUMlMjAlQkUlOTQ1JUM0JTIyJUUxWSVBMGklNUMlRDR0JTEzJUUwJUQ2JTg5JUVGJTlEMTUlQzIlQ0RMc1glQTclMDQlMDklMUZnOG9jJTgxJUUxJThDJThEJTIzJTk2ZjQ1JTQwJTlBJTA5JUMyJTA3JUM1QiUzQUslQjglNDA4JTk4aSVFMCVGMyUwRCVEOCVDRSU4MSUxNCVFNCclMjYlQTklOTIuJThCJTNDJUFCRVIlMkYlRTVkRSVCMiUwQyVGNiVGMCUxRnMlODMlRjJfJUIwJUE4JTk0JUU5JTlCJUFEJUU3JTEwJThEbSU5QSUxOU4lRDElN0MlOEElREUlMUY5JTdEcCU4QyVFNiUwMCVENSVDMSUzRl8lMTglQkRBJUI4JTlEcFg2JUUzJUEzNX5CJUNEJTI0JUFFJTExJTI2JUJEJUU3JUVFdGklOTglRURlJTlBJTk3WSklMTIlMjUlMUMlMjQlQkNiVCVBRTNsaSVFNiUwQiUwMyU4OSU5QSVFNiVEMyVFRCVGNFAlOTIlQjAlOUY0JUJGNDNZJUYzJUUzJUVEUCU5NSUwNCVFQjElQzUlRjUlRjZLRiVGNCVCQSVCRCVENyVEQiU5MSU5MyUwNyVFMzUlM0UlQTcpJUQ2JTdGJTQwJUZFJUJEJUY3JUY1ciU4QSVFNXklOTIlRjAlRUIlQjQlMUUlOEQlRDUlRjQlNUIlOTIlM0FWJURCJURCJUU0JUNEJUE2JTIzJUMzJUM0d1ElM0YlMDNIQiU4MiU4RSUxQ2QoJUUwJTkxQiUwQ2ElOUFjJUM0JUFBJUY4TCUxNiUxOSUyMkolQTQlRDJpdFR5JUIyOCVENiUzQiglOTMlOTYlRUQlMUNHeCVDOV8lMEUlQjglNUUlMTYlRjUlNUIlQjIlQjglRjYlRTAlRkIlOUUlREQlMjUlRDclOEUlQkMlMTUlODUlQzUlQjclQTMlRDhRJUVEJUI1JTgxJUU5JUJBJUIyJTEzJTlBJTFCJTdGdWElQTUlQTNuJUUxNyVCOSVFNSU5QiUxQm0lQUIlMEIlMDhRJUZFJThBJUU1JUIxSCU1RWUlQ0FPJTgyUSVEN3U2JUU2JTkwUyU5NyVGQ3UlMEIlQ0YyJTk0JUVFJTI1diUxMlglMEMlQkElQUMlRjAlNUUlRjgqbCUwQU8lODUlMTclQzIlOTclQkYlRDQlQzglQ0UlREUlQUQlMTElQ0IlODBxJTJDJTNFJUFCJTlFUyVDRCVDNiVFQyUyNSVEMkwlRDIlRUJkJUI4JUJGJThBJUY1QiVDNiUxOCVGOSU5MDFDWiU5RCVCRSUyNE0lOUMlOEE5JUYyJURBUCUwQiclMDZ3JTgyJUVCJUU2JUUyJTVDJTJGJUQ3JTA3JTlFJUJCJUNDJTVEJUUxJUZBJUI5JTA4JUFELnIlMjMlOEUlQzIlMTclRjVFJTdDISVGMCVCRTMlQkUlM0VfJUI3byU4OGElQTclREIlQkUlRDNkJUVCJUEzMVolRUIlQkIlRDMlOTElQkElQTIlQjF6JTk0JThGJURCJyVGNiUzRCU4RSVBQSUxMyUxOSVCMiVCMSVCRSVCMX5WJTA4JTJCJUI0JUEyY2pKJUIzdE8lMDAlMDMlMjVtTiU5NyVGMyUwNSU5MyVFRiUxMSU4NCUwQiU3QyU4OCVBRS0lODklOEYlQUJiVyU5ME8lMkIlMEFvJTk5JTBDJTVFJTk3JTBDSSVBRkglRDkuJUIwJTNCJThGJUVEJTAzJUI2UyVENiU1RCVFNmlfczklRjMqcCVFOSUxQiVGRCVDMyVFQi43VSUwNiU1RSUxOSVDMCVEMXMuJTE3JUEwM3UlRTQlMDklQjAlN0MlNUUlMkMlRUIlMTUlREIlMUYlM0MlOUUlQjclODAlOTElM0IlREJjJUFEJTNEbWElQkElOEIlM0VWJUFCJURCdC4lNUIlMUUlMDElQkIlMEYlQUIlRDUlOUYlQ0YlQUElRDUlREQlRTclRTQlN0YlMEJ4JUEzJUZDJTA2JUE5JTIzJTBBJUQ2JUMyJUExXzIlMDAlMDAlMDAlMDlwSFlzJTAwJTAwJTBCJTEzJTAwJTAwJTBCJTEzJTAxJTAwJTlBJTlDJTE4JTAwJTAwJTAwM0lEQVQ4JTExYyVGQyVGRiVGRiU3RiUzRSUwMyUxQSU2MCUwMSVGMiUzRiVBMyU4OTElODAlMDQlRkZRJTI2JUY4dyVDMCVCNDMlQTElREIlMEMlRTIlOEYlMEElQTIlODUlQ0FoJTgwJThDJTA2JTA4JTNDJTA0JUU4JTk2JTE4JTAwJUEzUyUwRCVDRCVDRiVEOCVDMSU5RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQsIHJlcGVhdC14O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O1xufVxuXG4uYWNlX2RyYWdnaW5nIC5hY2VfY29udGVudCB7XG4gICAgY3Vyc29yOiBtb3ZlO1xufVxuXG4uYWNlX2ZvbGRpbmctZW5hYmxlZCA+IC5hY2VfZ3V0dGVyLWNlbGwge1xuICAgIHBhZGRpbmctcmlnaHQ6IDEzcHg7XG59XG5cbi5hY2VfZm9sZC13aWRnZXQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAgIG1hcmdpbjogMCAtMTJweCAxcHggMXB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBoZWlnaHQ6IDE0cHg7XG4gICAgd2lkdGg6IDExcHg7XG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuICAgIFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDAlMDUlMDglMDYlMDAlMDAlMDAlOERvJTI2JUU1JTAwJTAwJTAwNElEQVR4JURBZSU4QSVCMSUwRCUwMDAlMEMlQzIlRjIlMkNLJTk2JUJDJUQwJThGOSU4MSU4OEglRTklRDAlMEUlOTYlQzAlMTAlOTIlM0UlMDIlODAlNUUlODIlRTQlQTkqLSVFRXN3JUM4JUNDJTExJUVFJTk2dyVEOCVEQyVFOSpFaCUwQyUxNTEoJTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgNXB4O1xuXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYWNlX2ZvbGQtd2lkZ2V0LmVuZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMCUwNSUwOCUwNiUwMCUwMCUwMCU4RG8lMjYlRTUlMDAlMDAlMDA0SURBVHglREFtJUM3JUMxJTA5JTAwMCUwOEMlRDElOEMlRUNFJUM4RSglOEUlRUMlMDIpJTFFWkolRjElQzEnJTA0JTA3SSVFMSVFNSVFRSVDQUwlRjUlQTIlOTklOTklMjIlRTIlRDYlMUZVJUI1JUZFMCVEOXglQTclMjZXejUlMEUlRDUlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbn1cblxuLmFjZV9mb2xkLXdpZGdldC5jbG9zZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDMlMDAlMDAlMDAlMDYlMDglMDYlMDAlMDAlMDAlMDYlRTUlMjQlMEMlMDAlMDAlMDA5SURBVHglREE1JUNBJUMxJTA5JTAwMCUwOCUwMyVDMCVBQyooJTNFJTA0JUMxJTBEJUJBJUIxJTIzJUE0VWglRTAlMjAlODElQzAlQ0MlRjglODIlODElQUElQTIlQUFyR2ZyJTg4JTA4JTExJTExJTFDJUREJTdEJUUwJUVFJTVCJUY2JUY2JUNCJUI4JTA1USUyRiVFOXRhaSVEOSUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xufVxuXG4uYWNlX2ZvbGQtd2lkZ2V0OmhvdmVyIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICAgIC1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgIC1tb3otYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDRweDtcbn1cblxuLmFjZV9mb2xkLXdpZGdldDphY3RpdmUge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAgIC1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiAgICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUpO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcbiAgICBib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUpO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG59XG5cbi5hY2VfZm9sZC13aWRnZXQuaW52YWxpZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGQjRCNDtcbiAgICBib3JkZXItY29sb3I6ICNERTU1NTU7XG59XG4iKSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dKy8sIiIpLGE9bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KyhhLmNoYXJBdCgwKT09Ii8iPyIiOmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sIiIpKSsiLyIrYS5yZXBsYWNlKC9eW1wvXSsvLCIiKSxhfSx0aGlzLiRndWVzc0Jhc2VQYXRoPWZ1bmN0aW9uKCl7aWYoYS5hY2VCYXNlVXJsKXJldHVybiBhLmFjZUJhc2VVcmw7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTtpZihlKXJldHVybiBlLnJlcGxhY2UoL1wvKiQvLCIvIik7dmFyIGY9ZC5zcmN8fGQuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZighZiljb250aW51ZTt2YXIgZz1mLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7aWYoZylyZXR1cm4gZ1sxXXx8Z1syXX1yZXR1cm4iIn0sdGhpcy50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLHt9KSx0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwsdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lciksdGhpcy4kZG9jPW51bGx9LHRoaXMuc2VuZD1mdW5jdGlvbihhLGIpe3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDphLGFyZ3M6Yn0pfSx0aGlzLmNhbGw9ZnVuY3Rpb24oYSxiLGMpe2lmKGMpe3ZhciBkPXRoaXMuY2FsbGJhY2tJZCsrO3RoaXMuY2FsbGJhY2tzW2RdPWMsYi5wdXNoKGQpfXRoaXMuc2VuZChhLGIpfSx0aGlzLmVtaXQ9ZnVuY3Rpb24oYSxiKXt0cnl7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDphLGRhdGE6e2RhdGE6Yi5kYXRhfX0pfWNhdGNoKGMpe319LHRoaXMuYXR0YWNoVG9Eb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLiRkb2MmJnRoaXMudGVybWluYXRlKCksdGhpcy4kZG9jPWEsdGhpcy5jYWxsKCJzZXRWYWx1ZSIsW2EuZ2V0VmFsdWUoKV0pLGEub24oImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lcil9LHRoaXMuY2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oYSl7YS5yYW5nZT17c3RhcnQ6YS5kYXRhLnJhbmdlLnN0YXJ0LGVuZDphLmRhdGEucmFuZ2UuZW5kfSx0aGlzLmVtaXQoImNoYW5nZSIsYSl9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuV29ya2VyQ2xpZW50PWZ9KSxkZWZpbmUoImFjZS90aGVtZS90ZXh0bWF0ZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixiLmlzRGFyaz0hMSxiLmNzc0NsYXNzPSJhY2UtdG0iLGIuY3NzVGV4dD0iLmFjZS10bSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG0gLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdG0gLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXRtIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRtIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICM2QjcyRTY7fS5hY2UtdG0gLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDt9LmFjZS10bSAuYWNlX2N1cnNvciB7ICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO30uYWNlLXRtIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9ICAgICAgICAuYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2tleXdvcmQgeyAgY29sb3I6IGJsdWU7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4geyAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiByZ2IoODgsIDkyLCAyNDYpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHsgIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52YWxpZCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTUzLCAwLCAwKTsgIGNvbG9yOiB3aGl0ZTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7ICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiByZ2IoMywgMTA2LCA3KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHsgIGNvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MgeyAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcgeyAgY29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjogcmdiKDAsIDAsIDIwNSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7ICBjb2xvcjogcmdiKDEwNCwgMTA0LCA5MSk7fS5hY2UtdG0gLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiAjMDAwMEEyO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9tYXJrdXBpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHsgIGNvbG9yOiByZ2IoMTIsIDcsIDI1NSk7fS5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2xpc3QgeyAgY29sb3I6cmdiKDE4NSwgNiwgMTQ0KTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7ICBiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNyk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjpyZ2IoMjgsIDIsIDI1NSk7fS5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHsgIGNvbG9yOiByZ2IoMjU1LCAwLCAwKX0iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KTsNCiAgICAgICAgICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpDQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-emacs-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgU2t5d3JpdGVyLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogTW96aWxsYS4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC9rZXliaW5kaW5nL2VtYWNzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2Uva2V5Ym9hcmQvc3RhdGVfaGFuZGxlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFN0YXRlSGFuZGxlciA9IHJlcXVpcmUoIi4uL3N0YXRlX2hhbmRsZXIiKS5TdGF0ZUhhbmRsZXI7DQp2YXIgbWF0Y2hDaGFyYWN0ZXJPbmx5ID0gIHJlcXVpcmUoIi4uL3N0YXRlX2hhbmRsZXIiKS5tYXRjaENoYXJhY3Rlck9ubHk7DQoNCnZhciBlbWFjc1N0YXRlID0gew0KICAgIHN0YXJ0OiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgImN0cmwteCIsDQogICAgICAgICAgICB0aGVuOiAgICJjLXgiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiAgWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkqIiwgIihkb3dufGN0cmwtbikiIF0sDQogICAgICAgICAgICBleGVjOiAgICJnb2xpbmVkb3duIiwNCiAgICAgICAgICAgIHBhcmFtczogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDEsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiBbICIoPzpjb21tYW5kLShbMC05XSopKSoiLCAiKHJpZ2h0fGN0cmwtZikiIF0sDQogICAgICAgICAgICBleGVjOiAiZ290b3JpZ2h0IiwNCiAgICAgICAgICAgIHBhcmFtczogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDEsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiBbICIoPzpjb21tYW5kLShbMC05XSopKSoiLCAiKHVwfGN0cmwtcCkiIF0sDQogICAgICAgICAgICBleGVjOiAiZ29saW5ldXAiLA0KICAgICAgICAgICAgcGFyYW1zOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGltZXMiLA0KICAgICAgICAgICAgICAgICAgICBtYXRjaDogMSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogIm51bWJlciIsDQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgcmVnZXg6IFsgIig/OmNvbW1hbmQtKFswLTldKikpKiIsICIobGVmdHxjdHJsLWIpIiBdLA0KICAgICAgICAgICAgZXhlYzogImdvdG9sZWZ0IiwNCiAgICAgICAgICAgIHBhcmFtczogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDEsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbW1lbnQ6ICJUaGlzIGJpbmRpbmcgbWF0Y2hlcyBhbGwgcHJpbnRhYmxlIGNoYXJhY3RlcnMgZXhjZXB0IG51bWJlcnMgYXMgbG9uZyBhcyB0aGV5IGFyZSBubyBudW1iZXJzIGFuZCBwcmludCB0aGVtIG4gdGltZXMuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAgWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkiLCAiKFteMC05XSspKiIgXSwNCiAgICAgICAgICAgIG1hdGNoOiAgbWF0Y2hDaGFyYWN0ZXJPbmx5LA0KICAgICAgICAgICAgZXhlYzogICAiaW5zZXJ0dGV4dCIsDQogICAgICAgICAgICBwYXJhbXM6IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJ0aW1lcyIsDQogICAgICAgICAgICAgICAgICAgIG1hdGNoOiAxLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAibnVtYmVyIiwNCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAiMSINCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRleHQiLA0KICAgICAgICAgICAgICAgICAgICBtYXRjaDogMg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWVudDogIlRoaXMgYmluZGluZyBtYXRjaGVzIG51bWJlcnMgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBtZXRhX251bWJlciBpbiB0aGUgYnVmZmVyLiIsDQogICAgICAgICAgICByZWdleDogIFsgIihjb21tYW5kLVswLTldKikqIiwgIihbMC05XSspIiBdLA0KICAgICAgICAgICAgbWF0Y2g6ICBtYXRjaENoYXJhY3Rlck9ubHksDQogICAgICAgICAgICBkaXNhbGxvd01hdGNoZXM6ICBbIDEgXSwNCiAgICAgICAgICAgIGV4ZWM6ICAgImluc2VydHRleHQiLA0KICAgICAgICAgICAgcGFyYW1zOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgIG1hdGNoOiAyLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAidGV4dCINCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlZ2V4OiBbICJjb21tYW5kLShbMC05XSopIiwgIihjb21tYW5kLVswLTldfFswLTldKSIgXSwNCiAgICAgICAgICAgIGNvbW1lbnQ6ICJTdG9wcyBleGVjdXRpb24gaWYgdGhlIHJlZ2V4IC9tZXRhX1swLTldKy8gbWF0Y2hlcyB0byBhdm9pZCByZXNldHRpbmcgdGhlIGJ1ZmZlci4iDQogICAgICAgIH0NCiAgICBdLA0KICAgICJjLXgiOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogImN0cmwtZyIsDQogICAgICAgICAgICB0aGVuOiAic3RhcnQiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogImN0cmwtcyIsDQogICAgICAgICAgICBleGVjOiAic2F2ZSIsDQogICAgICAgICAgICB0aGVuOiAic3RhcnQiDQogICAgICAgIH0NCiAgICBdDQp9Ow0KDQpleHBvcnRzLkVtYWNzID0gbmV3IFN0YXRlSGFuZGxlcihlbWFjc1N0YXRlKTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBNb3ppbGxhLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwOQ0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICBKdWxpYW4gVmllcmVjayAoanVsaWFuLnZpZXJlY2tAZ21haWwuY29tKQ0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2tleWJvYXJkL3N0YXRlX2hhbmRsZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQovLyBJZiB5b3UncmUgZGV2ZWxvcGluZyBhIG5ldyBrZXltYXBwaW5nIGFuZCB3YW50IHRvIGdldCBhbiBpZGVhIHdoYXQncyBnb2luZw0KLy8gb24sIHRoZW4gZW5hYmxlIGRlYnVnZ2luZy4NCnZhciBERUJVRyA9IGZhbHNlOw0KDQpmdW5jdGlvbiBTdGF0ZUhhbmRsZXIoa2V5bWFwcGluZykgew0KICAgIHRoaXMua2V5bWFwcGluZyA9IHRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGtleW1hcHBpbmcpOw0KfQ0KDQpTdGF0ZUhhbmRsZXIucHJvdG90eXBlID0gew0KICAgIC8qKg0KICAgICAqIEJ1aWxkIHRoZSBSZWdFeHAgZnJvbSB0aGUga2V5bWFwcGluZyBhcyBSZWdFeHAgY2FuJ3Qgc3RvcmVkIGRpcmVjdGx5DQogICAgICogaW4gdGhlIG1ldGFkYXRhIEpTT04gYW5kIGFzIHRoZSBSZWdFeHAgdXNlZCB0byBtYXRjaCB0aGUga2V5cy9idWZmZXINCiAgICAgKiBuZWVkIHRvIGJlIGFkYXB0ZWQuDQogICAgICovDQogICAgJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OiBmdW5jdGlvbihrZXltYXBwaW5nKSB7DQogICAgICAgIGZvciAodmFyIHN0YXRlIGluIGtleW1hcHBpbmcpIHsNCiAgICAgICAgICAgIHRoaXMuJGJ1aWxkQmluZGluZ3NSZWdleChrZXltYXBwaW5nW3N0YXRlXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGtleW1hcHBpbmc7DQogICAgfSwNCg0KICAgICRidWlsZEJpbmRpbmdzUmVnZXg6IGZ1bmN0aW9uKGJpbmRpbmdzKSB7DQogICAgICAgIC8vIEVzY2FwZSBhIGdpdmVuIFJlZ2V4IHN0cmluZy4NCiAgICAgICAgYmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICAgICAgICBpZiAoYmluZGluZy5rZXkpIHsNCiAgICAgICAgICAgICAgICBiaW5kaW5nLmtleSA9IG5ldyBSZWdFeHAoJ14nICsgYmluZGluZy5rZXkgKyAnJCcpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJpbmRpbmcucmVnZXgpKSB7DQogICAgICAgICAgICAgICAgaWYgKCEoJ2tleScgaW4gYmluZGluZykpDQogICAgICAgICAgICAgICAgICBiaW5kaW5nLmtleSA9IG5ldyBSZWdFeHAoJ14nICsgYmluZGluZy5yZWdleFsxXSArICckJyk7DQogICAgICAgICAgICAgICAgYmluZGluZy5yZWdleCA9IG5ldyBSZWdFeHAoYmluZGluZy5yZWdleC5qb2luKCcnKSArICckJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmcucmVnZXgpIHsNCiAgICAgICAgICAgICAgICBiaW5kaW5nLnJlZ2V4ID0gbmV3IFJlZ0V4cChiaW5kaW5nLnJlZ2V4ICsgJyQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSwNCg0KICAgICRjb21wb3NlQnVmZmVyOiBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleSwgZSkgew0KICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkYXRhIG9iamVjdC4NCiAgICAgICAgaWYgKGRhdGEuc3RhdGUgPT0gbnVsbCB8fCBkYXRhLmJ1ZmZlciA9PSBudWxsKSB7DQogICAgICAgICAgICBkYXRhLnN0YXRlID0gInN0YXJ0IjsNCiAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIga2V5QXJyYXkgPSBbXTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDEpIGtleUFycmF5LnB1c2goImN0cmwiKTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDgpIGtleUFycmF5LnB1c2goImNvbW1hbmQiKTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDIpIGtleUFycmF5LnB1c2goIm9wdGlvbiIpOw0KICAgICAgICBpZiAoaGFzaElkICYgNCkga2V5QXJyYXkucHVzaCgic2hpZnQiKTsNCiAgICAgICAgaWYgKGtleSkgICAgICAgIGtleUFycmF5LnB1c2goa2V5KTsNCg0KICAgICAgICB2YXIgc3ltYm9saWNOYW1lID0ga2V5QXJyYXkuam9pbigiLSIpOw0KICAgICAgICB2YXIgYnVmZmVyVG9Vc2UgPSBkYXRhLmJ1ZmZlciArIHN5bWJvbGljTmFtZTsNCg0KICAgICAgICAvLyBEb24ndCBhZGQgdGhlIHN5bWJvbGljIG5hbWUgdG8gdGhlIGtleSBidWZmZXIgaWYgdGhlIGFsdF8ga2V5IGlzDQogICAgICAgIC8vIHBhcnQgb2YgdGhlIHN5bWJvbGljIG5hbWUuIElmIGl0IHN0YXJ0cyB3aXRoIGFsdF8sIHRoaXMgbWVhbnMNCiAgICAgICAgLy8gdGhhdCB0aGUgdXNlciBoaXQgYW4gYWx0IGtleWNvbWJvIGFuZCB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlLA0KICAgICAgICAvLyBuZXcgY2hhcmFjdGVyIGRldGVjdGVkIGFmdGVyIHRoaXMgZXZlbnQsIHdoaWNoIHRoZW4gd2lsbCBiZQ0KICAgICAgICAvLyBhZGRlZCB0byB0aGUgYnVmZmVyIChlLmcuIGFsdF9qIHdpbGwgcmVzdWx0IGluIOKIhikuDQogICAgICAgIC8vDQogICAgICAgIC8vIFdlIHRlc3QgZm9yIDIgYW5kIG5vdCBmb3IgJiAyIGFzIHdlIG9ubHkgd2FudCB0byBleGNsdWRlIHRoZSBjYXNlIHdoZXJlDQogICAgICAgIC8vIHRoZSBvcHRpb24ga2V5IGlzIHByZXNzZWQgYWxvbmUuDQogICAgICAgIGlmIChoYXNoSWQgIT0gMikgew0KICAgICAgICAgICAgZGF0YS5idWZmZXIgPSBidWZmZXJUb1VzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBidWZmZXJPYmogPSB7DQogICAgICAgICAgICBidWZmZXJUb1VzZTogYnVmZmVyVG9Vc2UsDQogICAgICAgICAgICBzeW1ib2xpY05hbWU6IHN5bWJvbGljTmFtZSwNCiAgICAgICAgfTsNCg0KICAgICAgICBpZiAoZSkgew0KICAgICAgICAgICAgYnVmZmVyT2JqLmtleUlkZW50aWZpZXIgPSBlLmtleUlkZW50aWZpZXINCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXJPYmo7DQogICAgfSwNCg0KICAgICRmaW5kOiBmdW5jdGlvbihkYXRhLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgaGFzaElkLCBrZXksIGtleUlkZW50aWZpZXIpIHsNCiAgICAgICAgLy8gSG9sZHMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBhbmQgdGhlIGFyZ3MgaWYgYSBjb21tYW5kIG1hdGNoZWQuDQogICAgICAgIHZhciByZXN1bHQgPSB7fTsNCg0KICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBiaW5kaW5ncyBvZiB0aGUga2V5bWFwIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQuDQogICAgICAgIHRoaXMua2V5bWFwcGluZ1tkYXRhLnN0YXRlXS5zb21lKGZ1bmN0aW9uKGJpbmRpbmcpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaDsNCg0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcua2V5ICYmICFiaW5kaW5nLmtleS50ZXN0KHN5bWJvbGljTmFtZSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdleCBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcucmVnZXggJiYgIShtYXRjaCA9IGJpbmRpbmcucmVnZXguZXhlYyhidWZmZXIpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1hdGNoIGZ1bmN0aW9uIG1hdGNoZXMuDQogICAgICAgICAgICBpZiAoYmluZGluZy5tYXRjaCAmJiAhYmluZGluZy5tYXRjaChidWZmZXIsIGhhc2hJZCwga2V5LCBzeW1ib2xpY05hbWUsIGtleUlkZW50aWZpZXIpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDaGVjayBmb3IgZGlzYWxsb3dlZCBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcuZGlzYWxsb3dNYXRjaGVzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5nLmRpc2FsbG93TWF0Y2hlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoISFtYXRjaFtiaW5kaW5nLmRpc2FsbG93TWF0Y2hlc1tpXV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjb21tYW5kIHRvIGV4ZWN1dGUsIHRoZW4gZmlndXJlIG91dCB0aGUNCiAgICAgICAgICAgIC8vIGNvbW1hbmQgYW5kIHRoZSBhcmd1bWVudHMuDQogICAgICAgICAgICBpZiAoYmluZGluZy5leGVjKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBiaW5kaW5nLmV4ZWM7DQoNCiAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYXJndW1lbnRzLg0KICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnBhcmFtcykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcmdzID0ge307DQogICAgICAgICAgICAgICAgICAgIGJpbmRpbmcucGFyYW1zLmZvckVhY2goZnVuY3Rpb24ocGFyYW0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5tYXRjaCAhPSBudWxsICYmIG1hdGNoICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdGNoW3BhcmFtLm1hdGNoXSB8fCBwYXJhbS5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyYW0uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFyZ3NbcGFyYW0ubmFtZV0gPSB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgJ3RoZW4nIHByb3BlcnR5Lg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcudGhlbikgew0KICAgICAgICAgICAgICAgIGRhdGEuc3RhdGUgPSBiaW5kaW5nLnRoZW47DQogICAgICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gSWYgbm8gY29tbWFuZCBpcyBzZXQsIHRoZW4gZXhlY3V0ZSB0aGUgIm51bGwiIGZha2UgY29tbWFuZC4NCiAgICAgICAgICAgIGlmIChyZXN1bHQuY29tbWFuZCA9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSAibnVsbCI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChERUJVRykgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJLZXlib2FyZFN0YXRlTWFwcGVyI2ZpbmQiLCBiaW5kaW5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAocmVzdWx0LmNvbW1hbmQpIHsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGtleUJpbmRpbmcuDQogICAgICovDQogICAgaGFuZGxlS2V5Ym9hcmQ6IGZ1bmN0aW9uKGRhdGEsIGhhc2hJZCwga2V5LCBrZXlDb2RlLCBlKSB7DQogICAgICAgIC8vIElmIHdlIHByZXNzZWQgYW55IGNvbW1hbmQga2V5IGJ1dCBubyBvdGhlciBrZXksIHRoZW4gaWdub3JlIHRoZSBpbnB1dC4NCiAgICAgICAgLy8gT3RoZXJ3aXNlICJzaGlmdC0iIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIsIGFuZCBsYXRlciBvbiAic2hpZnQtZyINCiAgICAgICAgLy8gd2hpY2ggcmVzdWx0cyBpbiAic2hpZnQtc2hpZnQtZyIgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlLg0KICAgICAgICBpZiAoaGFzaElkICE9IDAgJiYgKGtleSA9PSAiIiB8fCBrZXkgPT0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSkpIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUga2V5Ym9hcmQgaW5wdXQgYnVmZmVyLg0KICAgICAgICB2YXIgciA9IHRoaXMuJGNvbXBvc2VCdWZmZXIoZGF0YSwgaGFzaElkLCBrZXksIGUpOw0KICAgICAgICB2YXIgYnVmZmVyID0gci5idWZmZXJUb1VzZTsNCiAgICAgICAgdmFyIHN5bWJvbGljTmFtZSA9IHIuc3ltYm9saWNOYW1lOw0KICAgICAgICB2YXIga2V5SWQgPSByLmtleUlkZW50aWZpZXI7DQoNCiAgICAgICAgciA9IHRoaXMuJGZpbmQoZGF0YSwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIGhhc2hJZCwga2V5LCBrZXlJZCk7DQogICAgICAgIGlmIChERUJVRykgew0KICAgICAgICAgICAgY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgcik7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcjsNCiAgICB9DQp9DQoNCi8qKg0KICogVGhpcyBpcyBhIHVzZWZ1bCBtYXRjaGluZyBmdW5jdGlvbiBhbmQgdGhlcmVmb3JlIGlzIGRlZmluZWQgaGVyZSBzbyB0aGF0DQogKiB1c2VycyBvZiBLZXlib2FyZFN0YXRlTWFwcGVyIGNhbiB1c2UgaXQuDQogKg0KICogQHJldHVybiBib29sZWFuDQogKiAgICAgICAgICBJZiBubyBjb21tYW5kIGtleSAoQ29tbWFuZHxPcHRpb258U2hpZnR8Q3RybCkgaXMgcHJlc3NlZCwgaXQNCiAqICAgICAgICAgIHJldHVybnMgdHJ1ZS4gSWYgdGhlIG9ubHkgdGhlIFNoaWZ0IGtleSBpcyBwcmVzc2VkICsgYSBjaGFyYWN0ZXINCiAqICAgICAgICAgIHRydWUgaXMgcmV0dXJuZWQgYXMgd2VsbC4gT3RoZXJ3aXNlLCBmYWxzZSBpcyByZXR1cm5lZC4NCiAqICAgICAgICAgIFN1bW1pbmcgdXAsIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbmV2ZXIgdGhlIHVzZXIgdHlwZWQNCiAqICAgICAgICAgIGEgbm9ybWFsIGNoYXJhY3RlciBvbiB0aGUga2V5Ym9hcmQgYW5kIG5vIHNob3J0Y3V0Lg0KICovDQpleHBvcnRzLm1hdGNoQ2hhcmFjdGVyT25seSA9IGZ1bmN0aW9uKGJ1ZmZlciwgaGFzaElkLCBrZXksIHN5bWJvbGljTmFtZSkgew0KICAgIC8vIElmIG5vIGNvbW1hbmQga2V5cyBhcmUgcHJlc3NlZCwgdGhlbiBjYXRjaCB0aGUgaW5wdXQuDQogICAgaWYgKGhhc2hJZCA9PSAwKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICAvLyBJZiBvbmx5IHRoZSBzaGlmdCBrZXkgaXMgcHJlc3NlZCBhbmQgYSBjaGFyYWN0ZXIga2V5LCB0aGVuDQogICAgLy8gY2F0Y2ggdGhhdCBpbnB1dCBhcyB3ZWxsLg0KICAgIGVsc2UgaWYgKChoYXNoSWQgPT0gNCkgJiYga2V5Lmxlbmd0aCA9PSAxKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICAvLyBPdGhlcndpc2UsIHdlIGxldCB0aGUgaW5wdXQgZ290IHRocm91Z2guDQogICAgZWxzZSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLlN0YXRlSGFuZGxlciA9IFN0YXRlSGFuZGxlcjsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-emacs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZy9lbWFjcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9zdGF0ZV9oYW5kbGVyIikuU3RhdGVIYW5kbGVyLGU9YSgiLi4vc3RhdGVfaGFuZGxlciIpLm1hdGNoQ2hhcmFjdGVyT25seSxmPXtzdGFydDpbe2tleToiY3RybC14Iix0aGVuOiJjLXgifSx7cmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSoiLCIoZG93bnxjdHJsLW4pIl0sZXhlYzoiZ29saW5lZG93biIscGFyYW1zOlt7bmFtZToidGltZXMiLG1hdGNoOjEsdHlwZToibnVtYmVyIixkZWZhdWx0VmFsdWU6MX1dfSx7cmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSoiLCIocmlnaHR8Y3RybC1mKSJdLGV4ZWM6ImdvdG9yaWdodCIscGFyYW1zOlt7bmFtZToidGltZXMiLG1hdGNoOjEsdHlwZToibnVtYmVyIixkZWZhdWx0VmFsdWU6MX1dfSx7cmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSoiLCIodXB8Y3RybC1wKSJdLGV4ZWM6ImdvbGluZXVwIixwYXJhbXM6W3tuYW1lOiJ0aW1lcyIsbWF0Y2g6MSx0eXBlOiJudW1iZXIiLGRlZmF1bHRWYWx1ZToxfV19LHtyZWdleDpbIig/OmNvbW1hbmQtKFswLTldKikpKiIsIihsZWZ0fGN0cmwtYikiXSxleGVjOiJnb3RvbGVmdCIscGFyYW1zOlt7bmFtZToidGltZXMiLG1hdGNoOjEsdHlwZToibnVtYmVyIixkZWZhdWx0VmFsdWU6MX1dfSx7Y29tbWVudDoiVGhpcyBiaW5kaW5nIG1hdGNoZXMgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBudW1iZXJzIGFzIGxvbmcgYXMgdGhleSBhcmUgbm8gbnVtYmVycyBhbmQgcHJpbnQgdGhlbSBuIHRpbWVzLiIscmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSIsIihbXjAtOV0rKSoiXSxtYXRjaDplLGV4ZWM6Imluc2VydHRleHQiLHBhcmFtczpbe25hbWU6InRpbWVzIixtYXRjaDoxLHR5cGU6Im51bWJlciIsZGVmYXVsdFZhbHVlOiIxIn0se25hbWU6InRleHQiLG1hdGNoOjJ9XX0se2NvbW1lbnQ6IlRoaXMgYmluZGluZyBtYXRjaGVzIG51bWJlcnMgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBtZXRhX251bWJlciBpbiB0aGUgYnVmZmVyLiIscmVnZXg6WyIoY29tbWFuZC1bMC05XSopKiIsIihbMC05XSspIl0sbWF0Y2g6ZSxkaXNhbGxvd01hdGNoZXM6WzFdLGV4ZWM6Imluc2VydHRleHQiLHBhcmFtczpbe25hbWU6InRleHQiLG1hdGNoOjIsdHlwZToidGV4dCJ9XX0se3JlZ2V4OlsiY29tbWFuZC0oWzAtOV0qKSIsIihjb21tYW5kLVswLTldfFswLTldKSJdLGNvbW1lbnQ6IlN0b3BzIGV4ZWN1dGlvbiBpZiB0aGUgcmVnZXggL21ldGFfWzAtOV0rLyBtYXRjaGVzIHRvIGF2b2lkIHJlc2V0dGluZyB0aGUgYnVmZmVyLiJ9XSwiYy14Ijpbe2tleToiY3RybC1nIix0aGVuOiJzdGFydCJ9LHtrZXk6ImN0cmwtcyIsZXhlYzoic2F2ZSIsdGhlbjoic3RhcnQifV19O2IuRW1hY3M9bmV3IGQoZil9KSxkZWZpbmUoImFjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoYSl7dGhpcy5rZXltYXBwaW5nPXRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGEpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD0hMTtlLnByb3RvdHlwZT17JGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXRoaXMuJGJ1aWxkQmluZGluZ3NSZWdleChhW2JdKTtyZXR1cm4gYX0sJGJ1aWxkQmluZGluZ3NSZWdleDpmdW5jdGlvbihhKXthLmZvckVhY2goZnVuY3Rpb24oYSl7YS5rZXk/YS5rZXk9bmV3IFJlZ0V4cCgiXiIrYS5rZXkrIiQiKTpBcnJheS5pc0FycmF5KGEucmVnZXgpPygia2V5ImluIGF8fChhLmtleT1uZXcgUmVnRXhwKCJeIithLnJlZ2V4WzFdKyIkIikpLGEucmVnZXg9bmV3IFJlZ0V4cChhLnJlZ2V4LmpvaW4oIiIpKyIkIikpOmEucmVnZXgmJihhLnJlZ2V4PW5ldyBSZWdFeHAoYS5yZWdleCsiJCIpKX0pfSwkY29tcG9zZUJ1ZmZlcjpmdW5jdGlvbihhLGIsYyxkKXtpZihhLnN0YXRlPT1udWxsfHxhLmJ1ZmZlcj09bnVsbClhLnN0YXRlPSJzdGFydCIsYS5idWZmZXI9IiI7dmFyIGU9W107YiYxJiZlLnB1c2goImN0cmwiKSxiJjgmJmUucHVzaCgiY29tbWFuZCIpLGImMiYmZS5wdXNoKCJvcHRpb24iKSxiJjQmJmUucHVzaCgic2hpZnQiKSxjJiZlLnB1c2goYyk7dmFyIGY9ZS5qb2luKCItIiksZz1hLmJ1ZmZlcitmO2IhPTImJihhLmJ1ZmZlcj1nKTt2YXIgaD17YnVmZmVyVG9Vc2U6ZyxzeW1ib2xpY05hbWU6Zn07cmV0dXJuIGQmJihoLmtleUlkZW50aWZpZXI9ZC5rZXlJZGVudGlmaWVyKSxofSwkZmluZDpmdW5jdGlvbihhLGIsYyxlLGYsZyl7dmFyIGg9e307cmV0dXJuIHRoaXMua2V5bWFwcGluZ1thLnN0YXRlXS5zb21lKGZ1bmN0aW9uKGkpe3ZhciBqO2lmKGkua2V5JiYhaS5rZXkudGVzdChjKSlyZXR1cm4hMTtpZihpLnJlZ2V4JiYhKGo9aS5yZWdleC5leGVjKGIpKSlyZXR1cm4hMTtpZihpLm1hdGNoJiYhaS5tYXRjaChiLGUsZixjLGcpKXJldHVybiExO2lmKGkuZGlzYWxsb3dNYXRjaGVzKWZvcih2YXIgaz0wO2s8aS5kaXNhbGxvd01hdGNoZXMubGVuZ3RoO2srKylpZighIWpbaS5kaXNhbGxvd01hdGNoZXNba11dKXJldHVybiExO2lmKGkuZXhlYyl7aC5jb21tYW5kPWkuZXhlYztpZihpLnBhcmFtcyl7dmFyIGw7aC5hcmdzPXt9LGkucGFyYW1zLmZvckVhY2goZnVuY3Rpb24oYSl7YS5tYXRjaCE9bnVsbCYmaiE9bnVsbD9sPWpbYS5tYXRjaF18fGEuZGVmYXVsdFZhbHVlOmw9YS5kZWZhdWx0VmFsdWUsYS50eXBlPT09Im51bWJlciImJihsPXBhcnNlSW50KGwpKSxoLmFyZ3NbYS5uYW1lXT1sfSl9YS5idWZmZXI9IiJ9cmV0dXJuIGkudGhlbiYmKGEuc3RhdGU9aS50aGVuLGEuYnVmZmVyPSIiKSxoLmNvbW1hbmQ9PW51bGwmJihoLmNvbW1hbmQ9Im51bGwiKSxkJiZjb25zb2xlLmxvZygiS2V5Ym9hcmRTdGF0ZU1hcHBlciNmaW5kIixpKSwhMH0pLGguY29tbWFuZD9oOihhLmJ1ZmZlcj0iIiwhMSl9LGhhbmRsZUtleWJvYXJkOmZ1bmN0aW9uKGEsYixjLGUsZil7aWYoYj09MHx8YyE9IiImJmMhPVN0cmluZy5mcm9tQ2hhckNvZGUoMCkpe3ZhciBnPXRoaXMuJGNvbXBvc2VCdWZmZXIoYSxiLGMsZiksaD1nLmJ1ZmZlclRvVXNlLGk9Zy5zeW1ib2xpY05hbWUsaj1nLmtleUlkZW50aWZpZXI7cmV0dXJuIGc9dGhpcy4kZmluZChhLGgsaSxiLGMsaiksZCYmY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLGgsaSxnKSxnfXJldHVybiBudWxsfX0sYi5tYXRjaENoYXJhY3Rlck9ubHk9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PTA/ITA6Yj09NCYmYy5sZW5ndGg9PTE/ITA6ITF9LGIuU3RhdGVIYW5kbGVyPWV9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-vim-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgU2t5d3JpdGVyLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogTW96aWxsYS4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC9rZXliaW5kaW5nL3ZpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2tleWJvYXJkL3N0YXRlX2hhbmRsZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBTdGF0ZUhhbmRsZXIgPSByZXF1aXJlKCIuLi9zdGF0ZV9oYW5kbGVyIikuU3RhdGVIYW5kbGVyOw0KdmFyIG1hdGNoQ2hhcmFjdGVyT25seSA9ICByZXF1aXJlKCIuLi9zdGF0ZV9oYW5kbGVyIikubWF0Y2hDaGFyYWN0ZXJPbmx5Ow0KDQp2YXIgdmltY29tbWFuZCA9IGZ1bmN0aW9uKGtleSwgZXhlYywgdGhlbikgew0KICAgIHJldHVybiB7DQogICAgICAgIHJlZ2V4OiAgWyAiKFswLTldKikiLCBrZXkgXSwNCiAgICAgICAgZXhlYzogICBleGVjLA0KICAgICAgICBwYXJhbXM6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBuYW1lOiAgICAgInRpbWVzIiwNCiAgICAgICAgICAgICAgICBtYXRjaDogICAgMSwNCiAgICAgICAgICAgICAgICB0eXBlOiAgICAgIm51bWJlciIsDQogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAgICAgMQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICB0aGVuOiAgIHRoZW4NCiAgICB9DQp9DQoNCnZhciB2aW1TdGF0ZXMgPSB7DQogICAgc3RhcnQ6IFsNCiAgICAgICAgew0KICAgICAgICAgICAga2V5OiAgICAiaSIsDQogICAgICAgICAgICB0aGVuOiAgICJpbnNlcnRNb2RlIg0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICBrZXk6ICAgICJkIiwNCiAgICAgICAgICAgIHRoZW46ICAgImRlbGV0ZU1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgImEiLA0KICAgICAgICAgICAgZXhlYzogICAiZ290b3JpZ2h0IiwNCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWkiLA0KICAgICAgICAgICAgZXhlYzogICAiZ290b2xpbmVzdGFydCIsDQogICAgICAgICAgICB0aGVuOiAgICJpbnNlcnRNb2RlIg0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICBrZXk6ICAgICJzaGlmdC1hIiwNCiAgICAgICAgICAgIGV4ZWM6ICAgImdvdG9saW5lZW5kIiwNCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWMiLA0KICAgICAgICAgICAgZXhlYzogICAicmVtb3ZldG9saW5lZW5kIiwNCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LXIiLA0KICAgICAgICAgICAgZXhlYzogICAib3ZlcndyaXRlIiwNCiAgICAgICAgICAgIHRoZW46ICAgInJlcGxhY2VNb2RlIg0KICAgICAgICB9LA0KICAgICAgICB2aW1jb21tYW5kKCIoa3x1cCkiLCAiZ29saW5ldXAiKSwNCiAgICAgICAgdmltY29tbWFuZCgiKGp8ZG93bikiLCAiZ29saW5lZG93biIpLA0KICAgICAgICB2aW1jb21tYW5kKCIobHxyaWdodCkiLCAiZ290b3JpZ2h0IiksDQogICAgICAgIHZpbWNvbW1hbmQoIihofGxlZnQpIiwgImdvdG9sZWZ0IiksDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWciLA0KICAgICAgICAgICAgZXhlYzogICAiZ290b2VuZCINCiAgICAgICAgfSwNCiAgICAgICAgdmltY29tbWFuZCgiYiIsICJnb3Rvd29yZGxlZnQiKSwNCiAgICAgICAgdmltY29tbWFuZCgiZSIsICJnb3Rvd29yZHJpZ2h0IiksDQogICAgICAgIHZpbWNvbW1hbmQoIngiLCAiZGVsIiksDQogICAgICAgIHZpbWNvbW1hbmQoInNoaWZ0LXgiLCAiYmFja3NwYWNlIiksDQogICAgICAgIHZpbWNvbW1hbmQoInNoaWZ0LWQiLCAicmVtb3ZldG9saW5lZW5kIiksDQogICAgICAgIHZpbWNvbW1hbmQoInUiLCAidW5kbyIpLCAvLyBbY291bnRdIG9uIHRoaXMgbWF5L21heSBub3Qgd29yaywgZGVwZW5kaW5nIG9uIGJyb3dzZXIgaW1wbGVtZW50YXRpb24uLi4NCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWVudDogICAgIkNhdGNoIHNvbWUga2V5Ym9hcmQgaW5wdXQgdG8gc3RvcCBpdCBoZXJlIiwNCiAgICAgICAgICAgIG1hdGNoOiAgICAgIG1hdGNoQ2hhcmFjdGVyT25seQ0KICAgICAgICB9DQogICAgXSwNCiAgICBpbnNlcnRNb2RlOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgICAiZXNjIiwNCiAgICAgICAgICAgIHRoZW46ICAgICAic3RhcnQiDQogICAgICAgIH0NCiAgICBdLA0KICAgIHJlcGxhY2VNb2RlOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgIGtleTogICAgICAiZXNjIiwNCiAgICAgICAgICAgIGV4ZWM6ICAgICAib3ZlcndyaXRlIiwNCiAgICAgICAgICAgIHRoZW46ICAgICAic3RhcnQiDQogICAgICAgIH0NCiAgICBdLA0KICAgIGRlbGV0ZU1vZGU6IFsNCiAgICAgICAgew0KICAgICAgICAgICAga2V5OiAgICAgICJkIiwNCiAgICAgICAgICAgIGV4ZWM6ICAgICAicmVtb3ZlbGluZSIsDQogICAgICAgICAgICB0aGVuOiAgICAgInN0YXJ0Ig0KICAgICAgICB9DQogICAgXQ0KfTsNCg0KZXhwb3J0cy5WaW0gPSBuZXcgU3RhdGVIYW5kbGVyKHZpbVN0YXRlcyk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgU2t5d3JpdGVyLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogTW96aWxsYS4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkNCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KLy8gSWYgeW91J3JlIGRldmVsb3BpbmcgYSBuZXcga2V5bWFwcGluZyBhbmQgd2FudCB0byBnZXQgYW4gaWRlYSB3aGF0J3MgZ29pbmcNCi8vIG9uLCB0aGVuIGVuYWJsZSBkZWJ1Z2dpbmcuDQp2YXIgREVCVUcgPSBmYWxzZTsNCg0KZnVuY3Rpb24gU3RhdGVIYW5kbGVyKGtleW1hcHBpbmcpIHsNCiAgICB0aGlzLmtleW1hcHBpbmcgPSB0aGlzLiRidWlsZEtleW1hcHBpbmdSZWdleChrZXltYXBwaW5nKTsNCn0NCg0KU3RhdGVIYW5kbGVyLnByb3RvdHlwZSA9IHsNCiAgICAvKioNCiAgICAgKiBCdWlsZCB0aGUgUmVnRXhwIGZyb20gdGhlIGtleW1hcHBpbmcgYXMgUmVnRXhwIGNhbid0IHN0b3JlZCBkaXJlY3RseQ0KICAgICAqIGluIHRoZSBtZXRhZGF0YSBKU09OIGFuZCBhcyB0aGUgUmVnRXhwIHVzZWQgdG8gbWF0Y2ggdGhlIGtleXMvYnVmZmVyDQogICAgICogbmVlZCB0byBiZSBhZGFwdGVkLg0KICAgICAqLw0KICAgICRidWlsZEtleW1hcHBpbmdSZWdleDogZnVuY3Rpb24oa2V5bWFwcGluZykgew0KICAgICAgICBmb3IgKHZhciBzdGF0ZSBpbiBrZXltYXBwaW5nKSB7DQogICAgICAgICAgICB0aGlzLiRidWlsZEJpbmRpbmdzUmVnZXgoa2V5bWFwcGluZ1tzdGF0ZV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBrZXltYXBwaW5nOw0KICAgIH0sDQoNCiAgICAkYnVpbGRCaW5kaW5nc1JlZ2V4OiBmdW5jdGlvbihiaW5kaW5ncykgew0KICAgICAgICAvLyBFc2NhcGUgYSBnaXZlbiBSZWdleCBzdHJpbmcuDQogICAgICAgIGJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24oYmluZGluZykgew0KICAgICAgICAgICAgaWYgKGJpbmRpbmcua2V5KSB7DQogICAgICAgICAgICAgICAgYmluZGluZy5rZXkgPSBuZXcgUmVnRXhwKCdeJyArIGJpbmRpbmcua2V5ICsgJyQnKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nLnJlZ2V4KSkgew0KICAgICAgICAgICAgICAgIGlmICghKCdrZXknIGluIGJpbmRpbmcpKQ0KICAgICAgICAgICAgICAgICAgYmluZGluZy5rZXkgPSBuZXcgUmVnRXhwKCdeJyArIGJpbmRpbmcucmVnZXhbMV0gKyAnJCcpOw0KICAgICAgICAgICAgICAgIGJpbmRpbmcucmVnZXggPSBuZXcgUmVnRXhwKGJpbmRpbmcucmVnZXguam9pbignJykgKyAnJCcpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nLnJlZ2V4KSB7DQogICAgICAgICAgICAgICAgYmluZGluZy5yZWdleCA9IG5ldyBSZWdFeHAoYmluZGluZy5yZWdleCArICckJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAkY29tcG9zZUJ1ZmZlcjogZnVuY3Rpb24oZGF0YSwgaGFzaElkLCBrZXksIGUpIHsNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGF0YSBvYmplY3QuDQogICAgICAgIGlmIChkYXRhLnN0YXRlID09IG51bGwgfHwgZGF0YS5idWZmZXIgPT0gbnVsbCkgew0KICAgICAgICAgICAgZGF0YS5zdGF0ZSA9ICJzdGFydCI7DQogICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGtleUFycmF5ID0gW107DQogICAgICAgIGlmIChoYXNoSWQgJiAxKSBrZXlBcnJheS5wdXNoKCJjdHJsIik7DQogICAgICAgIGlmIChoYXNoSWQgJiA4KSBrZXlBcnJheS5wdXNoKCJjb21tYW5kIik7DQogICAgICAgIGlmIChoYXNoSWQgJiAyKSBrZXlBcnJheS5wdXNoKCJvcHRpb24iKTsNCiAgICAgICAgaWYgKGhhc2hJZCAmIDQpIGtleUFycmF5LnB1c2goInNoaWZ0Iik7DQogICAgICAgIGlmIChrZXkpICAgICAgICBrZXlBcnJheS5wdXNoKGtleSk7DQoNCiAgICAgICAgdmFyIHN5bWJvbGljTmFtZSA9IGtleUFycmF5LmpvaW4oIi0iKTsNCiAgICAgICAgdmFyIGJ1ZmZlclRvVXNlID0gZGF0YS5idWZmZXIgKyBzeW1ib2xpY05hbWU7DQoNCiAgICAgICAgLy8gRG9uJ3QgYWRkIHRoZSBzeW1ib2xpYyBuYW1lIHRvIHRoZSBrZXkgYnVmZmVyIGlmIHRoZSBhbHRfIGtleSBpcw0KICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzeW1ib2xpYyBuYW1lLiBJZiBpdCBzdGFydHMgd2l0aCBhbHRfLCB0aGlzIG1lYW5zDQogICAgICAgIC8vIHRoYXQgdGhlIHVzZXIgaGl0IGFuIGFsdCBrZXljb21ibyBhbmQgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSwNCiAgICAgICAgLy8gbmV3IGNoYXJhY3RlciBkZXRlY3RlZCBhZnRlciB0aGlzIGV2ZW50LCB3aGljaCB0aGVuIHdpbGwgYmUNCiAgICAgICAgLy8gYWRkZWQgdG8gdGhlIGJ1ZmZlciAoZS5nLiBhbHRfaiB3aWxsIHJlc3VsdCBpbiDiiIYpLg0KICAgICAgICAvLw0KICAgICAgICAvLyBXZSB0ZXN0IGZvciAyIGFuZCBub3QgZm9yICYgMiBhcyB3ZSBvbmx5IHdhbnQgdG8gZXhjbHVkZSB0aGUgY2FzZSB3aGVyZQ0KICAgICAgICAvLyB0aGUgb3B0aW9uIGtleSBpcyBwcmVzc2VkIGFsb25lLg0KICAgICAgICBpZiAoaGFzaElkICE9IDIpIHsNCiAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gYnVmZmVyVG9Vc2U7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYnVmZmVyT2JqID0gew0KICAgICAgICAgICAgYnVmZmVyVG9Vc2U6IGJ1ZmZlclRvVXNlLA0KICAgICAgICAgICAgc3ltYm9saWNOYW1lOiBzeW1ib2xpY05hbWUsDQogICAgICAgIH07DQoNCiAgICAgICAgaWYgKGUpIHsNCiAgICAgICAgICAgIGJ1ZmZlck9iai5rZXlJZGVudGlmaWVyID0gZS5rZXlJZGVudGlmaWVyDQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gYnVmZmVyT2JqOw0KICAgIH0sDQoNCiAgICAkZmluZDogZnVuY3Rpb24oZGF0YSwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIGhhc2hJZCwga2V5LCBrZXlJZGVudGlmaWVyKSB7DQogICAgICAgIC8vIEhvbGRzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgYW5kIHRoZSBhcmdzIGlmIGEgY29tbWFuZCBtYXRjaGVkLg0KICAgICAgICB2YXIgcmVzdWx0ID0ge307DQoNCiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgYmluZGluZ3Mgb2YgdGhlIGtleW1hcCB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kLg0KICAgICAgICB0aGlzLmtleW1hcHBpbmdbZGF0YS5zdGF0ZV0uc29tZShmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2g7DQoNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgbWF0Y2hlcy4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmtleSAmJiAhYmluZGluZy5rZXkudGVzdChzeW1ib2xpY05hbWUpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVnZXggbWF0Y2hlcy4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLnJlZ2V4ICYmICEobWF0Y2ggPSBiaW5kaW5nLnJlZ2V4LmV4ZWMoYnVmZmVyKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBtYXRjaCBmdW5jdGlvbiBtYXRjaGVzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcubWF0Y2ggJiYgIWJpbmRpbmcubWF0Y2goYnVmZmVyLCBoYXNoSWQsIGtleSwgc3ltYm9saWNOYW1lLCBrZXlJZGVudGlmaWVyKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGRpc2FsbG93ZWQgbWF0Y2hlcy4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmRpc2FsbG93TWF0Y2hlcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluZGluZy5kaXNhbGxvd01hdGNoZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCEhbWF0Y2hbYmluZGluZy5kaXNhbGxvd01hdGNoZXNbaV1dKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY29tbWFuZCB0byBleGVjdXRlLCB0aGVuIGZpZ3VyZSBvdXQgdGhlDQogICAgICAgICAgICAvLyBjb21tYW5kIGFuZCB0aGUgYXJndW1lbnRzLg0KICAgICAgICAgICAgaWYgKGJpbmRpbmcuZXhlYykgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0gYmluZGluZy5leGVjOw0KDQogICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFyZ3VtZW50cy4NCiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5wYXJhbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOw0KICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXJncyA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uKHBhcmFtKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ubWF0Y2ggIT0gbnVsbCAmJiBtYXRjaCAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRjaFtwYXJhbS5tYXRjaF0gfHwgcGFyYW0uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcmdzW3BhcmFtLm5hbWVdID0gdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBIYW5kbGUgdGhlICd0aGVuJyBwcm9wZXJ0eS4NCiAgICAgICAgICAgIGlmIChiaW5kaW5nLnRoZW4pIHsNCiAgICAgICAgICAgICAgICBkYXRhLnN0YXRlID0gYmluZGluZy50aGVuOw0KICAgICAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIElmIG5vIGNvbW1hbmQgaXMgc2V0LCB0aGVuIGV4ZWN1dGUgdGhlICJudWxsIiBmYWtlIGNvbW1hbmQuDQogICAgICAgICAgICBpZiAocmVzdWx0LmNvbW1hbmQgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0gIm51bGwiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoREVCVUcpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiS2V5Ym9hcmRTdGF0ZU1hcHBlciNmaW5kIiwgYmluZGluZyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYgKHJlc3VsdC5jb21tYW5kKSB7DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBrZXlCaW5kaW5nLg0KICAgICAqLw0KICAgIGhhbmRsZUtleWJvYXJkOiBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleSwga2V5Q29kZSwgZSkgew0KICAgICAgICAvLyBJZiB3ZSBwcmVzc2VkIGFueSBjb21tYW5kIGtleSBidXQgbm8gb3RoZXIga2V5LCB0aGVuIGlnbm9yZSB0aGUgaW5wdXQuDQogICAgICAgIC8vIE90aGVyd2lzZSAic2hpZnQtIiBpcyBhZGRlZCB0byB0aGUgYnVmZmVyLCBhbmQgbGF0ZXIgb24gInNoaWZ0LWciDQogICAgICAgIC8vIHdoaWNoIHJlc3VsdHMgaW4gInNoaWZ0LXNoaWZ0LWciIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZS4NCiAgICAgICAgaWYgKGhhc2hJZCAhPSAwICYmIChrZXkgPT0gIiIgfHwga2V5ID09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCkpKSB7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIENvbXB1dGUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGtleWJvYXJkIGlucHV0IGJ1ZmZlci4NCiAgICAgICAgdmFyIHIgPSB0aGlzLiRjb21wb3NlQnVmZmVyKGRhdGEsIGhhc2hJZCwga2V5LCBlKTsNCiAgICAgICAgdmFyIGJ1ZmZlciA9IHIuYnVmZmVyVG9Vc2U7DQogICAgICAgIHZhciBzeW1ib2xpY05hbWUgPSByLnN5bWJvbGljTmFtZTsNCiAgICAgICAgdmFyIGtleUlkID0gci5rZXlJZGVudGlmaWVyOw0KDQogICAgICAgIHIgPSB0aGlzLiRmaW5kKGRhdGEsIGJ1ZmZlciwgc3ltYm9saWNOYW1lLCBoYXNoSWQsIGtleSwga2V5SWQpOw0KICAgICAgICBpZiAoREVCVUcpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJLZXlib2FyZFN0YXRlTWFwcGVyI21hdGNoIiwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIHIpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHI7DQogICAgfQ0KfQ0KDQovKioNCiAqIFRoaXMgaXMgYSB1c2VmdWwgbWF0Y2hpbmcgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSBpcyBkZWZpbmVkIGhlcmUgc28gdGhhdA0KICogdXNlcnMgb2YgS2V5Ym9hcmRTdGF0ZU1hcHBlciBjYW4gdXNlIGl0Lg0KICoNCiAqIEByZXR1cm4gYm9vbGVhbg0KICogICAgICAgICAgSWYgbm8gY29tbWFuZCBrZXkgKENvbW1hbmR8T3B0aW9ufFNoaWZ0fEN0cmwpIGlzIHByZXNzZWQsIGl0DQogKiAgICAgICAgICByZXR1cm5zIHRydWUuIElmIHRoZSBvbmx5IHRoZSBTaGlmdCBrZXkgaXMgcHJlc3NlZCArIGEgY2hhcmFjdGVyDQogKiAgICAgICAgICB0cnVlIGlzIHJldHVybmVkIGFzIHdlbGwuIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQuDQogKiAgICAgICAgICBTdW1taW5nIHVwLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW5ldmVyIHRoZSB1c2VyIHR5cGVkDQogKiAgICAgICAgICBhIG5vcm1hbCBjaGFyYWN0ZXIgb24gdGhlIGtleWJvYXJkIGFuZCBubyBzaG9ydGN1dC4NCiAqLw0KZXhwb3J0cy5tYXRjaENoYXJhY3Rlck9ubHkgPSBmdW5jdGlvbihidWZmZXIsIGhhc2hJZCwga2V5LCBzeW1ib2xpY05hbWUpIHsNCiAgICAvLyBJZiBubyBjb21tYW5kIGtleXMgYXJlIHByZXNzZWQsIHRoZW4gY2F0Y2ggdGhlIGlucHV0Lg0KICAgIGlmIChoYXNoSWQgPT0gMCkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgLy8gSWYgb25seSB0aGUgc2hpZnQga2V5IGlzIHByZXNzZWQgYW5kIGEgY2hhcmFjdGVyIGtleSwgdGhlbg0KICAgIC8vIGNhdGNoIHRoYXQgaW5wdXQgYXMgd2VsbC4NCiAgICBlbHNlIGlmICgoaGFzaElkID09IDQpICYmIGtleS5sZW5ndGggPT0gMSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgLy8gT3RoZXJ3aXNlLCB3ZSBsZXQgdGhlIGlucHV0IGdvdCB0aHJvdWdoLg0KICAgIGVsc2Ugew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KfTsNCg0KZXhwb3J0cy5TdGF0ZUhhbmRsZXIgPSBTdGF0ZUhhbmRsZXI7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-vim.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZy92aW0iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2Uva2V5Ym9hcmQvc3RhdGVfaGFuZGxlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vc3RhdGVfaGFuZGxlciIpLlN0YXRlSGFuZGxlcixlPWEoIi4uL3N0YXRlX2hhbmRsZXIiKS5tYXRjaENoYXJhY3Rlck9ubHksZj1mdW5jdGlvbihhLGIsYyl7cmV0dXJue3JlZ2V4OlsiKFswLTldKikiLGFdLGV4ZWM6YixwYXJhbXM6W3tuYW1lOiJ0aW1lcyIsbWF0Y2g6MSx0eXBlOiJudW1iZXIiLGRlZmF1bHRWYWx1ZToxfV0sdGhlbjpjfX0sZz17c3RhcnQ6W3trZXk6ImkiLHRoZW46Imluc2VydE1vZGUifSx7a2V5OiJkIix0aGVuOiJkZWxldGVNb2RlIn0se2tleToiYSIsZXhlYzoiZ290b3JpZ2h0Iix0aGVuOiJpbnNlcnRNb2RlIn0se2tleToic2hpZnQtaSIsZXhlYzoiZ290b2xpbmVzdGFydCIsdGhlbjoiaW5zZXJ0TW9kZSJ9LHtrZXk6InNoaWZ0LWEiLGV4ZWM6ImdvdG9saW5lZW5kIix0aGVuOiJpbnNlcnRNb2RlIn0se2tleToic2hpZnQtYyIsZXhlYzoicmVtb3ZldG9saW5lZW5kIix0aGVuOiJpbnNlcnRNb2RlIn0se2tleToic2hpZnQtciIsZXhlYzoib3ZlcndyaXRlIix0aGVuOiJyZXBsYWNlTW9kZSJ9LGYoIihrfHVwKSIsImdvbGluZXVwIiksZigiKGp8ZG93bikiLCJnb2xpbmVkb3duIiksZigiKGx8cmlnaHQpIiwiZ290b3JpZ2h0IiksZigiKGh8bGVmdCkiLCJnb3RvbGVmdCIpLHtrZXk6InNoaWZ0LWciLGV4ZWM6ImdvdG9lbmQifSxmKCJiIiwiZ290b3dvcmRsZWZ0IiksZigiZSIsImdvdG93b3JkcmlnaHQiKSxmKCJ4IiwiZGVsIiksZigic2hpZnQteCIsImJhY2tzcGFjZSIpLGYoInNoaWZ0LWQiLCJyZW1vdmV0b2xpbmVlbmQiKSxmKCJ1IiwidW5kbyIpLHtjb21tZW50OiJDYXRjaCBzb21lIGtleWJvYXJkIGlucHV0IHRvIHN0b3AgaXQgaGVyZSIsbWF0Y2g6ZX1dLGluc2VydE1vZGU6W3trZXk6ImVzYyIsdGhlbjoic3RhcnQifV0scmVwbGFjZU1vZGU6W3trZXk6ImVzYyIsZXhlYzoib3ZlcndyaXRlIix0aGVuOiJzdGFydCJ9XSxkZWxldGVNb2RlOlt7a2V5OiJkIixleGVjOiJyZW1vdmVsaW5lIix0aGVuOiJzdGFydCJ9XX07Yi5WaW09bmV3IGQoZyl9KSxkZWZpbmUoImFjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoYSl7dGhpcy5rZXltYXBwaW5nPXRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGEpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD0hMTtlLnByb3RvdHlwZT17JGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXRoaXMuJGJ1aWxkQmluZGluZ3NSZWdleChhW2JdKTtyZXR1cm4gYX0sJGJ1aWxkQmluZGluZ3NSZWdleDpmdW5jdGlvbihhKXthLmZvckVhY2goZnVuY3Rpb24oYSl7YS5rZXk/YS5rZXk9bmV3IFJlZ0V4cCgiXiIrYS5rZXkrIiQiKTpBcnJheS5pc0FycmF5KGEucmVnZXgpPygia2V5ImluIGF8fChhLmtleT1uZXcgUmVnRXhwKCJeIithLnJlZ2V4WzFdKyIkIikpLGEucmVnZXg9bmV3IFJlZ0V4cChhLnJlZ2V4LmpvaW4oIiIpKyIkIikpOmEucmVnZXgmJihhLnJlZ2V4PW5ldyBSZWdFeHAoYS5yZWdleCsiJCIpKX0pfSwkY29tcG9zZUJ1ZmZlcjpmdW5jdGlvbihhLGIsYyxkKXtpZihhLnN0YXRlPT1udWxsfHxhLmJ1ZmZlcj09bnVsbClhLnN0YXRlPSJzdGFydCIsYS5idWZmZXI9IiI7dmFyIGU9W107YiYxJiZlLnB1c2goImN0cmwiKSxiJjgmJmUucHVzaCgiY29tbWFuZCIpLGImMiYmZS5wdXNoKCJvcHRpb24iKSxiJjQmJmUucHVzaCgic2hpZnQiKSxjJiZlLnB1c2goYyk7dmFyIGY9ZS5qb2luKCItIiksZz1hLmJ1ZmZlcitmO2IhPTImJihhLmJ1ZmZlcj1nKTt2YXIgaD17YnVmZmVyVG9Vc2U6ZyxzeW1ib2xpY05hbWU6Zn07cmV0dXJuIGQmJihoLmtleUlkZW50aWZpZXI9ZC5rZXlJZGVudGlmaWVyKSxofSwkZmluZDpmdW5jdGlvbihhLGIsYyxlLGYsZyl7dmFyIGg9e307cmV0dXJuIHRoaXMua2V5bWFwcGluZ1thLnN0YXRlXS5zb21lKGZ1bmN0aW9uKGkpe3ZhciBqO2lmKGkua2V5JiYhaS5rZXkudGVzdChjKSlyZXR1cm4hMTtpZihpLnJlZ2V4JiYhKGo9aS5yZWdleC5leGVjKGIpKSlyZXR1cm4hMTtpZihpLm1hdGNoJiYhaS5tYXRjaChiLGUsZixjLGcpKXJldHVybiExO2lmKGkuZGlzYWxsb3dNYXRjaGVzKWZvcih2YXIgaz0wO2s8aS5kaXNhbGxvd01hdGNoZXMubGVuZ3RoO2srKylpZighIWpbaS5kaXNhbGxvd01hdGNoZXNba11dKXJldHVybiExO2lmKGkuZXhlYyl7aC5jb21tYW5kPWkuZXhlYztpZihpLnBhcmFtcyl7dmFyIGw7aC5hcmdzPXt9LGkucGFyYW1zLmZvckVhY2goZnVuY3Rpb24oYSl7YS5tYXRjaCE9bnVsbCYmaiE9bnVsbD9sPWpbYS5tYXRjaF18fGEuZGVmYXVsdFZhbHVlOmw9YS5kZWZhdWx0VmFsdWUsYS50eXBlPT09Im51bWJlciImJihsPXBhcnNlSW50KGwpKSxoLmFyZ3NbYS5uYW1lXT1sfSl9YS5idWZmZXI9IiJ9cmV0dXJuIGkudGhlbiYmKGEuc3RhdGU9aS50aGVuLGEuYnVmZmVyPSIiKSxoLmNvbW1hbmQ9PW51bGwmJihoLmNvbW1hbmQ9Im51bGwiKSxkJiZjb25zb2xlLmxvZygiS2V5Ym9hcmRTdGF0ZU1hcHBlciNmaW5kIixpKSwhMH0pLGguY29tbWFuZD9oOihhLmJ1ZmZlcj0iIiwhMSl9LGhhbmRsZUtleWJvYXJkOmZ1bmN0aW9uKGEsYixjLGUsZil7aWYoYj09MHx8YyE9IiImJmMhPVN0cmluZy5mcm9tQ2hhckNvZGUoMCkpe3ZhciBnPXRoaXMuJGNvbXBvc2VCdWZmZXIoYSxiLGMsZiksaD1nLmJ1ZmZlclRvVXNlLGk9Zy5zeW1ib2xpY05hbWUsaj1nLmtleUlkZW50aWZpZXI7cmV0dXJuIGc9dGhpcy4kZmluZChhLGgsaSxiLGMsaiksZCYmY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLGgsaSxnKSxnfXJldHVybiBudWxsfX0sYi5tYXRjaENoYXJhY3Rlck9ubHk9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PTA/ITA6Yj09NCYmYy5sZW5ndGg9PTE/ITA6ITF9LGIuU3RhdGVIYW5kbGVyPWV9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-clojure-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPg0KICogICAgICBDYXJpbiBNZWllcg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY2xvanVyZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX3BhcmVuc19vdXRkZW50JywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIENsb2p1cmVIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY2xvanVyZV9oaWdobGlnaHRfcnVsZXMiKS5DbG9qdXJlSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdQYXJlbnNPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCIpLk1hdGNoaW5nUGFyZW5zT3V0ZGVudDsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ2xvanVyZUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ1BhcmVuc091dGRlbnQoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopIy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIjsiKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOw0KICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7DQoNCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsNCiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9bXChcW10vKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiICAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbWF0Y2ggPSBsaW5lLm1hdGNoKC9bXCldLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgaW5kZW50ID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIFNobG9tbyBaYWxtYW4gSGVpZ2ggPHNobG9tb3phbG1hbmhlaWdoIEFUIGdtYWlsIERPVCBjb20+DQogKiAgICAgIENhcmluIE1laWVyDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jbG9qdXJlX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCg0KDQp2YXIgQ2xvanVyZUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCcqICoxICoyICozICphZ2VudCogKmFsbG93LXVucmVzb2x2ZWQtdmFycyogKmFzc2VydCogKmNsb2p1cmUtdmVyc2lvbiogJyArDQogICAgICAgICAgICAnKmNvbW1hbmQtbGluZS1hcmdzKiAqY29tcGlsZS1maWxlcyogKmNvbXBpbGUtcGF0aCogKmUgKmVyciogKmZpbGUqICcgKw0KICAgICAgICAgICAgJypmbHVzaC1vbi1uZXdsaW5lKiAqaW4qICptYWNyby1tZXRhKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICcgKw0KICAgICAgICAgICAgJypwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogJyArDQogICAgICAgICAgICAnKnJlYWQtZXZhbCogKnNvdXJjZS1wYXRoKiAqdXNlLWNvbnRleHQtY2xhc3Nsb2FkZXIqICcgKw0KICAgICAgICAgICAgJyp3YXJuLW9uLXJlZmxlY3Rpb24qICsgLSAtPiAtJmd0OyAtPj4gLSZndDsmZ3Q7IC4uIC8gPCAmbHQ7IDw9ICZsdDs9ID0gJyArDQogICAgICAgICAgICAnPT0gPiAmZ3Q7ID49ICZndDs9IGFjY2Vzc29yIGFjbG9uZSAnICsNCiAgICAgICAgICAgICdhZGQtY2xhc3NwYXRoIGFkZC13YXRjaCBhZ2VudCBhZ2VudC1lcnJvcnMgYWdldCBhbGVuZ3RoIGFsaWFzIGFsbC1ucyAnICsNCiAgICAgICAgICAgICdhbHRlciBhbHRlci1tZXRhISBhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSAnICsNCiAgICAgICAgICAgICdhcnJheS1tYXAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBhc2V0LWZsb2F0ICcgKw0KICAgICAgICAgICAgJ2FzZXQtaW50IGFzZXQtbG9uZyBhc2V0LXNob3J0IGFzc2VydCBhc3NvYyBhc3NvYyEgYXNzb2MtaW4gYXNzb2NpYXRpdmU/ICcgKw0KICAgICAgICAgICAgJ2F0b20gYXdhaXQgYXdhaXQtZm9yIGF3YWl0MSBiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmluZGluZyBiaXQtYW5kICcgKw0KICAgICAgICAgICAgJ2JpdC1hbmQtbm90IGJpdC1jbGVhciBiaXQtZmxpcCBiaXQtbm90IGJpdC1vciBiaXQtc2V0IGJpdC1zaGlmdC1sZWZ0ICcgKw0KICAgICAgICAgICAgJ2JpdC1zaGlmdC1yaWdodCBiaXQtdGVzdCBiaXQteG9yIGJvb2xlYW4gYm9vbGVhbi1hcnJheSBib29sZWFucyAnICsNCiAgICAgICAgICAgICdib3VuZC1mbiBib3VuZC1mbiogYnV0bGFzdCBieXRlIGJ5dGUtYXJyYXkgYnl0ZXMgY2FzdCBjaGFyIGNoYXItYXJyYXkgJyArDQogICAgICAgICAgICAnY2hhci1lc2NhcGUtc3RyaW5nIGNoYXItbmFtZS1zdHJpbmcgY2hhcj8gY2hhcnMgY2h1bmsgY2h1bmstYXBwZW5kICcgKw0KICAgICAgICAgICAgJ2NodW5rLWJ1ZmZlciBjaHVuay1jb25zIGNodW5rLWZpcnN0IGNodW5rLW5leHQgY2h1bmstcmVzdCBjaHVua2VkLXNlcT8gJyArDQogICAgICAgICAgICAnY2xhc3MgY2xhc3M/IGNsZWFyLWFnZW50LWVycm9ycyBjbG9qdXJlLXZlcnNpb24gY29sbD8gY29tbWVudCBjb21tdXRlICcgKw0KICAgICAgICAgICAgJ2NvbXAgY29tcGFyYXRvciBjb21wYXJlIGNvbXBhcmUtYW5kLXNldCEgY29tcGlsZSBjb21wbGVtZW50IGNvbmNhdCBjb25kICcgKw0KICAgICAgICAgICAgJ2NvbmRwIGNvbmogY29uaiEgY29ucyBjb25zdGFudGx5IGNvbnN0cnVjdC1wcm94eSBjb250YWlucz8gY291bnQgJyArDQogICAgICAgICAgICAnY291bnRlZD8gY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjIGRlY2ltYWw/IGRlY2xhcmUgZGVmaW5saW5lICcgKw0KICAgICAgICAgICAgJ2RlZm1hY3JvIGRlZm1ldGhvZCBkZWZtdWx0aSBkZWZuIGRlZm4tIGRlZm9uY2UgZGVmc3RydWN0IGRlbGF5IGRlbGF5PyAnICsNCiAgICAgICAgICAgICdkZWxpdmVyIGRlcmVmIGRlcml2ZSBkZXNjZW5kYW50cyBkZXN0cnVjdHVyZSBkaXNqIGRpc2ohIGRpc3NvYyBkaXNzb2MhICcgKw0KICAgICAgICAgICAgJ2Rpc3RpbmN0IGRpc3RpbmN0PyBkb2FsbCBkb2MgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgJyArDQogICAgICAgICAgICAnZG91YmxlLWFycmF5IGRvdWJsZXMgZHJvcCBkcm9wLWxhc3QgZHJvcC13aGlsZSBlbXB0eSBlbXB0eT8gZW5zdXJlICcgKw0KICAgICAgICAgICAgJ2VudW1lcmF0aW9uLXNlcSBldmFsIGV2ZW4/IGV2ZXJ5PyBmYWxzZT8gZmZpcnN0IGZpbGUtc2VxIGZpbHRlciBmaW5kICcgKw0KICAgICAgICAgICAgJ2ZpbmQtZG9jIGZpbmQtbnMgZmluZC12YXIgZmlyc3QgZmxvYXQgZmxvYXQtYXJyYXkgZmxvYXQ/IGZsb2F0cyBmbHVzaCAnICsNCiAgICAgICAgICAgICdmbiBmbj8gZm5leHQgZm9yIGZvcmNlIGZvcm1hdCBmdXR1cmUgZnV0dXJlLWNhbGwgZnV0dXJlLWNhbmNlbCAnICsNCiAgICAgICAgICAgICdmdXR1cmUtY2FuY2VsbGVkPyBmdXR1cmUtZG9uZT8gZnV0dXJlPyBnZW4tY2xhc3MgZ2VuLWludGVyZmFjZSBnZW5zeW0gJyArDQogICAgICAgICAgICAnZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgJyArDQogICAgICAgICAgICAnaGFzaCBoYXNoLW1hcCBoYXNoLXNldCBpZGVudGljYWw/IGlkZW50aXR5IGlmLWxldCBpZi1ub3QgaWZuPyBpbXBvcnQgJyArDQogICAgICAgICAgICAnaW4tbnMgaW5jIGluaXQtcHJveHkgaW5zdGFuY2U/IGludCBpbnQtYXJyYXkgaW50ZWdlcj8gaW50ZXJsZWF2ZSBpbnRlcm4gJyArDQogICAgICAgICAgICAnaW50ZXJwb3NlIGludG8gaW50by1hcnJheSBpbnRzIGlvISBpc2E/IGl0ZXJhdGUgaXRlcmF0b3Itc2VxIGp1eHQga2V5ICcgKw0KICAgICAgICAgICAgJ2tleXMga2V5d29yZCBrZXl3b3JkPyBsYXN0IGxhenktY2F0IGxhenktc2VxIGxldCBsZXRmbiBsaW5lLXNlcSBsaXN0ICcgKw0KICAgICAgICAgICAgJ2xpc3QqIGxpc3Q/IGxvYWQgbG9hZC1maWxlIGxvYWQtcmVhZGVyIGxvYWQtc3RyaW5nIGxvYWRlZC1saWJzIGxvY2tpbmcgJyArDQogICAgICAgICAgICAnbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5ICcgKw0KICAgICAgICAgICAgJ21ha2UtaGllcmFyY2h5IG1hcCBtYXA/IG1hcGNhdCBtYXggbWF4LWtleSBtZW1mbiBtZW1vaXplIG1lcmdlICcgKw0KICAgICAgICAgICAgJ21lcmdlLXdpdGggbWV0YSBtZXRob2Qtc2lnIG1ldGhvZHMgbWluIG1pbi1rZXkgbW9kIG5hbWUgbmFtZXNwYWNlIG5lZz8gJyArDQogICAgICAgICAgICAnbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgbm90LWV2ZXJ5PyBub3Q9ICcgKw0KICAgICAgICAgICAgJ25zIG5zLWFsaWFzZXMgbnMtaW1wb3J0cyBucy1pbnRlcm5zIG5zLW1hcCBucy1uYW1lIG5zLXB1YmxpY3MgJyArDQogICAgICAgICAgICAnbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5hbGlhcyBucy11bm1hcCBudGggbnRobmV4dCBudW0gbnVtYmVyPyBvZGQ/ICcgKw0KICAgICAgICAgICAgJ29yIHBhcmVudHMgcGFydGlhbCBwYXJ0aXRpb24gcGNhbGxzIHBlZWsgcGVyc2lzdGVudCEgcG1hcCBwb3AgcG9wISAnICsNCiAgICAgICAgICAgICdwb3AtdGhyZWFkLWJpbmRpbmdzIHBvcz8gcHIgcHItc3RyIHByZWZlci1tZXRob2QgcHJlZmVycyAnICsNCiAgICAgICAgICAgICdwcmltaXRpdmVzLWNsYXNzbmFtZXMgcHJpbnQgcHJpbnQtY3RvciBwcmludC1kb2MgcHJpbnQtZHVwIHByaW50LW1ldGhvZCAnICsNCiAgICAgICAgICAgICdwcmludC1uYW1lc3BhY2UtZG9jIHByaW50LXNpbXBsZSBwcmludC1zcGVjaWFsLWRvYyBwcmludC1zdHIgcHJpbnRmICcgKw0KICAgICAgICAgICAgJ3ByaW50bG4gcHJpbnRsbi1zdHIgcHJuIHBybi1zdHIgcHJvbWlzZSBwcm94eSBwcm94eS1jYWxsLXdpdGgtc3VwZXIgJyArDQogICAgICAgICAgICAncHJveHktbWFwcGluZ3MgcHJveHktbmFtZSBwcm94eS1zdXBlciBwdXNoLXRocmVhZC1iaW5kaW5ncyBwdmFsdWVzIHF1b3QgJyArDQogICAgICAgICAgICAncmFuZCByYW5kLWludCByYW5nZSByYXRpbz8gcmF0aW9uYWw/IHJhdGlvbmFsaXplIHJlLWZpbmQgcmUtZ3JvdXBzICcgKw0KICAgICAgICAgICAgJ3JlLW1hdGNoZXIgcmUtbWF0Y2hlcyByZS1wYXR0ZXJuIHJlLXNlcSByZWFkIHJlYWQtbGluZSByZWFkLXN0cmluZyAnICsNCiAgICAgICAgICAgICdyZWR1Y2UgcmVmIHJlZi1oaXN0b3J5LWNvdW50IHJlZi1tYXgtaGlzdG9yeSByZWYtbWluLWhpc3RvcnkgcmVmLXNldCAnICsNCiAgICAgICAgICAgICdyZWZlciByZWZlci1jbG9qdXJlIHJlbGVhc2UtcGVuZGluZy1zZW5kcyByZW0gcmVtb3ZlIHJlbW92ZS1tZXRob2QgJyArDQogICAgICAgICAgICAncmVtb3ZlLW5zIHJlbW92ZS13YXRjaCByZXBlYXQgcmVwZWF0ZWRseSByZXBsYWNlIHJlcGxpY2F0ZSByZXF1aXJlICcgKw0KICAgICAgICAgICAgJ3Jlc2V0ISByZXNldC1tZXRhISByZXNvbHZlIHJlc3QgcmVzdWx0c2V0LXNlcSByZXZlcnNlIHJldmVyc2libGU/IHJzZXEgJyArDQogICAgICAgICAgICAncnN1YnNlcSBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBzZXF1ZSBzZXF1ZW5jZSAnICsNCiAgICAgICAgICAgICdzZXF1ZW50aWFsPyBzZXQgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgJyArDQogICAgICAgICAgICAnc2h1dGRvd24tYWdlbnRzIHNsdXJwIHNvbWUgc29ydCBzb3J0LWJ5IHNvcnRlZC1tYXAgc29ydGVkLW1hcC1ieSAnICsNCiAgICAgICAgICAgICdzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyBzcGVjaWFsLWZvcm0tYW5jaG9yIHNwZWNpYWwtc3ltYm9sPyAnICsNCiAgICAgICAgICAgICdzcGxpdC1hdCBzcGxpdC13aXRoIHN0ciBzdHJlYW0/IHN0cmluZz8gc3RydWN0IHN0cnVjdC1tYXAgc3VicyBzdWJzZXEgJyArDQogICAgICAgICAgICAnc3VidmVjIHN1cGVycyBzd2FwISBzeW1ib2wgc3ltYm9sPyBzeW5jIHN5bnRheC1zeW1ib2wtYW5jaG9yIHRha2UgJyArDQogICAgICAgICAgICAndGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGltZSB0by1hcnJheSB0by1hcnJheS0yZCAnICsNCiAgICAgICAgICAgICd0cmFtcG9saW5lIHRyYW5zaWVudCB0cmVlLXNlcSB0cnVlPyB0eXBlIHVuY2hlY2tlZC1hZGQgdW5jaGVja2VkLWRlYyAnICsNCiAgICAgICAgICAgICd1bmNoZWNrZWQtZGl2aWRlIHVuY2hlY2tlZC1pbmMgdW5jaGVja2VkLW11bHRpcGx5IHVuY2hlY2tlZC1uZWdhdGUgJyArDQogICAgICAgICAgICAndW5jaGVja2VkLXJlbWFpbmRlciB1bmNoZWNrZWQtc3VidHJhY3QgdW5kZXJpdmUgdW5xdW90ZSAnICsNCiAgICAgICAgICAgICd1bnF1b3RlLXNwbGljaW5nIHVwZGF0ZS1pbiB1cGRhdGUtcHJveHkgdXNlIHZhbCB2YWxzIHZhci1nZXQgdmFyLXNldCAnICsNCiAgICAgICAgICAgICd2YXI/IHZhcnktbWV0YSB2ZWMgdmVjdG9yIHZlY3Rvcj8gd2hlbiB3aGVuLWZpcnN0IHdoZW4tbGV0IHdoZW4tbm90ICcgKw0KICAgICAgICAgICAgJ3doaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgJyArDQogICAgICAgICAgICAnd2l0aC1sb2NhbC12YXJzIHdpdGgtbWV0YSB3aXRoLW9wZW4gd2l0aC1vdXQtc3RyIHdpdGgtcHJlY2lzaW9uIHhtbC1zZXEgJyArDQogICAgICAgICAgICAnemVybz8gemlwbWFwICcpLnNwbGl0KCIgIikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoJ2RlZiBkbyBmbiBpZiBsZXQgbG9vcCBtb25pdG9yLWVudGVyIG1vbml0b3ItZXhpdCBuZXcgcXVvdGUgcmVjdXIgc2V0ISAnICsNCiAgICAgICAgICAgICd0aHJvdyB0cnkgdmFyJykuc3BsaXQoIiAiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJ0cnVlIGZhbHNlIG5pbCIpLnNwbGl0KCIgIikNCiAgICApOw0KDQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiOy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJeXD1iZWdpbiQiLA0KICAgICAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vcGFyZW5zDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcKHxcXCldIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvL2xpc3RzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcJ1xcKF0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vdmVjdG9ycw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXFt8XFxdXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy9zZXRzIGFuZCBtYXBzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xce3xcXH18XFwjXFx7fFxcI1xcfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBhbXBlcnNhbmRzDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tcXCZdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gbWV0YWRhdGENCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnW1xcI1xcXlxce10nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBhbm9ueW1vdXMgZm4gc3ludGFjdGljIHN1Z2FyDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tcXCVdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gZGVyZWYgcmVhZGVyIG1hY3JvDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tAXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1shfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x8PXwhPXw8PXw+PXw8Pnw8fD58IXwmJl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHN5bWJvbA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIls6XSg/OlthLXpBLVpdfFxkKSsiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwgLy9SZWd1bGFyIEV4cHJlc3Npb25zDQogICAgICAgICAgICByZWdleCA6ICcvIyIoPzpcLnwoXFxcIil8W15cIiJcbl0pKiIvZycNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgDQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiXlw9ZW5kJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhDbG9qdXJlSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzID0gQ2xvanVyZUhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdQYXJlbnNPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXCkvLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlwpKS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ1BhcmVuc091dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ1BhcmVuc091dGRlbnQgPSBNYXRjaGluZ1BhcmVuc091dGRlbnQ7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-clojure.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jbG9qdXJlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfcGFyZW5zX291dGRlbnQiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzIikuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCIpLk1hdGNoaW5nUGFyZW5zT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGh9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKSMvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCI7Iil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvW1woXFtdLyk7ZyYmKGQrPSIgICIpLGc9Yi5tYXRjaCgvW1wpXS8pLGcmJihkPSIiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUvY2xvanVyZV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCIqICoxICoyICozICphZ2VudCogKmFsbG93LXVucmVzb2x2ZWQtdmFycyogKmFzc2VydCogKmNsb2p1cmUtdmVyc2lvbiogKmNvbW1hbmQtbGluZS1hcmdzKiAqY29tcGlsZS1maWxlcyogKmNvbXBpbGUtcGF0aCogKmUgKmVyciogKmZpbGUqICpmbHVzaC1vbi1uZXdsaW5lKiAqaW4qICptYWNyby1tZXRhKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICpwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogKnJlYWQtZXZhbCogKnNvdXJjZS1wYXRoKiAqdXNlLWNvbnRleHQtY2xhc3Nsb2FkZXIqICp3YXJuLW9uLXJlZmxlY3Rpb24qICsgLSAtPiAtJmd0OyAtPj4gLSZndDsmZ3Q7IC4uIC8gPCAmbHQ7IDw9ICZsdDs9ID0gPT0gPiAmZ3Q7ID49ICZndDs9IGFjY2Vzc29yIGFjbG9uZSBhZGQtY2xhc3NwYXRoIGFkZC13YXRjaCBhZ2VudCBhZ2VudC1lcnJvcnMgYWdldCBhbGVuZ3RoIGFsaWFzIGFsbC1ucyBhbHRlciBhbHRlci1tZXRhISBhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSBhcnJheS1tYXAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBhc2V0LWZsb2F0IGFzZXQtaW50IGFzZXQtbG9uZyBhc2V0LXNob3J0IGFzc2VydCBhc3NvYyBhc3NvYyEgYXNzb2MtaW4gYXNzb2NpYXRpdmU/IGF0b20gYXdhaXQgYXdhaXQtZm9yIGF3YWl0MSBiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmluZGluZyBiaXQtYW5kIGJpdC1hbmQtbm90IGJpdC1jbGVhciBiaXQtZmxpcCBiaXQtbm90IGJpdC1vciBiaXQtc2V0IGJpdC1zaGlmdC1sZWZ0IGJpdC1zaGlmdC1yaWdodCBiaXQtdGVzdCBiaXQteG9yIGJvb2xlYW4gYm9vbGVhbi1hcnJheSBib29sZWFucyBib3VuZC1mbiBib3VuZC1mbiogYnV0bGFzdCBieXRlIGJ5dGUtYXJyYXkgYnl0ZXMgY2FzdCBjaGFyIGNoYXItYXJyYXkgY2hhci1lc2NhcGUtc3RyaW5nIGNoYXItbmFtZS1zdHJpbmcgY2hhcj8gY2hhcnMgY2h1bmsgY2h1bmstYXBwZW5kIGNodW5rLWJ1ZmZlciBjaHVuay1jb25zIGNodW5rLWZpcnN0IGNodW5rLW5leHQgY2h1bmstcmVzdCBjaHVua2VkLXNlcT8gY2xhc3MgY2xhc3M/IGNsZWFyLWFnZW50LWVycm9ycyBjbG9qdXJlLXZlcnNpb24gY29sbD8gY29tbWVudCBjb21tdXRlIGNvbXAgY29tcGFyYXRvciBjb21wYXJlIGNvbXBhcmUtYW5kLXNldCEgY29tcGlsZSBjb21wbGVtZW50IGNvbmNhdCBjb25kIGNvbmRwIGNvbmogY29uaiEgY29ucyBjb25zdGFudGx5IGNvbnN0cnVjdC1wcm94eSBjb250YWlucz8gY291bnQgY291bnRlZD8gY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjIGRlY2ltYWw/IGRlY2xhcmUgZGVmaW5saW5lIGRlZm1hY3JvIGRlZm1ldGhvZCBkZWZtdWx0aSBkZWZuIGRlZm4tIGRlZm9uY2UgZGVmc3RydWN0IGRlbGF5IGRlbGF5PyBkZWxpdmVyIGRlcmVmIGRlcml2ZSBkZXNjZW5kYW50cyBkZXN0cnVjdHVyZSBkaXNqIGRpc2ohIGRpc3NvYyBkaXNzb2MhIGRpc3RpbmN0IGRpc3RpbmN0PyBkb2FsbCBkb2MgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgZG91YmxlLWFycmF5IGRvdWJsZXMgZHJvcCBkcm9wLWxhc3QgZHJvcC13aGlsZSBlbXB0eSBlbXB0eT8gZW5zdXJlIGVudW1lcmF0aW9uLXNlcSBldmFsIGV2ZW4/IGV2ZXJ5PyBmYWxzZT8gZmZpcnN0IGZpbGUtc2VxIGZpbHRlciBmaW5kIGZpbmQtZG9jIGZpbmQtbnMgZmluZC12YXIgZmlyc3QgZmxvYXQgZmxvYXQtYXJyYXkgZmxvYXQ/IGZsb2F0cyBmbHVzaCBmbiBmbj8gZm5leHQgZm9yIGZvcmNlIGZvcm1hdCBmdXR1cmUgZnV0dXJlLWNhbGwgZnV0dXJlLWNhbmNlbCBmdXR1cmUtY2FuY2VsbGVkPyBmdXR1cmUtZG9uZT8gZnV0dXJlPyBnZW4tY2xhc3MgZ2VuLWludGVyZmFjZSBnZW5zeW0gZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgaGFzaCBoYXNoLW1hcCBoYXNoLXNldCBpZGVudGljYWw/IGlkZW50aXR5IGlmLWxldCBpZi1ub3QgaWZuPyBpbXBvcnQgaW4tbnMgaW5jIGluaXQtcHJveHkgaW5zdGFuY2U/IGludCBpbnQtYXJyYXkgaW50ZWdlcj8gaW50ZXJsZWF2ZSBpbnRlcm4gaW50ZXJwb3NlIGludG8gaW50by1hcnJheSBpbnRzIGlvISBpc2E/IGl0ZXJhdGUgaXRlcmF0b3Itc2VxIGp1eHQga2V5IGtleXMga2V5d29yZCBrZXl3b3JkPyBsYXN0IGxhenktY2F0IGxhenktc2VxIGxldCBsZXRmbiBsaW5lLXNlcSBsaXN0IGxpc3QqIGxpc3Q/IGxvYWQgbG9hZC1maWxlIGxvYWQtcmVhZGVyIGxvYWQtc3RyaW5nIGxvYWRlZC1saWJzIGxvY2tpbmcgbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5IG1ha2UtaGllcmFyY2h5IG1hcCBtYXA/IG1hcGNhdCBtYXggbWF4LWtleSBtZW1mbiBtZW1vaXplIG1lcmdlIG1lcmdlLXdpdGggbWV0YSBtZXRob2Qtc2lnIG1ldGhvZHMgbWluIG1pbi1rZXkgbW9kIG5hbWUgbmFtZXNwYWNlIG5lZz8gbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgbm90LWV2ZXJ5PyBub3Q9IG5zIG5zLWFsaWFzZXMgbnMtaW1wb3J0cyBucy1pbnRlcm5zIG5zLW1hcCBucy1uYW1lIG5zLXB1YmxpY3MgbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5hbGlhcyBucy11bm1hcCBudGggbnRobmV4dCBudW0gbnVtYmVyPyBvZGQ/IG9yIHBhcmVudHMgcGFydGlhbCBwYXJ0aXRpb24gcGNhbGxzIHBlZWsgcGVyc2lzdGVudCEgcG1hcCBwb3AgcG9wISBwb3AtdGhyZWFkLWJpbmRpbmdzIHBvcz8gcHIgcHItc3RyIHByZWZlci1tZXRob2QgcHJlZmVycyBwcmltaXRpdmVzLWNsYXNzbmFtZXMgcHJpbnQgcHJpbnQtY3RvciBwcmludC1kb2MgcHJpbnQtZHVwIHByaW50LW1ldGhvZCBwcmludC1uYW1lc3BhY2UtZG9jIHByaW50LXNpbXBsZSBwcmludC1zcGVjaWFsLWRvYyBwcmludC1zdHIgcHJpbnRmIHByaW50bG4gcHJpbnRsbi1zdHIgcHJuIHBybi1zdHIgcHJvbWlzZSBwcm94eSBwcm94eS1jYWxsLXdpdGgtc3VwZXIgcHJveHktbWFwcGluZ3MgcHJveHktbmFtZSBwcm94eS1zdXBlciBwdXNoLXRocmVhZC1iaW5kaW5ncyBwdmFsdWVzIHF1b3QgcmFuZCByYW5kLWludCByYW5nZSByYXRpbz8gcmF0aW9uYWw/IHJhdGlvbmFsaXplIHJlLWZpbmQgcmUtZ3JvdXBzIHJlLW1hdGNoZXIgcmUtbWF0Y2hlcyByZS1wYXR0ZXJuIHJlLXNlcSByZWFkIHJlYWQtbGluZSByZWFkLXN0cmluZyByZWR1Y2UgcmVmIHJlZi1oaXN0b3J5LWNvdW50IHJlZi1tYXgtaGlzdG9yeSByZWYtbWluLWhpc3RvcnkgcmVmLXNldCByZWZlciByZWZlci1jbG9qdXJlIHJlbGVhc2UtcGVuZGluZy1zZW5kcyByZW0gcmVtb3ZlIHJlbW92ZS1tZXRob2QgcmVtb3ZlLW5zIHJlbW92ZS13YXRjaCByZXBlYXQgcmVwZWF0ZWRseSByZXBsYWNlIHJlcGxpY2F0ZSByZXF1aXJlIHJlc2V0ISByZXNldC1tZXRhISByZXNvbHZlIHJlc3QgcmVzdWx0c2V0LXNlcSByZXZlcnNlIHJldmVyc2libGU/IHJzZXEgcnN1YnNlcSBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBzZXF1ZSBzZXF1ZW5jZSBzZXF1ZW50aWFsPyBzZXQgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgc2h1dGRvd24tYWdlbnRzIHNsdXJwIHNvbWUgc29ydCBzb3J0LWJ5IHNvcnRlZC1tYXAgc29ydGVkLW1hcC1ieSBzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyBzcGVjaWFsLWZvcm0tYW5jaG9yIHNwZWNpYWwtc3ltYm9sPyBzcGxpdC1hdCBzcGxpdC13aXRoIHN0ciBzdHJlYW0/IHN0cmluZz8gc3RydWN0IHN0cnVjdC1tYXAgc3VicyBzdWJzZXEgc3VidmVjIHN1cGVycyBzd2FwISBzeW1ib2wgc3ltYm9sPyBzeW5jIHN5bnRheC1zeW1ib2wtYW5jaG9yIHRha2UgdGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGltZSB0by1hcnJheSB0by1hcnJheS0yZCB0cmFtcG9saW5lIHRyYW5zaWVudCB0cmVlLXNlcSB0cnVlPyB0eXBlIHVuY2hlY2tlZC1hZGQgdW5jaGVja2VkLWRlYyB1bmNoZWNrZWQtZGl2aWRlIHVuY2hlY2tlZC1pbmMgdW5jaGVja2VkLW11bHRpcGx5IHVuY2hlY2tlZC1uZWdhdGUgdW5jaGVja2VkLXJlbWFpbmRlciB1bmNoZWNrZWQtc3VidHJhY3QgdW5kZXJpdmUgdW5xdW90ZSB1bnF1b3RlLXNwbGljaW5nIHVwZGF0ZS1pbiB1cGRhdGUtcHJveHkgdXNlIHZhbCB2YWxzIHZhci1nZXQgdmFyLXNldCB2YXI/IHZhcnktbWV0YSB2ZWMgdmVjdG9yIHZlY3Rvcj8gd2hlbiB3aGVuLWZpcnN0IHdoZW4tbGV0IHdoZW4tbm90IHdoaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgd2l0aC1sb2NhbC12YXJzIHdpdGgtbWV0YSB3aXRoLW9wZW4gd2l0aC1vdXQtc3RyIHdpdGgtcHJlY2lzaW9uIHhtbC1zZXEgemVybz8gemlwbWFwICIuc3BsaXQoIiAiKSksYj1lLmFycmF5VG9NYXAoImRlZiBkbyBmbiBpZiBsZXQgbG9vcCBtb25pdG9yLWVudGVyIG1vbml0b3ItZXhpdCBuZXcgcXVvdGUgcmVjdXIgc2V0ISB0aHJvdyB0cnkgdmFyIi5zcGxpdCgiICIpKSxjPWUuYXJyYXlUb01hcCgidHJ1ZSBmYWxzZSBuaWwiLnNwbGl0KCIgIikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiOy4qJCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il49YmVnaW4kIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcKHxcXCldIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcJ1xcKF0ifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJbXFxbfFxcXV0ifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJbXFx7fFxcfXxcXCNcXHt8XFwjXFx9XSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IltcXCZdIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcI1xcXlxce10ifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJbXFwlXSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IltAXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlIixyZWdleDoiWyF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfHw9fCE9fDw9fD49fDw+fDx8PnwhfCYmXSJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gYi5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yy5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmEuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWzpdKD86W2EtekEtWl18ZCkrIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDonLyMiKD86LnwoXFwiKXxbXiIiXG5dKSoiL2cnfV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXj1lbmQkIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX3BhcmVuc19vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlwpLy50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcKSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ1BhcmVuc091dGRlbnQ9ZX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coffee-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBTYXRvc2hpIE11cmFrYW1pIDxtdXJreS5zYXR5ciBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29mZmVlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbGliL29vcCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBSdWxlcyA9IHJlcXVpcmUoIi4vY29mZmVlX2hpZ2hsaWdodF9ydWxlcyIpLkNvZmZlZUhpZ2hsaWdodFJ1bGVzOw0KdmFyIE91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBQeXRob25Gb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9weXRob25pYyIpLkZvbGRNb2RlOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KDQpmdW5jdGlvbiBNb2RlKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCAgID0gbmV3IE91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBQeXRob25Gb2xkTW9kZSgiPXw9PnwtPnxcXHMqY2xhc3MgW14jXSoiKTsNCn0NCg0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBpbmRlbnRlciA9IC8oPzpbKHtbPTpdfFstPV0+fFxiKD86ZWxzZXxzd2l0Y2h8dHJ5fGNhdGNoKD86XHMqWyRBLVphLXpfXHg3Zi1cdWZmZmZdWyRcd1x4N2YtXHVmZmZmXSopP3xmaW5hbGx5KSlccyokLzsNCiAgICB2YXIgY29tbWVudExpbmUgPSAvXihccyopIy87DQogICAgdmFyIGhlcmVDb21tZW50ID0gL15ccyojIyMoPyEjKS87DQogICAgdmFyIGluZGVudGF0aW9uID0gL15ccyovOw0KICAgIA0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOw0KICAgIA0KICAgICAgICBpZiAoISh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0udHlwZSA9PT0gJ2NvbW1lbnQnKSAmJg0KICAgICAgICAgICAgc3RhdGUgPT09ICdzdGFydCcgJiYgaW5kZW50ZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpew0KICAgICAgICBjb25zb2xlLmxvZygidG9nZ2xlIik7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0Um93OyBpIDw9IGVuZFJvdzsgKytpKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgaWYgKGhlcmVDb21tZW50LnRlc3QobGluZSkpDQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoY29tbWVudExpbmUudGVzdChsaW5lKSkNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGNvbW1lbnRMaW5lLCAnJDEnKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGluZGVudGF0aW9uLCAnJCYjJyk7DQogICAgDQogICAgICAgICAgICByYW5nZS5lbmQucm93ID0gcmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSBsaW5lLmxlbmd0aCArIDE7DQogICAgICAgICAgICBkb2MucmVwbGFjZShyYW5nZSwgbGluZSk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY29mZmVlLmpzIiwgImFjZS9tb2RlL2NvZmZlZV93b3JrZXIiLCAiV29ya2VyIik7DQogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImVycm9yIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJvayIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgU2F0b3NoaSBNdXJha2FtaSA8bXVya3kuc2F0eXIgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KICAgIHZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCiAgICB2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KICAgIHZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KICAgIA0KICAgIG9vcC5pbmhlcml0cyhDb2ZmZWVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KICAgIGZ1bmN0aW9uIENvZmZlZUhpZ2hsaWdodFJ1bGVzKCkgew0KICAgICAgICB2YXIgaWRlbnRpZmllciA9ICJbJEEtWmEtel9cXHg3Zi1cXHVmZmZmXVskXFx3XFx4N2YtXFx1ZmZmZl0qIjsNCiAgICAgICAgdmFyIHN0cmluZ2ZpbGwgPSB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKCgNCiAgICAgICAgICAgICJ0aGlzfHRocm93fHRoZW58dHJ5fHR5cGVvZnxzdXBlcnxzd2l0Y2h8cmV0dXJufGJyZWFrfGJ5KXxjb250aW51ZXwiICsNCiAgICAgICAgICAgICJjYXRjaHxjbGFzc3xpbnxpbnN0YW5jZW9mfGlzfGlzbnR8aWZ8ZWxzZXxleHRlbmRzfGZvcnxmb3Jvd258IiArDQogICAgICAgICAgICAiZmluYWxseXxmdW5jdGlvbnx3aGlsZXx3aGVufG5ld3xub3xub3R8ZGVsZXRlfGRlYnVnZ2VyfGRvfGxvb3B8b2Z8b2ZmfCIgKw0KICAgICAgICAgICAgIm9yfG9ufHVubGVzc3x1bnRpbHxhbmR8eWVzIikuc3BsaXQoInwiKQ0KICAgICAgICApOw0KICAgICAgICANCiAgICAgICAgdmFyIGxhbmdDb25zdGFudCA9IGxhbmcuYXJyYXlUb01hcCgoDQogICAgICAgICAgICAidHJ1ZXxmYWxzZXxudWxsfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikNCiAgICAgICAgKTsNCiAgICAgICAgDQogICAgICAgIHZhciBpbGxlZ2FsID0gbGFuZy5hcnJheVRvTWFwKCgNCiAgICAgICAgICAgICJjYXNlfGNvbnN0fGRlZmF1bHR8ZnVuY3Rpb258dmFyfHZvaWR8d2l0aHxlbnVtfGV4cG9ydHxpbXBsZW1lbnRzfCIgKw0KICAgICAgICAgICAgImludGVyZmFjZXxsZXR8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8c3RhdGljfHlpZWxkfCIgKw0KICAgICAgICAgICAgIl9faGFzUHJvcHxleHRlbmRzfHNsaWNlfGJpbmR8aW5kZXhPZiIpLnNwbGl0KCJ8IikNCiAgICAgICAgKTsNCiAgICAgICAgDQogICAgICAgIHZhciBzdXBwb3J0Q2xhc3MgPSBsYW5nLmFycmF5VG9NYXAoKA0KICAgICAgICAgICAgIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxSZWZlcmVuY2VFcnJvcnwiICsNCiAgICAgICAgICAgICJSYW5nZUVycm9yfFN0cmluZ3xTeW50YXhFcnJvcnxFcnJvcnxFdmFsRXJyb3J8VHlwZUVycm9yfFVSSUVycm9yIikuc3BsaXQoInwiKQ0KICAgICAgICApOw0KICAgICAgICANCiAgICAgICAgdmFyIHN1cHBvcnRGdW5jdGlvbiA9IGxhbmcuYXJyYXlUb01hcCgoDQogICAgICAgICAgICAiTWF0aHxKU09OfGlzTmFOfGlzRmluaXRlfHBhcnNlSW50fHBhcnNlRmxvYXR8ZW5jb2RlVVJJfCIgKw0KICAgICAgICAgICAgImVuY29kZVVSSUNvbXBvbmVudHxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fFJhbmdlRXJyb3J8U3RyaW5nfCIgKw0KICAgICAgICAgICAgIlN5bnRheEVycm9yfEVycm9yfEV2YWxFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3IiKS5zcGxpdCgifCIpDQogICAgICAgICk7DQoNCiAgICAgICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICAgICBzdGFydCA6IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImlkZW50aWZpZXIiLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXC58OjopXFxzKikiICsgaWRlbnRpZmllcg0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJAKD86IiArIGlkZW50aWZpZXIgKyAiKT8iDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbjogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhbmdDb25zdGFudC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbGxlZ2FsLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0Q2xhc3MuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGFuZ3VhZ2Uuc3VwcG9ydC5jbGFzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0RnVuY3Rpb24uaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGFuZ3VhZ2Uuc3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiKD86MHhbXFxkYS1mQS1GXSt8KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspPykiDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIicnJyIsDQogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicWRvYyINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnIiIiJywNCiAgICAgICAgICAgICAgICAgICAgbmV4dCA6ICJxcWRvYyINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiJyIsDQogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnIicsDQogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogImAiLA0KICAgICAgICAgICAgICAgICAgICBuZXh0IDogImpzIg0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwNCiAgICAgICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIvLy8iLA0KICAgICAgICAgICAgICAgICAgICBuZXh0IDogImhlcmVnZXgiDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXgiLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIvKD8hXFxzKVteWy9cXG5cXFxcXSooPzogKD86XFxcXC58XFxbW15cXF1cXG5cXFxcXSooPzpcXFxcLlteXFxdXFxuXFxcXF0qKSpcXF0pW15bL1xcblxcXFxdKikqL1tpbWd5XXswLDR9KD8hXFx3KSINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMjIyg/ISMpIiwNCiAgICAgICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFwuIg0KICAgICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OltcXC09XT58Wy0rKi8lPD4mfF4hPz1dPXw+Pj49P3xcXC1cXC18XFwrXFwrfDo6fCYmPXxcXHxcXHw9fDw8PXw+Pj18XFw/XFwufFxcLnsyLDN9fFxcISkiDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJbKHtbXSINCiAgICAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF19KV0iDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgICAgICB9XSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcWRvYyA6IFt7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj8nJyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcXFkb2MgOiBbew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLio/IiIiJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgc3RyaW5nZmlsbF0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHFzdHJpbmcgOiBbew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW15cXFxcJ10qKD86XFxcXC5bXlxcXFwnXSopKiciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgc3RyaW5nZmlsbF0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHFxc3RyaW5nIDogW3sNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1teXFxcXCJdKig/OlxcXFwuW15cXFxcIl0qKSoiJywNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHN0cmluZ2ZpbGxdLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBqcyA6IFt7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW15cXFxcYF0qKD86XFxcXC5bXlxcXFxgXSopKmAiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaGVyZWdleCA6IFt7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKj8vLy9baW1neV17MCw0fScsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LnJlZ2V4IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrKD86Iy4qKT8iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxTKyINCiAgICAgICAgICAgIH1dLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKj8jIyMnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfV0NCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBleHBvcnRzLkNvZmZlZUhpZ2hsaWdodFJ1bGVzID0gQ29mZmVlSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvcHl0aG9uaWMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbihtYXJrZXJzKSB7DQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBuZXcgUmVnRXhwKCIoPzooW1xcW3tdKXwoIiArIG1hcmtlcnMgKyAiKSkoPzpcXHMqKSg/OiMuKik/JCIpOw0KfTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBtYXRjaC5pbmRleCk7DQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50YXRpb25CbG9jayhzZXNzaW9uLCByb3csIG1hdGNoLmluZGV4ICsgbWF0Y2hbMl0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGVudGF0aW9uQmxvY2soc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coffee.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jb2ZmZWUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY29mZmVlX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvdGV4dCIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGwoKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGQoKG5ldyBlKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBmLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBnKCI9fD0+fC0+fFxccypjbGFzcyBbXiNdKiIpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZT1hKCIuL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMiKS5Db2ZmZWVIaWdobGlnaHRSdWxlcyxmPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGc9YSgiLi9mb2xkaW5nL3B5dGhvbmljIikuRm9sZE1vZGUsaD1hKCIuLi9yYW5nZSIpLlJhbmdlLGk9YSgiLi90ZXh0IikuTW9kZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi4vbGliL29vcCIpO2suaW5oZXJpdHMobCxpKSxmdW5jdGlvbigpe3ZhciBhPS8oPzpbKHtbPTpdfFstPV0+fFxiKD86ZWxzZXxzd2l0Y2h8dHJ5fGNhdGNoKD86XHMqWyRBLVphLXpfXHg3Zi1cdWZmZmZdWyRcd1x4N2YtXHVmZmZmXSopP3xmaW5hbGx5KSlccyokLyxiPS9eKFxzKikjLyxjPS9eXHMqIyMjKD8hIykvLGQ9L15ccyovO3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMuJGdldEluZGVudChjKSxmPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGMsYikudG9rZW5zO3JldHVybighZi5sZW5ndGh8fGZbZi5sZW5ndGgtMV0udHlwZSE9PSJjb21tZW50IikmJmI9PT0ic3RhcnQiJiZhLnRlc3QoYykmJihlKz1kKSxlfSx0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGUsZixnKXtjb25zb2xlLmxvZygidG9nZ2xlIik7dmFyIGk9bmV3IGgoMCwwLDAsMCk7Zm9yKHZhciBqPWY7ajw9ZzsrK2ope3ZhciBrPWUuZ2V0TGluZShqKTtpZihjLnRlc3QoaykpY29udGludWU7Yi50ZXN0KGspP2s9ay5yZXBsYWNlKGIsIiQxIik6az1rLnJlcGxhY2UoZCwiJCYjIiksaS5lbmQucm93PWkuc3RhcnQucm93PWosaS5lbmQuY29sdW1uPWsubGVuZ3RoKzEsZS5yZXBsYWNlKGksayl9fSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWNvZmZlZS5qcyIsImFjZS9tb2RlL2NvZmZlZV93b3JrZXIiLCJXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigiZXJyb3IiLGZ1bmN0aW9uKGIpe2Euc2V0QW5ub3RhdGlvbnMoW2IuZGF0YV0pfSksYi5vbigib2siLGZ1bmN0aW9uKGIpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9jb2ZmZWVfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKCl7dmFyIGE9IlskQS1aYS16X1xceDdmLVxcdWZmZmZdWyRcXHdcXHg3Zi1cXHVmZmZmXSoiLGI9e3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9LGM9ZC5hcnJheVRvTWFwKCJ0aGlzfHRocm93fHRoZW58dHJ5fHR5cGVvZnxzdXBlcnxzd2l0Y2h8cmV0dXJufGJyZWFrfGJ5KXxjb250aW51ZXxjYXRjaHxjbGFzc3xpbnxpbnN0YW5jZW9mfGlzfGlzbnR8aWZ8ZWxzZXxleHRlbmRzfGZvcnxmb3Jvd258ZmluYWxseXxmdW5jdGlvbnx3aGlsZXx3aGVufG5ld3xub3xub3R8ZGVsZXRlfGRlYnVnZ2VyfGRvfGxvb3B8b2Z8b2ZmfG9yfG9ufHVubGVzc3x1bnRpbHxhbmR8eWVzIi5zcGxpdCgifCIpKSxlPWQuYXJyYXlUb01hcCgidHJ1ZXxmYWxzZXxudWxsfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksZj1kLmFycmF5VG9NYXAoImNhc2V8Y29uc3R8ZGVmYXVsdHxmdW5jdGlvbnx2YXJ8dm9pZHx3aXRofGVudW18ZXhwb3J0fGltcGxlbWVudHN8aW50ZXJmYWNlfGxldHxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xzdGF0aWN8eWllbGR8X19oYXNQcm9wfGV4dGVuZHN8c2xpY2V8YmluZHxpbmRleE9mIi5zcGxpdCgifCIpKSxnPWQuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufE51bWJlcnxPYmplY3R8UmVnRXhwfFJlZmVyZW5jZUVycm9yfFJhbmdlRXJyb3J8U3RyaW5nfFN5bnRheEVycm9yfEVycm9yfEV2YWxFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3IiLnNwbGl0KCJ8IikpLGg9ZC5hcnJheVRvTWFwKCJNYXRofEpTT058aXNOYU58aXNGaW5pdGV8cGFyc2VJbnR8cGFyc2VGbG9hdHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8UmFuZ2VFcnJvcnxTdHJpbmd8U3ludGF4RXJyb3J8RXJyb3J8RXZhbEVycm9yfFR5cGVFcnJvcnxVUklFcnJvciIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImlkZW50aWZpZXIiLHJlZ2V4OiIoPzooPzpcXC58OjopXFxzKikiK2F9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJAKD86IithKyIpPyJ9LHt0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4gYy5oYXNPd25Qcm9wZXJ0eShhKT8ia2V5d29yZCI6ZS5oYXNPd25Qcm9wZXJ0eShhKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmYuaGFzT3duUHJvcGVydHkoYSk/ImludmFsaWQuaWxsZWdhbCI6Zy5oYXNPd25Qcm9wZXJ0eShhKT8ibGFuZ3VhZ2Uuc3VwcG9ydC5jbGFzcyI6aC5oYXNPd25Qcm9wZXJ0eShhKT8ibGFuZ3VhZ2Uuc3VwcG9ydC5mdW5jdGlvbiI6ImlkZW50aWZpZXIifSxyZWdleDphfSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIoPzoweFtcXGRhLWZBLUZdK3woPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86W2VFXVsrLV0/XFxkKyk/KSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiJycnIixuZXh0OiJxZG9jIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiciIiInLG5leHQ6InFxZG9jIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiInIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiciJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiYCIsbmV4dDoianMifSx7dG9rZW46InN0cmluZy5yZWdleCIsbWVyZ2U6ITAscmVnZXg6Ii8vLyIsbmV4dDoiaGVyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4IixyZWdleDoiLyg/IVxccylbXlsvXFxuXFxcXF0qKD86ICg/OlxcXFwufFxcW1teXFxdXFxuXFxcXF0qKD86XFxcXC5bXlxcXVxcblxcXFxdKikqXFxdKVteWy9cXG5cXFxcXSopKi9baW1neV17MCw0fSg/IVxcdykifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIjIyMoPyEjKSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IiMuKiJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJcXD98XFw6fFxcLHxcXC4ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIoPzpbXFwtPV0+fFstKyovJTw+JnxeIT89XT18Pj4+PT98XFwtXFwtfFxcK1xcK3w6OnwmJj18XFx8XFx8PXw8PD18Pj49fFxcP1xcLnxcXC57MiwzfXxcXCEpIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbKHtbXSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXX0pXSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scWRvYzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIuKj8nJyciLG5leHQ6InN0YXJ0In0sYl0scXFkb2M6W3t0b2tlbjoic3RyaW5nIixyZWdleDonLio/IiIiJyxuZXh0OiJzdGFydCJ9LGJdLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiW15cXFxcJ10qKD86XFxcXC5bXlxcXFwnXSopKiciLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0sYl0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonW15cXFxcIl0qKD86XFxcXC5bXlxcXFwiXSopKiInLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0sYl0sanM6W3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiW15cXFxcYF0qKD86XFxcXC5bXlxcXFxgXSopKmAiLG5leHQ6InN0YXJ0In0sYl0saGVyZWdleDpbe3Rva2VuOiJzdHJpbmcucmVnZXgiLHJlZ2V4OiIuKj8vLy9baW1neV17MCw0fSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQucmVnZXgiLHJlZ2V4OiJcXHMrKD86Iy4qKT8ifSx7dG9rZW46InN0cmluZy5yZWdleCIsbWVyZ2U6ITAscmVnZXg6IlxcUysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/IyMjIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWEoIi4uL2xpYi9vb3AiKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7ZS5pbmhlcml0cyhnLGYpLGIuQ29mZmVlSGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9weXRob25pYyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZj1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW5ldyBSZWdFeHAoIig/OihbXFxbe10pfCgiK2ErIikpKD86XFxzKikoPzojLiopPyQiKX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxlPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGUpcmV0dXJuIGVbMV0/dGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZVsxXSxjLGUuaW5kZXgpOmVbMl0/dGhpcy5pbmRlbnRhdGlvbkJsb2NrKGEsYyxlLmluZGV4K2VbMl0ubGVuZ3RoKTp0aGlzLmluZGVudGF0aW9uQmxvY2soYSxjKX19LmNhbGwoZi5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coldfusion-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29sZGZ1c2lvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUveG1sJywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL21vZGUvY3NzJywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvY29sZGZ1c2lvbl9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgWG1sTW9kZSA9IHJlcXVpcmUoIi4veG1sIikuTW9kZTsNCnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7DQp2YXIgQ3NzTW9kZSA9IHJlcXVpcmUoIi4vY3NzIikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIpLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlczsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICBYbWxNb2RlLmNhbGwodGhpcyk7DQogICAgDQogICAgdmFyIGhpZ2hsaWdodGVyID0gbmV3IENvbGRmdXNpb25IaWdobGlnaHRSdWxlcygpOw0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgDQogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7DQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsNCiAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwNCiAgICAgICJjc3MtIjogQ3NzTW9kZQ0KICAgIH0pOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBYbWxNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgWG1sRm9sZE1vZGUoKTsNCn07DQoNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfV0sDQogICAgICAgIA0KICAgICAgICBjZGF0YSA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIg0KICAgICAgICB9XSwNCg0KICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOw0KfTsNCg0Kb29wLmluaGVyaXRzKFhtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsNCiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsNCiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOw0KDQogICAgICAgIGlmICh0YWcuY2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOw0KDQogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7DQogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOw0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOw0KICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7DQogICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7DQogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IHRhZywNCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsDQogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwNCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLA0KICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLA0KICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnDQogICAgICovDQogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgc3RhcnQ7DQogICAgICAgIA0KICAgICAgICBkbyB7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIHZhciBlbmQ7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghZW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsNCiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgDQogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsNCiAgICAgICAgdmFyIHN0YWNrID0gW107DQogICAgICAgIHZhciB0YWc7DQogICAgICAgIA0KICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jc3MnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IENzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9ICJjU3R5bGUiOw0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICAvLyBpZ25vcmUgYnJhY2VzIGluIGNvbW1lbnRzDQogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOw0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKlx7XHMqJC8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY3NzLmpzIiwgImFjZS9tb2RlL2Nzc193b3JrZXIiLCAiV29ya2VyIik7DQogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImNzc2xpbnQiLCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICB2YXIgZXJyb3JzID0gW107DQogICAgICAgICAgICBlLmRhdGEuZm9yRWFjaChmdW5jdGlvbihtZXNzYWdlKSB7DQogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICByb3c6IG1lc3NhZ2UubGluZSAtIDEsDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbWVzc2FnZS5jb2wgLSAxLA0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2UudHlwZSwNCiAgICAgICAgICAgICAgICAgICAgbGludDogbWVzc2FnZQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIHByb3BlcnRpZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXwiICsNCiAgICAgICAgImFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfCIgKw0KICAgICAgICAiYmFja2dyb3VuZC1vcmlnaW58YmFja2dyb3VuZC1wb3NpdGlvbnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kfGJvcmRlci1ib3R0b20tY29sb3J8IiArDQogICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArDQogICAgICAgICJib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8IiArDQogICAgICAgICJib3JkZXItbGVmdHxib3JkZXItcmlnaHQtY29sb3J8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC13aWR0aHwiICsNCiAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsNCiAgICAgICAgImJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8IiArDQogICAgICAgICJib3R0b218Ym94LXNpemluZ3xjYXB0aW9uLXNpZGV8Y2xlYXJ8Y2xpcHxjb2xvcnxjb250ZW50fGNvdW50ZXItaW5jcmVtZW50fCIgKw0KICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKw0KICAgICAgICAiZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfCIgKw0KICAgICAgICAiZm9udC1zdHJldGNofGZvbnQtc3R5bGV8Zm9udC12YXJpYW50fGZvbnQtd2VpZ2h0fGZvbnR8aGVpZ2h0fGxlZnR8IiArDQogICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArDQogICAgICAgICJsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHwiICsNCiAgICAgICAgIm1hcmdpbi10b3B8bWFya2VyLW9mZnNldHxtYXJnaW58bWFya3N8bWF4LWhlaWdodHxtYXgtd2lkdGh8bWluLWhlaWdodHwiICsNCiAgICAgICAgIm1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8IiArDQogICAgICAgICJvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218IiArDQogICAgICAgICJwYWRkaW5nLWxlZnR8cGFkZGluZy1yaWdodHxwYWRkaW5nLXRvcHxwYWRkaW5nfHBhZ2UtYnJlYWstYWZ0ZXJ8IiArDQogICAgICAgICJwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXwiICsNCiAgICAgICAgInBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8IiArDQogICAgICAgICJzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfCIgKw0KICAgICAgICAic3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHwiICsNCiAgICAgICAgInRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufCIgKw0KICAgICAgICAidmlzaWJpbGl0eXx2b2ljZS1mYW1pbHl8dm9sdW1lfHdoaXRlLXNwYWNlfHdpZG93c3x3aWR0aHx3b3JkLXNwYWNpbmd8IiArDQogICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnMiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBjb25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfCIgKw0KICAgICAgICAiYmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnwiICsNCiAgICAgICAgImNoYXJ8Y2lyY2xlfGNqay1pZGVvZ3JhcGhpY3xjb2wtcmVzaXplfGNvbGxhcHNlfGNvbnRlbnQtYm94fGNyb3NzaGFpcnxkYXNoZWR8IiArDQogICAgICAgICJkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3wiICsNCiAgICAgICAgImRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8IiArDQogICAgICAgICJkaXN0cmlidXRlfGRvdHRlZHxkb3VibGV8ZS1yZXNpemV8ZWxsaXBzaXN8Zml4ZWR8Z2VvcmdpYW58Z3Jvb3ZlfCIgKw0KICAgICAgICAiaGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHwiICsNCiAgICAgICAgImlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8IiArDQogICAgICAgICJpZGVvZ3JhcGgtc3BhY2V8aW5hY3RpdmV8aW5oZXJpdHxpbmxpbmUtYmxvY2t8aW5saW5lfGluc2V0fGluc2lkZXwiICsNCiAgICAgICAgImludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfCIgKw0KICAgICAgICAia2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8IiArDQogICAgICAgICJsb3dlci1hbHBoYXxsb3dlci1ncmVla3xsb3dlci1sYXRpbnxsb3dlci1yb21hbnxsb3dlcmNhc2V8bHItdGJ8bHRyfCIgKw0KICAgICAgICAibWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8IiArDQogICAgICAgICJudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8IiArDQogICAgICAgICJvdmVybGluZXxwb2ludGVyfHByb2dyZXNzfHJlbGF0aXZlfHJlcGVhdC14fHJlcGVhdC15fHJlcGVhdHxyaWdodHwiICsNCiAgICAgICAgInJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3wiICsNCiAgICAgICAgInNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8IiArDQogICAgICAgICJ0YWJsZS1oZWFkZXItZ3JvdXB8dGItcmx8dGV4dC1ib3R0b218dGV4dC10b3B8dGV4dHx0aGlja3x0aGlufHRvcHwiICsNCiAgICAgICAgInRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8IiArDQogICAgICAgICJ2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfCIgKw0KICAgICAgICAiemVybyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGNvbG9ycyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhcXVhfGJsYWNrfGJsdWV8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfCIgKw0KICAgICAgICAicHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB2YXIgbnVtUmUgPSAiXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiOw0KDQogICAgdmFyIGJhc2VfcnVsZXNldCA9IFsNCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAicnVsZXNldF9jb21tZW50Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsDQogICAgICAgICAgICByZWdleCA6IG51bVJlICsgIig/OmVtfGV4fHB4fGNtfG1tfGlufHB0fHBjfGRlZ3xyYWR8Z3JhZHxtc3xzfGh6fGtoenwlKSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsICAvLyBoZXg2IGNvbG9yDQogICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17Nn0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgzIGNvbG9yDQogICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17M30iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQudHlwZSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudC5jb2xvciI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRleHQiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWdleCA6ICJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiINCiAgICAgICAgfQ0KICAgICAgXTsNCg0KICAgIHZhciBydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9ydWxlc2V0KTsNCiAgICBydWxlc2V0LnVuc2hpZnQoew0KICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICByZWdleCA6ICJcXH0iLA0KICAgICAgICBuZXh0OiAgICJzdGFydCINCiAgICB9KTsNCg0KICAgIHZhciBtZWRpYV9ydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoIGJhc2VfcnVsZXNldCApOw0KICAgIG1lZGlhX3J1bGVzZXQudW5zaGlmdCh7DQogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgIHJlZ2V4IDogIlxcfSIsDQogICAgICAgIG5leHQ6ICAgIm1lZGlhIg0KICAgIH0pOw0KDQogICAgdmFyIGJhc2VfY29tbWVudCA9IFt7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICByZWdleCA6ICIuKyINCiAgICB9XTsNCg0KICAgIHZhciBjb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBjb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgfSk7DQoNCiAgICB2YXIgbWVkaWFfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7DQogICAgbWVkaWFfY29tbWVudC51bnNoaWZ0KHsNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICBuZXh0IDogIm1lZGlhIg0KICAgIH0pOw0KDQogICAgdmFyIHJ1bGVzZXRfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7DQogICAgcnVsZXNldF9jb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAicnVsZXNldCINCiAgICB9KTsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwNCiAgICAgICAgICAgIG5leHQ6ICAicnVsZXNldCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICJALio/eyIsDQogICAgICAgICAgICBuZXh0OiAgIm1lZGlhIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsDQogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICB9XSwNCg0KICAgICAgICAibWVkaWEiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJtZWRpYV9jb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICByZWdleDogIlxceyIsDQogICAgICAgICAgICBuZXh0OiAgIm1lZGlhX3J1bGVzZXQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICJcXH0iLA0KICAgICAgICAgICAgbmV4dDogICJzdGFydCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLA0KICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLA0KICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyINCiAgICAgICAgfV0sDQoNCiAgICAgICAgImNvbW1lbnQiIDogY29tbWVudCwNCg0KICAgICAgICAicnVsZXNldCIgOiBydWxlc2V0LA0KICAgICAgICAicnVsZXNldF9jb21tZW50IiA6IHJ1bGVzZXRfY29tbWVudCwNCg0KICAgICAgICAibWVkaWFfcnVsZXNldCIgOiBtZWRpYV9ydWxlc2V0LA0KICAgICAgICAibWVkaWFfY29tbWVudCIgOiBtZWRpYV9jb21tZW50DQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhDc3NIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5Dc3NIaWdobGlnaHRSdWxlcyA9IENzc0hpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NvbGRmdXNpb25faGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3htbF91dGlsJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXM7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KdmFyIHhtbF91dGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KDQp2YXIgQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMNCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgc3RhcnQgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIVxcW0NEQVRBXFxbIiwNCiAgICAgICAgICAgIG5leHQgOiAiY2RhdGEiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInhtbF9wZSIsDQogICAgICAgICAgICByZWdleCA6ICI8XFw/Lio/XFw/PiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLA0KICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICI8KD89XHMqc2NyaXB0KSIsDQogICAgICAgICAgICBuZXh0IDogInNjcmlwdCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiPCg/PVxzKnN0eWxlKSIsDQogICAgICAgICAgICBuZXh0IDogInN0eWxlIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsIC8vIG9wZW5pbmcgdGFnDQogICAgICAgICAgICByZWdleCA6ICI8XFwvPyIsDQogICAgICAgICAgICBuZXh0IDogInRhZyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltePF0rIg0KICAgICAgICB9IF0sDQogICAgDQogICAgICAgIGNkYXRhIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9IF0sDQoNCiAgICAgICAgY29tbWVudCA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIuKj8tLT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfSBdDQogICAgfTsNCiAgICANCiAgICB4bWxfdXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCiAgICB4bWxfdXRpbC50YWcodGhpcy4kcnVsZXMsICJzdHlsZSIsICJjc3Mtc3RhcnQiKTsNCiAgICB4bWxfdXRpbC50YWcodGhpcy4kcnVsZXMsICJzY3JpcHQiLCAianMtc3RhcnQiKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCAianMtIiwgW3sNCiAgICAgICAgdG9rZW46ICJjb21tZW50IiwNCiAgICAgICAgcmVnZXg6ICJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfSwgew0KICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwNCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c2NyaXB0KSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfV0pOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhDc3NIaWdobGlnaHRSdWxlcywgImNzcy0iLCBbew0KICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwNCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c3R5bGUpIiwNCiAgICAgICAgbmV4dDogInRhZyINCiAgICB9XSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlcyA9IENvbGRmdXNpb25IaWdobGlnaHRSdWxlczsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coldfusion.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jb2xkZnVzaW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWwiLCJhY2UvbW9kZS9qYXZhc2NyaXB0IiwiYWNlL21vZGUvY3NzIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2NvbGRmdXNpb25faGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIpLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlcyxqPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpO3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGVtYmVkcz1hLmdldEVtYmVkcygpLHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7ImpzLSI6ZiwiY3NzLSI6Z30pfTtkLmluaGVyaXRzKGosZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChqLnByb3RvdHlwZSksYi5Nb2RlPWp9KSxkZWZpbmUoImFjZS9tb2RlL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXIsaT1hKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGUsaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbF91dGlsIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Iig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZS50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0Iil9O2QuaW5oZXJpdHMoZyxmKSxiLlhtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIl9xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIl9xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9XSxhW2IrIl9xc3RyaW5nIl09aCgiJyIsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfcXFzdHJpbmciXT1oKCciJyxiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJdPVt7dG9rZW46Im1ldGEudGFnIixtZXJnZTohMCxyZWdleDoiLz8+IixuZXh0OmN9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ij0ifSx7dG9rZW46ImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIscmVnZXg6IlstX2EtekEtWjAtOTpdKyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XS5jb25jYXQoZyhiKSl9fSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1hKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixnPWZ1bmN0aW9uKCl7dGhpcy5pbmhlcml0KGYsWyJzdHJpbmdfZHF1b3RlcyJdKSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IjwiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj8hMTp7dGV4dDoiPD4iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09Ij4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSI+IilyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaz1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisyKTtpZihrPT0iPC8iKXt2YXIgbD10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpK2QuZ2V0VGFiU3RyaW5nKCksbT10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbCsiXG4iK20sc2VsZWN0aW9uOlsxLGwubGVuZ3RoLDEsbC5sZW5ndGhdfX19fSl9O2QuaW5oZXJpdHMoZyxlKSxiLlhtbEJlaGF2aW91cj1nfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9saWIvbGFuZyIpLGY9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsaD1hKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzKSx0aGlzLnZvaWRFbGVtZW50cz1hfHx7fX07ZC5pbmhlcml0cyhpLGcpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO3JldHVybiBkLmNsb3Npbmc/Yj09Im1hcmtiZWdpbmVuZCI/ImVuZCI6IiI6IWQudGFnTmFtZXx8dGhpcy52b2lkRWxlbWVudHNbZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldPyIiOmQuc2VsZkNsb3Npbmc/IiI6ZC52YWx1ZS5pbmRleE9mKCIvIitkLnRhZ05hbWUpIT09LTE/IiI6InN0YXJ0In0sdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFRva2VucyhiLGIpWzBdLnRva2VucyxkPSIiO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2cudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MD9kKz1nLnZhbHVlOmQrPWUuc3RyaW5nUmVwZWF0KCIgIixnLnZhbHVlLmxlbmd0aCl9cmV0dXJuIHRoaXMuX3BhcnNlVGFnKGQpfSx0aGlzLnRhZ1JlPS9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLyx0aGlzLl9wYXJzZVRhZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRhZ1JlLmV4ZWMoYSksYz10aGlzLnRhZ1JlLmxhc3RJbmRleHx8MDtyZXR1cm4gdGhpcy50YWdSZS5sYXN0SW5kZXg9MCx7dmFsdWU6YSxtYXRjaDpiP2JbMl06IiIsY2xvc2luZzpiPyEhYlszXTohMSxzZWxmQ2xvc2luZzpiPyEhYls1XXx8YlsyXT09Ii8+IjohMSx0YWdOYW1lOmI/Yls0XToiIixjb2x1bW46YlsxXT9jK2JbMV0ubGVuZ3RoOmN9fSx0aGlzLl9yZWFkVGFnRm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtpZighZCl2YXIgZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9O2MrPWIudmFsdWU7aWYoYy5pbmRleE9mKCI+IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuc3RhcnQ9ZCxlLmVuZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9LGEuc3RlcEZvcndhcmQoKSxlfX13aGlsZShiPWEuc3RlcEZvcndhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3JlYWRUYWdCYWNrd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtkfHwoZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9KSxjPWIudmFsdWUrYztpZihjLmluZGV4T2YoIjwiKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5lbmQ9ZCxlLnN0YXJ0PXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX0sYS5zdGVwQmFja3dhcmQoKSxlfX13aGlsZShiPWEuc3RlcEJhY2t3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9wb3A9ZnVuY3Rpb24oYSxiKXt3aGlsZShhLmxlbmd0aCl7dmFyIGM9YVthLmxlbmd0aC0xXTtpZighYnx8Yy50YWdOYW1lPT1iLnRhZ05hbWUpcmV0dXJuIGEucG9wKCk7aWYodGhpcy52b2lkRWxlbWVudHNbYi50YWdOYW1lXSlyZXR1cm47aWYodGhpcy52b2lkRWxlbWVudHNbYy50YWdOYW1lXSl7YS5wb3AoKTtjb250aW51ZX1yZXR1cm4gbnVsbH19LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO2lmKCFkLm1hdGNoKXJldHVybiBudWxsO3ZhciBlPWQuY2xvc2luZ3x8ZC5zZWxmQ2xvc2luZyxnPVtdLGk7aWYoIWUpe3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbiksaz17cm93OmMsY29sdW1uOmQuY29sdW1uK2QudGFnTmFtZS5sZW5ndGgrMn07d2hpbGUoaT10aGlzLl9yZWFkVGFnRm9yd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gZi5mcm9tUG9pbnRzKGssaS5zdGFydCl9ZWxzZSBnLnB1c2goaSl9fWVsc2V7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uK2QubWF0Y2gubGVuZ3RoKSxsPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW59O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZighaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixmLmZyb21Qb2ludHMoaS5zdGFydCxsKX1lbHNlIGcucHVzaChpKX19fX0uY2FsbChpLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGw9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLG09ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgayx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgbH07ZC5pbmhlcml0cyhtLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIil7dmFyIGg9Yi5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTtoJiYoZCs9Yyl9ZWxzZSBpZihhPT0iZG9jLXN0YXJ0Iil7aWYoZz09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWphdmFzY3JpcHQuanMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigianNsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MDtkPGIuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZT1iLmRhdGFbZF07ZSYmYy5wdXNoKHtyb3c6ZS5saW5lLTEsY29sdW1uOmUuY2hhcmFjdGVyLTEsdGV4dDplLnJlYXNvbix0eXBlOiJ3YXJuaW5nIixsaW50OmV9KX1hLnNldEFubm90YXRpb25zKGMpfSksYi5vbigibmFyY2lzc3VzIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXthLmNsZWFyQW5ub3RhdGlvbnMoKX0pLGJ9fS5jYWxsKG0ucHJvdG90eXBlKSxiLk1vZGU9bX0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS91bmljb2RlIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuLi91bmljb2RlIiksZz1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8Y29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiLnNwbGl0KCJ8IikpLGM9ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiLGQ9ZS5hcnJheVRvTWFwKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIi5zcGxpdCgifCIpKSxpPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxqPWUuYXJyYXlUb01hcCgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLnNwbGl0KCJ8IikpLGs9IlsiK2YucGFja2FnZXMuTCsiXFwkX11bIitmLnBhY2thZ2VzLkwrZi5wYWNrYWdlcy5NbitmLnBhY2thZ2VzLk1jK2YucGFja2FnZXMuTmQrZi5wYWNrYWdlcy5QYysiXFwkX10qXFxiIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZykuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpbImtleXdvcmQuZGVmaW5pdGlvbiIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIraysiKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IitjKyIpXFxiIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBhLmhhc093blByb3BlcnR5KGMpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5kZXByZWNhdGVkIjpoLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkLmRlZmluaXRpb24iOmIuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmkuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjpqLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmlsbGVnYWwiOmM9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDprfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXC89PyIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il4jIS4qJCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50X3JlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1xcdyoiLG5leHQ6InN0YXJ0IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiW15cXFxcL1xcW10rIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJcXFsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXSIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiW15cXFxcXFxdXSsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLGNvbW1lbnRfcmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZywiZG9jLSIsWyhuZXcgZykuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGksaCksYi5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvY3NzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsaj1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsaz1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCksImkiKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBqfTtkLmluaGVyaXRzKGssZSksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdSdWxlcz0iY1N0eWxlIix0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLnRva2VucztpZihlLmxlbmd0aCYmZVtlLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7dmFyIGY9Yi5tYXRjaCgvXi4qXHtccyokLyk7cmV0dXJuIGYmJihkKz1jKSxkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGkoWyJhY2UiXSwid29ya2VyLWNzcy5qcyIsImFjZS9tb2RlL2Nzc193b3JrZXIiLCJXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigiY3NzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Yi5kYXRhLmZvckVhY2goZnVuY3Rpb24oYSl7Yy5wdXNoKHtyb3c6YS5saW5lLTEsY29sdW1uOmEuY29sLTEsdGV4dDphLm1lc3NhZ2UsdHlwZTphLnR5cGUsbGludDphfSl9KSxhLnNldEFubm90YXRpb25zKGMpfSksYn19LmNhbGwoay5wcm90b3R5cGUpLGIuTW9kZT1rfSksZGVmaW5lKCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXxhcHBlYXJhbmNlfGF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8Ym9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofGJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofGJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfGJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8Y291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fGVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHxsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8bWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fG1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8b3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofG91dGxpbmV8b3ZlcmZsb3d8b3ZlcmZsb3cteHxvdmVyZmxvdy15fHBhZGRpbmctYm90dG9tfHBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXxwYXVzZXxwaXRjaC1yYW5nZXxwaXRjaHxwbGF5LWR1cmluZ3xwb2ludGVyLWV2ZW50c3xwb3NpdGlvbnxxdW90ZXN8cmVzaXplfHJpY2huZXNzfHJpZ2h0fHNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8c3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHx0ZXh0LXNoYWRvd3x0ZXh0LXRyYW5zZm9ybXx0b3B8dHJhbnNmb3JtfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnx2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3x6LWluZGV4Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXxibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfGNoYXJ8Y2lyY2xlfGNqay1pZGVvZ3JhcGhpY3xjb2wtcmVzaXplfGNvbGxhcHNlfGNvbnRlbnQtYm94fGNyb3NzaGFpcnxkYXNoZWR8ZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8ZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXxkaXN0cmlidXRlfGRvdHRlZHxkb3VibGV8ZS1yZXNpemV8ZWxsaXBzaXN8Zml4ZWR8Z2VvcmdpYW58Z3Jvb3ZlfGhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8aWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3xpZGVvZ3JhcGgtc3BhY2V8aW5hY3RpdmV8aW5oZXJpdHxpbmxpbmUtYmxvY2t8aW5saW5lfGluc2V0fGluc2lkZXxpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXxrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXxsb3dlci1hbHBoYXxsb3dlci1ncmVla3xsb3dlci1sYXRpbnxsb3dlci1yb21hbnxsb3dlcmNhc2V8bHItdGJ8bHRyfG1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fG53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXxvdmVybGluZXxwb2ludGVyfHByb2dyZXNzfHJlbGF0aXZlfHJlcGVhdC14fHJlcGVhdC15fHJlcGVhdHxyaWdodHxyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8c29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1oZWFkZXItZ3JvdXB8dGItcmx8dGV4dC1ib3R0b218dGV4dC10b3B8dGV4dHx0aGlja3x0aGlufHRvcHx0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfHZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8emVybyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8cHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciLnNwbGl0KCJ8IikpLGY9IlxcLT8oPzooPzpbMC05XSspfCg/OlswLTldKlxcLlswLTldKykpIixnPVt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6InJ1bGVzZXRfY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6ZisiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiI1thLWYwLTldezZ9In0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiI1thLWYwLTldezN9In0se3Rva2VuOmZ1bmN0aW9uKGUpe3JldHVybiBhLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQudHlwZSI6Yi5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmZ1bmN0aW9uIjpjLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuY29uc3RhbnQiOmQuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudC5jb2xvciI6InRleHQifSxyZWdleDoiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoifV0saD1lLmNvcHlBcnJheShnKTtoLnVuc2hpZnQoe3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJcXH0iLG5leHQ6InN0YXJ0In0pO3ZhciBpPWUuY29weUFycmF5KGcpO2kudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoibWVkaWEifSk7dmFyIGo9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGs9ZS5jb3B5QXJyYXkoaik7ay51bnNoaWZ0KHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSk7dmFyIGw9ZS5jb3B5QXJyYXkoaik7bC51bnNoaWZ0KHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoibWVkaWEifSk7dmFyIG09ZS5jb3B5QXJyYXkoaik7bS51bnNoaWZ0KHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoicnVsZXNldCJ9KSx0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiXFx7IixuZXh0OiJydWxlc2V0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJALio/eyIsbmV4dDoibWVkaWEifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIjW2EtejAtOS1fXSsifSx7dG9rZW46InZhcmlhYmxlIixyZWdleDoiXFwuW2EtejAtOS1fXSsifSx7dG9rZW46InN0cmluZyIscmVnZXg6IjpbYS16MC05LV9dKyJ9LHt0b2tlbjoiY29uc3RhbnQiLHJlZ2V4OiJbYS16MC05LV9dKyJ9XSxtZWRpYTpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJtZWRpYV9jb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6Im1lZGlhX3J1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIjW2EtejAtOS1fXSsifSx7dG9rZW46InZhcmlhYmxlIixyZWdleDoiXFwuW2EtejAtOS1fXSsifSx7dG9rZW46InN0cmluZyIscmVnZXg6IjpbYS16MC05LV9dKyJ9LHt0b2tlbjoiY29uc3RhbnQiLHJlZ2V4OiJbYS16MC05LV9dKyJ9XSxjb21tZW50OmsscnVsZXNldDpoLHJ1bGVzZXRfY29tbWVudDptLG1lZGlhX3J1bGVzZXQ6aSxtZWRpYV9jb21tZW50Omx9fTtkLmluaGVyaXRzKGcsZiksYi5Dc3NIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfdXRpbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXMsZj1hKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWEoIi4veG1sX3V0aWwiKSxpPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiI8XFwhXFxbQ0RBVEFcXFsiLG5leHQ6ImNkYXRhIn0se3Rva2VuOiJ4bWxfcGUiLHJlZ2V4OiI8XFw/Lio/XFw/PiJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IjxcXCEtLSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8KD89cypzY3JpcHQpIixuZXh0OiJzY3JpcHQifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPCg/PXMqc3R5bGUpIixuZXh0OiJzdHlsZSJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvPyIsbmV4dDoidGFnIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IltePF0rIn1dLGNkYXRhOlt7dG9rZW46InRleHQiLHJlZ2V4OiJcXF1cXF0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGgudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpLGgudGFnKHRoaXMuJHJ1bGVzLCJzdHlsZSIsImNzcy1zdGFydCIpLGgudGFnKHRoaXMuJHJ1bGVzLCJzY3JpcHQiLCJqcy1zdGFydCIpLHRoaXMuZW1iZWRSdWxlcyhmLCJqcy0iLFt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsbmV4dDoidGFnIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8oPz1zY3JpcHQpIixuZXh0OiJ0YWcifV0pLHRoaXMuZW1iZWRSdWxlcyhlLCJjc3MtIixbe3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8oPz1zdHlsZSkiLG5leHQ6InRhZyJ9XSl9O2QuaW5oZXJpdHMoaSxnKSxiLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlcz1pfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-csharp-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9jc2hhcnAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIENTaGFycEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzIikuQ1NoYXJwSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ1NoYXJwSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogIA0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICANCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsNCiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICANCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KICANCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCg0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBDU2hhcnBIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoImFic3RyYWN0fGV2ZW50fG5ld3xzdHJ1Y3R8YXN8ZXhwbGljaXR8bnVsbHxzd2l0Y2h8YmFzZXxleHRlcm58b2JqZWN0fHRoaXN8Ym9vbHxmYWxzZXxvcGVyYXRvcnx0aHJvd3xicmVha3xmaW5hbGx5fG91dHx0cnVlfGJ5dGV8Zml4ZWR8b3ZlcnJpZGV8dHJ5fGNhc2V8ZmxvYXR8cGFyYW1zfHR5cGVvZnxjYXRjaHxmb3J8cHJpdmF0ZXx1aW50fGNoYXJ8Zm9yZWFjaHxwcm90ZWN0ZWR8dWxvbmd8Y2hlY2tlZHxnb3RvfHB1YmxpY3x1bmNoZWNrZWR8Y2xhc3N8aWZ8cmVhZG9ubHl8dW5zYWZlfGNvbnN0fGltcGxpY2l0fHJlZnx1c2hvcnR8Y29udGludWV8aW58cmV0dXJufHVzaW5nfGRlY2ltYWx8aW50fHNieXRlfHZpcnR1YWx8ZGVmYXVsdHxpbnRlcmZhY2V8c2VhbGVkfHZvbGF0aWxlfGRlbGVnYXRlfGludGVybmFsfHNob3J0fHZvaWR8ZG98aXN8c2l6ZW9mfHdoaWxlfGRvdWJsZXxsb2NrfHN0YWNrYWxsb2N8ZWxzZXxsb25nfHN0YXRpY3xlbnVtfG5hbWVzcGFjZXxzdHJpbmd8dmFyfGR5bmFtaWMiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIm51bGx8dHJ1ZXxmYWxzZSIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhDU2hhcnBIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5DU2hhcnBIaWdobGlnaHRSdWxlcyA9IENTaGFycEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-csharp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jc2hhcnAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NoYXJwX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2NzaGFycF9oaWdobGlnaHRfcnVsZXMiKS5DU2hhcnBIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGo9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGs9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgaSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhrLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQiKXt2YXIgZz1iLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTtnJiYoZCs9Yyl9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbH19LmNhbGwoay5wcm90b3R5cGUpLGIuTW9kZT1rfSksZGVmaW5lKCJhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJhYnN0cmFjdHxldmVudHxuZXd8c3RydWN0fGFzfGV4cGxpY2l0fG51bGx8c3dpdGNofGJhc2V8ZXh0ZXJufG9iamVjdHx0aGlzfGJvb2x8ZmFsc2V8b3BlcmF0b3J8dGhyb3d8YnJlYWt8ZmluYWxseXxvdXR8dHJ1ZXxieXRlfGZpeGVkfG92ZXJyaWRlfHRyeXxjYXNlfGZsb2F0fHBhcmFtc3x0eXBlb2Z8Y2F0Y2h8Zm9yfHByaXZhdGV8dWludHxjaGFyfGZvcmVhY2h8cHJvdGVjdGVkfHVsb25nfGNoZWNrZWR8Z290b3xwdWJsaWN8dW5jaGVja2VkfGNsYXNzfGlmfHJlYWRvbmx5fHVuc2FmZXxjb25zdHxpbXBsaWNpdHxyZWZ8dXNob3J0fGNvbnRpbnVlfGlufHJldHVybnx1c2luZ3xkZWNpbWFsfGludHxzYnl0ZXx2aXJ0dWFsfGRlZmF1bHR8aW50ZXJmYWNlfHNlYWxlZHx2b2xhdGlsZXxkZWxlZ2F0ZXxpbnRlcm5hbHxzaG9ydHx2b2lkfGRvfGlzfHNpemVvZnx3aGlsZXxkb3VibGV8bG9ja3xzdGFja2FsbG9jfGVsc2V8bG9uZ3xzdGF0aWN8ZW51bXxuYW1lc3BhY2V8c3RyaW5nfHZhcnxkeW5hbWljIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgibnVsbHx0cnVlfGZhbHNlIi5zcGxpdCgifCIpKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXCoiLG1lcmdlOiEwLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBjPT0idGhpcyI/InZhcmlhYmxlLmxhbmd1YWdlIjphLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjpiLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4ifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLkNTaGFycEhpZ2hsaWdodFJ1bGVzPWh9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-css-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY3NzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBDc3NIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCksICJpIik7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSAiY1N0eWxlIjsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgLy8gaWdub3JlIGJyYWNlcyBpbiBjb21tZW50cw0KICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpLnRva2VuczsNCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsNCiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipce1xzKiQvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWNzcy5qcyIsICJhY2UvbW9kZS9jc3Nfd29ya2VyIiwgIldvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJjc3NsaW50IiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZS5kYXRhLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgew0KICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcm93OiBtZXNzYWdlLmxpbmUgLSAxLA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1lc3NhZ2UuY29sIC0gMSwNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZS5tZXNzYWdlLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlLnR5cGUsDQogICAgICAgICAgICAgICAgICAgIGxpbnQ6IG1lc3NhZ2UNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKGVycm9ycyk7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIi1tb3otYXBwZWFyYW5jZXwtbW96LWJveC1zaXppbmd8LXdlYmtpdC1ib3gtc2l6aW5nfC1tb3otb3V0bGluZS1yYWRpdXN8LW1vei10cmFuc2Zvcm18LXdlYmtpdC10cmFuc2Zvcm18IiArDQogICAgICAgICJhcHBlYXJhbmNlfGF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXwiICsNCiAgICAgICAgImJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfCIgKw0KICAgICAgICAiYm9yZGVyLWJvdHRvbS1zdHlsZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b218Ym9yZGVyLWNvbGxhcHNlfCIgKw0KICAgICAgICAiYm9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofCIgKw0KICAgICAgICAiYm9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8IiArDQogICAgICAgICJib3JkZXItcmlnaHR8Ym9yZGVyLXNwYWNpbmd8Ym9yZGVyLXN0eWxlfGJvcmRlci10b3AtY29sb3J8IiArDQogICAgICAgICJib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfCIgKw0KICAgICAgICAiYm90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHwiICsNCiAgICAgICAgImNvdW50ZXItcmVzZXR8Y3VlLWFmdGVyfGN1ZS1iZWZvcmV8Y3VlfGN1cnNvcnxkaXJlY3Rpb258ZGlzcGxheXwiICsNCiAgICAgICAgImVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXwiICsNCiAgICAgICAgImZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fCIgKw0KICAgICAgICAibGV0dGVyLXNwYWNpbmd8bGluZS1oZWlnaHR8bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlLXBvc2l0aW9ufCIgKw0KICAgICAgICAibGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8IiArDQogICAgICAgICJtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8IiArDQogICAgICAgICJtaW4td2lkdGh8LW1vei1ib3JkZXItcmFkaXVzfG9wYWNpdHl8b3JwaGFuc3xvdXRsaW5lLWNvbG9yfG91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfCIgKw0KICAgICAgICAib3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofG91dGxpbmV8b3ZlcmZsb3d8b3ZlcmZsb3cteHxvdmVyZmxvdy15fHBhZGRpbmctYm90dG9tfCIgKw0KICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKw0KICAgICAgICAicGFnZS1icmVhay1iZWZvcmV8cGFnZS1icmVhay1pbnNpZGV8cGFnZXxwYXVzZS1hZnRlcnxwYXVzZS1iZWZvcmV8IiArDQogICAgICAgICJwYXVzZXxwaXRjaC1yYW5nZXxwaXRjaHxwbGF5LWR1cmluZ3xwb2ludGVyLWV2ZW50c3xwb3NpdGlvbnxxdW90ZXN8cmVzaXplfHJpY2huZXNzfHJpZ2h0fCIgKw0KICAgICAgICAic2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3wiICsNCiAgICAgICAgInN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8IiArDQogICAgICAgICJ0ZXh0LXNoYWRvd3x0ZXh0LXRyYW5zZm9ybXx0b3B8dHJhbnNmb3JtfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnwiICsNCiAgICAgICAgInZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfCIgKw0KICAgICAgICAiei1pbmRleCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsNCiAgICAgICAgImJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8IiArDQogICAgICAgICJjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfCIgKw0KICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArDQogICAgICAgICJkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXwiICsNCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArDQogICAgICAgICJpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8IiArDQogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsNCiAgICAgICAgImtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfCIgKw0KICAgICAgICAibG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnwiICsNCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKw0KICAgICAgICAibnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfCIgKw0KICAgICAgICAib3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8IiArDQogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArDQogICAgICAgICJzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfCIgKw0KICAgICAgICAidGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8IiArDQogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKw0KICAgICAgICAidmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXwiICsNCiAgICAgICAgInplcm8iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBjb2xvcnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsNCiAgICAgICAgInB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdmFyIG51bVJlID0gIlxcLT8oPzooPzpbMC05XSspfCg/OlswLTldKlxcLlswLTldKykpIjsNCg0KICAgIHZhciBiYXNlX3J1bGVzZXQgPSBbDQogICAgICAgIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogInJ1bGVzZXRfY29tbWVudCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLA0KICAgICAgICAgICAgcmVnZXggOiBudW1SZSArICIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAgLy8gaGV4NiBjb2xvcg0KICAgICAgICAgICAgcmVnZXggOiAiI1thLWYwLTldezZ9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4MyBjb2xvcg0KICAgICAgICAgICAgcmVnZXggOiAiI1thLWYwLTldezN9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LnR5cGUiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9ycy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgcmVnZXggOiAiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoiDQogICAgICAgIH0NCiAgICAgIF07DQoNCiAgICB2YXIgcnVsZXNldCA9IGxhbmcuY29weUFycmF5KGJhc2VfcnVsZXNldCk7DQogICAgcnVsZXNldC51bnNoaWZ0KHsNCiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgcmVnZXggOiAiXFx9IiwNCiAgICAgICAgbmV4dDogICAic3RhcnQiDQogICAgfSk7DQoNCiAgICB2YXIgbWVkaWFfcnVsZXNldCA9IGxhbmcuY29weUFycmF5KCBiYXNlX3J1bGVzZXQgKTsNCiAgICBtZWRpYV9ydWxlc2V0LnVuc2hpZnQoew0KICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICByZWdleCA6ICJcXH0iLA0KICAgICAgICBuZXh0OiAgICJtZWRpYSINCiAgICB9KTsNCg0KICAgIHZhciBiYXNlX2NvbW1lbnQgPSBbew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgcmVnZXggOiAiLisiDQogICAgfV07DQoNCiAgICB2YXIgY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7DQogICAgY29tbWVudC51bnNoaWZ0KHsNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgIH0pOw0KDQogICAgdmFyIG1lZGlhX2NvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIG1lZGlhX2NvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJtZWRpYSINCiAgICB9KTsNCg0KICAgIHZhciBydWxlc2V0X2NvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIHJ1bGVzZXRfY29tbWVudC51bnNoaWZ0KHsNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICBuZXh0IDogInJ1bGVzZXQiDQogICAgfSk7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICByZWdleDogIlxceyIsDQogICAgICAgICAgICBuZXh0OiAgInJ1bGVzZXQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiQC4qP3siLA0KICAgICAgICAgICAgbmV4dDogICJtZWRpYSINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLA0KICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLA0KICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyINCiAgICAgICAgfV0sDQoNCiAgICAgICAgIm1lZGlhIiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAibWVkaWFfY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgcmVnZXg6ICJcXHsiLA0KICAgICAgICAgICAgbmV4dDogICJtZWRpYV9ydWxlc2V0Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx9IiwNCiAgICAgICAgICAgIG5leHQ6ICAic3RhcnQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiDQogICAgICAgIH1dLA0KDQogICAgICAgICJjb21tZW50IiA6IGNvbW1lbnQsDQoNCiAgICAgICAgInJ1bGVzZXQiIDogcnVsZXNldCwNCiAgICAgICAgInJ1bGVzZXRfY29tbWVudCIgOiBydWxlc2V0X2NvbW1lbnQsDQoNCiAgICAgICAgIm1lZGlhX3J1bGVzZXQiIDogbWVkaWFfcnVsZXNldCwNCiAgICAgICAgIm1lZGlhX2NvbW1lbnQiIDogbWVkaWFfY29tbWVudA0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoQ3NzSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuQ3NzSGlnaGxpZ2h0UnVsZXMgPSBDc3NIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jc3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSwiaSIpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1J1bGVzPSJjU3R5bGUiLHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSkudG9rZW5zO2lmKGUubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDt2YXIgZj1iLm1hdGNoKC9eLipce1xzKiQvKTtyZXR1cm4gZiYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaShbImFjZSJdLCJ3b3JrZXItY3NzLmpzIiwiYWNlL21vZGUvY3NzX3dvcmtlciIsIldvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJjc3NsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtiLmRhdGEuZm9yRWFjaChmdW5jdGlvbihhKXtjLnB1c2goe3JvdzphLmxpbmUtMSxjb2x1bW46YS5jb2wtMSx0ZXh0OmEubWVzc2FnZSx0eXBlOmEudHlwZSxsaW50OmF9KX0pLGEuc2V0QW5ub3RhdGlvbnMoYyl9KSxifX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfGFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXxib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8Ym90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHxjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8ZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfGZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fGxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnxsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHxtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8bWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8c2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3xzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fHRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufHZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfHotaW5kZXgiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj0iXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiLGc9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoicnVsZXNldF9jb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpmKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC50eXBlIjpiLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuZnVuY3Rpb24iOmMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudCI6ZC5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjoidGV4dCJ9LHJlZ2V4OiJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiJ9XSxoPWUuY29weUFycmF5KGcpO2gudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSk7dmFyIGk9ZS5jb3B5QXJyYXkoZyk7aS51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJtZWRpYSJ9KTt2YXIgaj1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0saz1lLmNvcHlBcnJheShqKTtrLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9KTt2YXIgbD1lLmNvcHlBcnJheShqKTtsLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJtZWRpYSJ9KTt2YXIgbT1lLmNvcHlBcnJheShqKTttLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJydWxlc2V0In0pLHRoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6InJ1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IkAuKj97IixuZXh0OiJtZWRpYSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLG1lZGlhOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6Im1lZGlhX2NvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoibWVkaWFfcnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLGNvbW1lbnQ6ayxydWxlc2V0OmgscnVsZXNldF9jb21tZW50Om0sbWVkaWFfcnVsZXNldDppLG1lZGlhX2NvbW1lbnQ6bH19O2QuaW5oZXJpdHMoZyxmKSxiLkNzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-c_cpp-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jX2NwcCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2NfY3BwX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgY19jcHBIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY19jcHBfaGlnaGxpZ2h0X3J1bGVzIikuY19jcHBIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgY19jcHBIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQmFzZWQgb24gQmVzcGluJ3MgQy9DKysgU3ludGF4IFBsdWdpbiBieSBNYXJjIE1jSW50eXJlLg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY19jcHBfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBjX2NwcEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYW5kfGRvdWJsZXxub3RfZXF8dGhyb3d8YW5kX2VxfGR5bmFtaWNfY2FzdHxvcGVyYXRvcnx0cnVlfCIgKw0KICAgICAgICAiYXNtfGVsc2V8b3J8dHJ5fGF1dG98ZW51bXxvcl9lcXx0eXBlZGVmfGJpdGFuZHxleHBsaWNpdHxwcml2YXRlfCIgKw0KICAgICAgICAidHlwZWlkfGJpdG9yfGV4dGVybnxwcm90ZWN0ZWR8dHlwZW5hbWV8Ym9vbHxmYWxzZXxwdWJsaWN8dW5pb258IiArDQogICAgICAgICJicmVha3xmbG9hdHxyZWdpc3Rlcnx1bnNpZ25lZHxjYXNlfGZyb3xyZWludGVycHJldC1jYXN0fHVzaW5nfGNhdGNofCIgKw0KICAgICAgICAiZnJpZW5kfHJldHVybnx2aXJ0dWFsfGNoYXJ8Z290b3xzaG9ydHx2b2lkfGNsYXNzfGlmfHNpZ25lZHx2b2xhdGlsZXwiICsNCiAgICAgICAgImNvbXBsfGlubGluZXxzaXplb2Z8d2NoYXJfdHxjb25zdHxpbnR8c3RhdGljfHdoaWxlfGNvbnN0LWNhc3R8bG9uZ3wiICsNCiAgICAgICAgInN0YXRpY19jYXN0fHhvcnxjb250aW51ZXxtdXRhYmxlfHN0cnVjdHx4b3JfZXF8ZGVmYXVsdHxuYW1lc3BhY2V8IiArDQogICAgICAgICJzd2l0Y2h8ZGVsZXRlfG5ld3x0ZW1wbGF0ZXxkb3xub3R8dGhpc3xmb3IiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIk5VTEwiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQiLCAvLyA8Q09OU1RBTlQ+DQogICAgICAgICAgICAgIHJlZ2V4IDogIjxbYS16QS1aMC05Ll0rPiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vIHByZS1jb21waWxlciBkaXJlY3RpdnMNCiAgICAgICAgICAgICAgcmVnZXggOiAiKD86I2luY2x1ZGV8I3ByYWdtYXwjbGluZXwjZGVmaW5lfCN1bmRlZnwjaWZkZWZ8I2Vsc2V8I2VsaWZ8I2VuZGlmfCNpZm5kZWYpIg0KICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09fD18IT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLA0KICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhjX2NwcEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLmNfY3BwSGlnaGxpZ2h0UnVsZXMgPSBjX2NwcEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-c_cpp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jX2NwcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9jX2NwcF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9jX2NwcF9oaWdobGlnaHRfcnVsZXMiKS5jX2NwcEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGs9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGw9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgaix0aGlzLmZvbGRpbmdSdWxlcz1uZXcga307ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCIpe3ZhciBoPWIubWF0Y2goL14uKltce1woXFtdXHMqJC8pO2gmJihkKz1jKX1lbHNlIGlmKGE9PSJkb2Mtc3RhcnQiKXtpZihnPT0ic3RhcnQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9jX2NwcF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFuZHxkb3VibGV8bm90X2VxfHRocm93fGFuZF9lcXxkeW5hbWljX2Nhc3R8b3BlcmF0b3J8dHJ1ZXxhc218ZWxzZXxvcnx0cnl8YXV0b3xlbnVtfG9yX2VxfHR5cGVkZWZ8Yml0YW5kfGV4cGxpY2l0fHByaXZhdGV8dHlwZWlkfGJpdG9yfGV4dGVybnxwcm90ZWN0ZWR8dHlwZW5hbWV8Ym9vbHxmYWxzZXxwdWJsaWN8dW5pb258YnJlYWt8ZmxvYXR8cmVnaXN0ZXJ8dW5zaWduZWR8Y2FzZXxmcm98cmVpbnRlcnByZXQtY2FzdHx1c2luZ3xjYXRjaHxmcmllbmR8cmV0dXJufHZpcnR1YWx8Y2hhcnxnb3RvfHNob3J0fHZvaWR8Y2xhc3N8aWZ8c2lnbmVkfHZvbGF0aWxlfGNvbXBsfGlubGluZXxzaXplb2Z8d2NoYXJfdHxjb25zdHxpbnR8c3RhdGljfHdoaWxlfGNvbnN0LWNhc3R8bG9uZ3xzdGF0aWNfY2FzdHx4b3J8Y29udGludWV8bXV0YWJsZXxzdHJ1Y3R8eG9yX2VxfGRlZmF1bHR8bmFtZXNwYWNlfHN3aXRjaHxkZWxldGV8bmV3fHRlbXBsYXRlfGRvfG5vdHx0aGlzfGZvciIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIk5VTEwiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBmKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IjxbYS16QS1aMC05Ll0rPiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiNpbmNsdWRlfCNwcmFnbWF8I2xpbmV8I2RlZmluZXwjdW5kZWZ8I2lmZGVmfCNlbHNlfCNlbGlmfCNlbmRpZnwjaWZuZGVmKSJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYz09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT18PXwhPXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4ifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLmNfY3BwSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-groovy-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9ncm9vdnknLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9ncm9vdnlfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2dyb292eV9oaWdobGlnaHRfcnVsZXMiKS5Hcm9vdnlIaWdobGlnaHRSdWxlczsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICBKYXZhU2NyaXB0TW9kZS5jYWxsKHRoaXMpOw0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEdyb292eUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9ncm9vdnlfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBHcm9vdnlIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYXNzZXJ0fHdpdGh8YWJzdHJhY3R8Y29udGludWV8Zm9yfG5ld3xzd2l0Y2h8IiArDQogICAgImFzc2VydHxkZWZhdWx0fGdvdG98cGFja2FnZXxzeW5jaHJvbml6ZWR8IiArDQogICAgImJvb2xlYW58ZG98aWZ8cHJpdmF0ZXx0aGlzfCIgKw0KICAgICJicmVha3xkb3VibGV8aW1wbGVtZW50c3xwcm90ZWN0ZWR8dGhyb3d8IiArDQogICAgImJ5dGV8ZWxzZXxpbXBvcnR8cHVibGljfHRocm93c3wiICsNCiAgICAiY2FzZXxlbnVtfGluc3RhbmNlb2Z8cmV0dXJufHRyYW5zaWVudHwiICsNCiAgICAiY2F0Y2h8ZXh0ZW5kc3xpbnR8c2hvcnR8dHJ5fCIgKw0KICAgICJjaGFyfGZpbmFsfGludGVyZmFjZXxzdGF0aWN8dm9pZHwiICsNCiAgICAiY2xhc3N8ZmluYWxseXxsb25nfHN0cmljdGZwfHZvbGF0aWxlfCIgKw0KICAgICJkZWZ8ZmxvYXR8bmF0aXZlfHN1cGVyfHdoaWxlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBsYW5nQ2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJBYnN0cmFjdE1ldGhvZEVycm9yfEFzc2VydGlvbkVycm9yfENsYXNzQ2lyY3VsYXJpdHlFcnJvcnwiKw0KICAgICAgICAiQ2xhc3NGb3JtYXRFcnJvcnxEZXByZWNhdGVkfEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb258IisNCiAgICAgICAgIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcnxJbGxlZ2FsQWNjZXNzRXJyb3J8IisNCiAgICAgICAgIklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbnxJbnN0YW50aWF0aW9uRXJyb3J8SW50ZXJuYWxFcnJvcnwiKw0KICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb258Tm9TdWNoRmllbGRFcnJvcnxPdmVycmlkZXxQcm9jZXNzfCIrDQogICAgICAgICJQcm9jZXNzQnVpbGRlcnxTZWN1cml0eU1hbmFnZXJ8U3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnwiKw0KICAgICAgICAiU3VwcHJlc3NXYXJuaW5nc3xUeXBlTm90UHJlc2VudEV4Y2VwdGlvbnxVbmtub3duRXJyb3J8IisNCiAgICAgICAgIlVuc2F0aXNmaWVkTGlua0Vycm9yfFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3J8VmVyaWZ5RXJyb3J8IisNCiAgICAgICAgIkluc3RhbnRpYXRpb25FeGNlcHRpb258SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnwiKw0KICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9ufCIrDQogICAgICAgICJOb1N1Y2hGaWVsZEV4Y2VwdGlvbnxJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb258TnVtYmVyRm9ybWF0RXhjZXB0aW9ufCIrDQogICAgICAgICJTZWN1cml0eUV4Y2VwdGlvbnxWb2lkfEluaGVyaXRhYmxlVGhyZWFkTG9jYWx8SWxsZWdhbFN0YXRlRXhjZXB0aW9ufCIrDQogICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbnxOb1N1Y2hNZXRob2RFeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnwiKw0KICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb258RW51bXxTdHJpY3RNYXRofFBhY2thZ2V8Q29tcGlsZXJ8IisNCiAgICAgICAgIlJlYWRhYmxlfFJ1bnRpbWV8U3RyaW5nQnVpbGRlcnxNYXRofEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3J8IisNCiAgICAgICAgIk5vU3VjaE1ldGhvZEVycm9yfFRocmVhZExvY2FsfFJ1bnRpbWVQZXJtaXNzaW9ufEFyaXRobWV0aWNFeGNlcHRpb258IisNCiAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9ufExvbmd8SW50ZWdlcnxTaG9ydHxCeXRlfERvdWJsZXxOdW1iZXJ8RmxvYXR8IisNCiAgICAgICAgIkNoYXJhY3RlcnxCb29sZWFufFN0YWNrVHJhY2VFbGVtZW50fEFwcGVuZGFibGV8U3RyaW5nQnVmZmVyfCIrDQogICAgICAgICJJdGVyYWJsZXxUaHJlYWRHcm91cHxSdW5uYWJsZXxUaHJlYWR8SWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnwiKw0KICAgICAgICAiU3RhY2tPdmVyZmxvd0Vycm9yfE91dE9mTWVtb3J5RXJyb3J8VmlydHVhbE1hY2hpbmVFcnJvcnwiKw0KICAgICAgICAiQXJyYXlTdG9yZUV4Y2VwdGlvbnxDbGFzc0Nhc3RFeGNlcHRpb258TGlua2FnZUVycm9yfCIrDQogICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvcnxDbGFzc05vdEZvdW5kRXhjZXB0aW9ufFJ1bnRpbWVFeGNlcHRpb258IisNCiAgICAgICAgIkV4Y2VwdGlvbnxUaHJlYWREZWF0aHxFcnJvcnxUaHJvd2FibGV8U3lzdGVtfENsYXNzTG9hZGVyfCIrDQogICAgICAgICJDbG9uZWFibGV8Q2xhc3N8Q2hhclNlcXVlbmNlfENvbXBhcmFibGV8U3RyaW5nfE9iamVjdCIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIA0KICAgIHZhciBpbXBvcnRDbGFzc2VzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIiIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0aGlzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYW5nQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRDbGFzc2VzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcPzp8XFw/XFwufFxcKlxcLnw8PT58PX58PT1+fFxcLkB8XFwqXFwuQHxcXC4mfGFzfGlufGlzfCF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMgPSBHcm9vdnlIaWdobGlnaHRSdWxlczsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-groovy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9ncm9vdnkiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvZ3Jvb3Z5X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi9qYXZhc2NyaXB0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vZ3Jvb3Z5X2hpZ2hsaWdodF9ydWxlcyIpLkdyb292eUhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXtlLmNhbGwodGhpcyksdGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSl9O2QuaW5oZXJpdHMoaCxlKSxmdW5jdGlvbigpe3RoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsfX0uY2FsbChoLnByb3RvdHlwZSksYi5Nb2RlPWh9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGw9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLG09ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgayx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgbH07ZC5pbmhlcml0cyhtLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIil7dmFyIGg9Yi5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTtoJiYoZCs9Yyl9ZWxzZSBpZihhPT0iZG9jLXN0YXJ0Iil7aWYoZz09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWphdmFzY3JpcHQuanMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigianNsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MDtkPGIuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZT1iLmRhdGFbZF07ZSYmYy5wdXNoKHtyb3c6ZS5saW5lLTEsY29sdW1uOmUuY2hhcmFjdGVyLTEsdGV4dDplLnJlYXNvbix0eXBlOiJ3YXJuaW5nIixsaW50OmV9KX1hLnNldEFubm90YXRpb25zKGMpfSksYi5vbigibmFyY2lzc3VzIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXthLmNsZWFyQW5ub3RhdGlvbnMoKX0pLGJ9fS5jYWxsKG0ucHJvdG90eXBlKSxiLk1vZGU9bX0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS91bmljb2RlIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuLi91bmljb2RlIiksZz1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8Y29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiLnNwbGl0KCJ8IikpLGM9ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiLGQ9ZS5hcnJheVRvTWFwKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIi5zcGxpdCgifCIpKSxpPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxqPWUuYXJyYXlUb01hcCgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLnNwbGl0KCJ8IikpLGs9IlsiK2YucGFja2FnZXMuTCsiXFwkX11bIitmLnBhY2thZ2VzLkwrZi5wYWNrYWdlcy5NbitmLnBhY2thZ2VzLk1jK2YucGFja2FnZXMuTmQrZi5wYWNrYWdlcy5QYysiXFwkX10qXFxiIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZykuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpbImtleXdvcmQuZGVmaW5pdGlvbiIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIraysiKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IitjKyIpXFxiIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBhLmhhc093blByb3BlcnR5KGMpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5kZXByZWNhdGVkIjpoLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkLmRlZmluaXRpb24iOmIuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmkuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjpqLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmlsbGVnYWwiOmM9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDprfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXC89PyIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il4jIS4qJCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50X3JlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1xcdyoiLG5leHQ6InN0YXJ0IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiW15cXFxcL1xcW10rIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJcXFsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXSIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiW15cXFxcXFxdXSsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLGNvbW1lbnRfcmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZywiZG9jLSIsWyhuZXcgZykuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGksaCksYi5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2dyb292eV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFzc2VydHx3aXRofGFic3RyYWN0fGNvbnRpbnVlfGZvcnxuZXd8c3dpdGNofGFzc2VydHxkZWZhdWx0fGdvdG98cGFja2FnZXxzeW5jaHJvbml6ZWR8Ym9vbGVhbnxkb3xpZnxwcml2YXRlfHRoaXN8YnJlYWt8ZG91YmxlfGltcGxlbWVudHN8cHJvdGVjdGVkfHRocm93fGJ5dGV8ZWxzZXxpbXBvcnR8cHVibGljfHRocm93c3xjYXNlfGVudW18aW5zdGFuY2VvZnxyZXR1cm58dHJhbnNpZW50fGNhdGNofGV4dGVuZHN8aW50fHNob3J0fHRyeXxjaGFyfGZpbmFsfGludGVyZmFjZXxzdGF0aWN8dm9pZHxjbGFzc3xmaW5hbGx5fGxvbmd8c3RyaWN0ZnB8dm9sYXRpbGV8ZGVmfGZsb2F0fG5hdGl2ZXxzdXBlcnx3aGlsZSIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoIkFic3RyYWN0TWV0aG9kRXJyb3J8QXNzZXJ0aW9uRXJyb3J8Q2xhc3NDaXJjdWxhcml0eUVycm9yfENsYXNzRm9ybWF0RXJyb3J8RGVwcmVjYXRlZHxFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9ufEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcnxJbGxlZ2FsQWNjZXNzRXJyb3J8SWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9ufEluc3RhbnRpYXRpb25FcnJvcnxJbnRlcm5hbEVycm9yfE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3xQcm9jZXNzQnVpbGRlcnxTZWN1cml0eU1hbmFnZXJ8U3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxTdXBwcmVzc1dhcm5pbmdzfFR5cGVOb3RQcmVzZW50RXhjZXB0aW9ufFVua25vd25FcnJvcnxVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfEluc3RhbnRpYXRpb25FeGNlcHRpb258SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258Q2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb258Tm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnxTZWN1cml0eUV4Y2VwdGlvbnxWb2lkfEluaGVyaXRhYmxlVGhyZWFkTG9jYWx8SWxsZWdhbFN0YXRlRXhjZXB0aW9ufEludGVycnVwdGVkRXhjZXB0aW9ufE5vU3VjaE1ldGhvZEV4Y2VwdGlvbnxJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ufFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfFJlYWRhYmxlfFJ1bnRpbWV8U3RyaW5nQnVpbGRlcnxNYXRofEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3J8Tm9TdWNoTWV0aG9kRXJyb3J8VGhyZWFkTG9jYWx8UnVudGltZVBlcm1pc3Npb258QXJpdGhtZXRpY0V4Y2VwdGlvbnxOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fENoYXJhY3RlcnxCb29sZWFufFN0YWNrVHJhY2VFbGVtZW50fEFwcGVuZGFibGV8U3RyaW5nQnVmZmVyfEl0ZXJhYmxlfFRocmVhZEdyb3VwfFJ1bm5hYmxlfFRocmVhZHxJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9ufFN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8QXJyYXlTdG9yZUV4Y2VwdGlvbnxDbGFzc0Nhc3RFeGNlcHRpb258TGlua2FnZUVycm9yfE5vQ2xhc3NEZWZGb3VuZEVycm9yfENsYXNzTm90Rm91bmRFeGNlcHRpb258UnVudGltZUV4Y2VwdGlvbnxFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnxDbG9uZWFibGV8Q2xhc3N8Q2hhclNlcXVlbmNlfENvbXBhcmFibGV8U3RyaW5nfE9iamVjdCIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGYpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gZT09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShlKT8ia2V5d29yZCI6Yy5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ZC5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShlKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcPzp8XFw/XFwufFxcKlxcLnw8PT58PX58PT1+fFxcLkB8XFwqXFwuQHxcXC4mfGFzfGlufGlzfCF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSJ9LHt0b2tlbjoibHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGYsImRvYy0iLFsobmV3IGYpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhoLGcpLGIuR3Jvb3Z5SGlnaGxpZ2h0UnVsZXM9aH0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-haxe-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9oYXhlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvaGF4ZV9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSGF4ZUhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9oYXhlX2hpZ2hsaWdodF9ydWxlcyIpLkhheGVIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBIYXhlSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7DQoNCiAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICAgIH0NCg0KICAgICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgfTsNCg0KICAgICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgICAgfTsNCg0KICAgICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgICAgfTsNCg0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQpkZWZpbmUoJ2FjZS9tb2RlL2hheGVfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBIYXhlSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJicmVha3xjYXNlfGNhc3R8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVmYXVsdHxlbHNlfGVudW18ZXh0ZW5kc3xmb3J8ZnVuY3Rpb258aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5saW5lfGludGVyZmFjZXxuZXd8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHB1YmxpY3xyZXR1cm58c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyYWNlfHRyeXx0eXBlZGVmfHVudHlwZWR8dmFyfHdoaWxlfEFycmF5fFZvaWR8Qm9vbHxJbnR8VUludHxGbG9hdHxEeW5hbWljfFN0cmluZ3xMaXN0fEhhc2h8SW50SGFzaHxFcnJvcnxVbmtub3dufFR5cGV8U3RkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfHRydWV8ZmFsc2UiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gInRoaXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHs8XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfT5dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEhheGVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5IYXhlSGlnaGxpZ2h0UnVsZXMgPSBIYXhlSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-haxe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9oYXhlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2hheGVfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vaGF4ZV9oaWdobGlnaHRfcnVsZXMiKS5IYXhlSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvaGF4ZV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2FzdHxjYXRjaHxjbGFzc3xjb250aW51ZXxkZWZhdWx0fGVsc2V8ZW51bXxleHRlbmRzfGZvcnxmdW5jdGlvbnxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbmxpbmV8aW50ZXJmYWNlfG5ld3xvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHVibGljfHJldHVybnxzdGF0aWN8c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJhY2V8dHJ5fHR5cGVkZWZ8dW50eXBlZHx2YXJ8d2hpbGV8QXJyYXl8Vm9pZHxCb29sfEludHxVSW50fEZsb2F0fER5bmFtaWN8U3RyaW5nfExpc3R8SGFzaHxJbnRIYXNofEVycm9yfFVua25vd258VHlwZXxTdGQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJudWxsfHRydWV8ZmFsc2UiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBmKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcKiIsbWVyZ2U6ITAsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PSJ0aGlzIj8idmFyaWFibGUubGFuZ3VhZ2UiOmEuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soezxdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX0+XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZiwiZG9jLSIsWyhuZXcgZikuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGgsZyksYi5IYXhlSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-html-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvaHRtbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0JywgJ2FjZS9tb2RlL2NzcycsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2JlaGF2aW91ci94bWwnLCAnYWNlL21vZGUvZm9sZGluZy9odG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7DQp2YXIgQ3NzTW9kZSA9IHJlcXVpcmUoIi4vY3NzIikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSHRtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgSHRtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2h0bWwiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgaGlnaGxpZ2h0ZXIgPSBuZXcgSHRtbEhpZ2hsaWdodFJ1bGVzKCk7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihoaWdobGlnaHRlci5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgDQogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7DQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsNCiAgICAgICAgImpzLSI6IEphdmFTY3JpcHRNb2RlLA0KICAgICAgICAiY3NzLSI6IENzc01vZGUNCiAgICB9KTsNCiAgICANCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBIdG1sRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICANCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NzcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ3NzSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpLCAiaSIpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gImNTdHlsZSI7DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7DQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1jc3MuanMiLCAiYWNlL21vZGUvY3NzX3dvcmtlciIsICJXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigiY3NzbGludCIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGUuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtZXNzYWdlLmNvbCAtIDEsDQogICAgICAgICAgICAgICAgICAgIHRleHQ6IG1lc3NhZ2UubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLA0KICAgICAgICAgICAgICAgICAgICBsaW50OiBtZXNzYWdlDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHdvcmtlcjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIgcHJvcGVydGllcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfCIgKw0KICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArDQogICAgICAgICJiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsNCiAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXwiICsNCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsNCiAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKw0KICAgICAgICAiYm9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfCIgKw0KICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsNCiAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArDQogICAgICAgICJjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8IiArDQogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArDQogICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsNCiAgICAgICAgImxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnwiICsNCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKw0KICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKw0KICAgICAgICAibWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3wiICsNCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsNCiAgICAgICAgInBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnwiICsNCiAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfCIgKw0KICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsNCiAgICAgICAgInNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8IiArDQogICAgICAgICJzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fCIgKw0KICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArDQogICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsNCiAgICAgICAgInotaW5kZXgiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8IiArDQogICAgICAgICJibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfCIgKw0KICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsNCiAgICAgICAgImRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXwiICsNCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArDQogICAgICAgICJoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3wiICsNCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKw0KICAgICAgICAiaW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8IiArDQogICAgICAgICJrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXwiICsNCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArDQogICAgICAgICJtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHwiICsNCiAgICAgICAgIm53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXwiICsNCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKw0KICAgICAgICAicmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfCIgKw0KICAgICAgICAic29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHwiICsNCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKw0KICAgICAgICAidHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXwiICsNCiAgICAgICAgInZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8IiArDQogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8IiArDQogICAgICAgICJwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7DQoNCiAgICB2YXIgYmFzZV9ydWxlc2V0ID0gWw0KICAgICAgICB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwNCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgIC8vIGhleDYgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC50eXBlIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIg0KICAgICAgICB9DQogICAgICBdOw0KDQogICAgdmFyIHJ1bGVzZXQgPSBsYW5nLmNvcHlBcnJheShiYXNlX3J1bGVzZXQpOw0KICAgIHJ1bGVzZXQudW5zaGlmdCh7DQogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgIHJlZ2V4IDogIlxcfSIsDQogICAgICAgIG5leHQ6ICAgInN0YXJ0Ig0KICAgIH0pOw0KDQogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7DQogICAgbWVkaWFfcnVsZXNldC51bnNoaWZ0KHsNCiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgcmVnZXggOiAiXFx9IiwNCiAgICAgICAgbmV4dDogICAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgYmFzZV9jb21tZW50ID0gW3sNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgIH1dOw0KDQogICAgdmFyIGNvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIGNvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICB9KTsNCg0KICAgIHZhciBtZWRpYV9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBydWxlc2V0X2NvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJydWxlc2V0Ig0KICAgIH0pOw0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgcmVnZXg6ICJcXHsiLA0KICAgICAgICAgICAgbmV4dDogICJydWxlc2V0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIkAuKj97IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWEiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiDQogICAgICAgIH1dLA0KDQogICAgICAgICJtZWRpYSIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWFfcnVsZXNldCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIlxcfSIsDQogICAgICAgICAgICBuZXh0OiAgInN0YXJ0Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsDQogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICB9XSwNCg0KICAgICAgICAiY29tbWVudCIgOiBjb21tZW50LA0KDQogICAgICAgICJydWxlc2V0IiA6IHJ1bGVzZXQsDQogICAgICAgICJydWxlc2V0X2NvbW1lbnQiIDogcnVsZXNldF9jb21tZW50LA0KDQogICAgICAgICJtZWRpYV9ydWxlc2V0IiA6IG1lZGlhX3J1bGVzZXQsDQogICAgICAgICJtZWRpYV9jb21tZW50IiA6IG1lZGlhX2NvbW1lbnQNCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkNzc0hpZ2hsaWdodFJ1bGVzID0gQ3NzSGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiPCg/PVxzKnNjcmlwdFxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzY3JpcHQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzdHlsZVxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzdHlsZSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfSBdLA0KICAgIA0KICAgICAgICBjZGF0YSA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfSBdLA0KDQogICAgICAgIGNvbW1lbnQgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH0gXQ0KICAgIH07DQogICAgDQogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInN0eWxlIiwgImNzcy1zdGFydCIpOw0KICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAic2NyaXB0IiwgImpzLXN0YXJ0Iik7DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgImpzLSIsIFt7DQogICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgIHJlZ2V4OiAiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXNjcmlwdCkiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH1dKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXN0eWxlKSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfV0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEh0bWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5IdG1sSGlnaGxpZ2h0UnVsZXMgPSBIdG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9odG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIE1peGVkRm9sZE1vZGUgPSByZXF1aXJlKCIuL21peGVkIikuRm9sZE1vZGU7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL3htbCIpLkZvbGRNb2RlOw0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIE1peGVkRm9sZE1vZGUuY2FsbCh0aGlzLCBuZXcgWG1sRm9sZE1vZGUoew0KICAgICAgICAvLyB2b2lkIGVsZW1lbnRzDQogICAgICAgICJhcmVhIjogMSwNCiAgICAgICAgImJhc2UiOiAxLA0KICAgICAgICAiYnIiOiAxLA0KICAgICAgICAiY29sIjogMSwNCiAgICAgICAgImNvbW1hbmQiOiAxLA0KICAgICAgICAiZW1iZWQiOiAxLA0KICAgICAgICAiaHIiOiAxLA0KICAgICAgICAiaW1nIjogMSwNCiAgICAgICAgImlucHV0IjogMSwNCiAgICAgICAgImtleWdlbiI6IDEsDQogICAgICAgICJsaW5rIjogMSwNCiAgICAgICAgIm1ldGEiOiAxLA0KICAgICAgICAicGFyYW0iOiAxLA0KICAgICAgICAic291cmNlIjogMSwNCiAgICAgICAgInRyYWNrIjogMSwNCiAgICAgICAgIndiciI6IDEsDQogICAgICAgIA0KICAgICAgICAvLyBvcHRpb25hbCB0YWdzIA0KICAgICAgICAibGkiOiAxLA0KICAgICAgICAiZHQiOiAxLA0KICAgICAgICAiZGQiOiAxLA0KICAgICAgICAicCI6IDEsDQogICAgICAgICJydCI6IDEsDQogICAgICAgICJycCI6IDEsDQogICAgICAgICJvcHRncm91cCI6IDEsDQogICAgICAgICJvcHRpb24iOiAxLA0KICAgICAgICAiY29sZ3JvdXAiOiAxLA0KICAgICAgICAidGQiOiAxLA0KICAgICAgICAidGgiOiAxDQogICAgfSksIHsNCiAgICAgICAgImpzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpLA0KICAgICAgICAiY3NzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpDQogICAgfSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIE1peGVkRm9sZE1vZGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oZGVmYXVsdE1vZGUsIHN1Yk1vZGVzKSB7DQogICAgdGhpcy5kZWZhdWx0TW9kZSA9IGRlZmF1bHRNb2RlOw0KICAgIHRoaXMuc3ViTW9kZXMgPSBzdWJNb2RlczsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy4kZ2V0TW9kZSA9IGZ1bmN0aW9uKHN0YXRlKSB7DQogICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnN1Yk1vZGVzKSB7DQogICAgICAgICAgICBpZiAoc3RhdGUuaW5kZXhPZihrZXkpID09PSAwKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Yk1vZGVzW2tleV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiR0cnlNb2RlID0gZnVuY3Rpb24oc3RhdGUsIHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzdGF0ZSk7DQogICAgICAgIHJldHVybiAobW9kZSA/IG1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgOiAiIik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuJHRyeU1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykNCiAgICAgICAgKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3ctMSkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCFtb2RlIHx8ICFtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpKQ0KICAgICAgICAgICAgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpKTsNCiAgICAgICAgDQogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkNCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLmRlZmF1bHRNb2RlOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vLi4vbGliL2xhbmciKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24odm9pZEVsZW1lbnRzKSB7DQogICAgQmFzZUZvbGRNb2RlLmNhbGwodGhpcyk7DQogICAgdGhpcy52b2lkRWxlbWVudHMgPSB2b2lkRWxlbWVudHMgfHwge307DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgdGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCg0KICAgICAgICBpZiAodGFnLmNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiID8gImVuZCIgOiAiIjsNCg0KICAgICAgICBpZiAoIXRhZy50YWdOYW1lIHx8IHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQ0KICAgICAgICAgICAgcmV0dXJuICIiOw0KDQogICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy52YWx1ZS5pbmRleE9mKCIvIiArIHRhZy50YWdOYW1lKSAhPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZSA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdykgew0KICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsNCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgdG9rZW4udmFsdWUubGVuZ3RoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy50YWdSZSA9IC9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLzsNCiAgICB0aGlzLl9wYXJzZVRhZyA9IGZ1bmN0aW9uKHRhZykgew0KICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy50YWdSZS5leGVjKHRhZyk7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnRhZ1JlLmxhc3RJbmRleCB8fCAwOw0KICAgICAgICB0aGlzLnRhZ1JlLmxhc3RJbmRleCA9IDA7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHZhbHVlOiB0YWcsDQogICAgICAgICAgICBtYXRjaDogbWF0Y2ggPyBtYXRjaFsyXSA6ICIiLA0KICAgICAgICAgICAgY2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzNdIDogZmFsc2UsDQogICAgICAgICAgICBzZWxmQ2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzVdIHx8IG1hdGNoWzJdID09ICIvPiIgOiBmYWxzZSwNCiAgICAgICAgICAgIHRhZ05hbWU6IG1hdGNoID8gbWF0Y2hbNF0gOiAiIiwNCiAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hbMV0gPyBjb2x1bW4gKyBtYXRjaFsxXS5sZW5ndGggOiBjb2x1bW4NCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIHJlYWRzIGEgZnVsbCB0YWcgYW5kIHBsYWNlcyB0aGUgaXRlcmF0b3IgYWZ0ZXIgdGhlIHRhZw0KICAgICAqLw0KICAgIHRoaXMuX3JlYWRUYWdGb3J3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7DQogICAgICAgIGlmICghdG9rZW4pDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgdmFyIHN0YXJ0Ow0KICAgICAgICANCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghc3RhcnQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj4iKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9yZWFkVGFnQmFja3dhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgZW5kOw0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICBpZiAoIWVuZCkgew0KICAgICAgICAgICAgICAgICAgICBlbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlICsgdmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IGVuZDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9wb3AgPSBmdW5jdGlvbihzdGFjaywgdGFnKSB7DQogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsNCiAgICAgICAgICAgIGlmICghdGFnIHx8IHRvcC50YWdOYW1lID09IHRhZy50YWdOYW1lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdG9wLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBmaXJzdFRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7DQogICAgICAgIA0KICAgICAgICBpZiAoIWZpcnN0VGFnLm1hdGNoKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIA0KICAgICAgICB2YXIgaXNCYWNrd2FyZCA9IGZpcnN0VGFnLmNsb3NpbmcgfHwgZmlyc3RUYWcuc2VsZkNsb3Npbmc7DQogICAgICAgIHZhciBzdGFjayA9IFtdOw0KICAgICAgICB2YXIgdGFnOw0KICAgICAgICANCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkKSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbik7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy50YWdOYW1lLmxlbmd0aCArIDINCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0ZvcndhcmQoaXRlcmF0b3IpKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCB0YWcuc3RhcnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy5tYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdCYWNrd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCBlbmQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-html.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9odG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL21vZGUvamF2YXNjcmlwdCIsImFjZS9tb2RlL2NzcyIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL2h0bWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlcyxqPWEoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cixrPWEoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaix0aGlzLiRlbWJlZHM9YS5nZXRFbWJlZHMoKSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoeyJqcy0iOmYsImNzcy0iOmd9KSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcga307ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIDB9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hMX19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9jc3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSwiaSIpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1J1bGVzPSJjU3R5bGUiLHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSkudG9rZW5zO2lmKGUubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDt2YXIgZj1iLm1hdGNoKC9eLipce1xzKiQvKTtyZXR1cm4gZiYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaShbImFjZSJdLCJ3b3JrZXItY3NzLmpzIiwiYWNlL21vZGUvY3NzX3dvcmtlciIsIldvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJjc3NsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtiLmRhdGEuZm9yRWFjaChmdW5jdGlvbihhKXtjLnB1c2goe3JvdzphLmxpbmUtMSxjb2x1bW46YS5jb2wtMSx0ZXh0OmEubWVzc2FnZSx0eXBlOmEudHlwZSxsaW50OmF9KX0pLGEuc2V0QW5ub3RhdGlvbnMoYyl9KSxifX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfGFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXxib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8Ym90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHxjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8ZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfGZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fGxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnxsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHxtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8bWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8c2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3xzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fHRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufHZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfHotaW5kZXgiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj0iXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiLGc9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoicnVsZXNldF9jb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpmKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC50eXBlIjpiLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuZnVuY3Rpb24iOmMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudCI6ZC5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjoidGV4dCJ9LHJlZ2V4OiJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiJ9XSxoPWUuY29weUFycmF5KGcpO2gudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSk7dmFyIGk9ZS5jb3B5QXJyYXkoZyk7aS51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJtZWRpYSJ9KTt2YXIgaj1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0saz1lLmNvcHlBcnJheShqKTtrLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9KTt2YXIgbD1lLmNvcHlBcnJheShqKTtsLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJtZWRpYSJ9KTt2YXIgbT1lLmNvcHlBcnJheShqKTttLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJydWxlc2V0In0pLHRoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6InJ1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IkAuKj97IixuZXh0OiJtZWRpYSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLG1lZGlhOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6Im1lZGlhX2NvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoibWVkaWFfcnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLGNvbW1lbnQ6ayxydWxlc2V0OmgscnVsZXNldF9jb21tZW50Om0sbWVkaWFfcnVsZXNldDppLG1lZGlhX2NvbW1lbnQ6bH19O2QuaW5oZXJpdHMoZyxmKSxiLkNzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxmPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3htbF91dGlsIiksaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnNjcmlwdFxcYikiLG5leHQ6InNjcmlwdCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8KD89cypzdHlsZVxcYikiLG5leHQ6InN0eWxlIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZy50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0IiksZy50YWcodGhpcy4kcnVsZXMsInN0eWxlIiwiY3NzLXN0YXJ0IiksZy50YWcodGhpcy4kcnVsZXMsInNjcmlwdCIsImpzLXN0YXJ0IiksdGhpcy5lbWJlZFJ1bGVzKGYsImpzLSIsW3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qKD89PFxcL3NjcmlwdD4pIixuZXh0OiJ0YWcifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXNjcmlwdCkiLG5leHQ6InRhZyJ9XSksdGhpcy5lbWJlZFJ1bGVzKGUsImNzcy0iLFt7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXN0eWxlKSIsbmV4dDoidGFnIn1dKX07ZC5pbmhlcml0cyhpLGgpLGIuSHRtbEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIl9xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIl9xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9XSxhW2IrIl9xc3RyaW5nIl09aCgiJyIsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfcXFzdHJpbmciXT1oKCciJyxiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJdPVt7dG9rZW46Im1ldGEudGFnIixtZXJnZTohMCxyZWdleDoiLz8+IixuZXh0OmN9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ij0ifSx7dG9rZW46ImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIscmVnZXg6IlstX2EtekEtWjAtOTpdKyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XS5jb25jYXQoZyhiKSl9fSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1hKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixnPWZ1bmN0aW9uKCl7dGhpcy5pbmhlcml0KGYsWyJzdHJpbmdfZHF1b3RlcyJdKSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IjwiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj8hMTp7dGV4dDoiPD4iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09Ij4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSI+IilyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaz1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisyKTtpZihrPT0iPC8iKXt2YXIgbD10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpK2QuZ2V0VGFiU3RyaW5nKCksbT10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbCsiXG4iK20sc2VsZWN0aW9uOlsxLGwubGVuZ3RoLDEsbC5sZW5ndGhdfX19fSl9O2QuaW5oZXJpdHMoZyxlKSxiLlhtbEJlaGF2aW91cj1nfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2h0bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuL21peGVkIikuRm9sZE1vZGUsZj1hKCIuL3htbCIpLkZvbGRNb2RlLGc9YSgiLi9jc3R5bGUiKS5Gb2xkTW9kZSxoPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXtlLmNhbGwodGhpcyxuZXcgZih7YXJlYToxLGJhc2U6MSxicjoxLGNvbDoxLGNvbW1hbmQ6MSxlbWJlZDoxLGhyOjEsaW1nOjEsaW5wdXQ6MSxrZXlnZW46MSxsaW5rOjEsbWV0YToxLHBhcmFtOjEsc291cmNlOjEsdHJhY2s6MSx3YnI6MSxsaToxLGR0OjEsZGQ6MSxwOjEscnQ6MSxycDoxLG9wdGdyb3VwOjEsb3B0aW9uOjEsY29sZ3JvdXA6MSx0ZDoxLHRoOjF9KSx7ImpzLSI6bmV3IGcsImNzcy0iOm5ldyBnfSl9O2QuaW5oZXJpdHMoaCxlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9taXhlZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZj1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEsYil7dGhpcy5kZWZhdWx0TW9kZT1hLHRoaXMuc3ViTW9kZXM9Yn07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy4kZ2V0TW9kZT1mdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gdGhpcy5zdWJNb2RlcylpZihhLmluZGV4T2YoYik9PT0wKXJldHVybiB0aGlzLnN1Yk1vZGVzW2JdO3JldHVybiBudWxsfSx0aGlzLiR0cnlNb2RlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJGdldE1vZGUoYSk7cmV0dXJuIGU/ZS5nZXRGb2xkV2lkZ2V0KGIsYyxkKToiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kdHJ5TW9kZShhLmdldFN0YXRlKGMtMSksYSxiLGMpfHx0aGlzLiR0cnlNb2RlKGEuZ2V0U3RhdGUoYyksYSxiLGMpfHx0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoYSxiLGMpfSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0TW9kZShhLmdldFN0YXRlKGMtMSkpO2lmKCFkfHwhZC5nZXRGb2xkV2lkZ2V0KGEsYixjKSlkPXRoaXMuJGdldE1vZGUoYS5nZXRTdGF0ZShjKSk7aWYoIWR8fCFkLmdldEZvbGRXaWRnZXQoYSxiLGMpKWQ9dGhpcy5kZWZhdWx0TW9kZTtyZXR1cm4gZC5nZXRGb2xkV2lkZ2V0UmFuZ2UoYSxiLGMpfX0uY2FsbChmLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-java-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9qYXZhJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YV9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCIuL2phdmFzY3JpcHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YUhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIEphdmFTY3JpcHRNb2RlLmNhbGwodGhpcyk7DQogICAgDQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCmRlZmluZSgnYWNlL21vZGUvamF2YV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gdGFrZW4gZnJvbSBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgKCJhYnN0cmFjdHxjb250aW51ZXxmb3J8bmV3fHN3aXRjaHwiICsNCiAgICAiYXNzZXJ0fGRlZmF1bHR8Z290b3xwYWNrYWdlfHN5bmNocm9uaXplZHwiICsNCiAgICAiYm9vbGVhbnxkb3xpZnxwcml2YXRlfHRoaXN8IiArDQogICAgImJyZWFrfGRvdWJsZXxpbXBsZW1lbnRzfHByb3RlY3RlZHx0aHJvd3wiICsNCiAgICAiYnl0ZXxlbHNlfGltcG9ydHxwdWJsaWN8dGhyb3dzfCIgKw0KICAgICJjYXNlfGVudW18aW5zdGFuY2VvZnxyZXR1cm58dHJhbnNpZW50fCIgKw0KICAgICJjYXRjaHxleHRlbmRzfGludHxzaG9ydHx0cnl8IiArDQogICAgImNoYXJ8ZmluYWx8aW50ZXJmYWNlfHN0YXRpY3x2b2lkfCIgKw0KICAgICJjbGFzc3xmaW5hbGx5fGxvbmd8c3RyaWN0ZnB8dm9sYXRpbGV8IiArDQogICAgImNvbnN0fGZsb2F0fG5hdGl2ZXxzdXBlcnx3aGlsZSIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgbGFuZ0NsYXNzZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiQWJzdHJhY3RNZXRob2RFcnJvcnxBc3NlcnRpb25FcnJvcnxDbGFzc0NpcmN1bGFyaXR5RXJyb3J8IisNCiAgICAgICAgIkNsYXNzRm9ybWF0RXJyb3J8RGVwcmVjYXRlZHxFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9ufCIrDQogICAgICAgICJFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J8SWxsZWdhbEFjY2Vzc0Vycm9yfCIrDQogICAgICAgICJJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb258SW5zdGFudGlhdGlvbkVycm9yfEludGVybmFsRXJyb3J8IisNCiAgICAgICAgIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3wiKw0KICAgICAgICAiUHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIlN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfCIrDQogICAgICAgICJVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfCIrDQogICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnwiKw0KICAgICAgICAiTm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnwiKw0KICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnwiKw0KICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258IisNCiAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfCIrDQogICAgICAgICJSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfCIrDQogICAgICAgICJOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufCIrDQogICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fCIrDQogICAgICAgICJDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnwiKw0KICAgICAgICAiSXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258IisNCiAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8IisNCiAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnwiKw0KICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufCIrDQogICAgICAgICJFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnwiKw0KICAgICAgICAiQ2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3QiKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICANCiAgICB2YXIgaW1wb3J0Q2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCIiKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0Q2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBpZGVudGlmaWVycw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhSGlnaGxpZ2h0UnVsZXMgPSBKYXZhSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-java.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9qYXZhIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9qYXZhc2NyaXB0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhX2hpZ2hsaWdodF9ydWxlcyIpLkphdmFIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpLHRoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpfTtkLmluaGVyaXRzKGgsZSksZnVuY3Rpb24oKXt0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbH19LmNhbGwoaC5wcm90b3R5cGUpLGIuTW9kZT1ofSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxnPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaD1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiYWJzdHJhY3R8Y29udGludWV8Zm9yfG5ld3xzd2l0Y2h8YXNzZXJ0fGRlZmF1bHR8Z290b3xwYWNrYWdlfHN5bmNocm9uaXplZHxib29sZWFufGRvfGlmfHByaXZhdGV8dGhpc3xicmVha3xkb3VibGV8aW1wbGVtZW50c3xwcm90ZWN0ZWR8dGhyb3d8Ynl0ZXxlbHNlfGltcG9ydHxwdWJsaWN8dGhyb3dzfGNhc2V8ZW51bXxpbnN0YW5jZW9mfHJldHVybnx0cmFuc2llbnR8Y2F0Y2h8ZXh0ZW5kc3xpbnR8c2hvcnR8dHJ5fGNoYXJ8ZmluYWx8aW50ZXJmYWNlfHN0YXRpY3x2b2lkfGNsYXNzfGZpbmFsbHl8bG9uZ3xzdHJpY3RmcHx2b2xhdGlsZXxjb25zdHxmbG9hdHxuYXRpdmV8c3VwZXJ8d2hpbGUiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJBYnN0cmFjdE1ldGhvZEVycm9yfEFzc2VydGlvbkVycm9yfENsYXNzQ2lyY3VsYXJpdHlFcnJvcnxDbGFzc0Zvcm1hdEVycm9yfERlcHJlY2F0ZWR8RW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbnxFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J8SWxsZWdhbEFjY2Vzc0Vycm9yfElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbnxJbnN0YW50aWF0aW9uRXJyb3J8SW50ZXJuYWxFcnJvcnxOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbnxOb1N1Y2hGaWVsZEVycm9yfE92ZXJyaWRlfFByb2Nlc3N8UHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258U3VwcHJlc3NXYXJuaW5nc3xUeXBlTm90UHJlc2VudEV4Y2VwdGlvbnxVbmtub3duRXJyb3J8VW5zYXRpc2ZpZWRMaW5rRXJyb3J8VW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvcnxWZXJpZnlFcnJvcnxJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXhjZXB0aW9ufElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnxOdW1iZXJGb3JtYXRFeGNlcHRpb258U2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnxJbnRlcnJ1cHRlZEV4Y2VwdGlvbnxOb1N1Y2hNZXRob2RFeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnxVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbnxFbnVtfFN0cmljdE1hdGh8UGFja2FnZXxDb21waWxlcnxSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfE5vU3VjaE1ldGhvZEVycm9yfFRocmVhZExvY2FsfFJ1bnRpbWVQZXJtaXNzaW9ufEFyaXRobWV0aWNFeGNlcHRpb258TnVsbFBvaW50ZXJFeGNlcHRpb258TG9uZ3xJbnRlZ2VyfFNob3J0fEJ5dGV8RG91YmxlfE51bWJlcnxGbG9hdHxDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnxJdGVyYWJsZXxUaHJlYWRHcm91cHxSdW5uYWJsZXxUaHJlYWR8SWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnxTdGFja092ZXJmbG93RXJyb3J8T3V0T2ZNZW1vcnlFcnJvcnxWaXJ0dWFsTWFjaGluZUVycm9yfEFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnxOb0NsYXNzRGVmRm91bmRFcnJvcnxDbGFzc05vdEZvdW5kRXhjZXB0aW9ufFJ1bnRpbWVFeGNlcHRpb258RXhjZXB0aW9ufFRocmVhZERlYXRofEVycm9yfFRocm93YWJsZXxTeXN0ZW18Q2xhc3NMb2FkZXJ8Q2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3QiLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCIiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBmKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJ0aGlzIj8idmFyaWFibGUubGFuZ3VhZ2UiOmEuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmMuaGFzT3duUHJvcGVydHkoZSk/InN1cHBvcnQuZnVuY3Rpb24iOmQuaGFzT3duUHJvcGVydHkoZSk/InN1cHBvcnQuZnVuY3Rpb24iOmIuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkifSx7dG9rZW46ImxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLkphdmFIaWdobGlnaHRSdWxlcz1ofSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-javascript-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-json-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvanNvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2pzb25faGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vanNvbl9oaWdobGlnaHRfcnVsZXMiKS5Kc29uSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItanNvbi5qcyIsICJhY2UvbW9kZS9qc29uX3dvcmtlciIsICJKc29uV29ya2VyIik7DQogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7DQoNCiAgICAgICAgd29ya2VyLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCg0KICAgICAgICB3b3JrZXIub24oIm9rIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmV0dXJuIHdvcmtlcjsNCiAgICB9Ow0KDQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qc29uX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEpzb25IaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImludmFsaWQuaWxsZWdhbCIsIC8vIHNpbmdsZSBxdW90ZWQgc3RyaW5ncyBhcmUgbm90IGFsbG93ZWQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImludmFsaWQuaWxsZWdhbCIsIC8vIGNvbW1lbnRzIGFyZSBub3QgYWxsb3dlZA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCn07DQoNCm9vcC5pbmhlcml0cyhKc29uSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuSnNvbkhpZ2hsaWdodFJ1bGVzID0gSnNvbkhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-json.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9qc29uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2pzb25faGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vanNvbl9oaWdobGlnaHRfcnVsZXMiKS5Kc29uSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGw9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgaSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpO2lmKGE9PSJzdGFydCIpe3ZhciBlPWIubWF0Y2goL14uKltce1woXFtdXHMqJC8pO2UmJihkKz1jKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBrKFsiYWNlIl0sIndvcmtlci1qc29uLmpzIiwiYWNlL21vZGUvanNvbl93b3JrZXIiLCJKc29uV29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImVycm9yIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oIm9rIixmdW5jdGlvbigpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9qc29uX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJpbnZhbGlkLmlsbGVnYWwiLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJpbnZhbGlkLmlsbGVnYWwiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XX19O2QuaW5oZXJpdHMoZixlKSxiLkpzb25IaWdobGlnaHRSdWxlcz1mfSksZGVmaW5lKCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlx9Ly50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcfSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ0JyYWNlT3V0ZGVudD1lfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZT1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyk7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QoZCk/InN0YXJ0IjpiPT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGQpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihhLGIsYyl7dmFyIGU9L15ccyovLGY9YixnPWIsaD1hLmdldExpbmUoYiksaT1jfHxoLmxlbmd0aCxqPWgubWF0Y2goZSlbMF0ubGVuZ3RoLGs9YS5nZXRMZW5ndGgoKTt3aGlsZSgrK2I8ayl7aD1hLmdldExpbmUoYik7dmFyIGw9aC5tYXRjaChlKVswXS5sZW5ndGg7aWYobD09aC5sZW5ndGgpY29udGludWU7aWYobDw9ailicmVhaztnPWJ9aWYoZz5mKXt2YXIgbT1hLmdldExpbmUoZykubGVuZ3RoO3JldHVybiBuZXcgZChmLGksZyxtKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj17cm93OmMsY29sdW1uOmUrMX0sZz1hLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYixmKTtpZighZylyZXR1cm47dmFyIGg9YS5mb2xkV2lkZ2V0c1tnLnJvd107cmV0dXJuIGg9PW51bGwmJihoPXRoaXMuZ2V0Rm9sZFdpZGdldChhLGcucm93KSksaD09InN0YXJ0IiYmKGcucm93LS0sZy5jb2x1bW49YS5nZXRMaW5lKGcucm93KS5sZW5ndGgpLGQuZnJvbVBvaW50cyhmLGcpfX0pKS5jYWxsKGUucHJvdG90eXBlKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-latex-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9sYXRleCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2xhdGV4X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBMYXRleEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9sYXRleF9oaWdobGlnaHRfcnVsZXMiKS5MYXRleEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpDQp7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgTGF0ZXhIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGFkYXB0ZWQgZnJvbSBydWJ5LmpzDQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgDQogICAgICAgIC8vIExhVGVYIGNvbW1lbnRzIGJlZ2luIHdpdGggJSBhbmQgZ28gdG8gdGhlIGVuZCBvZiB0aGUgbGluZQ0KICAgICAgICB2YXIgY29tbWVudFJlZ0V4ID0gL14oXHMqKVwlLzsNCg0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRSb3c7IGkgPD0gZW5kUm93OyBpKyspIHsNCiAgICAgICAgICAgIGlmICghY29tbWVudFJlZ0V4LnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdzsgaSA8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKGNvbW1lbnRSZWdFeCk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIiUiKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgLy8gVGhlcmUgaXMgbm8gdW5pdmVyc2FsbHkgYWNjZXB0ZWQgd2F5IG9mIGluZGVudGluZyBhIHRleCBkb2N1bWVudA0KICAgIC8vIHNvIGp1c3QgbWFpbnRhaW4gdGhlIGluZGVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICB9Ow0KICAgIA0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9sYXRleF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBMYXRleEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7ICAgDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgLy8gQSB0ZXggY29tbWFuZCBlLmcuIFxmb28NCiAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxcXCg/OlteYS16QS1aXXxbYS16QS1aXSspIiwNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgLy8gQ3VybHkgYW5kIHNxdWFyZSBicmFjZXMNCiAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsDQogICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgLy8gQ3VybHkgYW5kIHNxdWFyZSBicmFjZXMNCiAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICAvLyBJbmxpbmUgbWF0aCBiZXR3ZWVuIHR3byAkIHN5bWJvbHMNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICByZWdleCA6ICJcXCQoPzooPzpcXFxcLil8KD86W15cXCRcXFxcXSkpKj9cXCQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIC8vIEEgY29tbWVudC4gVGV4IGNvbW1lbnRzIHN0YXJ0IHdpdGggJSBhbmQgZ28gdG8gDQogICAgICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBsaW5lDQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIiUuKiQiDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhMYXRleEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkxhdGV4SGlnaGxpZ2h0UnVsZXMgPSBMYXRleEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-latex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9sYXRleCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9sYXRleF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2xhdGV4X2hpZ2hsaWdodF9ydWxlcyIpLkxhdGV4SGlnaGxpZ2h0UnVsZXMsaD1hKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKX07ZC5pbmhlcml0cyhpLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXCUvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaT1uZXcgaCgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtpLnN0YXJ0LnJvdz1nLGkuZW5kLnJvdz1nLGkuZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaSxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIlIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGkucHJvdG90eXBlKSxiLk1vZGU9aX0pLGRlZmluZSgiYWNlL21vZGUvbGF0ZXhfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJcXFxcKD86W15hLXpBLVpdfFthLXpBLVpdKykifSx7dG9rZW46ImxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCQoPzooPzpcXFxcLil8KD86W15cXCRcXFxcXSkpKj9cXCQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIlLiokIn1dfX07ZC5pbmhlcml0cyhmLGUpLGIuTGF0ZXhIaWdobGlnaHRSdWxlcz1mfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-lua-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQoqICAgICAgTGVlIEdhbw0KKg0KKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQoqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQoqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KKg0KKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2x1YScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBMdWFIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vbHVhX2hpZ2hsaWdodF9ydWxlcyIpLkx1YUhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEx1YUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCgkNCiAgICAgICAgdmFyIGNodW5rcyA9IFsiZnVuY3Rpb24iLCAidGhlbiIsICJkbyIsICJyZXBlYXQiXTsNCiAgICAgICAgDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdG9rZW5zKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPSAia2V5d29yZCIpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtfaSA9IGNodW5rcy5pbmRleE9mKHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX2kgIT0gLTEpew0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IA0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCiAgICANCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQoNCg0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQoqICAgICAgTGVlIEdhbw0KKg0KKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQoqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQoqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KKg0KKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgTHVhSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfHJlcGVhdHwiKw0KICAgICAgICAgInJldHVybnx0aGVufHVudGlsfHdoaWxlfG9yfGFuZHxub3QiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInRydWV8ZmFsc2V8bmlsfF9HfF9WRVJTSU9OIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJzdHJpbmd8eHBjYWxsfHBhY2thZ2V8dG9zdHJpbmd8cHJpbnR8b3N8dW5wYWNrfHJlcXVpcmV8IisNCiAgICAgICAgImdldGZlbnZ8c2V0bWV0YXRhYmxlfG5leHR8YXNzZXJ0fHRvbnVtYmVyfGlvfHJhd2VxdWFsfCIrDQogICAgICAgICJjb2xsZWN0Z2FyYmFnZXxnZXRtZXRhdGFibGV8bW9kdWxlfHJhd3NldHxtYXRofGRlYnVnfCIrDQogICAgICAgICJwY2FsbHx0YWJsZXxuZXdwcm94eXx0eXBlfGNvcm91dGluZXxfR3xzZWxlY3R8Z2NpbmZvfCIrDQogICAgICAgICJwYWlyc3xyYXdnZXR8bG9hZHN0cmluZ3xpcGFpcnN8X1ZFUlNJT058ZG9maWxlfHNldGZlbnZ8IisNCiAgICAgICAgImxvYWR8ZXJyb3J8bG9hZGZpbGV8IisNCg0KICAgICAgICAic3VifHVwcGVyfGxlbnxnZmluZHxyZXB8ZmluZHxtYXRjaHxjaGFyfGR1bXB8Z21hdGNofCIrDQogICAgICAgICJyZXZlcnNlfGJ5dGV8Zm9ybWF0fGdzdWJ8bG93ZXJ8cHJlbG9hZHxsb2FkbGlifGxvYWRlZHwiKw0KICAgICAgICAibG9hZGVyc3xjcGF0aHxjb25maWd8cGF0aHxzZWVhbGx8ZXhpdHxzZXRsb2NhbGV8ZGF0ZXwiKw0KICAgICAgICAiZ2V0ZW52fGRpZmZ0aW1lfHJlbW92ZXx0aW1lfGNsb2NrfHRtcG5hbWV8cmVuYW1lfGV4ZWN1dGV8IisNCiAgICAgICAgImxpbmVzfHdyaXRlfGNsb3NlfGZsdXNofG9wZW58b3V0cHV0fHR5cGV8cmVhZHxzdGRlcnJ8IisNCiAgICAgICAgInN0ZGlufGlucHV0fHN0ZG91dHxwb3Blbnx0bXBmaWxlfGxvZ3xtYXh8YWNvc3xodWdlfCIrDQogICAgICAgICJsZGV4cHxwaXxjb3N8dGFuaHxwb3d8ZGVnfHRhbnxjb3NofHNpbmh8cmFuZG9tfHJhbmRvbXNlZWR8IisNCiAgICAgICAgImZyZXhwfGNlaWx8Zmxvb3J8cmFkfGFic3xzcXJ0fG1vZGZ8YXNpbnxtaW58bW9kfGZtb2R8bG9nMTB8IisNCiAgICAgICAgImF0YW4yfGV4cHxzaW58YXRhbnxnZXR1cHZhbHVlfGRlYnVnfHNldGhvb2t8Z2V0bWV0YXRhYmxlfCIrDQogICAgICAgICJnZXRob29rfHNldG1ldGF0YWJsZXxzZXRsb2NhbHx0cmFjZWJhY2t8c2V0ZmVudnxnZXRpbmZvfCIrDQogICAgICAgICJzZXR1cHZhbHVlfGdldGxvY2FsfGdldHJlZ2lzdHJ5fGdldGZlbnZ8c2V0bnxpbnNlcnR8Z2V0bnwiKw0KICAgICAgICAiZm9yZWFjaGl8bWF4bnxmb3JlYWNofGNvbmNhdHxzb3J0fHJlbW92ZXxyZXN1bWV8eWllbGR8IisNCiAgICAgICAgInN0YXR1c3x3cmFwfGNyZWF0ZXxydW5uaW5nIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIHN0ZExpYmFyaWVzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInN0cmluZ3xwYWNrYWdlfG9zfGlvfG1hdGh8ZGVidWd8dGFibGV8Y29yb3V0aW5lIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIG1ldGF0YWJsZU1ldGhvZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19hZGR8X19zdWJ8X19tb2R8X191bm18X19jb25jYXR8X19sdHxfX2luZGV4fF9fY2FsbHxfX2djfF9fbWV0YXRhYmxlfCIrDQogICAgICAgICAiX19tdWx8X19kaXZ8X19wb3d8X19sZW58X19lcXxfX2xlfF9fbmV3aW5kZXh8X190b3N0cmluZ3xfX21vZGV8X190b251bWJlciIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIiIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIA0KICAgIHZhciBkZXByZWNhdGVkSW41MTUyID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInNldG58Zm9yZWFjaHxmb3JlYWNoaXxnY2luZm98bG9nMTB8bWF4biIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIHN0clByZSA9ICIiOw0KDQogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsNCiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOw0KICAgIHZhciBpbnRlZ2VyID0gIig/OiIgKyBkZWNpbWFsSW50ZWdlciArICJ8IiArIGhleEludGVnZXIgKyAiKSI7DQoNCiAgICB2YXIgZnJhY3Rpb24gPSAiKD86XFwuXFxkKykiOw0KICAgIHZhciBpbnRQYXJ0ID0gIig/OlxcZCspIjsNCiAgICB2YXIgcG9pbnRGbG9hdCA9ICIoPzooPzoiICsgaW50UGFydCArICI/IiArIGZyYWN0aW9uICsgIil8KD86IiArIGludFBhcnQgKyAiXFwuKSkiOw0KICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgcG9pbnRGbG9hdCArICIpIjsNCiAgICANCiAgICB2YXIgY29tbWVudF9zdGFjayA9IFtdOw0KICAgIA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogDQoNCgkJDQogICAgICAgIC8vIGJyYWNrZXRlZCBjb21tZW50cw0KICAgICAgICBbew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVtbIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcWy4qXFxdXFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPVxcWy4qXFxdXFw9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09WyBjb21tZW50DQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17Mn1cXFsuKlxcXVxcPXsyfVxcXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVs9PT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXszfVxcWy4qXFxdXFw9ezN9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXs0fVxcWy4qXFxdXFw9ezR9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PT0rWyBjb21tZW50DQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17NX1cXD0qXFxbLipcXF1cXD17NX1cXD0qXFxdJw0KICAgICAgICB9LA0KCQkNCgkJLy8gbXVsdGlsaW5lIGJyYWNrZXRlZCBjb21tZW50cw0KCQl7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tW1sgY29tbWVudA0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFxbLiokJywNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIG5leHQgIDogInFjb21tZW50Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPVxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDEiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXsyfVxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT09WyBjb21tZW50DQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17M31cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicWNvbW1lbnQzIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PT1bIGNvbW1lbnQNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXs0fVxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyAgICAgLy8gLS1bPT09PStbIGNvbW1lbnQNCiAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBFWFRSRU1FTFkgU0xPVywgYnV0IHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGNpcmN1bXZlbnQgdGhlDQogICAgICAgICAgICAgICAgLy8gbGltaXRzIGltcG9zZWQgYnkgdGhlIGN1cnJlbnQgYXV0b21hdG9uLg0KICAgICAgICAgICAgICAgIC8vIEkndmUgbmV2ZXIgcGVyc29uYWxseSBzZWVuIGFueSBwcmFjdGljYWwgY29kZSB3aGVyZSA1IG9yIG1vcmUgJz0ncyBhcmUNCiAgICAgICAgICAgICAgICAvLyB1c2VkIGZvciBzdHJpbmcgb3IgY29tbWVudGluZywgc28gdGhpcyB3aWxsIHJhcmVseSBiZSBpbnZva2VkLg0KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1wtXC1cWyhcPSspXFsvLCBtYXRjaDsNCiAgICAgICAgICAgICAgICAvLyB5b3UgY2FuIG5ldmVyIGJlIHRvbyBwYXJhbm9pZCA7KQ0KICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSAhPSBudWxsICYmIChtYXRjaCA9IG1hdGNoWzFdKSAhPSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfc3RhY2sucHVzaChtYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiAiY29tbWVudCI7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFw9ezV9XFw9KlxcWy4qJCcsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDUiDQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICAvLyBzaW5nbGUgbGluZSBjb21tZW50cw0KICAgICAgICB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLVxcLS4qJCINCiAgICAgICAgfSwgDQogICAgICAgIA0KICAgICAgICAvLyBicmFja2V0ZWQgc3RyaW5ncw0KCQl7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gW1sgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXFsuKlxcXVxcXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIFs9WyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPVxcWy4qXFxdXFw9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09WyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXsyfVxcWy4qXFxdXFw9ezJ9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17M31cXFsuKlxcXVxcPXszfVxcXScNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIFs9PT09WyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs0fVxcWy4qXFxdXFw9ezR9XFxdJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PT0rWyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs1fVxcPSpcXFsuKlxcXVxcPXs1fVxcPSpcXF0nDQogICAgICAgIH0sDQoJCQ0KCQkvLyBtdWx0aWxpbmUgYnJhY2tldGVkIHN0cmluZ3MNCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIFtbIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFxbLiokJywNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIG5leHQgIDogInFzdHJpbmciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD1cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzEiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT1bIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFw9ezJ9XFxbLiokJywNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIG5leHQgIDogInFzdHJpbmcyIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17M31cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzMiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT09PVsgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17NH1cXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyAgICAgLy8gLS1bPT09PStbIHN0cmluZw0KICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IEVYVFJFTUVMWSBTTE9XLCBzZWUgYWJvdmUuDQogICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAvXFsoXD0rKVxbLywgbWF0Y2g7DQogICAgICAgICAgICAgICAgaWYgKChtYXRjaCA9IHBhdHRlcm4uZXhlYyh2YWx1ZSkpICE9IG51bGwgJiYgKG1hdGNoID0gbWF0Y2hbMV0pICE9IHVuZGVmaW5lZCkNCiAgICAgICAgICAgICAgICAgICAgY29tbWVudF9zdGFjay5wdXNoKG1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs1fVxcPSpcXFsuKiQnLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzUiDQogICAgICAgIH0sIA0KICAgICAgICANCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciKD86W15cXFxcXXxcXFxcLikqPyInDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAnIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJyg/OlteXFxcXF18XFxcXC4pKj8nIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgIHJlZ2V4IDogZmxvYXROdW1iZXINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXINCiAgICAgICAgICAgIHJlZ2V4IDogaW50ZWdlciArICJcXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGRMaWJhcmllcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGlicmFyeSI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwcmVjYXRlZEluNTE1Mi5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhdGFibGVNZXRob2RzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcK3xcXC18XFwqfFxcL3wlfFxcI3xcXF58fnw8fD58PD18PT58PT18fj18PXxcXDp8XFwuXFwuXFwufFxcLlxcLiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltcXFtcXChcXHtdIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcXVxcKVxcfV0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSBdLA0KICAgICAgICANCiAgICAgICAgInFjb21tZW50IjogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFjb21tZW50MSI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgICJxY29tbWVudDIiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXsyfVxcXSIsDQogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicWNvbW1lbnQzIjogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17M31cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFjb21tZW50NCI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezR9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgICJxY29tbWVudDUiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyANCiAgICAgICAgICAgICAgICAvLyB2ZXJ5IGhhY2tpc2gsIG11dGF0ZXMgdGhlIHFjb21tZW50NSBmaWVsZCBvbiB0aGUgZmx5Lg0KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xdKFw9KylcXS8sIHJ1bGUgPSB0aGlzLnJ1bGVzLnFjb21tZW50NVswXSwgbWF0Y2g7DQogICAgICAgICAgICAgICAgcnVsZS5uZXh0ID0gInN0YXJ0IjsNCiAgICAgICAgICAgICAgICBpZiAoKG1hdGNoID0gcGF0dGVybi5leGVjKHZhbHVlKSkgIT0gbnVsbCAmJiAobWF0Y2ggPSBtYXRjaFsxXSkgIT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gbWF0Y2gubGVuZ3RoLCBleHBlY3RlZDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKChleHBlY3RlZCA9IGNvbW1lbnRfc3RhY2sucG9wKCkpICE9IGZvdW5kKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfc3RhY2sucHVzaChleHBlY3RlZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBydWxlLm5leHQgPSAicWNvbW1lbnQ1IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgIA0KICAgICAgICAicXN0cmluZyI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicXN0cmluZzEiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFzdHJpbmcyIjogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXsyfVxcXSIsDQogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0sDQogICAgICAgICJxc3RyaW5nMyI6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17M31cXF0iLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicXN0cmluZzQiOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezR9XFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFzdHJpbmc1IjogWyB7DQogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKXsgDQogICAgICAgICAgICAgICAgLy8gdmVyeSBoYWNraXNoLCBtdXRhdGVzIHRoZSBxc3RyaW5nNSBmaWVsZCBvbiB0aGUgZmx5Lg0KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xdKFw9KylcXS8sIHJ1bGUgPSB0aGlzLnJ1bGVzLnFzdHJpbmc1WzBdLCBtYXRjaDsNCiAgICAgICAgICAgICAgICBydWxlLm5leHQgPSAic3RhcnQiOw0KICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSAhPSBudWxsICYmIChtYXRjaCA9IG1hdGNoWzFdKSAhPSB1bmRlZmluZWQpew0KICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBtYXRjaC5sZW5ndGgsIGV4cGVjdGVkOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKGV4cGVjdGVkID0gY29tbWVudF9zdGFjay5wb3AoKSkgIT0gZm91bmQpew0KICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9zdGFjay5wdXNoKGV4cGVjdGVkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9ICJxc3RyaW5nNSI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIiwNCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXQ0KICAgICAgICANCiAgICB9Ow0KDQp9DQoNCm9vcC5pbmhlcml0cyhMdWFIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5MdWFIaWdobGlnaHRSdWxlcyA9IEx1YUhpZ2hsaWdodFJ1bGVzOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-lua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9sdWEiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvbHVhX2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vbHVhX2hpZ2hsaWdodF9ydWxlcyIpLkx1YUhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKX07ZC5pbmhlcml0cyhoLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9WyJmdW5jdGlvbiIsInRoZW4iLCJkbyIsInJlcGVhdCJdO2lmKGE9PSJzdGFydCIpe3ZhciBoPWIubWF0Y2goL14uKltce1woXFtdXHMqJC8pO2lmKGgpZCs9YztlbHNlIGZvcih2YXIgaSBpbiBmKXt2YXIgaj1mW2ldO2lmKGoudHlwZSE9ImtleXdvcmQiKWNvbnRpbnVlO3ZhciBrPWcuaW5kZXhPZihqLnZhbHVlKTtpZihrIT0tMSl7ZCs9YzticmVha319fXJldHVybiBkfX0uY2FsbChoLnByb3RvdHlwZSksYi5Nb2RlPWh9KSxkZWZpbmUoImFjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfHJlcGVhdHxyZXR1cm58dGhlbnx1bnRpbHx3aGlsZXxvcnxhbmR8bm90Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgidHJ1ZXxmYWxzZXxuaWx8X0d8X1ZFUlNJT04iLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJzdHJpbmd8eHBjYWxsfHBhY2thZ2V8dG9zdHJpbmd8cHJpbnR8b3N8dW5wYWNrfHJlcXVpcmV8Z2V0ZmVudnxzZXRtZXRhdGFibGV8bmV4dHxhc3NlcnR8dG9udW1iZXJ8aW98cmF3ZXF1YWx8Y29sbGVjdGdhcmJhZ2V8Z2V0bWV0YXRhYmxlfG1vZHVsZXxyYXdzZXR8bWF0aHxkZWJ1Z3xwY2FsbHx0YWJsZXxuZXdwcm94eXx0eXBlfGNvcm91dGluZXxfR3xzZWxlY3R8Z2NpbmZvfHBhaXJzfHJhd2dldHxsb2Fkc3RyaW5nfGlwYWlyc3xfVkVSU0lPTnxkb2ZpbGV8c2V0ZmVudnxsb2FkfGVycm9yfGxvYWRmaWxlfHN1Ynx1cHBlcnxsZW58Z2ZpbmR8cmVwfGZpbmR8bWF0Y2h8Y2hhcnxkdW1wfGdtYXRjaHxyZXZlcnNlfGJ5dGV8Zm9ybWF0fGdzdWJ8bG93ZXJ8cHJlbG9hZHxsb2FkbGlifGxvYWRlZHxsb2FkZXJzfGNwYXRofGNvbmZpZ3xwYXRofHNlZWFsbHxleGl0fHNldGxvY2FsZXxkYXRlfGdldGVudnxkaWZmdGltZXxyZW1vdmV8dGltZXxjbG9ja3x0bXBuYW1lfHJlbmFtZXxleGVjdXRlfGxpbmVzfHdyaXRlfGNsb3NlfGZsdXNofG9wZW58b3V0cHV0fHR5cGV8cmVhZHxzdGRlcnJ8c3RkaW58aW5wdXR8c3Rkb3V0fHBvcGVufHRtcGZpbGV8bG9nfG1heHxhY29zfGh1Z2V8bGRleHB8cGl8Y29zfHRhbmh8cG93fGRlZ3x0YW58Y29zaHxzaW5ofHJhbmRvbXxyYW5kb21zZWVkfGZyZXhwfGNlaWx8Zmxvb3J8cmFkfGFic3xzcXJ0fG1vZGZ8YXNpbnxtaW58bW9kfGZtb2R8bG9nMTB8YXRhbjJ8ZXhwfHNpbnxhdGFufGdldHVwdmFsdWV8ZGVidWd8c2V0aG9va3xnZXRtZXRhdGFibGV8Z2V0aG9va3xzZXRtZXRhdGFibGV8c2V0bG9jYWx8dHJhY2ViYWNrfHNldGZlbnZ8Z2V0aW5mb3xzZXR1cHZhbHVlfGdldGxvY2FsfGdldHJlZ2lzdHJ5fGdldGZlbnZ8c2V0bnxpbnNlcnR8Z2V0bnxmb3JlYWNoaXxtYXhufGZvcmVhY2h8Y29uY2F0fHNvcnR8cmVtb3ZlfHJlc3VtZXx5aWVsZHxzdGF0dXN8d3JhcHxjcmVhdGV8cnVubmluZyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoInN0cmluZ3xwYWNrYWdlfG9zfGlvfG1hdGh8ZGVidWd8dGFibGV8Y29yb3V0aW5lIi5zcGxpdCgifCIpKSxmPWUuYXJyYXlUb01hcCgiX19hZGR8X19zdWJ8X19tb2R8X191bm18X19jb25jYXR8X19sdHxfX2luZGV4fF9fY2FsbHxfX2djfF9fbWV0YXRhYmxlfF9fbXVsfF9fZGl2fF9fcG93fF9fbGVufF9fZXF8X19sZXxfX25ld2luZGV4fF9fdG9zdHJpbmd8X19tb2RlfF9fdG9udW1iZXIiLnNwbGl0KCJ8IikpLGc9ZS5hcnJheVRvTWFwKCIiLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJzZXRufGZvcmVhY2h8Zm9yZWFjaGl8Z2NpbmZvfGxvZzEwfG1heG4iLnNwbGl0KCJ8IikpLGk9IiIsaj0iKD86KD86WzEtOV1cXGQqKXwoPzowKSkiLGs9Iig/OjBbeFhdW1xcZEEtRmEtZl0rKSIsbD0iKD86IitqKyJ8IitrKyIpIixtPSIoPzpcXC5cXGQrKSIsbj0iKD86XFxkKykiLG89Iig/Oig/OiIrbisiPyIrbSsiKXwoPzoiK24rIlxcLikpIixwPSIoPzoiK28rIikiLHE9W107dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OmkrIlxcLVxcLVxcW1xcWy4qXFxdXFxdIn0se3Rva2VuOiJjb21tZW50IixyZWdleDppKyJcXC1cXC1cXFtcXD1cXFsuKlxcXVxcPVxcXSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9ezJ9XFxbLipcXF1cXD17Mn1cXF0ifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OmkrIlxcLVxcLVxcW1xcPXszfVxcWy4qXFxdXFw9ezN9XFxdIn0se3Rva2VuOiJjb21tZW50IixyZWdleDppKyJcXC1cXC1cXFtcXD17NH1cXFsuKlxcXVxcPXs0fVxcXSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9ezV9XFw9KlxcWy4qXFxdXFw9ezV9XFw9KlxcXSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFxbLiokIixtZXJnZTohMCxuZXh0OiJxY29tbWVudCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9XFxbLiokIixtZXJnZTohMCxuZXh0OiJxY29tbWVudDEifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OmkrIlxcLVxcLVxcW1xcPXsyfVxcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicWNvbW1lbnQyIn0se3Rva2VuOiJjb21tZW50IixyZWdleDppKyJcXC1cXC1cXFtcXD17M31cXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFjb21tZW50MyJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9ezR9XFxbLiokIixtZXJnZTohMCxuZXh0OiJxY29tbWVudDQifSx7dG9rZW46ZnVuY3Rpb24oYSl7dmFyIGI9L1wtXC1cWyhcPSspXFsvLGM7cmV0dXJuKGM9Yi5leGVjKGEpKSE9bnVsbCYmKGM9Y1sxXSkhPXVuZGVmaW5lZCYmcS5wdXNoKGMubGVuZ3RoKSwiY29tbWVudCJ9LHJlZ2V4OmkrIlxcLVxcLVxcW1xcPXs1fVxcPSpcXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFjb21tZW50NSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcLVxcLS4qJCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXFsuKlxcXVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD1cXFsuKlxcXVxcPVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17Mn1cXFsuKlxcXVxcPXsyfVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17M31cXFsuKlxcXVxcPXszfVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17NH1cXFsuKlxcXVxcPXs0fVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17NX1cXD0qXFxbLipcXF1cXD17NX1cXD0qXFxdIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmkrIlxcW1xcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD1cXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFzdHJpbmcxIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmkrIlxcW1xcPXsyfVxcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicXN0cmluZzIifSx7dG9rZW46InN0cmluZyIscmVnZXg6aSsiXFxbXFw9ezN9XFxbLiokIixtZXJnZTohMCxuZXh0OiJxc3RyaW5nMyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17NH1cXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFzdHJpbmc0In0se3Rva2VuOmZ1bmN0aW9uKGEpe3ZhciBiPS9cWyhcPSspXFsvLGM7cmV0dXJuKGM9Yi5leGVjKGEpKSE9bnVsbCYmKGM9Y1sxXSkhPXVuZGVmaW5lZCYmcS5wdXNoKGMubGVuZ3RoKSwic3RyaW5nIn0scmVnZXg6aSsiXFxbXFw9ezV9XFw9KlxcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicXN0cmluZzUifSx7dG9rZW46InN0cmluZyIscmVnZXg6aSsnIig/OlteXFxcXF18XFxcXC4pKj8iJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmkrIicoPzpbXlxcXFxdfFxcXFwuKSo/JyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6cH0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpsKyJcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpnLmhhc093blByb3BlcnR5KGUpPyJpbnZhbGlkLmlsbGVnYWwiOmQuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50LmxpYnJhcnkiOmguaGFzT3duUHJvcGVydHkoZSk/ImludmFsaWQuZGVwcmVjYXRlZCI6Yy5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6Zi5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwrfFxcLXxcXCp8XFwvfCV8XFwjfFxcXnx+fDx8Pnw8PXw9Pnw9PXx+PXw9fFxcOnxcXC5cXC5cXC58XFwuXFwuIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbXFxbXFwoXFx7XSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXVxcKVxcfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHFjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFjb21tZW50MTpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxY29tbWVudDI6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17Mn1cXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scWNvbW1lbnQzOlt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezN9XFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFjb21tZW50NDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXs0fVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxY29tbWVudDU6W3t0b2tlbjpmdW5jdGlvbihhKXt2YXIgYj0vXF0oXD0rKVxdLyxjPXRoaXMucnVsZXMucWNvbW1lbnQ1WzBdLGQ7Yy5uZXh0PSJzdGFydCI7aWYoKGQ9Yi5leGVjKGEpKSE9bnVsbCYmKGQ9ZFsxXSkhPXVuZGVmaW5lZCl7dmFyIGU9ZC5sZW5ndGgsZjsoZj1xLnBvcCgpKSE9ZSYmKHEucHVzaChmKSxjLm5leHQ9InFjb21tZW50NSIpfXJldHVybiJjb21tZW50In0scmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmcxOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD1cXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nMjpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezJ9XFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzM6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXszfVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc0Olt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NH1cXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nNTpbe3Rva2VuOmZ1bmN0aW9uKGEpe3ZhciBiPS9cXShcPSspXF0vLGM9dGhpcy5ydWxlcy5xc3RyaW5nNVswXSxkO2MubmV4dD0ic3RhcnQiO2lmKChkPWIuZXhlYyhhKSkhPW51bGwmJihkPWRbMV0pIT11bmRlZmluZWQpe3ZhciBlPWQubGVuZ3RoLGY7KGY9cS5wb3AoKSkhPWUmJihxLnB1c2goZiksYy5uZXh0PSJxc3RyaW5nNSIpfXJldHVybiJzdHJpbmcifSxyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXs1fVxcPSpcXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX19O2QuaW5oZXJpdHMoZyxmKSxiLkx1YUhpZ2hsaWdodFJ1bGVzPWd9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-markdown-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hcmtkb3duJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL21vZGUveG1sJywgJ2FjZS9tb2RlL2h0bWwnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsNCnZhciBYbWxNb2RlID0gcmVxdWlyZSgiLi94bWwiKS5Nb2RlOw0KdmFyIEh0bWxNb2RlID0gcmVxdWlyZSgiLi9odG1sIikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgTWFya2Rvd25IaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vbWFya2Rvd25faGlnaGxpZ2h0X3J1bGVzIikuTWFya2Rvd25IaWdobGlnaHRSdWxlczsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgaGlnaGxpZ2h0ZXIgPSBuZXcgTWFya2Rvd25IaWdobGlnaHRSdWxlcygpOw0KICAgIA0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7DQogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsNCiAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwNCiAgICAgICJ4bWwtIjogWG1sTW9kZSwNCiAgICAgICJodG1sLSI6IEh0bWxNb2RlDQogICAgfSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIGlmIChzdGF0ZSA9PSAibGlzdGJsb2NrIikgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gL14oKD86LispPykoWy0rKl1bIF0rKS8uZXhlYyhsaW5lKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkobWF0Y2hbMV0ubGVuZ3RoICsgMSkuam9pbigiICIpICsgbWF0Y2hbMl07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgICAgIH0NCiAgICB9Ow0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgWG1sRm9sZE1vZGUoKTsNCn07DQoNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfV0sDQogICAgICAgIA0KICAgICAgICBjZGF0YSA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIg0KICAgICAgICB9XSwNCg0KICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOw0KfTsNCg0Kb29wLmluaGVyaXRzKFhtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsNCiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsNCiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOw0KDQogICAgICAgIGlmICh0YWcuY2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOw0KDQogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7DQogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOw0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOw0KICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7DQogICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7DQogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IHRhZywNCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsDQogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwNCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLA0KICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLA0KICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnDQogICAgICovDQogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgc3RhcnQ7DQogICAgICAgIA0KICAgICAgICBkbyB7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIHZhciBlbmQ7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghZW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsNCiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgDQogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsNCiAgICAgICAgdmFyIHN0YWNrID0gW107DQogICAgICAgIHZhciB0YWc7DQogICAgICAgIA0KICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2h0bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvbW9kZS9jc3MnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcvaHRtbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCIuL2phdmFzY3JpcHQiKS5Nb2RlOw0KdmFyIENzc01vZGUgPSByZXF1aXJlKCIuL2NzcyIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vaHRtbF9oaWdobGlnaHRfcnVsZXMiKS5IdG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOw0KdmFyIEh0bWxGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGhpZ2hsaWdodGVyID0gbmV3IEh0bWxIaWdobGlnaHRSdWxlcygpOw0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IFhtbEJlaGF2aW91cigpOw0KICAgIA0KICAgIHRoaXMuJGVtYmVkcyA9IGhpZ2hsaWdodGVyLmdldEVtYmVkcygpOw0KICAgIHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7DQogICAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwNCiAgICAgICAgImNzcy0iOiBDc3NNb2RlDQogICAgfSk7DQogICAgDQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgSHRtbEZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHJldHVybiAwOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NzcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ3NzSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpLCAiaSIpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gImNTdHlsZSI7DQoNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KDQogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7DQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1jc3MuanMiLCAiYWNlL21vZGUvY3NzX3dvcmtlciIsICJXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigiY3NzbGludCIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGUuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtZXNzYWdlLmNvbCAtIDEsDQogICAgICAgICAgICAgICAgICAgIHRleHQ6IG1lc3NhZ2UubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLA0KICAgICAgICAgICAgICAgICAgICBsaW50OiBtZXNzYWdlDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHdvcmtlcjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIgcHJvcGVydGllcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfCIgKw0KICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArDQogICAgICAgICJiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsNCiAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXwiICsNCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsNCiAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKw0KICAgICAgICAiYm9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfCIgKw0KICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsNCiAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArDQogICAgICAgICJjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8IiArDQogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArDQogICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsNCiAgICAgICAgImxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnwiICsNCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKw0KICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKw0KICAgICAgICAibWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3wiICsNCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsNCiAgICAgICAgInBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnwiICsNCiAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfCIgKw0KICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsNCiAgICAgICAgInNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8IiArDQogICAgICAgICJzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fCIgKw0KICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArDQogICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsNCiAgICAgICAgInotaW5kZXgiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8IiArDQogICAgICAgICJibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfCIgKw0KICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsNCiAgICAgICAgImRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXwiICsNCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArDQogICAgICAgICJoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3wiICsNCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKw0KICAgICAgICAiaW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8IiArDQogICAgICAgICJrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXwiICsNCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArDQogICAgICAgICJtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHwiICsNCiAgICAgICAgIm53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXwiICsNCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKw0KICAgICAgICAicmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfCIgKw0KICAgICAgICAic29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHwiICsNCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKw0KICAgICAgICAidHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXwiICsNCiAgICAgICAgInZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8IiArDQogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8IiArDQogICAgICAgICJwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7DQoNCiAgICB2YXIgYmFzZV9ydWxlc2V0ID0gWw0KICAgICAgICB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwNCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgIC8vIGhleDYgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3INCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC50eXBlIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIg0KICAgICAgICB9DQogICAgICBdOw0KDQogICAgdmFyIHJ1bGVzZXQgPSBsYW5nLmNvcHlBcnJheShiYXNlX3J1bGVzZXQpOw0KICAgIHJ1bGVzZXQudW5zaGlmdCh7DQogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgIHJlZ2V4IDogIlxcfSIsDQogICAgICAgIG5leHQ6ICAgInN0YXJ0Ig0KICAgIH0pOw0KDQogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7DQogICAgbWVkaWFfcnVsZXNldC51bnNoaWZ0KHsNCiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgcmVnZXggOiAiXFx9IiwNCiAgICAgICAgbmV4dDogICAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgYmFzZV9jb21tZW50ID0gW3sNCiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgIH1dOw0KDQogICAgdmFyIGNvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOw0KICAgIGNvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICB9KTsNCg0KICAgIHZhciBtZWRpYV9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoew0KICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgIG5leHQgOiAibWVkaWEiDQogICAgfSk7DQoNCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsNCiAgICBydWxlc2V0X2NvbW1lbnQudW5zaGlmdCh7DQogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgbmV4dCA6ICJydWxlc2V0Ig0KICAgIH0pOw0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgcmVnZXg6ICJcXHsiLA0KICAgICAgICAgICAgbmV4dDogICJydWxlc2V0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIkAuKj97IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWEiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIg0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLA0KICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiDQogICAgICAgIH1dLA0KDQogICAgICAgICJtZWRpYSIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwNCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWFfcnVsZXNldCINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsDQogICAgICAgICAgICByZWdleDogIlxcfSIsDQogICAgICAgICAgICBuZXh0OiAgInN0YXJ0Ig0KICAgICAgICB9LHsNCiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsDQogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyINCiAgICAgICAgfSx7DQogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwNCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiDQogICAgICAgIH0sew0KICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICB9XSwNCg0KICAgICAgICAiY29tbWVudCIgOiBjb21tZW50LA0KDQogICAgICAgICJydWxlc2V0IiA6IHJ1bGVzZXQsDQogICAgICAgICJydWxlc2V0X2NvbW1lbnQiIDogcnVsZXNldF9jb21tZW50LA0KDQogICAgICAgICJtZWRpYV9ydWxlc2V0IiA6IG1lZGlhX3J1bGVzZXQsDQogICAgICAgICJtZWRpYV9jb21tZW50IiA6IG1lZGlhX2NvbW1lbnQNCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkNzc0hpZ2hsaWdodFJ1bGVzID0gQ3NzSGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiPCg/PVxzKnNjcmlwdFxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzY3JpcHQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzdHlsZVxcYikiLA0KICAgICAgICAgICAgbmV4dCA6ICJzdHlsZSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfSBdLA0KICAgIA0KICAgICAgICBjZGF0YSA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgfSBdLA0KDQogICAgICAgIGNvbW1lbnQgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH0gXQ0KICAgIH07DQogICAgDQogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInN0eWxlIiwgImNzcy1zdGFydCIpOw0KICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAic2NyaXB0IiwgImpzLXN0YXJ0Iik7DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgImpzLSIsIFt7DQogICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgIHJlZ2V4OiAiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXNjcmlwdCkiLA0KICAgICAgICBuZXh0OiAidGFnIg0KICAgIH1dKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sNCiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsDQogICAgICAgIHJlZ2V4OiAiPFxcLyg/PXN0eWxlKSIsDQogICAgICAgIG5leHQ6ICJ0YWciDQogICAgfV0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEh0bWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5IdG1sSGlnaGxpZ2h0UnVsZXMgPSBIdG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvaHRtbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBNaXhlZEZvbGRNb2RlID0gcmVxdWlyZSgiLi9taXhlZCIpLkZvbGRNb2RlOw0KdmFyIFhtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi94bWwiKS5Gb2xkTW9kZTsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICBNaXhlZEZvbGRNb2RlLmNhbGwodGhpcywgbmV3IFhtbEZvbGRNb2RlKHsNCiAgICAgICAgLy8gdm9pZCBlbGVtZW50cw0KICAgICAgICAiYXJlYSI6IDEsDQogICAgICAgICJiYXNlIjogMSwNCiAgICAgICAgImJyIjogMSwNCiAgICAgICAgImNvbCI6IDEsDQogICAgICAgICJjb21tYW5kIjogMSwNCiAgICAgICAgImVtYmVkIjogMSwNCiAgICAgICAgImhyIjogMSwNCiAgICAgICAgImltZyI6IDEsDQogICAgICAgICJpbnB1dCI6IDEsDQogICAgICAgICJrZXlnZW4iOiAxLA0KICAgICAgICAibGluayI6IDEsDQogICAgICAgICJtZXRhIjogMSwNCiAgICAgICAgInBhcmFtIjogMSwNCiAgICAgICAgInNvdXJjZSI6IDEsDQogICAgICAgICJ0cmFjayI6IDEsDQogICAgICAgICJ3YnIiOiAxLA0KICAgICAgICANCiAgICAgICAgLy8gb3B0aW9uYWwgdGFncyANCiAgICAgICAgImxpIjogMSwNCiAgICAgICAgImR0IjogMSwNCiAgICAgICAgImRkIjogMSwNCiAgICAgICAgInAiOiAxLA0KICAgICAgICAicnQiOiAxLA0KICAgICAgICAicnAiOiAxLA0KICAgICAgICAib3B0Z3JvdXAiOiAxLA0KICAgICAgICAib3B0aW9uIjogMSwNCiAgICAgICAgImNvbGdyb3VwIjogMSwNCiAgICAgICAgInRkIjogMSwNCiAgICAgICAgInRoIjogMQ0KICAgIH0pLCB7DQogICAgICAgICJqcy0iOiBuZXcgQ1N0eWxlRm9sZE1vZGUoKSwNCiAgICAgICAgImNzcy0iOiBuZXcgQ1N0eWxlRm9sZE1vZGUoKQ0KICAgIH0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBNaXhlZEZvbGRNb2RlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKGRlZmF1bHRNb2RlLCBzdWJNb2Rlcykgew0KICAgIHRoaXMuZGVmYXVsdE1vZGUgPSBkZWZhdWx0TW9kZTsNCiAgICB0aGlzLnN1Yk1vZGVzID0gc3ViTW9kZXM7DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCg0KICAgIHRoaXMuJGdldE1vZGUgPSBmdW5jdGlvbihzdGF0ZSkgew0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5zdWJNb2Rlcykgew0KICAgICAgICAgICAgaWYgKHN0YXRlLmluZGV4T2Yoa2V5KSA9PT0gMCkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJNb2Rlc1trZXldOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kdHJ5TW9kZSA9IGZ1bmN0aW9uKHN0YXRlLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc3RhdGUpOw0KICAgICAgICByZXR1cm4gKG1vZGUgPyBtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIDogIiIpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gKA0KICAgICAgICAgICAgdGhpcy4kdHJ5TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdy0xKSwgc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHx8DQogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93KSwgc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHx8DQogICAgICAgICAgICB0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpDQogICAgICAgICk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIG1vZGUgPSB0aGlzLiRnZXRNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpKTsNCiAgICAgICAgDQogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkNCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLiRnZXRNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93KSk7DQogICAgICAgIA0KICAgICAgICBpZiAoIW1vZGUgfHwgIW1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykpDQogICAgICAgICAgICBtb2RlID0gdGhpcy5kZWZhdWx0TW9kZTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiBtb2RlLmdldEZvbGRXaWRnZXRSYW5nZShzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdyk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWFya2Rvd25faGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgSHRtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlczsNCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOw0KDQpmdW5jdGlvbiBnaXRodWJfZW1iZWQodGFnLCBwcmVmaXgpIHsNCiAgICByZXR1cm4geyAvLyBHaXRodWIgc3R5bGUgYmxvY2sNCiAgICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsDQogICAgICAgIHJlZ2V4IDogIl5gYGAiICsgdGFnICsgIlxccyokIiwNCiAgICAgICAgbmV4dCAgOiBwcmVmaXggKyAic3RhcnQiDQogICAgfTsNCn0NCg0KdmFyIE1hcmtkb3duSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcw0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJlbXB0eV9saW5lIiwNCiAgICAgICAgICAgIHJlZ2V4IDogJ14kJw0KICAgICAgICB9LCB7IC8vIGNvZGUgc3BhbiBgDQogICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIihgKykoW15cXHJdKj9bXmBdKShcXDEpIg0KICAgICAgICB9LCB7IC8vIGNvZGUgYmxvY2sNCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgICAgICAgcmVnZXggOiAiXlsgXXs0fS4rIg0KICAgICAgICB9LCB7IC8vIGgxDQogICAgICAgICAgICB0b2tlbjogIm1hcmt1cC5oZWFkaW5nLjEiLA0KICAgICAgICAgICAgcmVnZXg6ICJePSsoPz1cXHMqJCkiDQogICAgICAgIH0sIHsgLy8gaDINCiAgICAgICAgICAgIHRva2VuOiAibWFya3VwLmhlYWRpbmcuMSIsDQogICAgICAgICAgICByZWdleDogIl5cXC0rKD89XFxzKiQpIg0KICAgICAgICB9LCB7IC8vIGhlYWRlcg0KICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWFya3VwLmhlYWRpbmcuIiArIHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWdleCA6ICJeI3sxLDZ9Ig0KICAgICAgICB9LCBnaXRodWJfZW1iZWQoImphdmFzY3JpcHQiLCAianMtIiksDQogICAgICAgICAgIGdpdGh1Yl9lbWJlZCgieG1sIiwgInhtbC0iKSwNCiAgICAgICAgICAgZ2l0aHViX2VtYmVkKCJodG1sIiwgImh0bWwtIiksDQogICAgICAgICAgIGdpdGh1Yl9lbWJlZCgiY3NzIiwgImNzcy0iKSwNCiAgICAgICAgeyAvLyBHaXRodWIgc3R5bGUgYmxvY2sNCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgICAgICAgcmVnZXggOiAiXmBgYFthLXpBLVpdK1xccyokIiwNCiAgICAgICAgICAgIG5leHQgIDogImdpdGh1YmJsb2NrIg0KICAgICAgICB9LCB7IC8vIGJsb2NrIHF1b3RlDQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXggOiAiXj5bIF0uKyQiLA0KICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2txdW90ZSINCiAgICAgICAgfSwgeyAvLyByZWZlcmVuY2UNCiAgICAgICAgICAgIHRva2VuIDogWyJ0ZXh0IiwgImNvbnN0YW50IiwgInRleHQiLCAidXJsIiwgInN0cmluZyIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICJeKFsgXXswLDN9XFxbKShbXlxcXV0rKShcXF06XFxzKikoW14gXSspKFxccyooPzpbXCJdW15cIl0rW1wiXSk/XFxzKikkIg0KICAgICAgICB9LCB7IC8vIGxpbmsgYnkgcmVmZXJlbmNlDQogICAgICAgICAgICB0b2tlbiA6IFsidGV4dCIsICJzdHJpbmciLCAidGV4dCIsICJjb25zdGFudCIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICIoXFxbKSgoPzpbW15cXF1dKlxcXXxbXlxcW1xcXV0pKikoXFxdWyBdPyg/OlxcblsgXSopP1xcWykoLio/KShcXF0pIg0KICAgICAgICB9LCB7IC8vIGxpbmsgYnkgdXJsDQogICAgICAgICAgICB0b2tlbiA6IFsidGV4dCIsICJzdHJpbmciLCAidGV4dCIsICJtYXJrdXAudW5kZXJsaW5lIiwgInN0cmluZyIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICIoXFxbKSIrDQogICAgICAgICAgICAgICAgICAgICIoXFxbW15cXF1dKlxcXXxbXlxcW1xcXV0qKSIrDQogICAgICAgICAgICAgICAgICAgICIoXFxdXFwoWyBcXHRdKikiKw0KICAgICAgICAgICAgICAgICAgICAiKDw/KD86KD86W15cXChdKj9cXChbXlxcKV0qP1xcKVxcUyo/KXwoPzouKj8pKT4/KSIrDQogICAgICAgICAgICAgICAgICAgICIoKD86WyBcdF0qXCIoPzouKj8pXCJbIFxcdF0qKT8pIisNCiAgICAgICAgICAgICAgICAgICAgIihcXCkpIg0KICAgICAgICB9LCB7IC8vIEhSICoNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5bIF17MCwyfSg/OlsgXT9cXCpbIF0/KXszLH1cXHMqJCINCiAgICAgICAgfSwgeyAvLyBIUiAtDQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsDQogICAgICAgICAgICByZWdleCA6ICJeWyBdezAsMn0oPzpbIF0/XFwtWyBdPyl7Myx9XFxzKiQiDQogICAgICAgIH0sIHsgLy8gSFIgXw0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXlsgXXswLDJ9KD86WyBdP1xcX1sgXT8pezMsfVxccyokIg0KICAgICAgICB9LCB7IC8vIGxpc3QNCiAgICAgICAgICAgIHRva2VuIDogIm1hcmt1cC5saXN0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5cXHN7MCwzfSg/OlsqKy1dfFxcZCtcXC4pXFxzKyIsDQogICAgICAgICAgICBuZXh0ICA6ICJsaXN0YmxvY2siDQogICAgICAgIH0sIHsgLy8gc3Ryb25nICoqIF9fDQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgcmVnZXggOiAiKFsqXXsyfXxbX117Mn0oPz1cXFMpKShbXlxccl0qP1xcU1sqX10qKShcXDEpIg0KICAgICAgICB9LCB7IC8vIGVtcGhhc2lzICogXw0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIihbKl18W19dKD89XFxTKSkoW15cXHJdKj9cXFNbKl9dKikoXFwxKSINCiAgICAgICAgfSwgeyAvLyANCiAgICAgICAgICAgIHRva2VuIDogWyJ0ZXh0IiwgInVybCIsICJ0ZXh0Il0sDQogICAgICAgICAgICByZWdleCA6ICIoPCkoIisNCiAgICAgICAgICAgICAgICAgICAgICAiKD86aHR0cHM/fGZ0cHxkaWN0KTpbXidcIj5cXHNdKyIrDQogICAgICAgICAgICAgICAgICAgICAgInwiKw0KICAgICAgICAgICAgICAgICAgICAgICIoPzptYWlsdG86KT9bLS5cXHddK1xcQFstYS16MC05XSsoPzpcXC5bLWEtejAtOV0rKSpcXC5bYS16XSsiKw0KICAgICAgICAgICAgICAgICAgICAiKSg+KSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXlxcKl8lJGBcXFsjPD5dKyINCiAgICAgICAgfSBdLA0KICAgICAgICANCiAgICAgICAgImxpc3RibG9jayIgOiBbIHsgLy8gTGlzdHMgb25seSBlc2NhcGUgb24gY29tcGxldGVseSBibGFuayBsaW5lcy4NCiAgICAgICAgICAgIHRva2VuIDogImVtcHR5X2xpbmUiLA0KICAgICAgICAgICAgcmVnZXggOiAiXiQiLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1hcmt1cC5saXN0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9IF0sDQogICAgICAgIA0KICAgICAgICAiYmxvY2txdW90ZSIgOiBbIHsgLy8gQkxvY2txdW90ZXMgb25seSBlc2NhcGUgb24gYmxhbmsgbGluZXMuDQogICAgICAgICAgICB0b2tlbiA6ICJlbXB0eV9saW5lIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5cXHMqJCIsDQogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9IF0sDQogICAgICAgIA0KICAgICAgICAiZ2l0aHViYmxvY2siIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIl5gYGAiLA0KICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH0gXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgImpzLSIsIFt7DQogICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsDQogICAgICAgcmVnZXggOiAiXmBgYCIsDQogICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgfV0pOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhIdG1sSGlnaGxpZ2h0UnVsZXMsICJodG1sLSIsIFt7DQogICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsDQogICAgICAgcmVnZXggOiAiXmBgYCIsDQogICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgfV0pOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhDc3NIaWdobGlnaHRSdWxlcywgImNzcy0iLCBbew0KICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLA0KICAgICAgIHJlZ2V4IDogIl5gYGAiLA0KICAgICAgIG5leHQgIDogInN0YXJ0Ig0KICAgIH1dKTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoWG1sSGlnaGxpZ2h0UnVsZXMsICJ4bWwtIiwgW3sNCiAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwNCiAgICAgICByZWdleCA6ICJeYGBgIiwNCiAgICAgICBuZXh0ICA6ICJzdGFydCINCiAgICB9XSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1hcmtkb3duSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuTWFya2Rvd25IaWdobGlnaHRSdWxlcyA9IE1hcmtkb3duSGlnaGxpZ2h0UnVsZXM7DQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-markdown.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9tYXJrZG93biIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvbW9kZS94bWwiLCJhY2UvbW9kZS9odG1sIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL21hcmtkb3duX2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4vamF2YXNjcmlwdCIpLk1vZGUsZz1hKCIuL3htbCIpLk1vZGUsaD1hKCIuL2h0bWwiKS5Nb2RlLGk9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGo9YSgiLi9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMiKS5NYXJrZG93bkhpZ2hsaWdodFJ1bGVzLGs9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgajt0aGlzLiR0b2tlbml6ZXI9bmV3IGkoYS5nZXRSdWxlcygpKSx0aGlzLiRlbWJlZHM9YS5nZXRFbWJlZHMoKSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoeyJqcy0iOmYsInhtbC0iOmcsImh0bWwtIjpofSl9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PSJsaXN0YmxvY2siKXt2YXIgZD0vXigoPzouKyk/KShbLSsqXVsgXSspLy5leGVjKGIpO3JldHVybiBkPyhuZXcgQXJyYXkoZFsxXS5sZW5ndGgrMSkpLmpvaW4oIiAiKStkWzJdOiIifXJldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvcmFuZ2UiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsaz1hKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsbD1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbT1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy4kYmVoYXZpb3VyPW5ldyBrLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBsfTtkLmluaGVyaXRzKG0sZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKilcL1wvLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLy8iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9ZS5zdGF0ZTtpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXt2YXIgaD1iLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pO2gmJihkKz1jKX1lbHNlIGlmKGE9PSJkb2Mtc3RhcnQiKXtpZihnPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpcmV0dXJuIiI7dmFyIGg9Yi5tYXRjaCgvXlxzKihcLz8pXCovKTtoJiYoaFsxXSYmKGQrPSIgIiksZCs9IiogIil9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaihbImFjZSJdLCJ3b3JrZXItamF2YXNjcmlwdC5qcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJqc2xpbnQiLGZ1bmN0aW9uKGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8Yi5kYXRhLmxlbmd0aDtkKyspe3ZhciBlPWIuZGF0YVtkXTtlJiZjLnB1c2goe3JvdzplLmxpbmUtMSxjb2x1bW46ZS5jaGFyYWN0ZXItMSx0ZXh0OmUucmVhc29uLHR5cGU6Indhcm5pbmciLGxpbnQ6ZX0pfWEuc2V0QW5ub3RhdGlvbnMoYyl9KSxiLm9uKCJuYXJjaXNzdXMiLGZ1bmN0aW9uKGIpe2Euc2V0QW5ub3RhdGlvbnMoW2IuZGF0YV0pfSksYi5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobS5wcm90b3R5cGUpLGIuTW9kZT1tfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3VuaWNvZGUiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4uL3VuaWNvZGUiKSxnPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxpPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHxjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIuc3BsaXQoInwiKSksYz0iY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCIsZD1lLmFycmF5VG9NYXAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIuc3BsaXQoInwiKSksaD1lLmFycmF5VG9NYXAoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLnNwbGl0KCJ8IikpLGk9ZS5hcnJheVRvTWFwKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiLnNwbGl0KCJ8IikpLGo9ZS5hcnJheVRvTWFwKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIuc3BsaXQoInwiKSksaz0iWyIrZi5wYWNrYWdlcy5MKyJcXCRfXVsiK2YucGFja2FnZXMuTCtmLnBhY2thZ2VzLk1uK2YucGFja2FnZXMuTWMrZi5wYWNrYWdlcy5OZCtmLnBhY2thZ2VzLlBjKyJcXCRfXSpcXGIiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBnKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOlsia2V5d29yZC5kZWZpbml0aW9uIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitrKyIpIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIoPzoiK2MrIilcXGIiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ZnVuY3Rpb24oYyl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoYyk/InZhcmlhYmxlLmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOmguaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQuZGVmaW5pdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6aS5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmouaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuaWxsZWdhbCI6Yz09ImRlYnVnZ2VyIj8iaW52YWxpZC5kZXByZWNhdGVkIjoiaWRlbnRpZmllciJ9LHJlZ2V4Omt9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJcXD98XFw6fFxcLHxcXDt8XFwuIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLz0/IixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXiMhLiokIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxyZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnRfcmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlxcLyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXg6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXgifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiIvXFx3KiIsbmV4dDoic3RhcnQiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbXlxcXFwvXFxbXSsiLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlxcWyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXhfY2hhcmFjdGVyX2NsYXNzOlt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJdIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJbXlxcXFxcXF1dKyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0sY29tbWVudF9yZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhnLCJkb2MtIixbKG5ldyBnKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaSxoKSxiLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcz1pfSksZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJUT0RPIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlteQFxcKl0rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6Ii4ifV19fTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLmdldFN0YXJ0UnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwvXFwqKD89XFwqKSIsbmV4dDphfX0sdGhpcy5nZXRFbmRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXCpcXC8iLG5leHQ6YX19fS5jYWxsKGYucHJvdG90eXBlKSxiLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcz1mfSksZGVmaW5lKCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlx9Ly50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcfSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ0JyYWNlT3V0ZGVudD1lfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZT1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyk7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QoZCk/InN0YXJ0IjpiPT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGQpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihhLGIsYyl7dmFyIGU9L15ccyovLGY9YixnPWIsaD1hLmdldExpbmUoYiksaT1jfHxoLmxlbmd0aCxqPWgubWF0Y2goZSlbMF0ubGVuZ3RoLGs9YS5nZXRMZW5ndGgoKTt3aGlsZSgrK2I8ayl7aD1hLmdldExpbmUoYik7dmFyIGw9aC5tYXRjaChlKVswXS5sZW5ndGg7aWYobD09aC5sZW5ndGgpY29udGludWU7aWYobDw9ailicmVhaztnPWJ9aWYoZz5mKXt2YXIgbT1hLmdldExpbmUoZykubGVuZ3RoO3JldHVybiBuZXcgZChmLGksZyxtKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj17cm93OmMsY29sdW1uOmUrMX0sZz1hLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYixmKTtpZighZylyZXR1cm47dmFyIGg9YS5mb2xkV2lkZ2V0c1tnLnJvd107cmV0dXJuIGg9PW51bGwmJihoPXRoaXMuZ2V0Rm9sZFdpZGdldChhLGcucm93KSksaD09InN0YXJ0IiYmKGcucm93LS0sZy5jb2x1bW49YS5nZXRMaW5lKGcucm93KS5sZW5ndGgpLGQuZnJvbVBvaW50cyhmLGcpfX0pKS5jYWxsKGUucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3htbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9iZWhhdmlvdXIveG1sIiwiYWNlL21vZGUvZm9sZGluZy94bWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlcyxoPWEoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cixpPWEoIi4vZm9sZGluZy94bWwiKS5Gb2xkTW9kZSxqPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kYmVoYXZpb3VyPW5ldyBoLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBpfTtkLmluaGVyaXRzKGosZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChqLnByb3RvdHlwZSksYi5Nb2RlPWp9KSxkZWZpbmUoImFjZS9tb2RlL3htbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3htbF91dGlsIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4veG1sX3V0aWwiKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiPFxcIVxcW0NEQVRBXFxbIixuZXh0OiJjZGF0YSJ9LHt0b2tlbjoieG1sX3BlIixyZWdleDoiPFxcPy4qP1xcPz4ifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiI8XFwhLS0iLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLz8iLG5leHQ6InRhZyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiJbXjxdKyJ9XSxjZGF0YTpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxdXFxdPiIsbmV4dDoic3RhcnQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiKD86W15cXF1dfFxcXSg/IVxcXT4pKSsifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/LS0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSxlLnRhZyh0aGlzLiRydWxlcywidGFnIiwic3RhcnQiKX07ZC5pbmhlcml0cyhnLGYpLGIuWG1sSGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUveG1sX3V0aWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZyhhKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLHJlZ2V4OiciLio/Iid9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLionLG5leHQ6YSsiX3Fxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiInLio/JyJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLioiLG5leHQ6YSsiX3FzdHJpbmcifV19ZnVuY3Rpb24gaChhLGIpe3JldHVyblt7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4qPyIrYSxuZXh0OmJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9sYW5nIiksZT1kLmFycmF5VG9NYXAoImJ1dHRvbnxmb3JtfGlucHV0fGxhYmVsfHNlbGVjdHx0ZXh0YXJlYSIuc3BsaXQoInwiKSksZj1kLmFycmF5VG9NYXAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIi5zcGxpdCgifCIpKTtiLnRhZz1mdW5jdGlvbihhLGIsYyl7YVtiXT1be3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4gYT09PSJhIj8ibWV0YS50YWcuYW5jaG9yIjphPT09ImltZyI/Im1ldGEudGFnLmltYWdlIjphPT09InNjcmlwdCI/Im1ldGEudGFnLnNjcmlwdCI6YT09PSJzdHlsZSI/Im1ldGEudGFnLnN0eWxlIjplLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLmZvcm0iOmYuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcudGFibGUiOiJtZXRhLnRhZyJ9LG1lcmdlOiEwLHJlZ2V4OiJbLV9hLXpBLVowLTk6IV0rIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6YisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0In1dLGFbYisiX3FzdHJpbmciXT1oKCInIixiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9xcXN0cmluZyJdPWgoJyInLGIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpLGFbYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Il09W3t0b2tlbjoibWV0YS50YWciLG1lcmdlOiEwLHJlZ2V4OiIvPz4iLG5leHQ6Y30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiPSJ9LHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLmNvbmNhdChnKGIpKX19KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWEoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGc9ZnVuY3Rpb24oKXt0aGlzLmluaGVyaXQoZixbInN0cmluZ19kcXVvdGVzIl0pLHRoaXMuYWRkKCJicmFja2V0cyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iPCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiPyExOnt0ZXh0OiI8PiIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iPiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09Ij4iKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxrPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzIpO2lmKGs9PSI8LyIpe3ZhciBsPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSkrZC5nZXRUYWJTdHJpbmcoKSxtPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSk7cmV0dXJue3RleHQ6IlxuIitsKyJcbiIrbSxzZWxlY3Rpb246WzEsbC5sZW5ndGgsMSxsLmxlbmd0aF19fX19KX07ZC5pbmhlcml0cyhnLGUpLGIuWG1sQmVoYXZpb3VyPWd9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9odG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL21vZGUvamF2YXNjcmlwdCIsImFjZS9tb2RlL2NzcyIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL2h0bWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlcyxqPWEoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cixrPWEoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaix0aGlzLiRlbWJlZHM9YS5nZXRFbWJlZHMoKSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoeyJqcy0iOmYsImNzcy0iOmd9KSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcga307ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIDB9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hMX19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9jc3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSwiaSIpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1J1bGVzPSJjU3R5bGUiLHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSkudG9rZW5zO2lmKGUubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDt2YXIgZj1iLm1hdGNoKC9eLipce1xzKiQvKTtyZXR1cm4gZiYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaShbImFjZSJdLCJ3b3JrZXItY3NzLmpzIiwiYWNlL21vZGUvY3NzX3dvcmtlciIsIldvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJjc3NsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtiLmRhdGEuZm9yRWFjaChmdW5jdGlvbihhKXtjLnB1c2goe3JvdzphLmxpbmUtMSxjb2x1bW46YS5jb2wtMSx0ZXh0OmEubWVzc2FnZSx0eXBlOmEudHlwZSxsaW50OmF9KX0pLGEuc2V0QW5ub3RhdGlvbnMoYyl9KSxifX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfGFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXxib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8Ym90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHxjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8ZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfGZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fGxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnxsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHxtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8bWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8c2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3xzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fHRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufHZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfHotaW5kZXgiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj0iXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiLGc9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoicnVsZXNldF9jb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpmKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC50eXBlIjpiLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuZnVuY3Rpb24iOmMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudCI6ZC5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjoidGV4dCJ9LHJlZ2V4OiJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiJ9XSxoPWUuY29weUFycmF5KGcpO2gudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSk7dmFyIGk9ZS5jb3B5QXJyYXkoZyk7aS51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJtZWRpYSJ9KTt2YXIgaj1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0saz1lLmNvcHlBcnJheShqKTtrLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9KTt2YXIgbD1lLmNvcHlBcnJheShqKTtsLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJtZWRpYSJ9KTt2YXIgbT1lLmNvcHlBcnJheShqKTttLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJydWxlc2V0In0pLHRoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6InJ1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IkAuKj97IixuZXh0OiJtZWRpYSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLG1lZGlhOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6Im1lZGlhX2NvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoibWVkaWFfcnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLGNvbW1lbnQ6ayxydWxlc2V0OmgscnVsZXNldF9jb21tZW50Om0sbWVkaWFfcnVsZXNldDppLG1lZGlhX2NvbW1lbnQ6bH19O2QuaW5oZXJpdHMoZyxmKSxiLkNzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxmPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3htbF91dGlsIiksaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnNjcmlwdFxcYikiLG5leHQ6InNjcmlwdCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8KD89cypzdHlsZVxcYikiLG5leHQ6InN0eWxlIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZy50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0IiksZy50YWcodGhpcy4kcnVsZXMsInN0eWxlIiwiY3NzLXN0YXJ0IiksZy50YWcodGhpcy4kcnVsZXMsInNjcmlwdCIsImpzLXN0YXJ0IiksdGhpcy5lbWJlZFJ1bGVzKGYsImpzLSIsW3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qKD89PFxcL3NjcmlwdD4pIixuZXh0OiJ0YWcifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXNjcmlwdCkiLG5leHQ6InRhZyJ9XSksdGhpcy5lbWJlZFJ1bGVzKGUsImNzcy0iLFt7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXN0eWxlKSIsbmV4dDoidGFnIn1dKX07ZC5pbmhlcml0cyhpLGgpLGIuSHRtbEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvaHRtbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9taXhlZCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vbWl4ZWQiKS5Gb2xkTW9kZSxmPWEoIi4veG1sIikuRm9sZE1vZGUsZz1hKCIuL2NzdHlsZSIpLkZvbGRNb2RlLGg9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe2UuY2FsbCh0aGlzLG5ldyBmKHthcmVhOjEsYmFzZToxLGJyOjEsY29sOjEsY29tbWFuZDoxLGVtYmVkOjEsaHI6MSxpbWc6MSxpbnB1dDoxLGtleWdlbjoxLGxpbms6MSxtZXRhOjEscGFyYW06MSxzb3VyY2U6MSx0cmFjazoxLHdicjoxLGxpOjEsZHQ6MSxkZDoxLHA6MSxydDoxLHJwOjEsb3B0Z3JvdXA6MSxvcHRpb246MSxjb2xncm91cDoxLHRkOjEsdGg6MX0pLHsianMtIjpuZXcgZywiY3NzLSI6bmV3IGd9KX07ZC5pbmhlcml0cyhoLGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL21peGVkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxmPWIuRm9sZE1vZGU9ZnVuY3Rpb24oYSxiKXt0aGlzLmRlZmF1bHRNb2RlPWEsdGhpcy5zdWJNb2Rlcz1ifTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLiRnZXRNb2RlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiB0aGlzLnN1Yk1vZGVzKWlmKGEuaW5kZXhPZihiKT09PTApcmV0dXJuIHRoaXMuc3ViTW9kZXNbYl07cmV0dXJuIG51bGx9LHRoaXMuJHRyeU1vZGU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy4kZ2V0TW9kZShhKTtyZXR1cm4gZT9lLmdldEZvbGRXaWRnZXQoYixjLGQpOiIifSx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiR0cnlNb2RlKGEuZ2V0U3RhdGUoYy0xKSxhLGIsYyl8fHRoaXMuJHRyeU1vZGUoYS5nZXRTdGF0ZShjKSxhLGIsYyl8fHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChhLGIsYyl9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRNb2RlKGEuZ2V0U3RhdGUoYy0xKSk7aWYoIWR8fCFkLmdldEZvbGRXaWRnZXQoYSxiLGMpKWQ9dGhpcy4kZ2V0TW9kZShhLmdldFN0YXRlKGMpKTtpZighZHx8IWQuZ2V0Rm9sZFdpZGdldChhLGIsYykpZD10aGlzLmRlZmF1bHRNb2RlO3JldHVybiBkLmdldEZvbGRXaWRnZXRSYW5nZShhLGIsYyl9fS5jYWxsKGYucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvbWFya2Rvd25faGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBqKGEsYil7cmV0dXJue3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiXmBgYCIrYSsiXFxzKiQiLG5leHQ6Yisic3RhcnQifX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlcyxoPWEoIi4vaHRtbF9oaWdobGlnaHRfcnVsZXMiKS5IdG1sSGlnaGxpZ2h0UnVsZXMsaT1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxrPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImVtcHR5X2xpbmUiLHJlZ2V4OiJeJCJ9LHt0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6IihgKykoW15cXHJdKj9bXmBdKShcXDEpIn0se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiXlsgXXs0fS4rIn0se3Rva2VuOiJtYXJrdXAuaGVhZGluZy4xIixyZWdleDoiXj0rKD89XFxzKiQpIn0se3Rva2VuOiJtYXJrdXAuaGVhZGluZy4xIixyZWdleDoiXlxcLSsoPz1cXHMqJCkifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIm1hcmt1cC5oZWFkaW5nLiIrYS5sZW5ndGh9LHJlZ2V4OiJeI3sxLDZ9In0saigiamF2YXNjcmlwdCIsImpzLSIpLGooInhtbCIsInhtbC0iKSxqKCJodG1sIiwiaHRtbC0iKSxqKCJjc3MiLCJjc3MtIikse3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiXmBgYFthLXpBLVpdK1xccyokIixuZXh0OiJnaXRodWJibG9jayJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXj5bIF0uKyQiLG5leHQ6ImJsb2NrcXVvdGUifSx7dG9rZW46WyJ0ZXh0IiwiY29uc3RhbnQiLCJ0ZXh0IiwidXJsIiwic3RyaW5nIiwidGV4dCJdLHJlZ2V4OideKFsgXXswLDN9XFxbKShbXlxcXV0rKShcXF06XFxzKikoW14gXSspKFxccyooPzpbIl1bXiJdK1siXSk/XFxzKikkJ30se3Rva2VuOlsidGV4dCIsInN0cmluZyIsInRleHQiLCJjb25zdGFudCIsInRleHQiXSxyZWdleDoiKFxcWykoKD86W1teXFxdXSpcXF18W15cXFtcXF1dKSopKFxcXVsgXT8oPzpcXG5bIF0qKT9cXFspKC4qPykoXFxdKSJ9LHt0b2tlbjpbInRleHQiLCJzdHJpbmciLCJ0ZXh0IiwibWFya3VwLnVuZGVybGluZSIsInN0cmluZyIsInRleHQiXSxyZWdleDonKFxcWykoXFxbW15cXF1dKlxcXXxbXlxcW1xcXV0qKShcXF1cXChbIFxcdF0qKSg8Pyg/Oig/OlteXFwoXSo/XFwoW15cXCldKj9cXClcXFMqPyl8KD86Lio/KSk+PykoKD86WyBcdF0qIig/Oi4qPykiWyBcXHRdKik/KShcXCkpJ30se3Rva2VuOiJjb25zdGFudCIscmVnZXg6Il5bIF17MCwyfSg/OlsgXT9cXCpbIF0/KXszLH1cXHMqJCJ9LHt0b2tlbjoiY29uc3RhbnQiLHJlZ2V4OiJeWyBdezAsMn0oPzpbIF0/XFwtWyBdPyl7Myx9XFxzKiQifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiXlsgXXswLDJ9KD86WyBdP1xcX1sgXT8pezMsfVxccyokIn0se3Rva2VuOiJtYXJrdXAubGlzdCIscmVnZXg6Il5cXHN7MCwzfSg/OlsqKy1dfFxcZCtcXC4pXFxzKyIsbmV4dDoibGlzdGJsb2NrIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoWypdezJ9fFtfXXsyfSg/PVxcUykpKFteXFxyXSo/XFxTWypfXSopKFxcMSkifSx7dG9rZW46InN0cmluZyIscmVnZXg6IihbKl18W19dKD89XFxTKSkoW15cXHJdKj9cXFNbKl9dKikoXFwxKSJ9LHt0b2tlbjpbInRleHQiLCJ1cmwiLCJ0ZXh0Il0scmVnZXg6Iig8KSgoPzpodHRwcz98ZnRwfGRpY3QpOlteJ1wiPlxcc10rfCg/Om1haWx0bzopP1stLlxcd10rXFxAWy1hLXowLTldKyg/OlxcLlstYS16MC05XSspKlxcLlthLXpdKykoPikifSx7dG9rZW46InRleHQiLHJlZ2V4OiJbXlxcKl8lJGBcXFsjPD5dKyJ9XSxsaXN0YmxvY2s6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il4kIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoibWFya3VwLmxpc3QiLHJlZ2V4OiIuKyJ9XSxibG9ja3F1b3RlOlt7dG9rZW46ImVtcHR5X2xpbmUiLHJlZ2V4OiJeXFxzKiQiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIuKyJ9XSxnaXRodWJibG9jazpbe3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiXmBgYCIsbmV4dDoic3RhcnQifSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGYsImpzLSIsW3t0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6Il5gYGAiLG5leHQ6InN0YXJ0In1dKSx0aGlzLmVtYmVkUnVsZXMoaCwiaHRtbC0iLFt7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgIixuZXh0OiJzdGFydCJ9XSksdGhpcy5lbWJlZFJ1bGVzKGksImNzcy0iLFt7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgIixuZXh0OiJzdGFydCJ9XSksdGhpcy5lbWJlZFJ1bGVzKGcsInhtbC0iLFt7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgIixuZXh0OiJzdGFydCJ9XSl9O2QuaW5oZXJpdHMoayxlKSxiLk1hcmtkb3duSGlnaGxpZ2h0UnVsZXM9a30p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ocaml-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBTZXJnaSBNYW5zaWxsYSA8c2VyZ2kgQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvb2NhbWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9vY2FtbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBPY2FtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9vY2FtbF9oaWdobGlnaHRfcnVsZXMiKS5PY2FtbEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IE9jYW1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ICAgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQp2YXIgaW5kZW50ZXIgPSAvKD86Wyh7Wz06XXxbLT1dPnxcYig/OmVsc2V8dHJ5fHdpdGgpKVxzKiQvOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIGksIGxpbmU7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL15ccypcKFwqKC4qKVwqXCkvOw0KDQogICAgICAgIGZvciAoaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICBmb3IgKGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93ICA9IGk7DQogICAgICAgICAgICByYW5nZS5lbmQucm93ICAgID0gaTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSBsaW5lLmxlbmd0aDsNCg0KICAgICAgICAgICAgZG9jLnJlcGxhY2UocmFuZ2UsIG91dGRlbnQgPyBsaW5lLm1hdGNoKHJlKVsxXSA6ICIoKiIgKyBsaW5lICsgIiopIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7DQoNCiAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdjb21tZW50JykgJiYNCiAgICAgICAgICAgIHN0YXRlID09PSAnc3RhcnQnICYmIGluZGVudGVyLnRlc3QobGluZSkpDQogICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQoNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgU2VyZ2kgTWFuc2lsbGEgPHNlcmdpIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKg0KICoNCiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL29jYW1sX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBPY2FtbEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoKA0KICAgICAgICAiYW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfCIgICsNCiAgICAgICAgImV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXwiICAgICArDQogICAgICAgICJpbmhlcml0fGluaXRpYWxpemVyfGxhenl8bGV0fG1hdGNofG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8IiAgKw0KICAgICAgICAib2JqZWN0fG9mfG9wZW58b3J8cHJpdmF0ZXxyZWN8c2lnfHN0cnVjdHx0aGVufHRvfHRyeXx0eXBlfHZhbHwiICsNCiAgICAgICAgInZpcnR1YWx8d2hlbnx3aGlsZXx3aXRoIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJ0cnVlfGZhbHNlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgoDQogICAgICAgICJhYnN8YWJzX2JpZ19pbnR8YWJzX2Zsb2F0fGFic19udW18YWJzdHJhY3RfdGFnfGFjY2VwdHxhY2Nlc3N8YWNvc3xhZGR8IiArDQogICAgICAgICJhZGRfYXZhaWxhYmxlX3VuaXRzfGFkZF9iaWdfaW50fGFkZF9idWZmZXJ8YWRkX2NoYW5uZWx8YWRkX2NoYXJ8IiArDQogICAgICAgICJhZGRfaW5pdGlhbGl6ZXJ8YWRkX2ludF9iaWdfaW50fGFkZF9pbnRlcmZhY2VzfGFkZF9udW18YWRkX3N0cmluZ3wiICsNCiAgICAgICAgImFkZF9zdWJzdGl0dXRlfGFkZF9zdWJzdHJpbmd8YWxhcm18YWxsb2NhdGVkX2J5dGVzfGFsbG93X29ubHl8IiArDQogICAgICAgICJhbGxvd191bnNhZmVfbW9kdWxlc3xhbHdheXN8YXBwZW5kfGFwcG5hbWVfZ2V0fGFwcG5hbWVfc2V0fCIgKw0KICAgICAgICAiYXBwcm94X251bV9leHB8YXBwcm94X251bV9maXh8YXJnfGFyZ3Z8YXJpdGhfc3RhdHVzfGFycmF5fCIgKw0KICAgICAgICAiYXJyYXkxX29mX2dlbmFycmF5fGFycmF5Ml9vZl9nZW5hcnJheXxhcnJheTNfb2ZfZ2VuYXJyYXl8YXNpbnxhc3J8IiArDQogICAgICAgICJhc3NvY3xhc3NxfGF0X2V4aXR8YXRhbnxhdGFuMnxhdXRvX3N5bmNocm9uaXplfGJhY2tncm91bmR8YmFzZW5hbWV8IiArDQogICAgICAgICJiZWdpbm5pbmdfb2ZfaW5wdXR8YmlnX2ludF9vZl9pbnR8YmlnX2ludF9vZl9udW18YmlnX2ludF9vZl9zdHJpbmd8YmluZHwiICsNCiAgICAgICAgImJpbmRfY2xhc3N8YmluZF90YWd8Yml0c3xiaXRzX29mX2Zsb2F0fGJsYWNrfGJsaXR8YmxpdF9pbWFnZXxibHVlfGJvb2x8IiArDQogICAgICAgICJib29sX29mX3N0cmluZ3xib3VuZGVkX2Z1bGxfc3BsaXR8Ym91bmRlZF9zcGxpdHxib3VuZGVkX3NwbGl0X2RlbGltfCIgKw0KICAgICAgICAiYnByaW50ZnxicmVha3xicm9hZGNhc3R8YnNjYW5mfGJ1dHRvbl9kb3dufGNfbGF5b3V0fGNhcGl0YWxpemV8Y2FyZGluYWx8IiArDQogICAgICAgICJjYXJkaW5hbHxjYXRjaHxjYXRjaF9icmVha3xjZWlsfGNlaWxpbmdfbnVtfGNoYW5uZWx8Y2hhcnxjaGFyX29mX2ludHwiICsNCiAgICAgICAgImNoZGlyfGNoZWNrfGNoZWNrX3N1ZmZpeHxjaG1vZHxjaG9vc2V8Y2hvcF9leHRlbnNpb258Y2hvcF9zdWZmaXh8Y2hvd258IiArDQogICAgICAgICJjaG93bnxjaHJ8Y2hyb290fGNsYXNzaWZ5X2Zsb2F0fGNsZWFyfGNsZWFyX2F2YWlsYWJsZV91bml0c3wiICsNCiAgICAgICAgImNsZWFyX2Nsb3NlX29uX2V4ZWN8Y2xlYXJfZ3JhcGh8Y2xlYXJfbm9uYmxvY2t8Y2xlYXJfcGFyc2VyfCIgKw0KICAgICAgICAiY2xvc2V8Y2xvc2V8Y2xvc2VUa3xjbG9zZV9ib3h8Y2xvc2VfZ3JhcGh8Y2xvc2VfaW58Y2xvc2VfaW5fbm9lcnJ8IiArDQogICAgICAgICJjbG9zZV9vdXR8Y2xvc2Vfb3V0X25vZXJyfGNsb3NlX3Byb2Nlc3N8Y2xvc2VfcHJvY2Vzc3wiICsNCiAgICAgICAgImNsb3NlX3Byb2Nlc3NfZnVsbHxjbG9zZV9wcm9jZXNzX2lufGNsb3NlX3Byb2Nlc3Nfb3V0fGNsb3NlX3N1YndpbmRvd3wiICsNCiAgICAgICAgImNsb3NlX3RhZ3xjbG9zZV90Ym94fGNsb3NlZGlyfGNsb3NlZGlyfGNsb3N1cmVfdGFnfGNvZGV8Y29tYmluZXwiICsNCiAgICAgICAgImNvbWJpbmV8Y29tYmluZXxjb21tYW5kfGNvbXBhY3R8Y29tcGFyZXxjb21wYXJlX2JpZ19pbnR8Y29tcGFyZV9udW18IiArDQogICAgICAgICJjb21wbGV4MzJ8Y29tcGxleDY0fGNvbmNhdHxjb25qfGNvbm5lY3R8Y29udGFpbnN8Y29udGFpbnNfZnJvbXxjb250ZW50c3wiICsNCiAgICAgICAgImNvcHl8Y29zfGNvc2h8Y291bnR8Y291bnR8Y291bnRlcnN8Y3JlYXRlfGNyZWF0ZV9hbGFybXxjcmVhdGVfaW1hZ2V8IiArDQogICAgICAgICJjcmVhdGVfbWF0cml4fGNyZWF0ZV9tYXRyaXh8Y3JlYXRlX21hdHJpeHxjcmVhdGVfb2JqZWN0fCIgKw0KICAgICAgICAiY3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpemVyc3xjcmVhdGVfb2JqZWN0X29wdHxjcmVhdGVfcHJvY2Vzc3wiICsNCiAgICAgICAgImNyZWF0ZV9wcm9jZXNzfGNyZWF0ZV9wcm9jZXNzX2VudnxjcmVhdGVfcHJvY2Vzc19lbnZ8Y3JlYXRlX3RhYmxlfCIgKw0KICAgICAgICAiY3VycmVudHxjdXJyZW50X2Rpcl9uYW1lfGN1cnJlbnRfcG9pbnR8Y3VycmVudF94fGN1cnJlbnRfeXxjdXJ2ZXRvfCIgKw0KICAgICAgICAiY3VzdG9tX3RhZ3xjeWFufGRhdGFfc2l6ZXxkZWNyfGRlY3JfbnVtfGRlZmF1bHRfYXZhaWxhYmxlX3VuaXRzfGRlbGF5fCIgKw0KICAgICAgICAiZGVsZXRlX2FsYXJtfGRlc2NyX29mX2luX2NoYW5uZWx8ZGVzY3Jfb2Zfb3V0X2NoYW5uZWx8ZGVzdHJveXxkaWZmfGRpbXwiICsNCiAgICAgICAgImRpbTF8ZGltMnxkaW0zfGRpbXN8ZGlybmFtZXxkaXNwbGF5X21vZGV8ZGl2fGRpdl9iaWdfaW50fGRpdl9udW18IiArDQogICAgICAgICJkb3VibGVfYXJyYXlfdGFnfGRvdWJsZV90YWd8ZHJhd19hcmN8ZHJhd19jaGFyfGRyYXdfY2lyY2xlfGRyYXdfZWxsaXBzZXwiICsNCiAgICAgICAgImRyYXdfaW1hZ2V8ZHJhd19wb2x5fGRyYXdfcG9seV9saW5lfGRyYXdfcmVjdHxkcmF3X3NlZ21lbnRzfGRyYXdfc3RyaW5nfCIgKw0KICAgICAgICAiZHVtbXlfcG9zfGR1bW15X3RhYmxlfGR1bXBfaW1hZ2V8ZHVwfGR1cDJ8ZWxlbWVudHN8ZW1wdHl8ZW5kX29mX2lucHV0fCIgKw0KICAgICAgICAiZW52aXJvbm1lbnR8ZXByaW50ZnxlcHNpbG9uX2Zsb2F0fGVxX2JpZ19pbnR8ZXFfbnVtfGVxdWFsfGVycl9mb3JtYXR0ZXJ8IiArDQogICAgICAgICJlcnJvcl9tZXNzYWdlfGVzY2FwZWR8ZXN0YWJsaXNoX3NlcnZlcnxleGVjdXRhYmxlX25hbWV8ZXhlY3Z8ZXhlY3ZlfGV4ZWN2cHwiICsNCiAgICAgICAgImV4ZWN2cGV8ZXhpc3RzfGV4aXN0czJ8ZXhpdHxleHB8ZmFpbHdpdGh8ZmFzdF9zb3J0fGZjaG1vZHxmY2hvd258ZmllbGR8IiArDQogICAgICAgICJmaWxlfGZpbGVfZXhpc3RzfGZpbGx8ZmlsbF9hcmN8ZmlsbF9jaXJjbGV8ZmlsbF9lbGxpcHNlfGZpbGxfcG9seXxmaWxsX3JlY3R8IiArDQogICAgICAgICJmaWx0ZXJ8ZmluYWxfdGFnfGZpbmFsaXNlfGZpbmR8ZmluZF9hbGx8Zmlyc3RfY2hhcnN8Zmlyc3RrZXl8ZmxhdHRlbnwiICsNCiAgICAgICAgImZsb2F0fGZsb2F0MzJ8ZmxvYXQ2NHxmbG9hdF9vZl9iaWdfaW50fGZsb2F0X29mX2JpdHN8ZmxvYXRfb2ZfaW50fCIgKw0KICAgICAgICAiZmxvYXRfb2ZfbnVtfGZsb2F0X29mX3N0cmluZ3xmbG9vcnxmbG9vcl9udW18Zmx1c2h8Zmx1c2hfYWxsfGZsdXNoX2lucHV0fCIgKw0KICAgICAgICAiZmx1c2hfc3RyX2Zvcm1hdHRlcnxmb2xkfGZvbGRfbGVmdHxmb2xkX2xlZnQyfGZvbGRfcmlnaHR8Zm9sZF9yaWdodDJ8IiArDQogICAgICAgICJmb3JfYWxsfGZvcl9hbGwyfGZvcmNlfGZvcmNlX25ld2xpbmV8Zm9yY2VfdmFsfGZvcmVncm91bmR8Zm9ya3wiICsNCiAgICAgICAgImZvcm1hdF9vZl9zdHJpbmd8Zm9ybWF0dGVyX29mX2J1ZmZlcnxmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWx8IiArDQogICAgICAgICJmb3J0cmFuX2xheW91dHxmb3J3YXJkX3RhZ3xmcHJpbnRmfGZyZXhwfGZyb218ZnJvbV9jaGFubmVsfGZyb21fZmlsZXwiICsNCiAgICAgICAgImZyb21fZmlsZV9iaW58ZnJvbV9mdW5jdGlvbnxmcm9tX3N0cmluZ3xmc2NhbmZ8ZnN0fGZzdGF0fGZ0cnVuY2F0ZXwiICsNCiAgICAgICAgImZ1bGxfaW5pdHxmdWxsX21ham9yfGZ1bGxfc3BsaXR8Z2NkX2JpZ19pbnR8Z2VfYmlnX2ludHxnZV9udW18IiArDQogICAgICAgICJnZW5hcnJheV9vZl9hcnJheTF8Z2VuYXJyYXlfb2ZfYXJyYXkyfGdlbmFycmF5X29mX2FycmF5M3xnZXR8IiArDQogICAgICAgICJnZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfGdldF9hcHByb3hfcHJpbnRpbmd8Z2V0X2NvcHl8IiArDQogICAgICAgICJnZXRfZWxsaXBzaXNfdGV4dHxnZXRfZXJyb3Jfd2hlbl9udWxsX2Rlbm9taW5hdG9yfGdldF9mbG9hdGluZ19wcmVjaXNpb258IiArDQogICAgICAgICJnZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8Z2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zfGdldF9pbWFnZXwiICsNCiAgICAgICAgImdldF9tYXJnaW58Z2V0X21hcmtfdGFnc3xnZXRfbWF4X2JveGVzfGdldF9tYXhfaW5kZW50fGdldF9tZXRob2R8IiArDQogICAgICAgICJnZXRfbWV0aG9kX2xhYmVsfGdldF9ub3JtYWxpemVfcmF0aW98Z2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfCIgKw0KICAgICAgICAiZ2V0X3ByaW50X3RhZ3N8Z2V0X3N0YXRlfGdldF92YXJpYWJsZXxnZXRjd2R8Z2V0ZWdpZHxnZXRlZ2lkfGdldGVudnwiICsNCiAgICAgICAgImdldGVudnxnZXRlbnZ8Z2V0ZXVpZHxnZXRldWlkfGdldGdpZHxnZXRnaWR8Z2V0Z3JnaWR8Z2V0Z3JnaWR8Z2V0Z3JuYW18IiArDQogICAgICAgICJnZXRncm5hbXxnZXRncm91cHN8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldGhvc3RuYW1lfGdldGl0aW1lcnwiICsNCiAgICAgICAgImdldGxvZ2lufGdldHBlZXJuYW1lfGdldHBpZHxnZXRwcGlkfGdldHByb3RvYnluYW1lfGdldHByb3RvYnludW1iZXJ8IiArDQogICAgICAgICJnZXRwd25hbXxnZXRwd3VpZHxnZXRzZXJ2YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0c29ja25hbWV8Z2V0c29ja29wdHwiICsNCiAgICAgICAgImdldHNvY2tvcHRfZmxvYXR8Z2V0c29ja29wdF9pbnR8Z2V0c29ja29wdF9vcHRpbnR8Z2V0dGltZW9mZGF5fGdldHVpZHwiICsNCiAgICAgICAgImdsb2JhbF9yZXBsYWNlfGdsb2JhbF9zdWJzdGl0dXRlfGdtdGltZXxncmVlbnxncmlkfGdyb3VwX2JlZ2lubmluZ3wiICsNCiAgICAgICAgImdyb3VwX2VuZHxndF9iaWdfaW50fGd0X251bXxndWFyZHxoYW5kbGVfdW5peF9lcnJvcnxoYXNofGhhc2hfcGFyYW18IiArDQogICAgICAgICJoZHxoZWFkZXJfc2l6ZXxpfGlkfGlnbm9yZXxpbl9jaGFubmVsX2xlbmd0aHxpbl9jaGFubmVsX29mX2Rlc2NyfGluY3J8IiArDQogICAgICAgICJpbmNyX251bXxpbmRleHxpbmRleF9mcm9tfGluZXRfYWRkcl9hbnl8aW5ldF9hZGRyX29mX3N0cmluZ3xpbmZpbml0eXwiICsNCiAgICAgICAgImluZml4X3RhZ3xpbml0fGluaXRfY2xhc3N8aW5wdXR8aW5wdXRfYmluYXJ5X2ludHxpbnB1dF9ieXRlfGlucHV0X2NoYXJ8IiArDQogICAgICAgICJpbnB1dF9saW5lfGlucHV0X3ZhbHVlfGludHxpbnQxNl9zaWduZWR8aW50MTZfdW5zaWduZWR8aW50MzJ8aW50NjR8IiArDQogICAgICAgICJpbnQ4X3NpZ25lZHxpbnQ4X3Vuc2lnbmVkfGludF9vZl9iaWdfaW50fGludF9vZl9jaGFyfGludF9vZl9mbG9hdHwiICsNCiAgICAgICAgImludF9vZl9udW18aW50X29mX3N0cmluZ3xpbnRlZ2VyX251bXxpbnRlcnxpbnRlcmFjdGl2ZXxpbnZ8aW52YWxpZF9hcmd8IiArDQogICAgICAgICJpc19ibG9ja3xpc19lbXB0eXxpc19pbXBsaWNpdHxpc19pbnR8aXNfaW50X2JpZ19pbnR8aXNfaW50ZWdlcl9udW18IiArDQogICAgICAgICJpc19yZWxhdGl2ZXxpdGVyfGl0ZXIyfGl0ZXJpfGpvaW58anVua3xrZXlfcHJlc3NlZHxraWxsfGtpbmR8a3ByaW50ZnwiICsNCiAgICAgICAgImtzY2FuZnxsYW5kfGxhc3RfY2hhcnN8bGF5b3V0fGxhenlfZnJvbV9mdW58bGF6eV9mcm9tX3ZhbHxsYXp5X2lzX3ZhbHwiICsNCiAgICAgICAgImxhenlfdGFnfGxkZXhwfGxlX2JpZ19pbnR8bGVfbnVtfGxlbmd0aHxsZXhlbWV8bGV4ZW1lX2NoYXJ8bGV4ZW1lX2VuZHwiICsNCiAgICAgICAgImxleGVtZV9lbmRfcHxsZXhlbWVfc3RhcnR8bGV4ZW1lX3N0YXJ0X3B8bGluZXRvfGxpbmt8bGlzdHxsaXN0ZW58bG5vdHwiICsNCiAgICAgICAgImxvYWRmaWxlfGxvYWRmaWxlX3ByaXZhdGV8bG9jYWx0aW1lfGxvY2t8bG9ja2Z8bG9nfGxvZzEwfGxvZ2FuZHxsb2dub3R8IiArDQogICAgICAgICJsb2dvcnxsb2d4b3J8bG9yfGxvd2VyX3dpbmRvd3xsb3dlcmNhc2V8bHNlZWt8bHNsfGxzcnxsc3RhdHxsdF9iaWdfaW50fCIgKw0KICAgICAgICAibHRfbnVtfGx4b3J8bWFnZW50YXxtYWdpY3xtYWluTG9vcHxtYWpvcnxtYWpvcl9zbGljZXxtYWtlfG1ha2VfZm9ybWF0dGVyfCIgKw0KICAgICAgICAibWFrZV9pbWFnZXxtYWtlX2xleGVyfG1ha2VfbWF0cml4fG1ha2Vfc2VsZl9pbml0fG1hcHxtYXAyfG1hcF9maWxlfG1hcGl8IiArDQogICAgICAgICJtYXJzaGFsfG1hdGNoX2JlZ2lubmluZ3xtYXRjaF9lbmR8bWF0Y2hlZF9ncm91cHxtYXRjaGVkX3N0cmluZ3xtYXh8IiArDQogICAgICAgICJtYXhfYXJyYXlfbGVuZ3RofG1heF9iaWdfaW50fG1heF9lbHR8bWF4X2Zsb2F0fG1heF9pbnR8bWF4X251bXwiICsNCiAgICAgICAgIm1heF9zdHJpbmdfbGVuZ3RofG1lbXxtZW1fYXNzb2N8bWVtX2Fzc3F8bWVtcXxtZXJnZXxtaW58bWluX2JpZ19pbnR8IiArDQogICAgICAgICJtaW5fZWx0fG1pbl9mbG9hdHxtaW5faW50fG1pbl9udW18bWlub3J8bWludXNfYmlnX2ludHxtaW51c19udW18IiArDQogICAgICAgICJtaW51c19vbmV8bWtkaXJ8bWtmaWZvfG1rdGltZXxtb2R8bW9kX2JpZ19pbnR8bW9kX2Zsb2F0fG1vZF9udW18bW9kZnwiICsNCiAgICAgICAgIm1vdXNlX3Bvc3xtb3ZldG98bXVsfG11bHRfYmlnX2ludHxtdWx0X2ludF9iaWdfaW50fG11bHRfbnVtfG5hbnxuYXJyb3d8IiArDQogICAgICAgICJuYXRfb2ZfbnVtfG5hdGl2ZWludHxuZWd8bmVnX2luZmluaXR5fG5ld19ibG9ja3xuZXdfY2hhbm5lbHxuZXdfbWV0aG9kfCIgKw0KICAgICAgICAibmV3X3ZhcmlhYmxlfG5leHR8bmV4dGtleXxuaWNlfG5pY2V8bm9fc2Nhbl90YWd8bm9ybXxub3JtMnxub3R8bnBlZWt8IiArDQogICAgICAgICJudGh8bnRoX2RpbXxudW1fZGlnaXRzX2JpZ19pbnR8bnVtX2RpbXN8bnVtX29mX2JpZ19pbnR8bnVtX29mX2ludHwiICsNCiAgICAgICAgIm51bV9vZl9uYXR8bnVtX29mX3JhdGlvfG51bV9vZl9zdHJpbmd8T3xvYmp8b2JqZWN0X3RhZ3xvY2FtbF92ZXJzaW9ufCIgKw0KICAgICAgICAib2ZfYXJyYXl8b2ZfY2hhbm5lbHxvZl9mbG9hdHxvZl9pbnR8b2ZfaW50MzJ8b2ZfbGlzdHxvZl9uYXRpdmVpbnR8IiArDQogICAgICAgICJvZl9zdHJpbmd8b25lfG9wZW5Ua3xvcGVuX2JveHxvcGVuX2Nvbm5lY3Rpb258b3Blbl9ncmFwaHxvcGVuX2hib3h8IiArDQogICAgICAgICJvcGVuX2hvdmJveHxvcGVuX2h2Ym94fG9wZW5faW58b3Blbl9pbl9iaW58b3Blbl9pbl9nZW58b3Blbl9vdXR8IiArDQogICAgICAgICJvcGVuX291dF9iaW58b3Blbl9vdXRfZ2VufG9wZW5fcHJvY2Vzc3xvcGVuX3Byb2Nlc3NfZnVsbHxvcGVuX3Byb2Nlc3NfaW58IiArDQogICAgICAgICJvcGVuX3Byb2Nlc3Nfb3V0fG9wZW5fc3Vid2luZG93fG9wZW5fdGFnfG9wZW5fdGJveHxvcGVuX3RlbXBfZmlsZXwiICsNCiAgICAgICAgIm9wZW5fdmJveHxvcGVuZGJtfG9wZW5kaXJ8b3BlbmZpbGV8b3J8b3NfdHlwZXxvdXRfY2hhbm5lbF9sZW5ndGh8IiArDQogICAgICAgICJvdXRfY2hhbm5lbF9vZl9kZXNjcnxvdXRwdXR8b3V0cHV0X2JpbmFyeV9pbnR8b3V0cHV0X2J1ZmZlcnxvdXRwdXRfYnl0ZXwiICsNCiAgICAgICAgIm91dHB1dF9jaGFyfG91dHB1dF9zdHJpbmd8b3V0cHV0X3ZhbHVlfG92ZXJfbWF4X2JveGVzfHBhY2t8cGFyYW1zfCIgKw0KICAgICAgICAicGFyZW50X2Rpcl9uYW1lfHBhcnNlfHBhcnNlX2FyZ3Z8cGFydGl0aW9ufHBhdXNlfHBlZWt8cGlwZXxwaXhlbHN8IiArDQogICAgICAgICJwbGFjZXxwbG90fHBsb3RzfHBvaW50X2NvbG9yfHBvbGFyfHBvbGx8cG9wfHBvc19pbnxwb3Nfb3V0fHBvd3wiICsNCiAgICAgICAgInBvd2VyX2JpZ19pbnRfcG9zaXRpdmVfYmlnX2ludHxwb3dlcl9iaWdfaW50X3Bvc2l0aXZlX2ludHwiICsNCiAgICAgICAgInBvd2VyX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2ludF9wb3NpdGl2ZV9pbnR8cG93ZXJfbnVtfCIgKw0KICAgICAgICAicHBfY2xvc2VfYm94fHBwX2Nsb3NlX3RhZ3xwcF9jbG9zZV90Ym94fHBwX2ZvcmNlX25ld2xpbmV8IiArDQogICAgICAgICJwcF9nZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX2dldF9lbGxpcHNpc190ZXh0fCIgKw0KICAgICAgICAicHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX2dldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3wiICsNCiAgICAgICAgInBwX2dldF9tYXJnaW58cHBfZ2V0X21hcmtfdGFnc3xwcF9nZXRfbWF4X2JveGVzfHBwX2dldF9tYXhfaW5kZW50fCIgKw0KICAgICAgICAicHBfZ2V0X3ByaW50X3RhZ3N8cHBfb3Blbl9ib3h8cHBfb3Blbl9oYm94fHBwX29wZW5faG92Ym94fHBwX29wZW5faHZib3h8IiArDQogICAgICAgICJwcF9vcGVuX3RhZ3xwcF9vcGVuX3Rib3h8cHBfb3Blbl92Ym94fHBwX292ZXJfbWF4X2JveGVzfHBwX3ByaW50X2FzfCIgKw0KICAgICAgICAicHBfcHJpbnRfYm9vbHxwcF9wcmludF9icmVha3xwcF9wcmludF9jaGFyfHBwX3ByaW50X2N1dHxwcF9wcmludF9mbG9hdHwiICsNCiAgICAgICAgInBwX3ByaW50X2ZsdXNofHBwX3ByaW50X2lmX25ld2xpbmV8cHBfcHJpbnRfaW50fHBwX3ByaW50X25ld2xpbmV8IiArDQogICAgICAgICJwcF9wcmludF9zcGFjZXxwcF9wcmludF9zdHJpbmd8cHBfcHJpbnRfdGFifHBwX3ByaW50X3RicmVha3wiICsNCiAgICAgICAgInBwX3NldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8cHBfc2V0X2VsbGlwc2lzX3RleHR8IiArDQogICAgICAgICJwcF9zZXRfZm9ybWF0dGVyX291dF9jaGFubmVsfHBwX3NldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3wiICsNCiAgICAgICAgInBwX3NldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xwcF9zZXRfbWFyZ2lufHBwX3NldF9tYXJrX3RhZ3N8IiArDQogICAgICAgICJwcF9zZXRfbWF4X2JveGVzfHBwX3NldF9tYXhfaW5kZW50fHBwX3NldF9wcmludF90YWdzfHBwX3NldF90YWJ8IiArDQogICAgICAgICJwcF9zZXRfdGFnc3xwcmVkfHByZWRfYmlnX2ludHxwcmVkX251bXxwcmVycl9jaGFyfHByZXJyX2VuZGxpbmV8IiArDQogICAgICAgICJwcmVycl9mbG9hdHxwcmVycl9pbnR8cHJlcnJfbmV3bGluZXxwcmVycl9zdHJpbmd8cHJpbnR8cHJpbnRfYXN8IiArDQogICAgICAgICJwcmludF9ib29sfHByaW50X2JyZWFrfHByaW50X2NoYXJ8cHJpbnRfY3V0fHByaW50X2VuZGxpbmV8cHJpbnRfZmxvYXR8IiArDQogICAgICAgICJwcmludF9mbHVzaHxwcmludF9pZl9uZXdsaW5lfHByaW50X2ludHxwcmludF9uZXdsaW5lfHByaW50X3NwYWNlfCIgKw0KICAgICAgICAicHJpbnRfc3RhdHxwcmludF9zdHJpbmd8cHJpbnRfdGFifHByaW50X3RicmVha3xwcmludGZ8cHJvaGliaXR8IiArDQogICAgICAgICJwdWJsaWNfbWV0aG9kX2xhYmVsfHB1c2h8cHV0ZW52fHF1b19udW18cXVvbW9kX2JpZ19pbnR8cXVvdGV8cmFpc2V8IiArDQogICAgICAgICJyYWlzZV93aW5kb3d8cmF0aW9fb2ZfbnVtfHJjb250YWluc19mcm9tfHJlYWR8cmVhZF9mbG9hdHxyZWFkX2ludHwiICsNCiAgICAgICAgInJlYWRfa2V5fHJlYWRfbGluZXxyZWFkZGlyfHJlYWRkaXJ8cmVhZGxpbmt8cmVhbGx5X2lucHV0fHJlY2VpdmV8cmVjdnwiICsNCiAgICAgICAgInJlY3Zmcm9tfHJlZHxyZWZ8cmVnZXhwfHJlZ2V4cF9jYXNlX2ZvbGR8cmVnZXhwX3N0cmluZ3wiICsNCiAgICAgICAgInJlZ2V4cF9zdHJpbmdfY2FzZV9mb2xkfHJlZ2lzdGVyfHJlZ2lzdGVyX2V4Y2VwdGlvbnxyZW18cmVtZW1iZXJfbW9kZXwiICsNCiAgICAgICAgInJlbW92ZXxyZW1vdmVfYXNzb2N8cmVtb3ZlX2Fzc3F8cmVuYW1lfHJlcGxhY2V8cmVwbGFjZV9maXJzdHwiICsNCiAgICAgICAgInJlcGxhY2VfbWF0Y2hlZHxyZXByfHJlc2V0fHJlc2hhcGV8cmVzaGFwZV8xfHJlc2hhcGVfMnxyZXNoYXBlXzN8cmV2fCIgKw0KICAgICAgICAicmV2X2FwcGVuZHxyZXZfbWFwfHJldl9tYXAyfHJld2luZGRpcnxyZ2J8cmhzX2VuZHxyaHNfZW5kX3Bvc3xyaHNfc3RhcnR8IiArDQogICAgICAgICJyaHNfc3RhcnRfcG9zfHJpbmRleHxyaW5kZXhfZnJvbXxybGluZXRvfHJtZGlyfHJtb3ZldG98cm91bmRfbnVtfCIgKw0KICAgICAgICAicnVuX2luaXRpYWxpemVyc3xydW5faW5pdGlhbGl6ZXJzX29wdHxzY2FuZnxzZWFyY2hfYmFja3dhcmR8IiArDQogICAgICAgICJzZWFyY2hfZm9yd2FyZHxzZWVrX2lufHNlZWtfb3V0fHNlbGVjdHxzZWxmfHNlbGZfaW5pdHxzZW5kfHNlbmR0b3xzZXR8IiArDQogICAgICAgICJzZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHNldF9hcHByb3hfcHJpbnRpbmd8IiArDQogICAgICAgICJzZXRfYmluYXJ5X21vZGVfaW58c2V0X2JpbmFyeV9tb2RlX291dHxzZXRfY2xvc2Vfb25fZXhlY3wiICsNCiAgICAgICAgInNldF9jbG9zZV9vbl9leGVjfHNldF9jb2xvcnxzZXRfZWxsaXBzaXNfdGV4dHwiICsNCiAgICAgICAgInNldF9lcnJvcl93aGVuX251bGxfZGVub21pbmF0b3J8c2V0X2ZpZWxkfHNldF9mbG9hdGluZ19wcmVjaXNpb258IiArDQogICAgICAgICJzZXRfZm9udHxzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsfHNldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3wiICsNCiAgICAgICAgInNldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xzZXRfbGluZV93aWR0aHxzZXRfbWFyZ2lufHNldF9tYXJrX3RhZ3N8IiArDQogICAgICAgICJzZXRfbWF4X2JveGVzfHNldF9tYXhfaW5kZW50fHNldF9tZXRob2R8c2V0X25vbmJsb2NrfHNldF9ub25ibG9ja3wiICsNCiAgICAgICAgInNldF9ub3JtYWxpemVfcmF0aW98c2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfHNldF9wcmludF90YWdzfCIgKw0KICAgICAgICAic2V0X3NpZ25hbHxzZXRfc3RhdGV8c2V0X3RhYnxzZXRfdGFnfHNldF90YWdzfHNldF90ZXh0X3NpemV8IiArDQogICAgICAgICJzZXRfd2luZG93X3RpdGxlfHNldGdpZHxzZXRnaWR8c2V0aXRpbWVyfHNldGl0aW1lcnxzZXRzaWR8c2V0c2lkfCIgKw0KICAgICAgICAic2V0c29ja29wdHxzZXRzb2Nrb3B0fHNldHNvY2tvcHRfZmxvYXR8c2V0c29ja29wdF9mbG9hdHxzZXRzb2Nrb3B0X2ludHwiICsNCiAgICAgICAgInNldHNvY2tvcHRfaW50fHNldHNvY2tvcHRfb3B0aW50fHNldHNvY2tvcHRfb3B0aW50fHNldHVpZHxzZXR1aWR8IiArDQogICAgICAgICJzaGlmdF9sZWZ0fHNoaWZ0X2xlZnR8c2hpZnRfbGVmdHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHwiICsNCiAgICAgICAgInNoaWZ0X3JpZ2h0X2xvZ2ljYWx8c2hpZnRfcmlnaHRfbG9naWNhbHxzaGlmdF9yaWdodF9sb2dpY2FsfHNob3dfYnVja2V0c3wiICsNCiAgICAgICAgInNodXRkb3dufHNodXRkb3dufHNodXRkb3duX2Nvbm5lY3Rpb258c2h1dGRvd25fY29ubmVjdGlvbnxzaWdhYnJ0fCIgKw0KICAgICAgICAic2lnYWxybXxzaWdjaGxkfHNpZ2NvbnR8c2lnZnBlfHNpZ2h1cHxzaWdpbGx8c2lnaW50fHNpZ2tpbGx8c2lnbl9iaWdfaW50fCIgKw0KICAgICAgICAic2lnbl9udW18c2lnbmFsfHNpZ25hbHxzaWdwZW5kaW5nfHNpZ3BlbmRpbmd8c2lncGlwZXxzaWdwcm9jbWFza3wiICsNCiAgICAgICAgInNpZ3Byb2NtYXNrfHNpZ3Byb2Z8c2lncXVpdHxzaWdzZWd2fHNpZ3N0b3B8c2lnc3VzcGVuZHxzaWdzdXNwZW5kfCIgKw0KICAgICAgICAic2lndGVybXxzaWd0c3RwfHNpZ3R0aW58c2lndHRvdXxzaWd1c3IxfHNpZ3VzcjJ8c2lndnRhbHJtfHNpbnxzaW5nbGV0b258IiArDQogICAgICAgICJzaW5ofHNpemV8c2l6ZXxzaXplX3h8c2l6ZV95fHNsZWVwfHNsZWVwfHNsZWVwfHNsaWNlX2xlZnR8c2xpY2VfbGVmdHwiICsNCiAgICAgICAgInNsaWNlX2xlZnRfMXxzbGljZV9sZWZ0XzJ8c2xpY2VfcmlnaHR8c2xpY2VfcmlnaHR8c2xpY2VfcmlnaHRfMXwiICsNCiAgICAgICAgInNsaWNlX3JpZ2h0XzJ8c25kfHNvY2tldHxzb2NrZXR8c29ja2V0fHNvY2tldHBhaXJ8c29ja2V0cGFpcnxzb3J0fHNvdW5kfCIgKw0KICAgICAgICAic3BsaXR8c3BsaXRfZGVsaW18c3ByaW50ZnxzcHJpbnRmfHNxcnR8c3FydHxzcXJ0X2JpZ19pbnR8c3F1YXJlX2JpZ19pbnR8IiArDQogICAgICAgICJzcXVhcmVfbnVtfHNzY2FuZnxzdGFibGVfc29ydHxzdGFibGVfc29ydHxzdGFibGVfc29ydHxzdGFibGVfc29ydHxzdGFibGVfc29ydHwiICsNCiAgICAgICAgInN0YWJsZV9zb3J0fHN0YXR8c3RhdHxzdGF0fHN0YXR8c3RhdHxzdGF0c3xzdGF0c3xzdGRfZm9ybWF0dGVyfHN0ZGJ1ZnwiICsNCiAgICAgICAgInN0ZGVycnxzdGRlcnJ8c3RkZXJyfHN0ZGlifHN0ZGlufHN0ZGlufHN0ZGlufHN0ZG91dHxzdGRvdXR8c3Rkb3V0fCIgKw0KICAgICAgICAic3RyX2Zvcm1hdHRlcnxzdHJpbmd8c3RyaW5nX2FmdGVyfHN0cmluZ19iZWZvcmV8c3RyaW5nX21hdGNofCIgKw0KICAgICAgICAic3RyaW5nX29mX2JpZ19pbnR8c3RyaW5nX29mX2Jvb2x8c3RyaW5nX29mX2Zsb2F0fHN0cmluZ19vZl9mb3JtYXR8IiArDQogICAgICAgICJzdHJpbmdfb2ZfaW5ldF9hZGRyfHN0cmluZ19vZl9pbmV0X2FkZHJ8c3RyaW5nX29mX2ludHxzdHJpbmdfb2ZfbnVtfCIgKw0KICAgICAgICAic3RyaW5nX3BhcnRpYWxfbWF0Y2h8c3RyaW5nX3RhZ3xzdWJ8c3VifHN1Yl9iaWdfaW50fHN1Yl9sZWZ0fHN1Yl9udW18IiArDQogICAgICAgICJzdWJfcmlnaHR8c3Vic2V0fHN1YnNldHxzdWJzdGl0dXRlX2ZpcnN0fHN1YnN0cmluZ3xzdWNjfHN1Y2N8IiArDQogICAgICAgICJzdWNjfHN1Y2N8c3VjY19iaWdfaW50fHN1Y2NfbnVtfHN5bWJvbF9lbmR8c3ltYm9sX2VuZF9wb3N8c3ltYm9sX3N0YXJ0fCIgKw0KICAgICAgICAic3ltYm9sX3N0YXJ0X3Bvc3xzeW1saW5rfHN5bWxpbmt8c3luY3xzeW5jaHJvbml6ZXxzeXN0ZW18c3lzdGVtfHN5c3RlbXwiICsNCiAgICAgICAgInRhZ3x0YWtlfHRhbnx0YW5ofHRjZHJhaW58dGNkcmFpbnx0Y2Zsb3d8dGNmbG93fHRjZmx1c2h8dGNmbHVzaHwiICsNCiAgICAgICAgInRjZ2V0YXR0cnx0Y2dldGF0dHJ8dGNzZW5kYnJlYWt8dGNzZW5kYnJlYWt8dGNzZXRhdHRyfHRjc2V0YXR0cnwiICsNCiAgICAgICAgInRlbXBfZmlsZXx0ZXh0X3NpemV8dGltZXx0aW1lfHRpbWV8dGltZWRfcmVhZHx0aW1lZF93cml0ZXx0aW1lc3x0aW1lc3wiICsNCiAgICAgICAgInRsfHRsfHRsfHRvX2J1ZmZlcnx0b19jaGFubmVsfHRvX2Zsb2F0fHRvX2hleHx0b19pbnR8dG9faW50MzJ8dG9fbGlzdHwiICsNCiAgICAgICAgInRvX2xpc3R8dG9fbGlzdHx0b19uYXRpdmVpbnR8dG9fc3RyaW5nfHRvX3N0cmluZ3x0b19zdHJpbmd8dG9fc3RyaW5nfCIgKw0KICAgICAgICAidG9fc3RyaW5nfHRvcHx0b3B8dG90YWxfc2l6ZXx0cmFuc2Zlcnx0cmFuc3B8dHJ1bmNhdGV8dHJ1bmNhdGV8dHJ1bmNhdGV8IiArDQogICAgICAgICJ0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnlfbG9ja3x1bWFza3x1bWFza3x1bmNhcGl0YWxpemV8dW5jYXBpdGFsaXplfCIgKw0KICAgICAgICAidW5jYXBpdGFsaXplfHVuaW9ufHVuaW9ufHVuaXRfYmlnX2ludHx1bmxpbmt8dW5saW5rfHVubG9ja3x1bm1hcnNoYWx8IiArDQogICAgICAgICJ1bnNhZmVfYmxpdHx1bnNhZmVfZmlsbHx1bnNhZmVfZ2V0fHVuc2FmZV9nZXR8dW5zYWZlX3NldHx1bnNhZmVfc2V0fCIgKw0KICAgICAgICAidXBkYXRlfHVwcGVyY2FzZXx1cHBlcmNhc2V8dXBwZXJjYXNlfHVwcGVyY2FzZXx1c2FnZXx1dGltZXN8dXRpbWVzfHdhaXR8IiArDQogICAgICAgICJ3YWl0fHdhaXR8d2FpdHx3YWl0X25leHRfZXZlbnR8d2FpdF9waWR8d2FpdF9yZWFkfHdhaXRfc2lnbmFsfCIgKw0KICAgICAgICAid2FpdF90aW1lZF9yZWFkfHdhaXRfdGltZWRfd3JpdGV8d2FpdF93cml0ZXx3YWl0cGlkfHdoaXRlfCIgKw0KICAgICAgICAid2lkZW58d2luZG93X2lkfHdvcmRfc2l6ZXx3cmFwfHdyYXBfYWJvcnR8d3JpdGV8eWVsbG93fHlpZWxkfHplcm98emVyb19iaWdfaW50fCIgKw0KDQogICAgICAgICJBcmd8QXJpdGhfc3RhdHVzfEFycmF5fEFycmF5MXxBcnJheTJ8QXJyYXkzfEFycmF5TGFiZWxzfEJpZ19pbnR8QmlnYXJyYXl8IiArDQogICAgICAgICJCdWZmZXJ8Q2FsbGJhY2t8Q2FtbGludGVybmFsT098Q2hhcnxDb21wbGV4fENvbmRpdGlvbnxEYm18RGlnZXN0fER5bmxpbmt8IiArDQogICAgICAgICJFdmVudHxGaWxlbmFtZXxGb3JtYXR8R2N8R2VuYXJyYXl8R2VubGV4fEdyYXBoaWNzfEdyYXBoaWNzWDExfEhhc2h0Ymx8IiArDQogICAgICAgICJJbnQzMnxJbnQ2NHxMYXJnZUZpbGV8TGF6eXxMZXhpbmd8TGlzdHxMaXN0TGFiZWxzfE1ha2V8TWFwfE1hcnNoYWx8IiArDQogICAgICAgICJNb3JlTGFiZWxzfE11dGV4fE5hdGl2ZWludHxOdW18T2JqfE9vfFBhcnNpbmd8UGVydmFzaXZlc3xQcmludGV4Y3wiICsNCiAgICAgICAgIlByaW50ZnxRdWV1ZXxSYW5kb218U2NhbmZ8U2Nhbm5pbmd8U2V0fFNvcnR8U3RhY2t8U3RhdGV8U3RkTGFiZWxzfFN0cnwiICsNCiAgICAgICAgIlN0cmVhbXxTdHJpbmd8U3RyaW5nTGFiZWxzfFN5c3xUaHJlYWR8VGhyZWFkVW5peHxUa3xVbml4fFVuaXhMYWJlbHN8V2VhayINCiAgICApLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsNCiAgICB2YXIgb2N0SW50ZWdlciA9ICIoPzowW29PXT9bMC03XSspIjsNCiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOw0KICAgIHZhciBiaW5JbnRlZ2VyID0gIig/OjBbYkJdWzAxXSspIjsNCiAgICB2YXIgaW50ZWdlciA9ICIoPzoiICsgZGVjaW1hbEludGVnZXIgKyAifCIgKyBvY3RJbnRlZ2VyICsgInwiICsgaGV4SW50ZWdlciArICJ8IiArIGJpbkludGVnZXIgKyAiKSI7DQoNCiAgICB2YXIgZXhwb25lbnQgPSAiKD86W2VFXVsrLV0/XFxkKykiOw0KICAgIHZhciBmcmFjdGlvbiA9ICIoPzpcXC5cXGQrKSI7DQogICAgdmFyIGludFBhcnQgPSAiKD86XFxkKykiOw0KICAgIHZhciBwb2ludEZsb2F0ID0gIig/Oig/OiIgKyBpbnRQYXJ0ICsgIj8iICsgZnJhY3Rpb24gKyAiKXwoPzoiICsgaW50UGFydCArICJcXC4pKSI7DQogICAgdmFyIGV4cG9uZW50RmxvYXQgPSAiKD86KD86IiArIHBvaW50RmxvYXQgKyAifCIgKyAgaW50UGFydCArICIpIiArIGV4cG9uZW50ICsgIikiOw0KICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgZXhwb25lbnRGbG9hdCArICJ8IiArIHBvaW50RmxvYXQgKyAiKSI7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdcXChcXCouKj9cXCpcXClcXHMqPyQnDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdcXChcXCouKicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBjaGFyDQogICAgICAgICAgICAgICAgcmVnZXggOiAiJy4nIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyAiIHN0cmluZw0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICciJywNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJxc3RyaW5nIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaW1hZ2luYXJ5DQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGZsb2F0TnVtYmVyICsgInxcXGQrKVtqSl1cXGIiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogZmxvYXROdW1iZXINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXINCiAgICAgICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiXFxiIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcK1xcLnxcXC1cXC58XFwqXFwufFxcL1xcLnwjfDs7fFxcK3xcXC18XFwqfFxcKlxcKlxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PC18PSINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcKSIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCg0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICciJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhPY2FtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLk9jYW1sSGlnaGxpZ2h0UnVsZXMgPSBPY2FtbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ocaml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9vY2FtbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9vY2FtbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9vY2FtbF9oaWdobGlnaHRfcnVsZXMiKS5PY2FtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBofTtkLmluaGVyaXRzKGosZSk7dmFyIGs9Lyg/Olsoe1s9Ol18Wy09XT58XGIoPzplbHNlfHRyeXx3aXRoKSlccyokLzsoKGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPSEwLGg9L15ccypcKFwqKC4qKVwqXCkvO2ZvcihlPWM7ZTw9ZDtlKyspaWYoIWgudGVzdChiLmdldExpbmUoZSkpKXtnPSExO2JyZWFrfXZhciBqPW5ldyBpKDAsMCwwLDApO2ZvcihlPWM7ZTw9ZDtlKyspZj1iLmdldExpbmUoZSksai5zdGFydC5yb3c9ZSxqLmVuZC5yb3c9ZSxqLmVuZC5jb2x1bW49Zi5sZW5ndGgsYi5yZXBsYWNlKGosZz9mLm1hdGNoKGgpWzFdOiIoKiIrZisiKikiKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKS50b2tlbnM7cmV0dXJuKCFlLmxlbmd0aHx8ZVtlLmxlbmd0aC0xXS50eXBlIT09ImNvbW1lbnQiKSYmYT09PSJzdGFydCImJmsudGVzdChiKSYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0pKS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUvb2NhbWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiYW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXxpbmhlcml0fGluaXRpYWxpemVyfGxhenl8bGV0fG1hdGNofG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8b2JqZWN0fG9mfG9wZW58b3J8cHJpdmF0ZXxyZWN8c2lnfHN0cnVjdHx0aGVufHRvfHRyeXx0eXBlfHZhbHx2aXJ0dWFsfHdoZW58d2hpbGV8d2l0aCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoInRydWV8ZmFsc2UiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJhYnN8YWJzX2JpZ19pbnR8YWJzX2Zsb2F0fGFic19udW18YWJzdHJhY3RfdGFnfGFjY2VwdHxhY2Nlc3N8YWNvc3xhZGR8YWRkX2F2YWlsYWJsZV91bml0c3xhZGRfYmlnX2ludHxhZGRfYnVmZmVyfGFkZF9jaGFubmVsfGFkZF9jaGFyfGFkZF9pbml0aWFsaXplcnxhZGRfaW50X2JpZ19pbnR8YWRkX2ludGVyZmFjZXN8YWRkX251bXxhZGRfc3RyaW5nfGFkZF9zdWJzdGl0dXRlfGFkZF9zdWJzdHJpbmd8YWxhcm18YWxsb2NhdGVkX2J5dGVzfGFsbG93X29ubHl8YWxsb3dfdW5zYWZlX21vZHVsZXN8YWx3YXlzfGFwcGVuZHxhcHBuYW1lX2dldHxhcHBuYW1lX3NldHxhcHByb3hfbnVtX2V4cHxhcHByb3hfbnVtX2ZpeHxhcmd8YXJndnxhcml0aF9zdGF0dXN8YXJyYXl8YXJyYXkxX29mX2dlbmFycmF5fGFycmF5Ml9vZl9nZW5hcnJheXxhcnJheTNfb2ZfZ2VuYXJyYXl8YXNpbnxhc3J8YXNzb2N8YXNzcXxhdF9leGl0fGF0YW58YXRhbjJ8YXV0b19zeW5jaHJvbml6ZXxiYWNrZ3JvdW5kfGJhc2VuYW1lfGJlZ2lubmluZ19vZl9pbnB1dHxiaWdfaW50X29mX2ludHxiaWdfaW50X29mX251bXxiaWdfaW50X29mX3N0cmluZ3xiaW5kfGJpbmRfY2xhc3N8YmluZF90YWd8Yml0c3xiaXRzX29mX2Zsb2F0fGJsYWNrfGJsaXR8YmxpdF9pbWFnZXxibHVlfGJvb2x8Ym9vbF9vZl9zdHJpbmd8Ym91bmRlZF9mdWxsX3NwbGl0fGJvdW5kZWRfc3BsaXR8Ym91bmRlZF9zcGxpdF9kZWxpbXxicHJpbnRmfGJyZWFrfGJyb2FkY2FzdHxic2NhbmZ8YnV0dG9uX2Rvd258Y19sYXlvdXR8Y2FwaXRhbGl6ZXxjYXJkaW5hbHxjYXJkaW5hbHxjYXRjaHxjYXRjaF9icmVha3xjZWlsfGNlaWxpbmdfbnVtfGNoYW5uZWx8Y2hhcnxjaGFyX29mX2ludHxjaGRpcnxjaGVja3xjaGVja19zdWZmaXh8Y2htb2R8Y2hvb3NlfGNob3BfZXh0ZW5zaW9ufGNob3Bfc3VmZml4fGNob3dufGNob3dufGNocnxjaHJvb3R8Y2xhc3NpZnlfZmxvYXR8Y2xlYXJ8Y2xlYXJfYXZhaWxhYmxlX3VuaXRzfGNsZWFyX2Nsb3NlX29uX2V4ZWN8Y2xlYXJfZ3JhcGh8Y2xlYXJfbm9uYmxvY2t8Y2xlYXJfcGFyc2VyfGNsb3NlfGNsb3NlfGNsb3NlVGt8Y2xvc2VfYm94fGNsb3NlX2dyYXBofGNsb3NlX2lufGNsb3NlX2luX25vZXJyfGNsb3NlX291dHxjbG9zZV9vdXRfbm9lcnJ8Y2xvc2VfcHJvY2Vzc3xjbG9zZV9wcm9jZXNzfGNsb3NlX3Byb2Nlc3NfZnVsbHxjbG9zZV9wcm9jZXNzX2lufGNsb3NlX3Byb2Nlc3Nfb3V0fGNsb3NlX3N1YndpbmRvd3xjbG9zZV90YWd8Y2xvc2VfdGJveHxjbG9zZWRpcnxjbG9zZWRpcnxjbG9zdXJlX3RhZ3xjb2RlfGNvbWJpbmV8Y29tYmluZXxjb21iaW5lfGNvbW1hbmR8Y29tcGFjdHxjb21wYXJlfGNvbXBhcmVfYmlnX2ludHxjb21wYXJlX251bXxjb21wbGV4MzJ8Y29tcGxleDY0fGNvbmNhdHxjb25qfGNvbm5lY3R8Y29udGFpbnN8Y29udGFpbnNfZnJvbXxjb250ZW50c3xjb3B5fGNvc3xjb3NofGNvdW50fGNvdW50fGNvdW50ZXJzfGNyZWF0ZXxjcmVhdGVfYWxhcm18Y3JlYXRlX2ltYWdlfGNyZWF0ZV9tYXRyaXh8Y3JlYXRlX21hdHJpeHxjcmVhdGVfbWF0cml4fGNyZWF0ZV9vYmplY3R8Y3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpemVyc3xjcmVhdGVfb2JqZWN0X29wdHxjcmVhdGVfcHJvY2Vzc3xjcmVhdGVfcHJvY2Vzc3xjcmVhdGVfcHJvY2Vzc19lbnZ8Y3JlYXRlX3Byb2Nlc3NfZW52fGNyZWF0ZV90YWJsZXxjdXJyZW50fGN1cnJlbnRfZGlyX25hbWV8Y3VycmVudF9wb2ludHxjdXJyZW50X3h8Y3VycmVudF95fGN1cnZldG98Y3VzdG9tX3RhZ3xjeWFufGRhdGFfc2l6ZXxkZWNyfGRlY3JfbnVtfGRlZmF1bHRfYXZhaWxhYmxlX3VuaXRzfGRlbGF5fGRlbGV0ZV9hbGFybXxkZXNjcl9vZl9pbl9jaGFubmVsfGRlc2NyX29mX291dF9jaGFubmVsfGRlc3Ryb3l8ZGlmZnxkaW18ZGltMXxkaW0yfGRpbTN8ZGltc3xkaXJuYW1lfGRpc3BsYXlfbW9kZXxkaXZ8ZGl2X2JpZ19pbnR8ZGl2X251bXxkb3VibGVfYXJyYXlfdGFnfGRvdWJsZV90YWd8ZHJhd19hcmN8ZHJhd19jaGFyfGRyYXdfY2lyY2xlfGRyYXdfZWxsaXBzZXxkcmF3X2ltYWdlfGRyYXdfcG9seXxkcmF3X3BvbHlfbGluZXxkcmF3X3JlY3R8ZHJhd19zZWdtZW50c3xkcmF3X3N0cmluZ3xkdW1teV9wb3N8ZHVtbXlfdGFibGV8ZHVtcF9pbWFnZXxkdXB8ZHVwMnxlbGVtZW50c3xlbXB0eXxlbmRfb2ZfaW5wdXR8ZW52aXJvbm1lbnR8ZXByaW50ZnxlcHNpbG9uX2Zsb2F0fGVxX2JpZ19pbnR8ZXFfbnVtfGVxdWFsfGVycl9mb3JtYXR0ZXJ8ZXJyb3JfbWVzc2FnZXxlc2NhcGVkfGVzdGFibGlzaF9zZXJ2ZXJ8ZXhlY3V0YWJsZV9uYW1lfGV4ZWN2fGV4ZWN2ZXxleGVjdnB8ZXhlY3ZwZXxleGlzdHN8ZXhpc3RzMnxleGl0fGV4cHxmYWlsd2l0aHxmYXN0X3NvcnR8ZmNobW9kfGZjaG93bnxmaWVsZHxmaWxlfGZpbGVfZXhpc3RzfGZpbGx8ZmlsbF9hcmN8ZmlsbF9jaXJjbGV8ZmlsbF9lbGxpcHNlfGZpbGxfcG9seXxmaWxsX3JlY3R8ZmlsdGVyfGZpbmFsX3RhZ3xmaW5hbGlzZXxmaW5kfGZpbmRfYWxsfGZpcnN0X2NoYXJzfGZpcnN0a2V5fGZsYXR0ZW58ZmxvYXR8ZmxvYXQzMnxmbG9hdDY0fGZsb2F0X29mX2JpZ19pbnR8ZmxvYXRfb2ZfYml0c3xmbG9hdF9vZl9pbnR8ZmxvYXRfb2ZfbnVtfGZsb2F0X29mX3N0cmluZ3xmbG9vcnxmbG9vcl9udW18Zmx1c2h8Zmx1c2hfYWxsfGZsdXNoX2lucHV0fGZsdXNoX3N0cl9mb3JtYXR0ZXJ8Zm9sZHxmb2xkX2xlZnR8Zm9sZF9sZWZ0Mnxmb2xkX3JpZ2h0fGZvbGRfcmlnaHQyfGZvcl9hbGx8Zm9yX2FsbDJ8Zm9yY2V8Zm9yY2VfbmV3bGluZXxmb3JjZV92YWx8Zm9yZWdyb3VuZHxmb3JrfGZvcm1hdF9vZl9zdHJpbmd8Zm9ybWF0dGVyX29mX2J1ZmZlcnxmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWx8Zm9ydHJhbl9sYXlvdXR8Zm9yd2FyZF90YWd8ZnByaW50ZnxmcmV4cHxmcm9tfGZyb21fY2hhbm5lbHxmcm9tX2ZpbGV8ZnJvbV9maWxlX2Jpbnxmcm9tX2Z1bmN0aW9ufGZyb21fc3RyaW5nfGZzY2FuZnxmc3R8ZnN0YXR8ZnRydW5jYXRlfGZ1bGxfaW5pdHxmdWxsX21ham9yfGZ1bGxfc3BsaXR8Z2NkX2JpZ19pbnR8Z2VfYmlnX2ludHxnZV9udW18Z2VuYXJyYXlfb2ZfYXJyYXkxfGdlbmFycmF5X29mX2FycmF5MnxnZW5hcnJheV9vZl9hcnJheTN8Z2V0fGdldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8Z2V0X2FwcHJveF9wcmludGluZ3xnZXRfY29weXxnZXRfZWxsaXBzaXNfdGV4dHxnZXRfZXJyb3Jfd2hlbl9udWxsX2Rlbm9taW5hdG9yfGdldF9mbG9hdGluZ19wcmVjaXNpb258Z2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfGdldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xnZXRfaW1hZ2V8Z2V0X21hcmdpbnxnZXRfbWFya190YWdzfGdldF9tYXhfYm94ZXN8Z2V0X21heF9pbmRlbnR8Z2V0X21ldGhvZHxnZXRfbWV0aG9kX2xhYmVsfGdldF9ub3JtYWxpemVfcmF0aW98Z2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfGdldF9wcmludF90YWdzfGdldF9zdGF0ZXxnZXRfdmFyaWFibGV8Z2V0Y3dkfGdldGVnaWR8Z2V0ZWdpZHxnZXRlbnZ8Z2V0ZW52fGdldGVudnxnZXRldWlkfGdldGV1aWR8Z2V0Z2lkfGdldGdpZHxnZXRncmdpZHxnZXRncmdpZHxnZXRncm5hbXxnZXRncm5hbXxnZXRncm91cHN8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldGhvc3RuYW1lfGdldGl0aW1lcnxnZXRsb2dpbnxnZXRwZWVybmFtZXxnZXRwaWR8Z2V0cHBpZHxnZXRwcm90b2J5bmFtZXxnZXRwcm90b2J5bnVtYmVyfGdldHB3bmFtfGdldHB3dWlkfGdldHNlcnZieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRzb2NrbmFtZXxnZXRzb2Nrb3B0fGdldHNvY2tvcHRfZmxvYXR8Z2V0c29ja29wdF9pbnR8Z2V0c29ja29wdF9vcHRpbnR8Z2V0dGltZW9mZGF5fGdldHVpZHxnbG9iYWxfcmVwbGFjZXxnbG9iYWxfc3Vic3RpdHV0ZXxnbXRpbWV8Z3JlZW58Z3JpZHxncm91cF9iZWdpbm5pbmd8Z3JvdXBfZW5kfGd0X2JpZ19pbnR8Z3RfbnVtfGd1YXJkfGhhbmRsZV91bml4X2Vycm9yfGhhc2h8aGFzaF9wYXJhbXxoZHxoZWFkZXJfc2l6ZXxpfGlkfGlnbm9yZXxpbl9jaGFubmVsX2xlbmd0aHxpbl9jaGFubmVsX29mX2Rlc2NyfGluY3J8aW5jcl9udW18aW5kZXh8aW5kZXhfZnJvbXxpbmV0X2FkZHJfYW55fGluZXRfYWRkcl9vZl9zdHJpbmd8aW5maW5pdHl8aW5maXhfdGFnfGluaXR8aW5pdF9jbGFzc3xpbnB1dHxpbnB1dF9iaW5hcnlfaW50fGlucHV0X2J5dGV8aW5wdXRfY2hhcnxpbnB1dF9saW5lfGlucHV0X3ZhbHVlfGludHxpbnQxNl9zaWduZWR8aW50MTZfdW5zaWduZWR8aW50MzJ8aW50NjR8aW50OF9zaWduZWR8aW50OF91bnNpZ25lZHxpbnRfb2ZfYmlnX2ludHxpbnRfb2ZfY2hhcnxpbnRfb2ZfZmxvYXR8aW50X29mX251bXxpbnRfb2Zfc3RyaW5nfGludGVnZXJfbnVtfGludGVyfGludGVyYWN0aXZlfGludnxpbnZhbGlkX2FyZ3xpc19ibG9ja3xpc19lbXB0eXxpc19pbXBsaWNpdHxpc19pbnR8aXNfaW50X2JpZ19pbnR8aXNfaW50ZWdlcl9udW18aXNfcmVsYXRpdmV8aXRlcnxpdGVyMnxpdGVyaXxqb2lufGp1bmt8a2V5X3ByZXNzZWR8a2lsbHxraW5kfGtwcmludGZ8a3NjYW5mfGxhbmR8bGFzdF9jaGFyc3xsYXlvdXR8bGF6eV9mcm9tX2Z1bnxsYXp5X2Zyb21fdmFsfGxhenlfaXNfdmFsfGxhenlfdGFnfGxkZXhwfGxlX2JpZ19pbnR8bGVfbnVtfGxlbmd0aHxsZXhlbWV8bGV4ZW1lX2NoYXJ8bGV4ZW1lX2VuZHxsZXhlbWVfZW5kX3B8bGV4ZW1lX3N0YXJ0fGxleGVtZV9zdGFydF9wfGxpbmV0b3xsaW5rfGxpc3R8bGlzdGVufGxub3R8bG9hZGZpbGV8bG9hZGZpbGVfcHJpdmF0ZXxsb2NhbHRpbWV8bG9ja3xsb2NrZnxsb2d8bG9nMTB8bG9nYW5kfGxvZ25vdHxsb2dvcnxsb2d4b3J8bG9yfGxvd2VyX3dpbmRvd3xsb3dlcmNhc2V8bHNlZWt8bHNsfGxzcnxsc3RhdHxsdF9iaWdfaW50fGx0X251bXxseG9yfG1hZ2VudGF8bWFnaWN8bWFpbkxvb3B8bWFqb3J8bWFqb3Jfc2xpY2V8bWFrZXxtYWtlX2Zvcm1hdHRlcnxtYWtlX2ltYWdlfG1ha2VfbGV4ZXJ8bWFrZV9tYXRyaXh8bWFrZV9zZWxmX2luaXR8bWFwfG1hcDJ8bWFwX2ZpbGV8bWFwaXxtYXJzaGFsfG1hdGNoX2JlZ2lubmluZ3xtYXRjaF9lbmR8bWF0Y2hlZF9ncm91cHxtYXRjaGVkX3N0cmluZ3xtYXh8bWF4X2FycmF5X2xlbmd0aHxtYXhfYmlnX2ludHxtYXhfZWx0fG1heF9mbG9hdHxtYXhfaW50fG1heF9udW18bWF4X3N0cmluZ19sZW5ndGh8bWVtfG1lbV9hc3NvY3xtZW1fYXNzcXxtZW1xfG1lcmdlfG1pbnxtaW5fYmlnX2ludHxtaW5fZWx0fG1pbl9mbG9hdHxtaW5faW50fG1pbl9udW18bWlub3J8bWludXNfYmlnX2ludHxtaW51c19udW18bWludXNfb25lfG1rZGlyfG1rZmlmb3xta3RpbWV8bW9kfG1vZF9iaWdfaW50fG1vZF9mbG9hdHxtb2RfbnVtfG1vZGZ8bW91c2VfcG9zfG1vdmV0b3xtdWx8bXVsdF9iaWdfaW50fG11bHRfaW50X2JpZ19pbnR8bXVsdF9udW18bmFufG5hcnJvd3xuYXRfb2ZfbnVtfG5hdGl2ZWludHxuZWd8bmVnX2luZmluaXR5fG5ld19ibG9ja3xuZXdfY2hhbm5lbHxuZXdfbWV0aG9kfG5ld192YXJpYWJsZXxuZXh0fG5leHRrZXl8bmljZXxuaWNlfG5vX3NjYW5fdGFnfG5vcm18bm9ybTJ8bm90fG5wZWVrfG50aHxudGhfZGltfG51bV9kaWdpdHNfYmlnX2ludHxudW1fZGltc3xudW1fb2ZfYmlnX2ludHxudW1fb2ZfaW50fG51bV9vZl9uYXR8bnVtX29mX3JhdGlvfG51bV9vZl9zdHJpbmd8T3xvYmp8b2JqZWN0X3RhZ3xvY2FtbF92ZXJzaW9ufG9mX2FycmF5fG9mX2NoYW5uZWx8b2ZfZmxvYXR8b2ZfaW50fG9mX2ludDMyfG9mX2xpc3R8b2ZfbmF0aXZlaW50fG9mX3N0cmluZ3xvbmV8b3BlblRrfG9wZW5fYm94fG9wZW5fY29ubmVjdGlvbnxvcGVuX2dyYXBofG9wZW5faGJveHxvcGVuX2hvdmJveHxvcGVuX2h2Ym94fG9wZW5faW58b3Blbl9pbl9iaW58b3Blbl9pbl9nZW58b3Blbl9vdXR8b3Blbl9vdXRfYmlufG9wZW5fb3V0X2dlbnxvcGVuX3Byb2Nlc3N8b3Blbl9wcm9jZXNzX2Z1bGx8b3Blbl9wcm9jZXNzX2lufG9wZW5fcHJvY2Vzc19vdXR8b3Blbl9zdWJ3aW5kb3d8b3Blbl90YWd8b3Blbl90Ym94fG9wZW5fdGVtcF9maWxlfG9wZW5fdmJveHxvcGVuZGJtfG9wZW5kaXJ8b3BlbmZpbGV8b3J8b3NfdHlwZXxvdXRfY2hhbm5lbF9sZW5ndGh8b3V0X2NoYW5uZWxfb2ZfZGVzY3J8b3V0cHV0fG91dHB1dF9iaW5hcnlfaW50fG91dHB1dF9idWZmZXJ8b3V0cHV0X2J5dGV8b3V0cHV0X2NoYXJ8b3V0cHV0X3N0cmluZ3xvdXRwdXRfdmFsdWV8b3Zlcl9tYXhfYm94ZXN8cGFja3xwYXJhbXN8cGFyZW50X2Rpcl9uYW1lfHBhcnNlfHBhcnNlX2FyZ3Z8cGFydGl0aW9ufHBhdXNlfHBlZWt8cGlwZXxwaXhlbHN8cGxhY2V8cGxvdHxwbG90c3xwb2ludF9jb2xvcnxwb2xhcnxwb2xsfHBvcHxwb3NfaW58cG9zX291dHxwb3d8cG93ZXJfYmlnX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2JpZ19pbnRfcG9zaXRpdmVfaW50fHBvd2VyX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2ludF9wb3NpdGl2ZV9pbnR8cG93ZXJfbnVtfHBwX2Nsb3NlX2JveHxwcF9jbG9zZV90YWd8cHBfY2xvc2VfdGJveHxwcF9mb3JjZV9uZXdsaW5lfHBwX2dldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8cHBfZ2V0X2VsbGlwc2lzX3RleHR8cHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX2dldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xwcF9nZXRfbWFyZ2lufHBwX2dldF9tYXJrX3RhZ3N8cHBfZ2V0X21heF9ib3hlc3xwcF9nZXRfbWF4X2luZGVudHxwcF9nZXRfcHJpbnRfdGFnc3xwcF9vcGVuX2JveHxwcF9vcGVuX2hib3h8cHBfb3Blbl9ob3Zib3h8cHBfb3Blbl9odmJveHxwcF9vcGVuX3RhZ3xwcF9vcGVuX3Rib3h8cHBfb3Blbl92Ym94fHBwX292ZXJfbWF4X2JveGVzfHBwX3ByaW50X2FzfHBwX3ByaW50X2Jvb2x8cHBfcHJpbnRfYnJlYWt8cHBfcHJpbnRfY2hhcnxwcF9wcmludF9jdXR8cHBfcHJpbnRfZmxvYXR8cHBfcHJpbnRfZmx1c2h8cHBfcHJpbnRfaWZfbmV3bGluZXxwcF9wcmludF9pbnR8cHBfcHJpbnRfbmV3bGluZXxwcF9wcmludF9zcGFjZXxwcF9wcmludF9zdHJpbmd8cHBfcHJpbnRfdGFifHBwX3ByaW50X3RicmVha3xwcF9zZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX3NldF9lbGxpcHNpc190ZXh0fHBwX3NldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWx8cHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX3NldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xwcF9zZXRfbWFyZ2lufHBwX3NldF9tYXJrX3RhZ3N8cHBfc2V0X21heF9ib3hlc3xwcF9zZXRfbWF4X2luZGVudHxwcF9zZXRfcHJpbnRfdGFnc3xwcF9zZXRfdGFifHBwX3NldF90YWdzfHByZWR8cHJlZF9iaWdfaW50fHByZWRfbnVtfHByZXJyX2NoYXJ8cHJlcnJfZW5kbGluZXxwcmVycl9mbG9hdHxwcmVycl9pbnR8cHJlcnJfbmV3bGluZXxwcmVycl9zdHJpbmd8cHJpbnR8cHJpbnRfYXN8cHJpbnRfYm9vbHxwcmludF9icmVha3xwcmludF9jaGFyfHByaW50X2N1dHxwcmludF9lbmRsaW5lfHByaW50X2Zsb2F0fHByaW50X2ZsdXNofHByaW50X2lmX25ld2xpbmV8cHJpbnRfaW50fHByaW50X25ld2xpbmV8cHJpbnRfc3BhY2V8cHJpbnRfc3RhdHxwcmludF9zdHJpbmd8cHJpbnRfdGFifHByaW50X3RicmVha3xwcmludGZ8cHJvaGliaXR8cHVibGljX21ldGhvZF9sYWJlbHxwdXNofHB1dGVudnxxdW9fbnVtfHF1b21vZF9iaWdfaW50fHF1b3RlfHJhaXNlfHJhaXNlX3dpbmRvd3xyYXRpb19vZl9udW18cmNvbnRhaW5zX2Zyb218cmVhZHxyZWFkX2Zsb2F0fHJlYWRfaW50fHJlYWRfa2V5fHJlYWRfbGluZXxyZWFkZGlyfHJlYWRkaXJ8cmVhZGxpbmt8cmVhbGx5X2lucHV0fHJlY2VpdmV8cmVjdnxyZWN2ZnJvbXxyZWR8cmVmfHJlZ2V4cHxyZWdleHBfY2FzZV9mb2xkfHJlZ2V4cF9zdHJpbmd8cmVnZXhwX3N0cmluZ19jYXNlX2ZvbGR8cmVnaXN0ZXJ8cmVnaXN0ZXJfZXhjZXB0aW9ufHJlbXxyZW1lbWJlcl9tb2RlfHJlbW92ZXxyZW1vdmVfYXNzb2N8cmVtb3ZlX2Fzc3F8cmVuYW1lfHJlcGxhY2V8cmVwbGFjZV9maXJzdHxyZXBsYWNlX21hdGNoZWR8cmVwcnxyZXNldHxyZXNoYXBlfHJlc2hhcGVfMXxyZXNoYXBlXzJ8cmVzaGFwZV8zfHJldnxyZXZfYXBwZW5kfHJldl9tYXB8cmV2X21hcDJ8cmV3aW5kZGlyfHJnYnxyaHNfZW5kfHJoc19lbmRfcG9zfHJoc19zdGFydHxyaHNfc3RhcnRfcG9zfHJpbmRleHxyaW5kZXhfZnJvbXxybGluZXRvfHJtZGlyfHJtb3ZldG98cm91bmRfbnVtfHJ1bl9pbml0aWFsaXplcnN8cnVuX2luaXRpYWxpemVyc19vcHR8c2NhbmZ8c2VhcmNoX2JhY2t3YXJkfHNlYXJjaF9mb3J3YXJkfHNlZWtfaW58c2Vla19vdXR8c2VsZWN0fHNlbGZ8c2VsZl9pbml0fHNlbmR8c2VuZHRvfHNldHxzZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHNldF9hcHByb3hfcHJpbnRpbmd8c2V0X2JpbmFyeV9tb2RlX2lufHNldF9iaW5hcnlfbW9kZV9vdXR8c2V0X2Nsb3NlX29uX2V4ZWN8c2V0X2Nsb3NlX29uX2V4ZWN8c2V0X2NvbG9yfHNldF9lbGxpcHNpc190ZXh0fHNldF9lcnJvcl93aGVuX251bGxfZGVub21pbmF0b3J8c2V0X2ZpZWxkfHNldF9mbG9hdGluZ19wcmVjaXNpb258c2V0X2ZvbnR8c2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbHxzZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8c2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zfHNldF9saW5lX3dpZHRofHNldF9tYXJnaW58c2V0X21hcmtfdGFnc3xzZXRfbWF4X2JveGVzfHNldF9tYXhfaW5kZW50fHNldF9tZXRob2R8c2V0X25vbmJsb2NrfHNldF9ub25ibG9ja3xzZXRfbm9ybWFsaXplX3JhdGlvfHNldF9ub3JtYWxpemVfcmF0aW9fd2hlbl9wcmludGluZ3xzZXRfcHJpbnRfdGFnc3xzZXRfc2lnbmFsfHNldF9zdGF0ZXxzZXRfdGFifHNldF90YWd8c2V0X3RhZ3N8c2V0X3RleHRfc2l6ZXxzZXRfd2luZG93X3RpdGxlfHNldGdpZHxzZXRnaWR8c2V0aXRpbWVyfHNldGl0aW1lcnxzZXRzaWR8c2V0c2lkfHNldHNvY2tvcHR8c2V0c29ja29wdHxzZXRzb2Nrb3B0X2Zsb2F0fHNldHNvY2tvcHRfZmxvYXR8c2V0c29ja29wdF9pbnR8c2V0c29ja29wdF9pbnR8c2V0c29ja29wdF9vcHRpbnR8c2V0c29ja29wdF9vcHRpbnR8c2V0dWlkfHNldHVpZHxzaGlmdF9sZWZ0fHNoaWZ0X2xlZnR8c2hpZnRfbGVmdHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodF9sb2dpY2FsfHNoaWZ0X3JpZ2h0X2xvZ2ljYWx8c2hpZnRfcmlnaHRfbG9naWNhbHxzaG93X2J1Y2tldHN8c2h1dGRvd258c2h1dGRvd258c2h1dGRvd25fY29ubmVjdGlvbnxzaHV0ZG93bl9jb25uZWN0aW9ufHNpZ2FicnR8c2lnYWxybXxzaWdjaGxkfHNpZ2NvbnR8c2lnZnBlfHNpZ2h1cHxzaWdpbGx8c2lnaW50fHNpZ2tpbGx8c2lnbl9iaWdfaW50fHNpZ25fbnVtfHNpZ25hbHxzaWduYWx8c2lncGVuZGluZ3xzaWdwZW5kaW5nfHNpZ3BpcGV8c2lncHJvY21hc2t8c2lncHJvY21hc2t8c2lncHJvZnxzaWdxdWl0fHNpZ3NlZ3Z8c2lnc3RvcHxzaWdzdXNwZW5kfHNpZ3N1c3BlbmR8c2lndGVybXxzaWd0c3RwfHNpZ3R0aW58c2lndHRvdXxzaWd1c3IxfHNpZ3VzcjJ8c2lndnRhbHJtfHNpbnxzaW5nbGV0b258c2luaHxzaXplfHNpemV8c2l6ZV94fHNpemVfeXxzbGVlcHxzbGVlcHxzbGVlcHxzbGljZV9sZWZ0fHNsaWNlX2xlZnR8c2xpY2VfbGVmdF8xfHNsaWNlX2xlZnRfMnxzbGljZV9yaWdodHxzbGljZV9yaWdodHxzbGljZV9yaWdodF8xfHNsaWNlX3JpZ2h0XzJ8c25kfHNvY2tldHxzb2NrZXR8c29ja2V0fHNvY2tldHBhaXJ8c29ja2V0cGFpcnxzb3J0fHNvdW5kfHNwbGl0fHNwbGl0X2RlbGltfHNwcmludGZ8c3ByaW50ZnxzcXJ0fHNxcnR8c3FydF9iaWdfaW50fHNxdWFyZV9iaWdfaW50fHNxdWFyZV9udW18c3NjYW5mfHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YXR8c3RhdHxzdGF0fHN0YXR8c3RhdHxzdGF0c3xzdGF0c3xzdGRfZm9ybWF0dGVyfHN0ZGJ1ZnxzdGRlcnJ8c3RkZXJyfHN0ZGVycnxzdGRpYnxzdGRpbnxzdGRpbnxzdGRpbnxzdGRvdXR8c3Rkb3V0fHN0ZG91dHxzdHJfZm9ybWF0dGVyfHN0cmluZ3xzdHJpbmdfYWZ0ZXJ8c3RyaW5nX2JlZm9yZXxzdHJpbmdfbWF0Y2h8c3RyaW5nX29mX2JpZ19pbnR8c3RyaW5nX29mX2Jvb2x8c3RyaW5nX29mX2Zsb2F0fHN0cmluZ19vZl9mb3JtYXR8c3RyaW5nX29mX2luZXRfYWRkcnxzdHJpbmdfb2ZfaW5ldF9hZGRyfHN0cmluZ19vZl9pbnR8c3RyaW5nX29mX251bXxzdHJpbmdfcGFydGlhbF9tYXRjaHxzdHJpbmdfdGFnfHN1YnxzdWJ8c3ViX2JpZ19pbnR8c3ViX2xlZnR8c3ViX251bXxzdWJfcmlnaHR8c3Vic2V0fHN1YnNldHxzdWJzdGl0dXRlX2ZpcnN0fHN1YnN0cmluZ3xzdWNjfHN1Y2N8c3VjY3xzdWNjfHN1Y2NfYmlnX2ludHxzdWNjX251bXxzeW1ib2xfZW5kfHN5bWJvbF9lbmRfcG9zfHN5bWJvbF9zdGFydHxzeW1ib2xfc3RhcnRfcG9zfHN5bWxpbmt8c3ltbGlua3xzeW5jfHN5bmNocm9uaXplfHN5c3RlbXxzeXN0ZW18c3lzdGVtfHRhZ3x0YWtlfHRhbnx0YW5ofHRjZHJhaW58dGNkcmFpbnx0Y2Zsb3d8dGNmbG93fHRjZmx1c2h8dGNmbHVzaHx0Y2dldGF0dHJ8dGNnZXRhdHRyfHRjc2VuZGJyZWFrfHRjc2VuZGJyZWFrfHRjc2V0YXR0cnx0Y3NldGF0dHJ8dGVtcF9maWxlfHRleHRfc2l6ZXx0aW1lfHRpbWV8dGltZXx0aW1lZF9yZWFkfHRpbWVkX3dyaXRlfHRpbWVzfHRpbWVzfHRsfHRsfHRsfHRvX2J1ZmZlcnx0b19jaGFubmVsfHRvX2Zsb2F0fHRvX2hleHx0b19pbnR8dG9faW50MzJ8dG9fbGlzdHx0b19saXN0fHRvX2xpc3R8dG9fbmF0aXZlaW50fHRvX3N0cmluZ3x0b19zdHJpbmd8dG9fc3RyaW5nfHRvX3N0cmluZ3x0b19zdHJpbmd8dG9wfHRvcHx0b3RhbF9zaXplfHRyYW5zZmVyfHRyYW5zcHx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnlfbG9ja3x1bWFza3x1bWFza3x1bmNhcGl0YWxpemV8dW5jYXBpdGFsaXplfHVuY2FwaXRhbGl6ZXx1bmlvbnx1bmlvbnx1bml0X2JpZ19pbnR8dW5saW5rfHVubGlua3x1bmxvY2t8dW5tYXJzaGFsfHVuc2FmZV9ibGl0fHVuc2FmZV9maWxsfHVuc2FmZV9nZXR8dW5zYWZlX2dldHx1bnNhZmVfc2V0fHVuc2FmZV9zZXR8dXBkYXRlfHVwcGVyY2FzZXx1cHBlcmNhc2V8dXBwZXJjYXNlfHVwcGVyY2FzZXx1c2FnZXx1dGltZXN8dXRpbWVzfHdhaXR8d2FpdHx3YWl0fHdhaXR8d2FpdF9uZXh0X2V2ZW50fHdhaXRfcGlkfHdhaXRfcmVhZHx3YWl0X3NpZ25hbHx3YWl0X3RpbWVkX3JlYWR8d2FpdF90aW1lZF93cml0ZXx3YWl0X3dyaXRlfHdhaXRwaWR8d2hpdGV8d2lkZW58d2luZG93X2lkfHdvcmRfc2l6ZXx3cmFwfHdyYXBfYWJvcnR8d3JpdGV8eWVsbG93fHlpZWxkfHplcm98emVyb19iaWdfaW50fEFyZ3xBcml0aF9zdGF0dXN8QXJyYXl8QXJyYXkxfEFycmF5MnxBcnJheTN8QXJyYXlMYWJlbHN8QmlnX2ludHxCaWdhcnJheXxCdWZmZXJ8Q2FsbGJhY2t8Q2FtbGludGVybmFsT098Q2hhcnxDb21wbGV4fENvbmRpdGlvbnxEYm18RGlnZXN0fER5bmxpbmt8RXZlbnR8RmlsZW5hbWV8Rm9ybWF0fEdjfEdlbmFycmF5fEdlbmxleHxHcmFwaGljc3xHcmFwaGljc1gxMXxIYXNodGJsfEludDMyfEludDY0fExhcmdlRmlsZXxMYXp5fExleGluZ3xMaXN0fExpc3RMYWJlbHN8TWFrZXxNYXB8TWFyc2hhbHxNb3JlTGFiZWxzfE11dGV4fE5hdGl2ZWludHxOdW18T2JqfE9vfFBhcnNpbmd8UGVydmFzaXZlc3xQcmludGV4Y3xQcmludGZ8UXVldWV8UmFuZG9tfFNjYW5mfFNjYW5uaW5nfFNldHxTb3J0fFN0YWNrfFN0YXRlfFN0ZExhYmVsc3xTdHJ8U3RyZWFtfFN0cmluZ3xTdHJpbmdMYWJlbHN8U3lzfFRocmVhZHxUaHJlYWRVbml4fFRrfFVuaXh8VW5peExhYmVsc3xXZWFrIi5zcGxpdCgifCIpKSxkPSIoPzooPzpbMS05XVxcZCopfCg/OjApKSIsZj0iKD86MFtvT10/WzAtN10rKSIsZz0iKD86MFt4WF1bXFxkQS1GYS1mXSspIixoPSIoPzowW2JCXVswMV0rKSIsaT0iKD86IitkKyJ8IitmKyJ8IitnKyJ8IitoKyIpIixqPSIoPzpbZUVdWystXT9cXGQrKSIsaz0iKD86XFwuXFxkKykiLGw9Iig/OlxcZCspIixtPSIoPzooPzoiK2wrIj8iK2srIil8KD86IitsKyJcXC4pKSIsbj0iKD86KD86IittKyJ8IitsKyIpIitqKyIpIixvPSIoPzoiK24rInwiK20rIikiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwoXFwqLio/XFwqXFwpXFxzKj8kIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwoXFwqLioiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuJyJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonIicsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6Iig/OiIrbysifFxcZCspW2pKXVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6b30se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDppKyJcXGIifSx7dG9rZW46ZnVuY3Rpb24oZCl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZCk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoZCk/ImNvbnN0YW50Lmxhbmd1YWdlIjpjLmhhc093blByb3BlcnR5KGQpPyJzdXBwb3J0LmZ1bmN0aW9uIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXCtcXC58XFwtXFwufFxcKlxcLnxcXC9cXC58I3w7O3xcXCt8XFwtfFxcKnxcXCpcXCpcXC98XFwvXFwvfCV8PDx8Pj58JnxcXHx8XFxefH58PHw+fDw9fD0+fD09fCE9fDw+fDwtfD0ifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXCkiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiciJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19fTtkLmluaGVyaXRzKGcsZiksYi5PY2FtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-perl-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBQYW5hZ2lvdGlzIEFzdGl0aGFzIDxwYXN0aXRoIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9wZXJsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBQZXJsSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3BlcmxfaGlnaGxpZ2h0X3J1bGVzIikuUGVybEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFBlcmxIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgew0KICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7DQogICAgICAgIHZhciByZSA9IC9eKFxzKikjLzsNCg0KICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsNCiAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsNCiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAob3V0ZGVudCkgew0KICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5yb3cgPSBpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBkb2MucmVwbGFjZShkZWxldGVSYW5nZSwgbVsxXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiIyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgUGFuYWdpb3RpcyBBc3RpdGhhcyA8cGFzdGl0aCBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgUGVybEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYmFzZXxjb25zdGFudHxjb250aW51ZXxlbHNlfGVsc2lmfGZvcnxmb3JlYWNofGZvcm1hdHxnb3RvfGlmfGxhc3R8bG9jYWx8bXl8bmV4dHwiICsNCiAgICAgICAgICJub3xwYWNrYWdlfHBhcmVudHxyZWRvfHJlcXVpcmV8c2NhbGFyfHN1Ynx1bmxlc3N8dW50aWx8d2hpbGV8dXNlfHZhcnMiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIkFSR1Z8RU5WfElOQ3xTSUciKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImdldHByb3RvYnludW1iZXJ8Z2V0cHJvdG9ieW5hbWV8Z2V0c2VydmJ5bmFtZXxnZXRob3N0YnlhZGRyfCIgKw0KICAgICAgICAgImdldGhvc3RieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRuZXRieWFkZHJ8Z2V0bmV0YnluYW1lfGdldHNvY2tuYW1lfCIgKw0KICAgICAgICAgImdldHBlZXJuYW1lfHNldHByaW9yaXR5fGdldHByb3RvZW50fHNldHByb3RvZW50fGdldHByaW9yaXR5fCIgKw0KICAgICAgICAgImVuZHByb3RvZW50fGdldHNlcnZlbnR8c2V0c2VydmVudHxlbmRzZXJ2ZW50fHNldGhvc3RlbnR8c29ja2V0cGFpcnwiICsNCiAgICAgICAgICJnZXRzb2Nrb3B0fGdldGhvc3RlbnR8ZW5kaG9zdGVudHxzZXRzb2Nrb3B0fHNldG5ldGVudHxxdW90ZW1ldGF8IiArDQogICAgICAgICAibG9jYWx0aW1lfHByb3RvdHlwZXxnZXRuZXRlbnR8ZW5kbmV0ZW50fHJld2luZGRpcnx3YW50YXJyYXl8Z2V0cHd1aWR8IiArDQogICAgICAgICAiY2xvc2VkaXJ8Z2V0bG9naW58cmVhZGxpbmt8ZW5kZ3JlbnR8Z2V0Z3JnaWR8Z2V0Z3JuYW18c2htd3JpdGV8IiArDQogICAgICAgICAic2h1dGRvd258cmVhZGxpbmV8ZW5kcHdlbnR8c2V0Z3JlbnR8cmVhZHBpcGV8Zm9ybWxpbmV8dHJ1bmNhdGV8IiArDQogICAgICAgICAiZGJtY2xvc2V8c3lzd3JpdGV8c2V0cHdlbnR8Z2V0cHduYW18Z2V0Z3JlbnR8Z2V0cHdlbnR8dWNmaXJzdHxzeXNyZWFkfCIgKw0KICAgICAgICAgInNldHBncnB8c2htcmVhZHxzeXNzZWVrfHN5c29wZW58dGVsbGRpcnxkZWZpbmVkfG9wZW5kaXJ8Y29ubmVjdHwiICsNCiAgICAgICAgICJsY2ZpcnN0fGdldHBwaWR8YmlubW9kZXxzeXNjYWxsfHNwcmludGZ8Z2V0cGdycHxyZWFkZGlyfHNlZWtkaXJ8IiArDQogICAgICAgICAid2FpdHBpZHxyZXZlcnNlfHVuc2hpZnR8c3ltbGlua3xkYm1vcGVufHNlbWdldHxtc2dyY3Z8cmVuYW1lfGxpc3RlbnwiICsNCiAgICAgICAgICJjaHJvb3R8bXNnc25kfHNobWN0bHxhY2NlcHR8dW5wYWNrfGV4aXN0c3xmaWxlbm98c2htZ2V0fHN5c3RlbXwiICsNCiAgICAgICAgICJ1bmxpbmt8cHJpbnRmfGdtdGltZXxtc2djdGx8c2VtY3RsfHZhbHVlc3xyaW5kZXh8c3Vic3RyfHNwbGljZXwiICsNCiAgICAgICAgICJsZW5ndGh8bXNnZ2V0fHNlbGVjdHxzb2NrZXR8cmV0dXJufGNhbGxlcnxkZWxldGV8YWxhcm18aW9jdGx8aW5kZXh8IiArDQogICAgICAgICAidW5kZWZ8bHN0YXR8dGltZXN8c3JhbmR8Y2hvd258ZmNudGx8Y2xvc2V8d3JpdGV8dW1hc2t8cm1kaXJ8c3R1ZHl8IiArDQogICAgICAgICAic2xlZXB8Y2hvbXB8dW50aWV8cHJpbnR8dXRpbWV8bWtkaXJ8YXRhbjJ8c3BsaXR8Y3J5cHR8ZmxvY2t8Y2htb2R8IiArDQogICAgICAgICAiQkVHSU58Ymxlc3N8Y2hkaXJ8c2Vtb3B8c2hpZnR8cmVzZXR8bGlua3xzdGF0fGNob3B8Z3JlcHxmb3JrfGR1bXB8IiArDQogICAgICAgICAiam9pbnxvcGVufHRlbGx8cGlwZXxleGl0fGdsb2J8d2FybnxlYWNofGJpbmR8c29ydHxwYWNrfGV2YWx8cHVzaHwiICsNCiAgICAgICAgICJrZXlzfGdldGN8a2lsbHxzZWVrfHNxcnR8c2VuZHx3YWl0fHJhbmR8dGllZHxyZWFkfHRpbWV8ZXhlY3xyZWN2fCIgKw0KICAgICAgICAgImVvZnxjaHJ8aW50fG9yZHxleHB8cG9zfHBvcHxzaW58bG9nfGFic3xvY3R8aGV4fHRpZXxjb3N8dmVjfEVORHxyZWZ8IiArDQogICAgICAgICAibWFwfGRpZXx1Y3xsY3xkbyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIweFswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwuXFwuXFwufFxcfFxcfD18Pj49fDw8PXw8PT58JiY9fD0+fCF+fFxcXj18Jj18XFx8PXxcXC49fHg9fCU9fFxcLz18XFwqPXxcXC09fFxcKz18PX58XFwqXFwqfFxcLVxcLXxcXC5cXC58XFx8XFx8fCYmfFxcK1xcK3xcXC0+fCE9fD09fD49fDw9fD4+fDw8fCx8PXxcXD9cXDp8XFxefFxcfHx4fCV8XFwvfFxcKnw8fCZ8XFxcXHx+fCF8PnxcXC58XFwtfFxcK3xcXC1DfFxcLWJ8XFwtU3xcXC11fFxcLXR8XFwtcHxcXC1sfFxcLWR8XFwtZnxcXC1nfFxcLXN8XFwtenxcXC1rfFxcLWV8XFwtT3xcXC1UfFxcLUJ8XFwtTXxcXC1BfFxcLVh8XFwtV3xcXC1jfFxcLVJ8XFwtb3xcXC14fFxcLXd8XFwtcnxcXGIoPzphbmR8Y21wfGVxfGdlfGd0fGxlfGx0fG5lfG5vdHxvcnx4b3IpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKFBlcmxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5QZXJsSGlnaGxpZ2h0UnVsZXMgPSBQZXJsSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsNCg0KICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOw0KICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHJlID0gL15ccyovOw0KICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7DQogICAgICAgIHZhciBlbmRSb3cgPSByb3c7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsNCiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpDQogICAgICAgIA0KICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsNCiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZW5kUm93ID0gcm93Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOw0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07DQogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOw0KICAgICAgICBpZiAoIWVuZCkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOw0KICAgICAgICBpZiAoZncgPT0gbnVsbCkNCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOw0KDQogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7DQogICAgICAgICAgICBlbmQucm93IC0tOw0KICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-perl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9wZXJsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3BlcmxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9wZXJsX2hpZ2hsaWdodF9ydWxlcyIpLlBlcmxIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhrLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopIy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIiMiKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQiKXt2YXIgZz1iLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pO2cmJihkKz1jKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJiYXNlfGNvbnN0YW50fGNvbnRpbnVlfGVsc2V8ZWxzaWZ8Zm9yfGZvcmVhY2h8Zm9ybWF0fGdvdG98aWZ8bGFzdHxsb2NhbHxteXxuZXh0fG5vfHBhY2thZ2V8cGFyZW50fHJlZG98cmVxdWlyZXxzY2FsYXJ8c3VifHVubGVzc3x1bnRpbHx3aGlsZXx1c2V8dmFycyIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIkFSR1Z8RU5WfElOQ3xTSUciLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0bmV0YnlhZGRyfGdldG5ldGJ5bmFtZXxnZXRzb2NrbmFtZXxnZXRwZWVybmFtZXxzZXRwcmlvcml0eXxnZXRwcm90b2VudHxzZXRwcm90b2VudHxnZXRwcmlvcml0eXxlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8Z2V0c29ja29wdHxnZXRob3N0ZW50fGVuZGhvc3RlbnR8c2V0c29ja29wdHxzZXRuZXRlbnR8cXVvdGVtZXRhfGxvY2FsdGltZXxwcm90b3R5cGV8Z2V0bmV0ZW50fGVuZG5ldGVudHxyZXdpbmRkaXJ8d2FudGFycmF5fGdldHB3dWlkfGNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfHNodXRkb3dufHJlYWRsaW5lfGVuZHB3ZW50fHNldGdyZW50fHJlYWRwaXBlfGZvcm1saW5lfHRydW5jYXRlfGRibWNsb3NlfHN5c3dyaXRlfHNldHB3ZW50fGdldHB3bmFtfGdldGdyZW50fGdldHB3ZW50fHVjZmlyc3R8c3lzcmVhZHxzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8bGNmaXJzdHxnZXRwcGlkfGJpbm1vZGV8c3lzY2FsbHxzcHJpbnRmfGdldHBncnB8cmVhZGRpcnxzZWVrZGlyfHdhaXRwaWR8cmV2ZXJzZXx1bnNoaWZ0fHN5bWxpbmt8ZGJtb3BlbnxzZW1nZXR8bXNncmN2fHJlbmFtZXxsaXN0ZW58Y2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18dW5saW5rfHByaW50ZnxnbXRpbWV8bXNnY3RsfHNlbWN0bHx2YWx1ZXN8cmluZGV4fHN1YnN0cnxzcGxpY2V8bGVuZ3RofG1zZ2dldHxzZWxlY3R8c29ja2V0fHJldHVybnxjYWxsZXJ8ZGVsZXRlfGFsYXJtfGlvY3RsfGluZGV4fHVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fHNsZWVwfGNob21wfHVudGllfHByaW50fHV0aW1lfG1rZGlyfGF0YW4yfHNwbGl0fGNyeXB0fGZsb2NrfGNobW9kfEJFR0lOfGJsZXNzfGNoZGlyfHNlbW9wfHNoaWZ0fHJlc2V0fGxpbmt8c3RhdHxjaG9wfGdyZXB8Zm9ya3xkdW1wfGpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8a2V5c3xnZXRjfGtpbGx8c2Vla3xzcXJ0fHNlbmR8d2FpdHxyYW5kfHRpZWR8cmVhZHx0aW1lfGV4ZWN8cmVjdnxlb2Z8Y2hyfGludHxvcmR8ZXhwfHBvc3xwb3B8c2lufGxvZ3xhYnN8b2N0fGhleHx0aWV8Y29zfHZlY3xFTkR8cmVmfG1hcHxkaWV8dWN8bGN8ZG8iLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMHhbMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmMuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLlxcLlxcLnxcXHxcXHw9fD4+PXw8PD18PD0+fCYmPXw9PnwhfnxcXF49fCY9fFxcfD18XFwuPXx4PXwlPXxcXC89fFxcKj18XFwtPXxcXCs9fD1+fFxcKlxcKnxcXC1cXC18XFwuXFwufFxcfFxcfHwmJnxcXCtcXCt8XFwtPnwhPXw9PXw+PXw8PXw+Pnw8PHwsfD18XFw/XFw6fFxcXnxcXHx8eHwlfFxcL3xcXCp8PHwmfFxcXFx8fnwhfD58XFwufFxcLXxcXCt8XFwtQ3xcXC1ifFxcLVN8XFwtdXxcXC10fFxcLXB8XFwtbHxcXC1kfFxcLWZ8XFwtZ3xcXC1zfFxcLXp8XFwta3xcXC1lfFxcLU98XFwtVHxcXC1CfFxcLU18XFwtQXxcXC1YfFxcLVd8XFwtY3xcXC1SfFxcLW98XFwteHxcXC13fFxcLXJ8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKSJ9LHt0b2tlbjoibHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuUGVybEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-pgsql-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCioNCiogQ29udHJpYnV0b3Iocyk6DQoqICAgICAgSm9uYXRoYW4gQ2FtaWxlIDxqb25hdGhhbi5jYW1pbGUgQVQgZ21haWwgRE9UIGNvbT4NCioNCiogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQoqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQoqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQoqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQoqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCioNCiogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9wZ3NxbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCiAgICB2YXIgb29wID0gcmVxdWlyZSgiYWNlL2xpYi9vb3AiKTsNCiAgICB2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCJhY2UvbW9kZS90ZXh0IikuTW9kZTsNCiAgICB2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiYWNlL3Rva2VuaXplciIpLlRva2VuaXplcjsNCiAgICB2YXIgUGdzcWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoImFjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlBnc3FsSGlnaGxpZ2h0UnVsZXM7DQogICAgdmFyIFJhbmdlID0gcmVxdWlyZSgiYWNlL3JhbmdlIikuUmFuZ2U7DQogICAgLy8gdmFyIEVkaXRTZXNzaW9uID0gcmVxdWlyZSgiYWNlL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uOw0KDQogICAgdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUGdzcWxIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIH07DQogICAgb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KICAgIChmdW5jdGlvbigpIHsNCg0KICAgICAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgICAgIC8vIHZhciBvdXRlbnRlZFJvd3MgPSBbXTsNCiAgICAgICAgICAgIHZhciByZSA9IC9eKFxzKiktLS87DQoNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiLS0iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KDQogICAgICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7IA0KICAgICAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gImtleXdvcmQuc3RhdGVtZW50RW5kIikgew0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsgLy8gS2VlcCB3aGF0ZXZlciBpbmRlbnQgdGhlIHByZXZpb3VzIGxpbmUgaGFzDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgIH0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQogICAgZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEpvaG4gRGVTb2ksIFBoLkQuIDxkZXNvaSBBVCBwZ2VkaXQgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKg0KICoNCiAqLw0KDQoNCmRlZmluZSgnYWNlL21vZGUvcGdzcWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3BlcmxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCnZhciBvb3AgPSByZXF1aXJlKCJhY2UvbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCJhY2UvbGliL2xhbmciKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KLy8gU3VwcG9ydGluZyBwZXJsIGFuZCBweXRob24gZm9yIG5vdyAtLSBib3RoIGluIHBnIGNvcmUgYW5kIGFjZQ0KdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcGVybF9oaWdobGlnaHRfcnVsZXMiKS5QZXJsSGlnaGxpZ2h0UnVsZXM7DQp2YXIgUHl0aG9uSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiKS5QeXRob25IaWdobGlnaHRSdWxlczsNCg0KdmFyIFBnc3FsSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCiAgICANCiAgICAvLyBLZXl3b3JkcywgZnVuY3Rpb25zLCBvcGVyYXRvcnMgbGFzdCB1cGRhdGVkIGZvciBwZyA5LjEuDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFib3J0fGFic29sdXRlfGFic3RpbWV8YWNjZXNzfGFjbGl0ZW18YWN0aW9ufGFkZHxhZG1pbnxhZnRlcnxhZ2dyZWdhdGV8YWxsfGFsc298YWx0ZXJ8YWx3YXlzfCIgKw0KICAgICAgICAiYW5hbHlzZXxhbmFseXplfGFuZHxhbnl8YW55YXJyYXl8YW55ZWxlbWVudHxhbnllbnVtfGFueW5vbmFycmF5fGFycmF5fGFzfGFzY3xhc3NlcnRpb258IiArDQogICAgICAgICJhc3NpZ25tZW50fGFzeW1tZXRyaWN8YXR8YXR0cmlidXRlfGF1dGhvcml6YXRpb258YmFja3dhcmR8YmVmb3JlfGJlZ2lufGJldHdlZW58YmlnaW50fCIgKw0KICAgICAgICAiYmluYXJ5fGJpdHxib29sfGJvb2xlYW58Ym90aHxib3h8YnBjaGFyfGJ5fGJ5dGVhfGNhY2hlfGNhbGxlZHxjYXNjYWRlfGNhc2NhZGVkfGNhc2V8Y2FzdHwiICsNCiAgICAgICAgImNhdGFsb2d8Y2hhaW58Y2hhcnxjaGFyYWN0ZXJ8Y2hhcmFjdGVyaXN0aWNzfGNoZWNrfGNoZWNrcG9pbnR8Y2lkfGNpZHJ8Y2lyY2xlfGNsYXNzfGNsb3NlfCIgKw0KICAgICAgICAiY2x1c3Rlcnxjb2FsZXNjZXxjb2xsYXRlfGNvbGxhdGlvbnxjb2x1bW58Y29tbWVudHxjb21tZW50c3xjb21taXR8Y29tbWl0dGVkfGNvbmN1cnJlbnRseXwiICsNCiAgICAgICAgImNvbmZpZ3VyYXRpb258Y29ubmVjdGlvbnxjb25zdHJhaW50fGNvbnN0cmFpbnRzfGNvbnRlbnR8Y29udGludWV8Y29udmVyc2lvbnxjb3B5fGNvc3R8IiArDQogICAgICAgICJjcmVhdGV8Y3Jvc3N8Y3N0cmluZ3xjc3Z8Y3VycmVudHxjdXJyZW50X2NhdGFsb2d8Y3VycmVudF9kYXRlfGN1cnJlbnRfcm9sZXwiICsNCiAgICAgICAgImN1cnJlbnRfc2NoZW1hfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxjdXJyZW50X3VzZXJ8Y3Vyc29yfGN5Y2xlfGRhdGF8ZGF0YWJhc2V8IiArDQogICAgICAgICJkYXRlfGRheXxkZWFsbG9jYXRlfGRlY3xkZWNpbWFsfGRlY2xhcmV8ZGVmYXVsdHxkZWZhdWx0c3xkZWZlcnJhYmxlfGRlZmVycmVkfGRlZmluZXJ8ZGVsZXRlfCIgKw0KICAgICAgICAiZGVsaW1pdGVyfGRlbGltaXRlcnN8ZGVzY3xkaWN0aW9uYXJ5fGRpc2FibGV8ZGlzY2FyZHxkaXN0aW5jdHxkb3xkb2N1bWVudHxkb21haW58ZG91YmxlfCIgKw0KICAgICAgICAiZHJvcHxlYWNofGVsc2V8ZW5hYmxlfGVuY29kaW5nfGVuY3J5cHRlZHxlbmR8ZW51bXxlc2NhcGV8ZXhjZXB0fGV4Y2x1ZGV8ZXhjbHVkaW5nfGV4Y2x1c2l2ZXwiICsNCiAgICAgICAgImV4ZWN1dGV8ZXhpc3RzfGV4cGxhaW58ZXh0ZW5zaW9ufGV4dGVybmFsfGV4dHJhY3R8ZmFsc2V8ZmFtaWx5fGZkd19oYW5kbGVyfGZldGNofGZpcnN0fCIgKw0KICAgICAgICAiZmxvYXR8ZmxvYXQ0fGZsb2F0OHxmb2xsb3dpbmd8Zm9yfGZvcmNlfGZvcmVpZ258Zm9yd2FyZHxmcmVlemV8ZnJvbXxmdWxsfGZ1bmN0aW9ufGZ1bmN0aW9uc3wiICsNCiAgICAgICAgImdsb2JhbHxncmFudHxncmFudGVkfGdyZWF0ZXN0fGdyb3VwfGd0c3ZlY3RvcnxoYW5kbGVyfGhhdmluZ3xoZWFkZXJ8aG9sZHxob3VyfGlkZW50aXR5fGlmfCIgKw0KICAgICAgICAiaWxpa2V8aW1tZWRpYXRlfGltbXV0YWJsZXxpbXBsaWNpdHxpbnxpbmNsdWRpbmd8aW5jcmVtZW50fGluZGV4fGluZGV4ZXN8aW5ldHxpbmhlcml0fCIgKw0KICAgICAgICAiaW5oZXJpdHN8aW5pdGlhbGx5fGlubGluZXxpbm5lcnxpbm91dHxpbnB1dHxpbnNlbnNpdGl2ZXxpbnNlcnR8aW5zdGVhZHxpbnR8aW50MnxpbnQydmVjdG9yfCIgKw0KICAgICAgICAiaW50NHxpbnQ4fGludGVnZXJ8aW50ZXJuYWx8aW50ZXJzZWN0fGludGVydmFsfGludG98aW52b2tlcnxpc3xpc251bGx8aXNvbGF0aW9ufGpvaW58a2V5fGxhYmVsfCIgKw0KICAgICAgICAibGFuZ3VhZ2V8bGFuZ3VhZ2VfaGFuZGxlcnxsYXJnZXxsYXN0fGxjX2NvbGxhdGV8bGNfY3R5cGV8bGVhZGluZ3xsZWFzdHxsZWZ0fGxldmVsfGxpa2V8IiArDQogICAgICAgICJsaW1pdHxsaW5lfGxpc3Rlbnxsb2FkfGxvY2FsfGxvY2FsdGltZXxsb2NhbHRpbWVzdGFtcHxsb2NhdGlvbnxsb2NrfGxzZWd8bWFjYWRkcnxtYXBwaW5nfCIgKw0KICAgICAgICAibWF0Y2h8bWF4dmFsdWV8bWludXRlfG1pbnZhbHVlfG1vZGV8bW9uZXl8bW9udGh8bW92ZXxuYW1lfG5hbWVzfG5hdGlvbmFsfG5hdHVyYWx8bmNoYXJ8bmV4dHxub3wiICsNCiAgICAgICAgIm5vbmV8bm90fG5vdGhpbmd8bm90aWZ5fG5vdG51bGx8bm93YWl0fG51bGx8bnVsbGlmfG51bGxzfG51bWVyaWN8b2JqZWN0fG9mfG9mZnxvZmZzZXR8b2lkfG9pZHN8IiArDQogICAgICAgICJvaWR2ZWN0b3J8b258b25seXxvcGFxdWV8b3BlcmF0b3J8b3B0aW9ufG9wdGlvbnN8b3J8b3JkZXJ8b3V0fG91dGVyfG92ZXJ8b3ZlcmxhcHN8b3ZlcmxheXwiICsNCiAgICAgICAgIm93bmVkfG93bmVyfHBhcnNlcnxwYXJ0aWFsfHBhcnRpdGlvbnxwYXNzaW5nfHBhc3N3b3JkfHBhdGh8cGdfYXR0cmlidXRlfHBnX2F1dGhfbWVtYmVyc3wiICsNCiAgICAgICAgInBnX2F1dGhpZHxwZ19jbGFzc3xwZ19kYXRhYmFzZXxwZ19ub2RlX3RyZWV8cGdfcHJvY3xwZ190eXBlfHBsYWNpbmd8cGxhbnN8cG9pbnR8cG9seWdvbnwiICsNCiAgICAgICAgInBvc2l0aW9ufHByZWNlZGluZ3xwcmVjaXNpb258cHJlcGFyZXxwcmVwYXJlZHxwcmVzZXJ2ZXxwcmltYXJ5fHByaW9yfHByaXZpbGVnZXN8IiArDQogICAgICAgICJwcm9jZWR1cmFsfHByb2NlZHVyZXxxdW90ZXxyYW5nZXxyZWFkfHJlYWx8cmVhc3NpZ258cmVjaGVja3xyZWNvcmR8cmVjdXJzaXZlfHJlZnxyZWZjdXJzb3J8IiArDQogICAgICAgICJyZWZlcmVuY2VzfHJlZ2NsYXNzfHJlZ2NvbmZpZ3xyZWdkaWN0aW9uYXJ5fHJlZ29wZXJ8cmVnb3BlcmF0b3J8cmVncHJvY3xyZWdwcm9jZWR1cmV8IiArDQogICAgICAgICJyZWd0eXBlfHJlaW5kZXh8cmVsYXRpdmV8cmVsZWFzZXxyZWx0aW1lfHJlbmFtZXxyZXBlYXRhYmxlfHJlcGxhY2V8cmVwbGljYXxyZXNldHxyZXN0YXJ0fCIgKw0KICAgICAgICAicmVzdHJpY3R8cmV0dXJuaW5nfHJldHVybnN8cmV2b2tlfHJpZ2h0fHJvbGV8cm9sbGJhY2t8cm93fHJvd3N8cnVsZXxzYXZlcG9pbnR8c2NoZW1hfHNjcm9sbHwiICsNCiAgICAgICAgInNlYXJjaHxzZWNvbmR8c2VjdXJpdHl8c2VsZWN0fHNlcXVlbmNlfHNlcXVlbmNlc3xzZXJpYWxpemFibGV8c2VydmVyfHNlc3Npb258c2Vzc2lvbl91c2VyfCIgKw0KICAgICAgICAic2V0fHNldG9mfHNoYXJlfHNob3d8c2ltaWxhcnxzaW1wbGV8c21hbGxpbnR8c21ncnxzb21lfHN0YWJsZXxzdGFuZGFsb25lfHN0YXJ0fHN0YXRlbWVudHwiICsNCiAgICAgICAgInN0YXRpc3RpY3N8c3RkaW58c3Rkb3V0fHN0b3JhZ2V8c3RyaWN0fHN0cmlwfHN1YnN0cmluZ3xzeW1tZXRyaWN8c3lzaWR8c3lzdGVtfHRhYmxlfHRhYmxlc3wiICsNCiAgICAgICAgInRhYmxlc3BhY2V8dGVtcHx0ZW1wbGF0ZXx0ZW1wb3Jhcnl8dGV4dHx0aGVufHRpZHx0aW1lfHRpbWVzdGFtcHx0aW1lc3RhbXB0enx0aW1ldHp8IiArDQogICAgICAgICJ0aW50ZXJ2YWx8dG98dHJhaWxpbmd8dHJhbnNhY3Rpb258dHJlYXR8dHJpZ2dlcnx0cmltfHRydWV8dHJ1bmNhdGV8dHJ1c3RlZHx0c3F1ZXJ5fHRzdmVjdG9yfCIgKw0KICAgICAgICAidHhpZF9zbmFwc2hvdHx0eXBlfHVuYm91bmRlZHx1bmNvbW1pdHRlZHx1bmVuY3J5cHRlZHx1bmlvbnx1bmlxdWV8dW5rbm93bnx1bmxpc3RlbnwiICsNCiAgICAgICAgInVubG9nZ2VkfHVudGlsfHVwZGF0ZXx1c2VyfHVzaW5nfHV1aWR8dmFjdXVtfHZhbGlkfHZhbGlkYXRlfHZhbGlkYXRvcnx2YWx1ZXx2YWx1ZXN8dmFyYml0fCIgKw0KICAgICAgICAidmFyY2hhcnx2YXJpYWRpY3x2YXJ5aW5nfHZlcmJvc2V8dmVyc2lvbnx2aWV3fHZvaWR8dm9sYXRpbGV8d2hlbnx3aGVyZXx3aGl0ZXNwYWNlfHdpbmRvd3wiICsNCiAgICAgICAgIndpdGh8d2l0aG91dHx3b3JrfHdyYXBwZXJ8d3JpdGV8eGlkfHhtbHx4bWxhdHRyaWJ1dGVzfHhtbGNvbmNhdHx4bWxlbGVtZW50fHhtbGV4aXN0c3wiICsNCiAgICAgICAgInhtbGZvcmVzdHx4bWxwYXJzZXx4bWxwaXx4bWxyb290fHhtbHNlcmlhbGl6ZXx5ZWFyfHllc3x6b25lIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiUklfRktleV9jYXNjYWRlX2RlbHxSSV9GS2V5X2Nhc2NhZGVfdXBkfFJJX0ZLZXlfY2hlY2tfaW5zfFJJX0ZLZXlfY2hlY2tfdXBkfCIgKw0KICAgICAgICAiUklfRktleV9ub2FjdGlvbl9kZWx8UklfRktleV9ub2FjdGlvbl91cGR8UklfRktleV9yZXN0cmljdF9kZWx8UklfRktleV9yZXN0cmljdF91cGR8IiArDQogICAgICAgICJSSV9GS2V5X3NldGRlZmF1bHRfZGVsfFJJX0ZLZXlfc2V0ZGVmYXVsdF91cGR8UklfRktleV9zZXRudWxsX2RlbHwiICsNCiAgICAgICAgIlJJX0ZLZXlfc2V0bnVsbF91cGR8YWJicmV2fGFic3xhYnN0aW1lfGFic3RpbWVlcXxhYnN0aW1lZ2V8YWJzdGltZWd0fGFic3RpbWVpbnxhYnN0aW1lbGV8IiArDQogICAgICAgICJhYnN0aW1lbHR8YWJzdGltZW5lfGFic3RpbWVvdXR8YWJzdGltZXJlY3Z8YWJzdGltZXNlbmR8YWNsY29udGFpbnN8YWNsZXhwbG9kZXxhY2xpbnNlcnR8IiArDQogICAgICAgICJhY2xpdGVtZXF8YWNsaXRlbWlufGFjbGl0ZW1vdXR8YWNscmVtb3ZlfGFjb3N8YWdlfGFueV9pbnxhbnlfb3V0fGFueWFycmF5X2lufGFueWFycmF5X291dHwiICsNCiAgICAgICAgImFueWFycmF5X3JlY3Z8YW55YXJyYXlfc2VuZHxhbnllbGVtZW50X2lufGFueWVsZW1lbnRfb3V0fGFueWVudW1faW58YW55ZW51bV9vdXR8IiArDQogICAgICAgICJhbnlub25hcnJheV9pbnxhbnlub25hcnJheV9vdXR8YW55dGV4dGNhdHxhcmVhfGFyZWFqb2luc2VsfGFyZWFzZWx8YXJyYXlfYWdnfCIgKw0KICAgICAgICAiYXJyYXlfYWdnX2ZpbmFsZm58YXJyYXlfYWdnX3RyYW5zZm58YXJyYXlfYXBwZW5kfGFycmF5X2NhdHxhcnJheV9kaW1zfGFycmF5X2VxfCIgKw0KICAgICAgICAiYXJyYXlfZmlsbHxhcnJheV9nZXxhcnJheV9ndHxhcnJheV9pbnxhcnJheV9sYXJnZXJ8YXJyYXlfbGV8YXJyYXlfbGVuZ3RofGFycmF5X2xvd2VyfCIgKw0KICAgICAgICAiYXJyYXlfbHR8YXJyYXlfbmRpbXN8YXJyYXlfbmV8YXJyYXlfb3V0fGFycmF5X3ByZXBlbmR8YXJyYXlfcmVjdnxhcnJheV9zZW5kfCIgKw0KICAgICAgICAiYXJyYXlfc21hbGxlcnxhcnJheV90b19zdHJpbmd8YXJyYXlfdXBwZXJ8YXJyYXljb250YWluZWR8YXJyYXljb250YWluc3xhcnJheW92ZXJsYXB8IiArDQogICAgICAgICJhc2NpaXxhc2NpaV90b19taWN8YXNjaWlfdG9fdXRmOHxhc2lufGF0YW58YXRhbjJ8YXZnfGJpZzVfdG9fZXVjX3R3fGJpZzVfdG9fbWljfCIgKw0KICAgICAgICAiYmlnNV90b191dGY4fGJpdF9hbmR8Yml0X2lufGJpdF9sZW5ndGh8Yml0X29yfGJpdF9vdXR8Yml0X3JlY3Z8Yml0X3NlbmR8Yml0YW5kfGJpdGNhdHwiICsNCiAgICAgICAgImJpdGNtcHxiaXRlcXxiaXRnZXxiaXRndHxiaXRsZXxiaXRsdHxiaXRuZXxiaXRub3R8Yml0b3J8Yml0c2hpZnRsZWZ0fGJpdHNoaWZ0cmlnaHR8IiArDQogICAgICAgICJiaXR0eXBtb2RpbnxiaXR0eXBtb2RvdXR8Yml0eG9yfGJvb2x8Ym9vbF9hbmR8Ym9vbF9vcnxib29sYW5kX3N0YXRlZnVuY3xib29sZXF8Ym9vbGdlfCIgKw0KICAgICAgICAiYm9vbGd0fGJvb2xpbnxib29sbGV8Ym9vbGx0fGJvb2xuZXxib29sb3Jfc3RhdGVmdW5jfGJvb2xvdXR8Ym9vbHJlY3Z8Ym9vbHNlbmR8Ym94fCIgKw0KICAgICAgICAiYm94X2Fib3ZlfGJveF9hYm92ZV9lcXxib3hfYWRkfGJveF9iZWxvd3xib3hfYmVsb3dfZXF8Ym94X2NlbnRlcnxib3hfY29udGFpbnwiICsNCiAgICAgICAgImJveF9jb250YWluX3B0fGJveF9jb250YWluZWR8Ym94X2Rpc3RhbmNlfGJveF9kaXZ8Ym94X2VxfGJveF9nZXxib3hfZ3R8Ym94X2lufCIgKw0KICAgICAgICAiYm94X2ludGVyc2VjdHxib3hfbGV8Ym94X2xlZnR8Ym94X2x0fGJveF9tdWx8Ym94X291dHxib3hfb3ZlcmFib3ZlfGJveF9vdmVyYmVsb3d8IiArDQogICAgICAgICJib3hfb3ZlcmxhcHxib3hfb3ZlcmxlZnR8Ym94X292ZXJyaWdodHxib3hfcmVjdnxib3hfcmlnaHR8Ym94X3NhbWV8Ym94X3NlbmR8Ym94X3N1YnwiICsNCiAgICAgICAgImJwY2hhcl9sYXJnZXJ8YnBjaGFyX3BhdHRlcm5fZ2V8YnBjaGFyX3BhdHRlcm5fZ3R8YnBjaGFyX3BhdHRlcm5fbGV8IiArDQogICAgICAgICJicGNoYXJfcGF0dGVybl9sdHxicGNoYXJfc21hbGxlcnxicGNoYXJjbXB8YnBjaGFyZXF8YnBjaGFyZ2V8YnBjaGFyZ3R8YnBjaGFyaWNsaWtlfCIgKw0KICAgICAgICAiYnBjaGFyaWNubGlrZXxicGNoYXJpY3JlZ2V4ZXF8YnBjaGFyaWNyZWdleG5lfGJwY2hhcmlufGJwY2hhcmxlfGJwY2hhcmxpa2V8YnBjaGFybHR8IiArDQogICAgICAgICJicGNoYXJuZXxicGNoYXJubGlrZXxicGNoYXJvdXR8YnBjaGFycmVjdnxicGNoYXJyZWdleGVxfGJwY2hhcnJlZ2V4bmV8YnBjaGFyc2VuZHwiICsNCiAgICAgICAgImJwY2hhcnR5cG1vZGlufGJwY2hhcnR5cG1vZG91dHxicm9hZGNhc3R8YnRhYnN0aW1lY21wfGJ0YXJyYXljbXB8YnRiZWdpbnNjYW58YnRib29sY21wfCIgKw0KICAgICAgICAiYnRicGNoYXJfcGF0dGVybl9jbXB8YnRidWlsZHxidGJ1aWxkZW1wdHl8YnRidWxrZGVsZXRlfGJ0Y2hhcmNtcHxidGNvc3Rlc3RpbWF0ZXwiICsNCiAgICAgICAgImJ0ZW5kc2NhbnxidGZsb2F0NDhjbXB8YnRmbG9hdDRjbXB8YnRmbG9hdDg0Y21wfGJ0ZmxvYXQ4Y21wfGJ0Z2V0Yml0bWFwfGJ0Z2V0dHVwbGV8IiArDQogICAgICAgICJidGluc2VydHxidGludDI0Y21wfGJ0aW50MjhjbXB8YnRpbnQyY21wfGJ0aW50NDJjbXB8YnRpbnQ0OGNtcHxidGludDRjbXB8YnRpbnQ4MmNtcHwiICsNCiAgICAgICAgImJ0aW50ODRjbXB8YnRpbnQ4Y21wfGJ0bWFya3Bvc3xidG5hbWVjbXB8YnRvaWRjbXB8YnRvaWR2ZWN0b3JjbXB8YnRvcHRpb25zfGJ0cmVjb3JkY21wfCIgKw0KICAgICAgICAiYnRyZWx0aW1lY21wfGJ0cmVzY2FufGJ0cmVzdHJwb3N8YnRyaW18YnR0ZXh0X3BhdHRlcm5fY21wfGJ0dGV4dGNtcHxidHRpZGNtcHwiICsNCiAgICAgICAgImJ0dGludGVydmFsY21wfGJ0dmFjdXVtY2xlYW51cHxieXRlYWNhdHxieXRlYWNtcHxieXRlYWVxfGJ5dGVhZ2V8Ynl0ZWFndHxieXRlYWlufGJ5dGVhbGV8IiArDQogICAgICAgICJieXRlYWxpa2V8Ynl0ZWFsdHxieXRlYW5lfGJ5dGVhbmxpa2V8Ynl0ZWFvdXR8Ynl0ZWFyZWN2fGJ5dGVhc2VuZHxjYXNoX2NtcHxjYXNoX2Rpdl9jYXNofCIgKw0KICAgICAgICAiY2FzaF9kaXZfZmx0NHxjYXNoX2Rpdl9mbHQ4fGNhc2hfZGl2X2ludDJ8Y2FzaF9kaXZfaW50NHxjYXNoX2VxfGNhc2hfZ2V8Y2FzaF9ndHxjYXNoX2lufCIgKw0KICAgICAgICAiY2FzaF9sZXxjYXNoX2x0fGNhc2hfbWl8Y2FzaF9tdWxfZmx0NHxjYXNoX211bF9mbHQ4fGNhc2hfbXVsX2ludDJ8Y2FzaF9tdWxfaW50NHxjYXNoX25lfCIgKw0KICAgICAgICAiY2FzaF9vdXR8Y2FzaF9wbHxjYXNoX3JlY3Z8Y2FzaF9zZW5kfGNhc2hfd29yZHN8Y2FzaGxhcmdlcnxjYXNoc21hbGxlcnxjYnJ0fGNlaWx8Y2VpbGluZ3wiICsNCiAgICAgICAgImNlbnRlcnxjaGFyfGNoYXJfbGVuZ3RofGNoYXJhY3Rlcl9sZW5ndGh8Y2hhcmVxfGNoYXJnZXxjaGFyZ3R8Y2hhcmlufGNoYXJsZXxjaGFybHR8Y2hhcm5lfCIgKw0KICAgICAgICAiY2hhcm91dHxjaGFycmVjdnxjaGFyc2VuZHxjaHJ8Y2lkZXF8Y2lkaW58Y2lkb3V0fGNpZHJ8Y2lkcl9pbnxjaWRyX291dHxjaWRyX3JlY3Z8Y2lkcl9zZW5kfCIgKw0KICAgICAgICAiY2lkcmVjdnxjaWRzZW5kfGNpcmNsZXxjaXJjbGVfYWJvdmV8Y2lyY2xlX2FkZF9wdHxjaXJjbGVfYmVsb3d8Y2lyY2xlX2NlbnRlcnwiICsNCiAgICAgICAgImNpcmNsZV9jb250YWlufGNpcmNsZV9jb250YWluX3B0fGNpcmNsZV9jb250YWluZWR8Y2lyY2xlX2Rpc3RhbmNlfGNpcmNsZV9kaXZfcHR8IiArDQogICAgICAgICJjaXJjbGVfZXF8Y2lyY2xlX2dlfGNpcmNsZV9ndHxjaXJjbGVfaW58Y2lyY2xlX2xlfGNpcmNsZV9sZWZ0fGNpcmNsZV9sdHxjaXJjbGVfbXVsX3B0fCIgKw0KICAgICAgICAiY2lyY2xlX25lfGNpcmNsZV9vdXR8Y2lyY2xlX292ZXJhYm92ZXxjaXJjbGVfb3ZlcmJlbG93fGNpcmNsZV9vdmVybGFwfGNpcmNsZV9vdmVybGVmdHwiICsNCiAgICAgICAgImNpcmNsZV9vdmVycmlnaHR8Y2lyY2xlX3JlY3Z8Y2lyY2xlX3JpZ2h0fGNpcmNsZV9zYW1lfGNpcmNsZV9zZW5kfGNpcmNsZV9zdWJfcHR8IiArDQogICAgICAgICJjbG9ja190aW1lc3RhbXB8Y2xvc2VfbGJ8Y2xvc2VfbHN8Y2xvc2VfbHNlZ3xjbG9zZV9wYnxjbG9zZV9wbHxjbG9zZV9wc3xjbG9zZV9zYnwiICsNCiAgICAgICAgImNsb3NlX3NsfGNvbF9kZXNjcmlwdGlvbnxjb25jYXR8Y29uY2F0X3dzfGNvbnRqb2luc2VsfGNvbnRzZWx8Y29udmVydHxjb252ZXJ0X2Zyb218IiArDQogICAgICAgICJjb252ZXJ0X3RvfGNvcnJ8Y29zfGNvdHxjb3VudHxjb3Zhcl9wb3B8Y292YXJfc2FtcHxjc3RyaW5nX2lufGNzdHJpbmdfb3V0fGNzdHJpbmdfcmVjdnwiICsNCiAgICAgICAgImNzdHJpbmdfc2VuZHxjdW1lX2Rpc3R8Y3VycmVudF9kYXRhYmFzZXxjdXJyZW50X3F1ZXJ5fGN1cnJlbnRfc2NoZW1hfGN1cnJlbnRfc2NoZW1hc3wiICsNCiAgICAgICAgImN1cnJlbnRfc2V0dGluZ3xjdXJyZW50X3VzZXJ8Y3VycnRpZHxjdXJydGlkMnxjdXJydmFsfGN1cnNvcl90b194bWx8IiArDQogICAgICAgICJjdXJzb3JfdG9feG1sc2NoZW1hfGRhdGFiYXNlX3RvX3htbHxkYXRhYmFzZV90b194bWxfYW5kX3htbHNjaGVtYXwiICsNCiAgICAgICAgImRhdGFiYXNlX3RvX3htbHNjaGVtYXxkYXRlfGRhdGVfY21wfGRhdGVfY21wX3RpbWVzdGFtcHxkYXRlX2NtcF90aW1lc3RhbXB0enxkYXRlX2VxfCIgKw0KICAgICAgICAiZGF0ZV9lcV90aW1lc3RhbXB8ZGF0ZV9lcV90aW1lc3RhbXB0enxkYXRlX2dlfGRhdGVfZ2VfdGltZXN0YW1wfGRhdGVfZ2VfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJkYXRlX2d0fGRhdGVfZ3RfdGltZXN0YW1wfGRhdGVfZ3RfdGltZXN0YW1wdHp8ZGF0ZV9pbnxkYXRlX2xhcmdlcnxkYXRlX2xlfCIgKw0KICAgICAgICAiZGF0ZV9sZV90aW1lc3RhbXB8ZGF0ZV9sZV90aW1lc3RhbXB0enxkYXRlX2x0fGRhdGVfbHRfdGltZXN0YW1wfGRhdGVfbHRfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJkYXRlX21pfGRhdGVfbWlfaW50ZXJ2YWx8ZGF0ZV9taWl8ZGF0ZV9uZXxkYXRlX25lX3RpbWVzdGFtcHxkYXRlX25lX3RpbWVzdGFtcHR6fCIgKw0KICAgICAgICAiZGF0ZV9vdXR8ZGF0ZV9wYXJ0fGRhdGVfcGxfaW50ZXJ2YWx8ZGF0ZV9wbGl8ZGF0ZV9yZWN2fGRhdGVfc2VuZHxkYXRlX3NtYWxsZXJ8IiArDQogICAgICAgICJkYXRlX3RydW5jfGRhdGV0aW1lX3BsfGRhdGV0aW1ldHpfcGx8ZGNicnR8ZGVjb2RlfGRlZ3JlZXN8ZGVuc2VfcmFua3xkZXhwfGRpYWdvbmFsfCIgKw0KICAgICAgICAiZGlhbWV0ZXJ8ZGlzcGVsbF9pbml0fGRpc3BlbGxfbGV4aXplfGRpc3RfY3BvbHl8ZGlzdF9sYnxkaXN0X3BifGRpc3RfcGN8ZGlzdF9wbHwiICsNCiAgICAgICAgImRpc3RfcHBhdGh8ZGlzdF9wc3xkaXN0X3NifGRpc3Rfc2x8ZGl2fGRsb2cxfGRsb2cxMHxkb21haW5faW58ZG9tYWluX3JlY3Z8ZHBvd3xkcm91bmR8IiArDQogICAgICAgICJkc2ltcGxlX2luaXR8ZHNpbXBsZV9sZXhpemV8ZHNub3diYWxsX2luaXR8ZHNub3diYWxsX2xleGl6ZXxkc3FydHxkc3lub255bV9pbml0fCIgKw0KICAgICAgICAiZHN5bm9ueW1fbGV4aXplfGR0cnVuY3xlbmNvZGV8ZW51bV9jbXB8ZW51bV9lcXxlbnVtX2ZpcnN0fGVudW1fZ2V8ZW51bV9ndHxlbnVtX2lufCIgKw0KICAgICAgICAiZW51bV9sYXJnZXJ8ZW51bV9sYXN0fGVudW1fbGV8ZW51bV9sdHxlbnVtX25lfGVudW1fb3V0fGVudW1fcmFuZ2V8ZW51bV9yZWN2fGVudW1fc2VuZHwiICsNCiAgICAgICAgImVudW1fc21hbGxlcnxlcWpvaW5zZWx8ZXFzZWx8ZXVjX2NuX3RvX21pY3xldWNfY25fdG9fdXRmOHwiICsNCiAgICAgICAgImV1Y19qaXNfMjAwNF90b19zaGlmdF9qaXNfMjAwNHxldWNfamlzXzIwMDRfdG9fdXRmOHxldWNfanBfdG9fbWljfGV1Y19qcF90b19zamlzfCIgKw0KICAgICAgICAiZXVjX2pwX3RvX3V0Zjh8ZXVjX2tyX3RvX21pY3xldWNfa3JfdG9fdXRmOHxldWNfdHdfdG9fYmlnNXxldWNfdHdfdG9fbWljfCIgKw0KICAgICAgICAiZXVjX3R3X3RvX3V0Zjh8ZXZlcnl8ZXhwfGZhY3RvcmlhbHxmYW1pbHl8ZmR3X2hhbmRsZXJfaW58ZmR3X2hhbmRsZXJfb3V0fGZpcnN0X3ZhbHVlfCIgKw0KICAgICAgICAiZmxvYXQ0fGZsb2F0NDhkaXZ8ZmxvYXQ0OGVxfGZsb2F0NDhnZXxmbG9hdDQ4Z3R8ZmxvYXQ0OGxlfGZsb2F0NDhsdHxmbG9hdDQ4bWl8ZmxvYXQ0OG11bHwiICsNCiAgICAgICAgImZsb2F0NDhuZXxmbG9hdDQ4cGx8ZmxvYXQ0X2FjY3VtfGZsb2F0NGFic3xmbG9hdDRkaXZ8ZmxvYXQ0ZXF8ZmxvYXQ0Z2V8ZmxvYXQ0Z3R8ZmxvYXQ0aW58IiArDQogICAgICAgICJmbG9hdDRsYXJnZXJ8ZmxvYXQ0bGV8ZmxvYXQ0bHR8ZmxvYXQ0bWl8ZmxvYXQ0bXVsfGZsb2F0NG5lfGZsb2F0NG91dHxmbG9hdDRwbHxmbG9hdDRyZWN2fCIgKw0KICAgICAgICAiZmxvYXQ0c2VuZHxmbG9hdDRzbWFsbGVyfGZsb2F0NHVtfGZsb2F0NHVwfGZsb2F0OHxmbG9hdDg0ZGl2fGZsb2F0ODRlcXxmbG9hdDg0Z2V8IiArDQogICAgICAgICJmbG9hdDg0Z3R8ZmxvYXQ4NGxlfGZsb2F0ODRsdHxmbG9hdDg0bWl8ZmxvYXQ4NG11bHxmbG9hdDg0bmV8ZmxvYXQ4NHBsfGZsb2F0OF9hY2N1bXwiICsNCiAgICAgICAgImZsb2F0OF9hdmd8ZmxvYXQ4X2NvcnJ8ZmxvYXQ4X2NvdmFyX3BvcHxmbG9hdDhfY292YXJfc2FtcHxmbG9hdDhfcmVncl9hY2N1bXwiICsNCiAgICAgICAgImZsb2F0OF9yZWdyX2F2Z3h8ZmxvYXQ4X3JlZ3JfYXZneXxmbG9hdDhfcmVncl9pbnRlcmNlcHR8ZmxvYXQ4X3JlZ3JfcjJ8IiArDQogICAgICAgICJmbG9hdDhfcmVncl9zbG9wZXxmbG9hdDhfcmVncl9zeHh8ZmxvYXQ4X3JlZ3Jfc3h5fGZsb2F0OF9yZWdyX3N5eXxmbG9hdDhfc3RkZGV2X3BvcHwiICsNCiAgICAgICAgImZsb2F0OF9zdGRkZXZfc2FtcHxmbG9hdDhfdmFyX3BvcHxmbG9hdDhfdmFyX3NhbXB8ZmxvYXQ4YWJzfGZsb2F0OGRpdnxmbG9hdDhlcXwiICsNCiAgICAgICAgImZsb2F0OGdlfGZsb2F0OGd0fGZsb2F0OGlufGZsb2F0OGxhcmdlcnxmbG9hdDhsZXxmbG9hdDhsdHxmbG9hdDhtaXxmbG9hdDhtdWx8ZmxvYXQ4bmV8IiArDQogICAgICAgICJmbG9hdDhvdXR8ZmxvYXQ4cGx8ZmxvYXQ4cmVjdnxmbG9hdDhzZW5kfGZsb2F0OHNtYWxsZXJ8ZmxvYXQ4dW18ZmxvYXQ4dXB8Zmxvb3J8IiArDQogICAgICAgICJmbHQ0X211bF9jYXNofGZsdDhfbXVsX2Nhc2h8Zm1ncl9jX3ZhbGlkYXRvcnxmbWdyX2ludGVybmFsX3ZhbGlkYXRvcnwiICsNCiAgICAgICAgImZtZ3Jfc3FsX3ZhbGlkYXRvcnxmb3JtYXR8Zm9ybWF0X3R5cGV8Z2IxODAzMF90b191dGY4fGdia190b191dGY4fGdlbmVyYXRlX3Nlcmllc3wiICsNCiAgICAgICAgImdlbmVyYXRlX3N1YnNjcmlwdHN8Z2V0X2JpdHxnZXRfYnl0ZXxnZXRfY3VycmVudF90c19jb25maWd8Z2V0ZGF0YWJhc2VlbmNvZGluZ3wiICsNCiAgICAgICAgImdldHBndXNlcm5hbWV8Z2luX2NtcF9wcmVmaXh8Z2luX2NtcF90c2xleGVtZXxnaW5fZXh0cmFjdF90c3F1ZXJ5fCIgKw0KICAgICAgICAiZ2luX2V4dHJhY3RfdHN2ZWN0b3J8Z2luX3RzcXVlcnlfY29uc2lzdGVudHxnaW5hcnJheWNvbnNpc3RlbnR8Z2luYXJyYXlleHRyYWN0fCIgKw0KICAgICAgICAiZ2luYmVnaW5zY2FufGdpbmJ1aWxkfGdpbmJ1aWxkZW1wdHl8Z2luYnVsa2RlbGV0ZXxnaW5jb3N0ZXN0aW1hdGV8Z2luZW5kc2NhbnwiICsNCiAgICAgICAgImdpbmdldGJpdG1hcHxnaW5pbnNlcnR8Z2lubWFya3Bvc3xnaW5vcHRpb25zfGdpbnF1ZXJ5YXJyYXlleHRyYWN0fGdpbnJlc2NhbnwiICsNCiAgICAgICAgImdpbnJlc3RycG9zfGdpbnZhY3V1bWNsZWFudXB8Z2lzdF9ib3hfY29tcHJlc3N8Z2lzdF9ib3hfY29uc2lzdGVudHwiICsNCiAgICAgICAgImdpc3RfYm94X2RlY29tcHJlc3N8Z2lzdF9ib3hfcGVuYWx0eXxnaXN0X2JveF9waWNrc3BsaXR8Z2lzdF9ib3hfc2FtZXxnaXN0X2JveF91bmlvbnwiICsNCiAgICAgICAgImdpc3RfY2lyY2xlX2NvbXByZXNzfGdpc3RfY2lyY2xlX2NvbnNpc3RlbnR8Z2lzdF9wb2ludF9jb21wcmVzc3wiICsNCiAgICAgICAgImdpc3RfcG9pbnRfY29uc2lzdGVudHxnaXN0X3BvaW50X2Rpc3RhbmNlfGdpc3RfcG9seV9jb21wcmVzc3xnaXN0X3BvbHlfY29uc2lzdGVudHwiICsNCiAgICAgICAgImdpc3RiZWdpbnNjYW58Z2lzdGJ1aWxkfGdpc3RidWlsZGVtcHR5fGdpc3RidWxrZGVsZXRlfGdpc3Rjb3N0ZXN0aW1hdGV8Z2lzdGVuZHNjYW58IiArDQogICAgICAgICJnaXN0Z2V0Yml0bWFwfGdpc3RnZXR0dXBsZXxnaXN0aW5zZXJ0fGdpc3RtYXJrcG9zfGdpc3RvcHRpb25zfGdpc3RyZXNjYW58Z2lzdHJlc3RycG9zfCIgKw0KICAgICAgICAiZ2lzdHZhY3V1bWNsZWFudXB8Z3RzcXVlcnlfY29tcHJlc3N8Z3RzcXVlcnlfY29uc2lzdGVudHxndHNxdWVyeV9kZWNvbXByZXNzfCIgKw0KICAgICAgICAiZ3RzcXVlcnlfcGVuYWx0eXxndHNxdWVyeV9waWNrc3BsaXR8Z3RzcXVlcnlfc2FtZXxndHNxdWVyeV91bmlvbnxndHN2ZWN0b3JfY29tcHJlc3N8IiArDQogICAgICAgICJndHN2ZWN0b3JfY29uc2lzdGVudHxndHN2ZWN0b3JfZGVjb21wcmVzc3xndHN2ZWN0b3JfcGVuYWx0eXxndHN2ZWN0b3JfcGlja3NwbGl0fCIgKw0KICAgICAgICAiZ3RzdmVjdG9yX3NhbWV8Z3RzdmVjdG9yX3VuaW9ufGd0c3ZlY3RvcmlufGd0c3ZlY3Rvcm91dHxoYXNfYW55X2NvbHVtbl9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfY29sdW1uX3ByaXZpbGVnZXxoYXNfZGF0YWJhc2VfcHJpdmlsZWdlfGhhc19mb3JlaWduX2RhdGFfd3JhcHBlcl9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfZnVuY3Rpb25fcHJpdmlsZWdlfGhhc19sYW5ndWFnZV9wcml2aWxlZ2V8aGFzX3NjaGVtYV9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfc2VxdWVuY2VfcHJpdmlsZWdlfGhhc19zZXJ2ZXJfcHJpdmlsZWdlfGhhc190YWJsZV9wcml2aWxlZ2V8IiArDQogICAgICAgICJoYXNfdGFibGVzcGFjZV9wcml2aWxlZ2V8aGFzaF9hY2xpdGVtfGhhc2hfYXJyYXl8aGFzaF9udW1lcmljfGhhc2hiZWdpbnNjYW58IiArDQogICAgICAgICJoYXNoYnBjaGFyfGhhc2hidWlsZHxoYXNoYnVpbGRlbXB0eXxoYXNoYnVsa2RlbGV0ZXxoYXNoY2hhcnxoYXNoY29zdGVzdGltYXRlfCIgKw0KICAgICAgICAiaGFzaGVuZHNjYW58aGFzaGVudW18aGFzaGZsb2F0NHxoYXNoZmxvYXQ4fGhhc2hnZXRiaXRtYXB8aGFzaGdldHR1cGxlfGhhc2hpbmV0fCIgKw0KICAgICAgICAiaGFzaGluc2VydHxoYXNoaW50MnxoYXNoaW50MnZlY3RvcnxoYXNoaW50NHxoYXNoaW50OHxoYXNobWFjYWRkcnxoYXNobWFya3Bvc3xoYXNobmFtZXwiICsNCiAgICAgICAgImhhc2hvaWR8aGFzaG9pZHZlY3RvcnxoYXNob3B0aW9uc3xoYXNocmVzY2FufGhhc2hyZXN0cnBvc3xoYXNodGV4dHxoYXNodmFjdXVtY2xlYW51cHwiICsNCiAgICAgICAgImhhc2h2YXJsZW5hfGhlaWdodHxob3N0fGhvc3RtYXNrfGljbGlrZWpvaW5zZWx8aWNsaWtlc2VsfGljbmxpa2Vqb2luc2VsfGljbmxpa2VzZWx8IiArDQogICAgICAgICJpY3JlZ2V4ZXFqb2luc2VsfGljcmVnZXhlcXNlbHxpY3JlZ2V4bmVqb2luc2VsfGljcmVnZXhuZXNlbHxpbmV0X2NsaWVudF9hZGRyfCIgKw0KICAgICAgICAiaW5ldF9jbGllbnRfcG9ydHxpbmV0X2lufGluZXRfb3V0fGluZXRfcmVjdnxpbmV0X3NlbmR8aW5ldF9zZXJ2ZXJfYWRkcnwiICsNCiAgICAgICAgImluZXRfc2VydmVyX3BvcnR8aW5ldGFuZHxpbmV0bWl8aW5ldG1pX2ludDh8aW5ldG5vdHxpbmV0b3J8aW5ldHBsfGluaXRjYXB8aW50MnxpbnQyNGRpdnwiICsNCiAgICAgICAgImludDI0ZXF8aW50MjRnZXxpbnQyNGd0fGludDI0bGV8aW50MjRsdHxpbnQyNG1pfGludDI0bXVsfGludDI0bmV8aW50MjRwbHxpbnQyOGRpdnxpbnQyOGVxfCIgKw0KICAgICAgICAiaW50MjhnZXxpbnQyOGd0fGludDI4bGV8aW50MjhsdHxpbnQyOG1pfGludDI4bXVsfGludDI4bmV8aW50MjhwbHxpbnQyX2FjY3VtfCIgKw0KICAgICAgICAiaW50Ml9hdmdfYWNjdW18aW50Ml9tdWxfY2FzaHxpbnQyX3N1bXxpbnQyYWJzfGludDJhbmR8aW50MmRpdnxpbnQyZXF8aW50MmdlfGludDJndHxpbnQyaW58IiArDQogICAgICAgICJpbnQybGFyZ2VyfGludDJsZXxpbnQybHR8aW50Mm1pfGludDJtb2R8aW50Mm11bHxpbnQybmV8aW50Mm5vdHxpbnQyb3J8aW50Mm91dHxpbnQycGx8IiArDQogICAgICAgICJpbnQycmVjdnxpbnQyc2VuZHxpbnQyc2hsfGludDJzaHJ8aW50MnNtYWxsZXJ8aW50MnVtfGludDJ1cHxpbnQydmVjdG9yZXF8aW50MnZlY3RvcmlufCIgKw0KICAgICAgICAiaW50MnZlY3Rvcm91dHxpbnQydmVjdG9ycmVjdnxpbnQydmVjdG9yc2VuZHxpbnQyeG9yfGludDR8aW50NDJkaXZ8aW50NDJlcXxpbnQ0MmdlfCIgKw0KICAgICAgICAiaW50NDJndHxpbnQ0MmxlfGludDQybHR8aW50NDJtaXxpbnQ0Mm11bHxpbnQ0Mm5lfGludDQycGx8aW50NDhkaXZ8aW50NDhlcXxpbnQ0OGdlfGludDQ4Z3R8IiArDQogICAgICAgICJpbnQ0OGxlfGludDQ4bHR8aW50NDhtaXxpbnQ0OG11bHxpbnQ0OG5lfGludDQ4cGx8aW50NF9hY2N1bXxpbnQ0X2F2Z19hY2N1bXxpbnQ0X211bF9jYXNofCIgKw0KICAgICAgICAiaW50NF9zdW18aW50NGFic3xpbnQ0YW5kfGludDRkaXZ8aW50NGVxfGludDRnZXxpbnQ0Z3R8aW50NGlufGludDRpbmN8aW50NGxhcmdlcnxpbnQ0bGV8IiArDQogICAgICAgICJpbnQ0bHR8aW50NG1pfGludDRtb2R8aW50NG11bHxpbnQ0bmV8aW50NG5vdHxpbnQ0b3J8aW50NG91dHxpbnQ0cGx8aW50NHJlY3Z8aW50NHNlbmR8IiArDQogICAgICAgICJpbnQ0c2hsfGludDRzaHJ8aW50NHNtYWxsZXJ8aW50NHVtfGludDR1cHxpbnQ0eG9yfGludDh8aW50ODJkaXZ8aW50ODJlcXxpbnQ4MmdlfGludDgyZ3R8IiArDQogICAgICAgICJpbnQ4MmxlfGludDgybHR8aW50ODJtaXxpbnQ4Mm11bHxpbnQ4Mm5lfGludDgycGx8aW50ODRkaXZ8aW50ODRlcXxpbnQ4NGdlfGludDg0Z3R8aW50ODRsZXwiICsNCiAgICAgICAgImludDg0bHR8aW50ODRtaXxpbnQ4NG11bHxpbnQ4NG5lfGludDg0cGx8aW50OF9hY2N1bXxpbnQ4X2F2Z3xpbnQ4X2F2Z19hY2N1bXxpbnQ4X3N1bXwiICsNCiAgICAgICAgImludDhhYnN8aW50OGFuZHxpbnQ4ZGl2fGludDhlcXxpbnQ4Z2V8aW50OGd0fGludDhpbnxpbnQ4aW5jfGludDhpbmNfYW55fCIgKw0KICAgICAgICAiaW50OGluY19mbG9hdDhfZmxvYXQ4fGludDhsYXJnZXJ8aW50OGxlfGludDhsdHxpbnQ4bWl8aW50OG1vZHxpbnQ4bXVsfGludDhuZXxpbnQ4bm90fCIgKw0KICAgICAgICAiaW50OG9yfGludDhvdXR8aW50OHBsfGludDhwbF9pbmV0fGludDhyZWN2fGludDhzZW5kfGludDhzaGx8aW50OHNocnxpbnQ4c21hbGxlcnxpbnQ4dW18IiArDQogICAgICAgICJpbnQ4dXB8aW50OHhvcnxpbnRlZ2VyX3BsX2RhdGV8aW50ZXJfbGJ8aW50ZXJfc2J8aW50ZXJfc2x8aW50ZXJuYWxfaW58aW50ZXJuYWxfb3V0fCIgKw0KICAgICAgICAiaW50ZXJ2YWxfYWNjdW18aW50ZXJ2YWxfYXZnfGludGVydmFsX2NtcHxpbnRlcnZhbF9kaXZ8aW50ZXJ2YWxfZXF8aW50ZXJ2YWxfZ2V8IiArDQogICAgICAgICJpbnRlcnZhbF9ndHxpbnRlcnZhbF9oYXNofGludGVydmFsX2lufGludGVydmFsX2xhcmdlcnxpbnRlcnZhbF9sZXxpbnRlcnZhbF9sdHwiICsNCiAgICAgICAgImludGVydmFsX21pfGludGVydmFsX211bHxpbnRlcnZhbF9uZXxpbnRlcnZhbF9vdXR8aW50ZXJ2YWxfcGx8aW50ZXJ2YWxfcGxfZGF0ZXwiICsNCiAgICAgICAgImludGVydmFsX3BsX3RpbWV8aW50ZXJ2YWxfcGxfdGltZXN0YW1wfGludGVydmFsX3BsX3RpbWVzdGFtcHR6fGludGVydmFsX3BsX3RpbWV0enwiICsNCiAgICAgICAgImludGVydmFsX3JlY3Z8aW50ZXJ2YWxfc2VuZHxpbnRlcnZhbF9zbWFsbGVyfGludGVydmFsX3VtfGludGVydmFsdHlwbW9kaW58IiArDQogICAgICAgICJpbnRlcnZhbHR5cG1vZG91dHxpbnRpbnRlcnZhbHxpc2Nsb3NlZHxpc2Zpbml0ZXxpc2hvcml6b250YWx8aXNvODg1OV8xX3RvX3V0Zjh8IiArDQogICAgICAgICJpc284ODU5X3RvX3V0Zjh8aXNvX3RvX2tvaThyfGlzb190b19taWN8aXNvX3RvX3dpbjEyNTF8aXNvX3RvX3dpbjg2Nnxpc29wZW58aXNwYXJhbGxlbHwiICsNCiAgICAgICAgImlzcGVycHxpc3ZlcnRpY2FsfGpvaGFiX3RvX3V0Zjh8anVzdGlmeV9kYXlzfGp1c3RpZnlfaG91cnN8anVzdGlmeV9pbnRlcnZhbHwiICsNCiAgICAgICAgImtvaThyX3RvX2lzb3xrb2k4cl90b19taWN8a29pOHJfdG9fdXRmOHxrb2k4cl90b193aW4xMjUxfGtvaThyX3RvX3dpbjg2NnwiICsNCiAgICAgICAgImtvaTh1X3RvX3V0Zjh8bGFnfGxhbmd1YWdlX2hhbmRsZXJfaW58bGFuZ3VhZ2VfaGFuZGxlcl9vdXR8bGFzdF92YWx1ZXxsYXN0dmFsfCIgKw0KICAgICAgICAibGF0aW4xX3RvX21pY3xsYXRpbjJfdG9fbWljfGxhdGluMl90b193aW4xMjUwfGxhdGluM190b19taWN8bGF0aW40X3RvX21pY3xsZWFkfGxlZnR8IiArDQogICAgICAgICJsZW5ndGh8bGlrZXxsaWtlX2VzY2FwZXxsaWtlam9pbnNlbHxsaWtlc2VsfGxpbmV8bGluZV9kaXN0YW5jZXxsaW5lX2VxfGxpbmVfaG9yaXpvbnRhbHwiICsNCiAgICAgICAgImxpbmVfaW58bGluZV9pbnRlcnB0fGxpbmVfaW50ZXJzZWN0fGxpbmVfb3V0fGxpbmVfcGFyYWxsZWx8bGluZV9wZXJwfGxpbmVfcmVjdnwiICsNCiAgICAgICAgImxpbmVfc2VuZHxsaW5lX3ZlcnRpY2FsfGxufGxvX2Nsb3NlfGxvX2NyZWF0fGxvX2NyZWF0ZXxsb19leHBvcnR8bG9faW1wb3J0fGxvX2xzZWVrfCIgKw0KICAgICAgICAibG9fb3Blbnxsb190ZWxsfGxvX3RydW5jYXRlfGxvX3VubGlua3xsb2d8bG9yZWFkfGxvd2VyfGxvd3JpdGV8bHBhZHxsc2VnfGxzZWdfY2VudGVyfCIgKw0KICAgICAgICAibHNlZ19kaXN0YW5jZXxsc2VnX2VxfGxzZWdfZ2V8bHNlZ19ndHxsc2VnX2hvcml6b250YWx8bHNlZ19pbnxsc2VnX2ludGVycHR8IiArDQogICAgICAgICJsc2VnX2ludGVyc2VjdHxsc2VnX2xlfGxzZWdfbGVuZ3RofGxzZWdfbHR8bHNlZ19uZXxsc2VnX291dHxsc2VnX3BhcmFsbGVsfGxzZWdfcGVycHwiICsNCiAgICAgICAgImxzZWdfcmVjdnxsc2VnX3NlbmR8bHNlZ192ZXJ0aWNhbHxsdHJpbXxtYWNhZGRyX2NtcHxtYWNhZGRyX2VxfG1hY2FkZHJfZ2V8bWFjYWRkcl9ndHwiICsNCiAgICAgICAgIm1hY2FkZHJfaW58bWFjYWRkcl9sZXxtYWNhZGRyX2x0fG1hY2FkZHJfbmV8bWFjYWRkcl9vdXR8bWFjYWRkcl9yZWN2fG1hY2FkZHJfc2VuZHwiICsNCiAgICAgICAgIm1ha2VhY2xpdGVtfG1hc2tsZW58bWF4fG1kNXxtaWNfdG9fYXNjaWl8bWljX3RvX2JpZzV8bWljX3RvX2V1Y19jbnxtaWNfdG9fZXVjX2pwfCIgKw0KICAgICAgICAibWljX3RvX2V1Y19rcnxtaWNfdG9fZXVjX3R3fG1pY190b19pc298bWljX3RvX2tvaThyfG1pY190b19sYXRpbjF8bWljX3RvX2xhdGluMnwiICsNCiAgICAgICAgIm1pY190b19sYXRpbjN8bWljX3RvX2xhdGluNHxtaWNfdG9fc2ppc3xtaWNfdG9fd2luMTI1MHxtaWNfdG9fd2luMTI1MXxtaWNfdG9fd2luODY2fCIgKw0KICAgICAgICAibWlufG1rdGludGVydmFsfG1vZHxtb25leXxtdWxfZF9pbnRlcnZhbHxuYW1lfG5hbWVlcXxuYW1lZ2V8bmFtZWd0fG5hbWVpY2xpa2V8bmFtZWljbmxpa2V8IiArDQogICAgICAgICJuYW1laWNyZWdleGVxfG5hbWVpY3JlZ2V4bmV8bmFtZWlufG5hbWVsZXxuYW1lbGlrZXxuYW1lbHR8bmFtZW5lfG5hbWVubGlrZXxuYW1lb3V0fCIgKw0KICAgICAgICAibmFtZXJlY3Z8bmFtZXJlZ2V4ZXF8bmFtZXJlZ2V4bmV8bmFtZXNlbmR8bmVxam9pbnNlbHxuZXFzZWx8bmV0bWFza3xuZXR3b3JrfG5ldHdvcmtfY21wfCIgKw0KICAgICAgICAibmV0d29ya19lcXxuZXR3b3JrX2dlfG5ldHdvcmtfZ3R8bmV0d29ya19sZXxuZXR3b3JrX2x0fG5ldHdvcmtfbmV8bmV0d29ya19zdWJ8IiArDQogICAgICAgICJuZXR3b3JrX3N1YmVxfG5ldHdvcmtfc3VwfG5ldHdvcmtfc3VwZXF8bmV4dHZhbHxubGlrZWpvaW5zZWx8bmxpa2VzZWx8bm90bGlrZXxub3d8IiArDQogICAgICAgICJucG9pbnRzfG50aF92YWx1ZXxudGlsZXxudW1lcmljX2Fic3xudW1lcmljX2FjY3VtfG51bWVyaWNfYWRkfG51bWVyaWNfYXZnfCIgKw0KICAgICAgICAibnVtZXJpY19hdmdfYWNjdW18bnVtZXJpY19jbXB8bnVtZXJpY19kaXZ8bnVtZXJpY19kaXZfdHJ1bmN8bnVtZXJpY19lcXxudW1lcmljX2V4cHwiICsNCiAgICAgICAgIm51bWVyaWNfZmFjfG51bWVyaWNfZ2V8bnVtZXJpY19ndHxudW1lcmljX2lufG51bWVyaWNfaW5jfG51bWVyaWNfbGFyZ2VyfG51bWVyaWNfbGV8IiArDQogICAgICAgICJudW1lcmljX2xufG51bWVyaWNfbG9nfG51bWVyaWNfbHR8bnVtZXJpY19tb2R8bnVtZXJpY19tdWx8bnVtZXJpY19uZXxudW1lcmljX291dHwiICsNCiAgICAgICAgIm51bWVyaWNfcG93ZXJ8bnVtZXJpY19yZWN2fG51bWVyaWNfc2VuZHxudW1lcmljX3NtYWxsZXJ8bnVtZXJpY19zcXJ0fCIgKw0KICAgICAgICAibnVtZXJpY19zdGRkZXZfcG9wfG51bWVyaWNfc3RkZGV2X3NhbXB8bnVtZXJpY19zdWJ8bnVtZXJpY191bWludXN8bnVtZXJpY191cGx1c3wiICsNCiAgICAgICAgIm51bWVyaWNfdmFyX3BvcHxudW1lcmljX3Zhcl9zYW1wfG51bWVyaWN0eXBtb2RpbnxudW1lcmljdHlwbW9kb3V0fG51bW5vZGV8IiArDQogICAgICAgICJvYmpfZGVzY3JpcHRpb258b2N0ZXRfbGVuZ3RofG9pZHxvaWRlcXxvaWRnZXxvaWRndHxvaWRpbnxvaWRsYXJnZXJ8b2lkbGV8b2lkbHR8b2lkbmV8b2lkb3V0fCIgKw0KICAgICAgICAib2lkcmVjdnxvaWRzZW5kfG9pZHNtYWxsZXJ8b2lkdmVjdG9yZXF8b2lkdmVjdG9yZ2V8b2lkdmVjdG9yZ3R8b2lkdmVjdG9yaW58b2lkdmVjdG9ybGV8IiArDQogICAgICAgICJvaWR2ZWN0b3JsdHxvaWR2ZWN0b3JuZXxvaWR2ZWN0b3JvdXR8b2lkdmVjdG9ycmVjdnxvaWR2ZWN0b3JzZW5kfG9pZHZlY3RvcnR5cGVzfG9uX3BifCIgKw0KICAgICAgICAib25fcGx8b25fcHBhdGh8b25fcHN8b25fc2J8b25fc2x8b3BhcXVlX2lufG9wYXF1ZV9vdXR8b3ZlcmxhcHN8b3ZlcmxheXxwYXRofHBhdGhfYWRkfCIgKw0KICAgICAgICAicGF0aF9hZGRfcHR8cGF0aF9jZW50ZXJ8cGF0aF9jb250YWluX3B0fHBhdGhfZGlzdGFuY2V8cGF0aF9kaXZfcHR8cGF0aF9pbnxwYXRoX2ludGVyfCIgKw0KICAgICAgICAicGF0aF9sZW5ndGh8cGF0aF9tdWxfcHR8cGF0aF9uX2VxfHBhdGhfbl9nZXxwYXRoX25fZ3R8cGF0aF9uX2xlfHBhdGhfbl9sdHxwYXRoX25wb2ludHN8IiArDQogICAgICAgICJwYXRoX291dHxwYXRoX3JlY3Z8cGF0aF9zZW5kfHBhdGhfc3ViX3B0fHBjbG9zZXxwZXJjZW50X3Jhbmt8cGdfYWR2aXNvcnlfbG9ja3wiICsNCiAgICAgICAgInBnX2Fkdmlzb3J5X2xvY2tfc2hhcmVkfHBnX2Fkdmlzb3J5X3VubG9ja3xwZ19hZHZpc29yeV91bmxvY2tfYWxsfCIgKw0KICAgICAgICAicGdfYWR2aXNvcnlfdW5sb2NrX3NoYXJlZHxwZ19hZHZpc29yeV94YWN0X2xvY2t8cGdfYWR2aXNvcnlfeGFjdF9sb2NrX3NoYXJlZHwiICsNCiAgICAgICAgInBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnN8cGdfYXZhaWxhYmxlX2V4dGVuc2lvbnN8cGdfYmFja2VuZF9waWR8IiArDQogICAgICAgICJwZ19jYW5jZWxfYmFja2VuZHxwZ19jaGFyX3RvX2VuY29kaW5nfHBnX2NsaWVudF9lbmNvZGluZ3xwZ19jb2xsYXRpb25faXNfdmlzaWJsZXwiICsNCiAgICAgICAgInBnX2NvbHVtbl9zaXplfHBnX2NvbmZfbG9hZF90aW1lfHBnX2NvbnZlcnNpb25faXNfdmlzaWJsZXxwZ19jcmVhdGVfcmVzdG9yZV9wb2ludHwiICsNCiAgICAgICAgInBnX2N1cnJlbnRfeGxvZ19pbnNlcnRfbG9jYXRpb258cGdfY3VycmVudF94bG9nX2xvY2F0aW9ufHBnX2N1cnNvcnxwZ19kYXRhYmFzZV9zaXplfCIgKw0KICAgICAgICAicGdfZGVzY3JpYmVfb2JqZWN0fHBnX2VuY29kaW5nX21heF9sZW5ndGh8cGdfZW5jb2RpbmdfdG9fY2hhcnwiICsNCiAgICAgICAgInBnX2V4dGVuc2lvbl9jb25maWdfZHVtcHxwZ19leHRlbnNpb25fdXBkYXRlX3BhdGhzfHBnX2Z1bmN0aW9uX2lzX3Zpc2libGV8IiArDQogICAgICAgICJwZ19nZXRfY29uc3RyYWludGRlZnxwZ19nZXRfZXhwcnxwZ19nZXRfZnVuY3Rpb25fYXJndW1lbnRzfCIgKw0KICAgICAgICAicGdfZ2V0X2Z1bmN0aW9uX2lkZW50aXR5X2FyZ3VtZW50c3xwZ19nZXRfZnVuY3Rpb25fcmVzdWx0fHBnX2dldF9mdW5jdGlvbmRlZnwiICsNCiAgICAgICAgInBnX2dldF9pbmRleGRlZnxwZ19nZXRfa2V5d29yZHN8cGdfZ2V0X3J1bGVkZWZ8cGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZXwiICsNCiAgICAgICAgInBnX2dldF90cmlnZ2VyZGVmfHBnX2dldF91c2VyYnlpZHxwZ19nZXRfdmlld2RlZnxwZ19oYXNfcm9sZXxwZ19pbmRleGVzX3NpemV8IiArDQogICAgICAgICJwZ19pc19pbl9yZWNvdmVyeXxwZ19pc19vdGhlcl90ZW1wX3NjaGVtYXxwZ19pc194bG9nX3JlcGxheV9wYXVzZWR8IiArDQogICAgICAgICJwZ19sYXN0X3hhY3RfcmVwbGF5X3RpbWVzdGFtcHxwZ19sYXN0X3hsb2dfcmVjZWl2ZV9sb2NhdGlvbnwiICsNCiAgICAgICAgInBnX2xhc3RfeGxvZ19yZXBsYXlfbG9jYXRpb258cGdfbGlzdGVuaW5nX2NoYW5uZWxzfHBnX2xvY2tfc3RhdHVzfHBnX2xzX2RpcnwiICsNCiAgICAgICAgInBnX215X3RlbXBfc2NoZW1hfHBnX25vZGVfdHJlZV9pbnxwZ19ub2RlX3RyZWVfb3V0fHBnX25vZGVfdHJlZV9yZWN2fCIgKw0KICAgICAgICAicGdfbm9kZV90cmVlX3NlbmR8cGdfbm90aWZ5fHBnX29wY2xhc3NfaXNfdmlzaWJsZXxwZ19vcGVyYXRvcl9pc192aXNpYmxlfCIgKw0KICAgICAgICAicGdfb3B0aW9uc190b190YWJsZXxwZ19wb3N0bWFzdGVyX3N0YXJ0X3RpbWV8cGdfcHJlcGFyZWRfc3RhdGVtZW50fHBnX3ByZXBhcmVkX3hhY3R8IiArDQogICAgICAgICJwZ19yZWFkX2JpbmFyeV9maWxlfHBnX3JlYWRfZmlsZXxwZ19yZWxhdGlvbl9maWxlbm9kZXxwZ19yZWxhdGlvbl9maWxlcGF0aHwiICsNCiAgICAgICAgInBnX3JlbGF0aW9uX3NpemV8cGdfcmVsb2FkX2NvbmZ8cGdfcm90YXRlX2xvZ2ZpbGV8cGdfc2VxdWVuY2VfcGFyYW1ldGVyc3wiICsNCiAgICAgICAgInBnX3Nob3dfYWxsX3NldHRpbmdzfHBnX3NpemVfcHJldHR5fHBnX3NsZWVwfHBnX3N0YXJ0X2JhY2t1cHxwZ19zdGF0X2NsZWFyX3NuYXBzaG90fCIgKw0KICAgICAgICAicGdfc3RhdF9maWxlfHBnX3N0YXRfZ2V0X2FjdGl2aXR5fHBnX3N0YXRfZ2V0X2FuYWx5emVfY291bnR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9hdXRvYW5hbHl6ZV9jb3VudHxwZ19zdGF0X2dldF9hdXRvdmFjdXVtX2NvdW50fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9hY3Rpdml0eXxwZ19zdGF0X2dldF9iYWNrZW5kX2FjdGl2aXR5X3N0YXJ0fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9jbGllbnRfYWRkcnxwZ19zdGF0X2dldF9iYWNrZW5kX2NsaWVudF9wb3J0fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9kYmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfaWRzZXR8cGdfc3RhdF9nZXRfYmFja2VuZF9waWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9iYWNrZW5kX3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfdXNlcmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfd2FpdGluZ3wiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2JhY2tlbmRfeGFjdF9zdGFydHxwZ19zdGF0X2dldF9iZ3dyaXRlcl9idWZfd3JpdHRlbl9jaGVja3BvaW50c3wiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2Jnd3JpdGVyX2J1Zl93cml0dGVuX2NsZWFufHBnX3N0YXRfZ2V0X2Jnd3JpdGVyX21heHdyaXR0ZW5fY2xlYW58IiArDQogICAgICAgICJwZ19zdGF0X2dldF9iZ3dyaXRlcl9yZXF1ZXN0ZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfc3RhdF9yZXNldF90aW1lfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfYmd3cml0ZXJfdGltZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmxvY2tzX2ZldGNoZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9ibG9ja3NfaGl0fHBnX3N0YXRfZ2V0X2J1Zl9hbGxvY3xwZ19zdGF0X2dldF9idWZfZnN5bmNfYmFja2VuZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2J1Zl93cml0dGVuX2JhY2tlbmR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2ZldGNoZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl9ibG9ja3NfaGl0fHBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X2FsbHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X2J1ZmZlcnBpbnxwZ19zdGF0X2dldF9kYl9jb25mbGljdF9sb2NrfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc25hcHNob3R8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc3RhcnR1cF9kZWFkbG9ja3wiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X3RhYmxlc3BhY2V8cGdfc3RhdF9nZXRfZGJfbnVtYmFja2VuZHN8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl9zdGF0X3Jlc2V0X3RpbWV8cGdfc3RhdF9nZXRfZGJfdHVwbGVzX2RlbGV0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfaW5zZXJ0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfZGJfdHVwbGVzX3VwZGF0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF9kYl94YWN0X2NvbW1pdHxwZ19zdGF0X2dldF9kYl94YWN0X3JvbGxiYWNrfHBnX3N0YXRfZ2V0X2RlYWRfdHVwbGVzfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fc2VsZl90aW1lfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfZnVuY3Rpb25fdGltZXxwZ19zdGF0X2dldF9sYXN0X2FuYWx5emVfdGltZXwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2xhc3RfYXV0b2FuYWx5emVfdGltZXxwZ19zdGF0X2dldF9sYXN0X2F1dG92YWN1dW1fdGltZXwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X2xhc3RfdmFjdXVtX3RpbWV8cGdfc3RhdF9nZXRfbGl2ZV90dXBsZXN8cGdfc3RhdF9nZXRfbnVtc2NhbnN8IiArDQogICAgICAgICJwZ19zdGF0X2dldF90dXBsZXNfZGVsZXRlZHxwZ19zdGF0X2dldF90dXBsZXNfZmV0Y2hlZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X3R1cGxlc19ob3RfdXBkYXRlZHxwZ19zdGF0X2dldF90dXBsZXNfaW5zZXJ0ZWR8IiArDQogICAgICAgICJwZ19zdGF0X2dldF90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9nZXRfdmFjdXVtX2NvdW50fCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfd2FsX3NlbmRlcnN8cGdfc3RhdF9nZXRfeGFjdF9ibG9ja3NfZmV0Y2hlZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X3hhY3RfYmxvY2tzX2hpdHxwZ19zdGF0X2dldF94YWN0X2Z1bmN0aW9uX2NhbGxzfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl9zZWxmX3RpbWV8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl90aW1lfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF9udW1zY2Fuc3xwZ19zdGF0X2dldF94YWN0X3R1cGxlc19kZWxldGVkfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF94YWN0X3R1cGxlc19ob3RfdXBkYXRlZHwiICsNCiAgICAgICAgInBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2luc2VydGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3JldHVybmVkfCIgKw0KICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfdXBkYXRlZHxwZ19zdGF0X3Jlc2V0fHBnX3N0YXRfcmVzZXRfc2hhcmVkfCIgKw0KICAgICAgICAicGdfc3RhdF9yZXNldF9zaW5nbGVfZnVuY3Rpb25fY291bnRlcnN8cGdfc3RhdF9yZXNldF9zaW5nbGVfdGFibGVfY291bnRlcnN8IiArDQogICAgICAgICJwZ19zdG9wX2JhY2t1cHxwZ19zd2l0Y2hfeGxvZ3xwZ190YWJsZV9pc192aXNpYmxlfHBnX3RhYmxlX3NpemV8IiArDQogICAgICAgICJwZ190YWJsZXNwYWNlX2RhdGFiYXNlc3xwZ190YWJsZXNwYWNlX3NpemV8cGdfdGVybWluYXRlX2JhY2tlbmR8cGdfdGltZXpvbmVfYWJicmV2c3wiICsNCiAgICAgICAgInBnX3RpbWV6b25lX25hbWVzfHBnX3RvdGFsX3JlbGF0aW9uX3NpemV8cGdfdHJ5X2Fkdmlzb3J5X2xvY2t8IiArDQogICAgICAgICJwZ190cnlfYWR2aXNvcnlfbG9ja19zaGFyZWR8cGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9ja3wiICsNCiAgICAgICAgInBnX3RyeV9hZHZpc29yeV94YWN0X2xvY2tfc2hhcmVkfHBnX3RzX2NvbmZpZ19pc192aXNpYmxlfHBnX3RzX2RpY3RfaXNfdmlzaWJsZXwiICsNCiAgICAgICAgInBnX3RzX3BhcnNlcl9pc192aXNpYmxlfHBnX3RzX3RlbXBsYXRlX2lzX3Zpc2libGV8cGdfdHlwZV9pc192aXNpYmxlfHBnX3R5cGVvZnwiICsNCiAgICAgICAgInBnX3hsb2dfcmVwbGF5X3BhdXNlfHBnX3hsb2dfcmVwbGF5X3Jlc3VtZXxwZ194bG9nZmlsZV9uYW1lfHBnX3hsb2dmaWxlX25hbWVfb2Zmc2V0fCIgKw0KICAgICAgICAicGl8cGxhaW50b190c3F1ZXJ5fHBscGdzcWxfY2FsbF9oYW5kbGVyfHBscGdzcWxfaW5saW5lX2hhbmRsZXJ8cGxwZ3NxbF92YWxpZGF0b3J8IiArDQogICAgICAgICJwb2ludHxwb2ludF9hYm92ZXxwb2ludF9hZGR8cG9pbnRfYmVsb3d8cG9pbnRfZGlzdGFuY2V8cG9pbnRfZGl2fHBvaW50X2VxfHBvaW50X2hvcml6fCIgKw0KICAgICAgICAicG9pbnRfaW58cG9pbnRfbGVmdHxwb2ludF9tdWx8cG9pbnRfbmV8cG9pbnRfb3V0fHBvaW50X3JlY3Z8cG9pbnRfcmlnaHR8cG9pbnRfc2VuZHwiICsNCiAgICAgICAgInBvaW50X3N1Ynxwb2ludF92ZXJ0fHBvbHlfYWJvdmV8cG9seV9iZWxvd3xwb2x5X2NlbnRlcnxwb2x5X2NvbnRhaW58cG9seV9jb250YWluX3B0fCIgKw0KICAgICAgICAicG9seV9jb250YWluZWR8cG9seV9kaXN0YW5jZXxwb2x5X2lufHBvbHlfbGVmdHxwb2x5X25wb2ludHN8cG9seV9vdXR8cG9seV9vdmVyYWJvdmV8IiArDQogICAgICAgICJwb2x5X292ZXJiZWxvd3xwb2x5X292ZXJsYXB8cG9seV9vdmVybGVmdHxwb2x5X292ZXJyaWdodHxwb2x5X3JlY3Z8cG9seV9yaWdodHwiICsNCiAgICAgICAgInBvbHlfc2FtZXxwb2x5X3NlbmR8cG9seWdvbnxwb3Blbnxwb3NpdGlvbnxwb3NpdGlvbmpvaW5zZWx8cG9zaXRpb25zZWx8IiArDQogICAgICAgICJwb3N0Z3Jlc3FsX2Zkd192YWxpZGF0b3J8cG93fHBvd2VyfHByc2RfZW5kfHByc2RfaGVhZGxpbmV8cHJzZF9sZXh0eXBlfHByc2RfbmV4dHRva2VufCIgKw0KICAgICAgICAicHJzZF9zdGFydHxwdF9jb250YWluZWRfY2lyY2xlfHB0X2NvbnRhaW5lZF9wb2x5fHF1ZXJ5X3RvX3htbHwiICsNCiAgICAgICAgInF1ZXJ5X3RvX3htbF9hbmRfeG1sc2NoZW1hfHF1ZXJ5X3RvX3htbHNjaGVtYXxxdWVyeXRyZWV8cXVvdGVfaWRlbnR8cXVvdGVfbGl0ZXJhbHwiICsNCiAgICAgICAgInF1b3RlX251bGxhYmxlfHJhZGlhbnN8cmFkaXVzfHJhbmRvbXxyYW5rfHJlY29yZF9lcXxyZWNvcmRfZ2V8cmVjb3JkX2d0fHJlY29yZF9pbnwiICsNCiAgICAgICAgInJlY29yZF9sZXxyZWNvcmRfbHR8cmVjb3JkX25lfHJlY29yZF9vdXR8cmVjb3JkX3JlY3Z8cmVjb3JkX3NlbmR8cmVnY2xhc3N8cmVnY2xhc3NpbnwiICsNCiAgICAgICAgInJlZ2NsYXNzb3V0fHJlZ2NsYXNzcmVjdnxyZWdjbGFzc3NlbmR8cmVnY29uZmlnaW58cmVnY29uZmlnb3V0fHJlZ2NvbmZpZ3JlY3Z8IiArDQogICAgICAgICJyZWdjb25maWdzZW5kfHJlZ2RpY3Rpb25hcnlpbnxyZWdkaWN0aW9uYXJ5b3V0fHJlZ2RpY3Rpb25hcnlyZWN2fHJlZ2RpY3Rpb25hcnlzZW5kfCIgKw0KICAgICAgICAicmVnZXhlcWpvaW5zZWx8cmVnZXhlcXNlbHxyZWdleG5lam9pbnNlbHxyZWdleG5lc2VsfHJlZ2V4cF9tYXRjaGVzfHJlZ2V4cF9yZXBsYWNlfCIgKw0KICAgICAgICAicmVnZXhwX3NwbGl0X3RvX2FycmF5fHJlZ2V4cF9zcGxpdF90b190YWJsZXxyZWdvcGVyYXRvcmlufHJlZ29wZXJhdG9yb3V0fCIgKw0KICAgICAgICAicmVnb3BlcmF0b3JyZWN2fHJlZ29wZXJhdG9yc2VuZHxyZWdvcGVyaW58cmVnb3Blcm91dHxyZWdvcGVycmVjdnxyZWdvcGVyc2VuZHwiICsNCiAgICAgICAgInJlZ3Byb2NlZHVyZWlufHJlZ3Byb2NlZHVyZW91dHxyZWdwcm9jZWR1cmVyZWN2fHJlZ3Byb2NlZHVyZXNlbmR8cmVncHJvY2lufHJlZ3Byb2NvdXR8IiArDQogICAgICAgICJyZWdwcm9jcmVjdnxyZWdwcm9jc2VuZHxyZWdyX2F2Z3h8cmVncl9hdmd5fHJlZ3JfY291bnR8cmVncl9pbnRlcmNlcHR8cmVncl9yMnwiICsNCiAgICAgICAgInJlZ3Jfc2xvcGV8cmVncl9zeHh8cmVncl9zeHl8cmVncl9zeXl8cmVndHlwZWlufHJlZ3R5cGVvdXR8cmVndHlwZXJlY3Z8cmVndHlwZXNlbmR8IiArDQogICAgICAgICJyZWx0aW1lfHJlbHRpbWVlcXxyZWx0aW1lZ2V8cmVsdGltZWd0fHJlbHRpbWVpbnxyZWx0aW1lbGV8cmVsdGltZWx0fHJlbHRpbWVuZXxyZWx0aW1lb3V0fCIgKw0KICAgICAgICAicmVsdGltZXJlY3Z8cmVsdGltZXNlbmR8cmVwZWF0fHJlcGxhY2V8cmV2ZXJzZXxyaWdodHxyb3VuZHxyb3dfbnVtYmVyfHJwYWR8cnRyaW18IiArDQogICAgICAgICJzY2FsYXJndGpvaW5zZWx8c2NhbGFyZ3RzZWx8c2NhbGFybHRqb2luc2VsfHNjYWxhcmx0c2VsfHNjaGVtYV90b194bWx8IiArDQogICAgICAgICJzY2hlbWFfdG9feG1sX2FuZF94bWxzY2hlbWF8c2NoZW1hX3RvX3htbHNjaGVtYXxzZXNzaW9uX3VzZXJ8c2V0X2JpdHxzZXRfYnl0ZXwiICsNCiAgICAgICAgInNldF9jb25maWd8c2V0X21hc2tsZW58c2V0c2VlZHxzZXR2YWx8c2V0d2VpZ2h0fHNoZWxsX2lufHNoZWxsX291dHwiICsNCiAgICAgICAgInNoaWZ0X2ppc18yMDA0X3RvX2V1Y19qaXNfMjAwNHxzaGlmdF9qaXNfMjAwNF90b191dGY4fHNob2JqX2Rlc2NyaXB0aW9ufHNpZ258IiArDQogICAgICAgICJzaW1pbGFyX2VzY2FwZXxzaW58c2ppc190b19ldWNfanB8c2ppc190b19taWN8c2ppc190b191dGY4fHNsb3BlfHNtZ3JlcXxzbWdyaW58c21ncm5lfCIgKw0KICAgICAgICAic21ncm91dHxzcGxpdF9wYXJ0fHNxcnR8c3RhdGVtZW50X3RpbWVzdGFtcHxzdGRkZXZ8c3RkZGV2X3BvcHxzdGRkZXZfc2FtcHxzdHJpbmdfYWdnfCIgKw0KICAgICAgICAic3RyaW5nX2FnZ19maW5hbGZufHN0cmluZ19hZ2dfdHJhbnNmbnxzdHJpbmdfdG9fYXJyYXl8c3RyaXB8c3RycG9zfHN1YnN0cnxzdWJzdHJpbmd8c3VtfCIgKw0KICAgICAgICAic3VwcHJlc3NfcmVkdW5kYW50X3VwZGF0ZXNfdHJpZ2dlcnx0YWJsZV90b194bWx8dGFibGVfdG9feG1sX2FuZF94bWxzY2hlbWF8IiArDQogICAgICAgICJ0YWJsZV90b194bWxzY2hlbWF8dGFufHRleHR8dGV4dF9nZXx0ZXh0X2d0fHRleHRfbGFyZ2VyfHRleHRfbGV8dGV4dF9sdHx0ZXh0X3BhdHRlcm5fZ2V8IiArDQogICAgICAgICJ0ZXh0X3BhdHRlcm5fZ3R8dGV4dF9wYXR0ZXJuX2xlfHRleHRfcGF0dGVybl9sdHx0ZXh0X3NtYWxsZXJ8dGV4dGFueWNhdHx0ZXh0Y2F0fHRleHRlcXwiICsNCiAgICAgICAgInRleHRpY2xpa2V8dGV4dGljbmxpa2V8dGV4dGljcmVnZXhlcXx0ZXh0aWNyZWdleG5lfHRleHRpbnx0ZXh0bGVufHRleHRsaWtlfHRleHRuZXwiICsNCiAgICAgICAgInRleHRubGlrZXx0ZXh0b3V0fHRleHRyZWN2fHRleHRyZWdleGVxfHRleHRyZWdleG5lfHRleHRzZW5kfHRoZXNhdXJ1c19pbml0fCIgKw0KICAgICAgICAidGhlc2F1cnVzX2xleGl6ZXx0aWRlcXx0aWRnZXx0aWRndHx0aWRpbnx0aWRsYXJnZXJ8dGlkbGV8dGlkbHR8dGlkbmV8dGlkb3V0fHRpZHJlY3Z8dGlkc2VuZHwiICsNCiAgICAgICAgInRpZHNtYWxsZXJ8dGltZV9jbXB8dGltZV9lcXx0aW1lX2dlfHRpbWVfZ3R8dGltZV9oYXNofHRpbWVfaW58dGltZV9sYXJnZXJ8dGltZV9sZXx0aW1lX2x0fCIgKw0KICAgICAgICAidGltZV9taV9pbnRlcnZhbHx0aW1lX21pX3RpbWV8dGltZV9uZXx0aW1lX291dHx0aW1lX3BsX2ludGVydmFsfHRpbWVfcmVjdnx0aW1lX3NlbmR8IiArDQogICAgICAgICJ0aW1lX3NtYWxsZXJ8dGltZWRhdGVfcGx8dGltZW1pfHRpbWVub3d8dGltZW9mZGF5fHRpbWVwbHx0aW1lc3RhbXBfY21wfCIgKw0KICAgICAgICAidGltZXN0YW1wX2NtcF9kYXRlfHRpbWVzdGFtcF9jbXBfdGltZXN0YW1wdHp8dGltZXN0YW1wX2VxfHRpbWVzdGFtcF9lcV9kYXRlfCIgKw0KICAgICAgICAidGltZXN0YW1wX2VxX3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9nZXx0aW1lc3RhbXBfZ2VfZGF0ZXx0aW1lc3RhbXBfZ2VfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJ0aW1lc3RhbXBfZ3R8dGltZXN0YW1wX2d0X2RhdGV8dGltZXN0YW1wX2d0X3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9oYXNofHRpbWVzdGFtcF9pbnwiICsNCiAgICAgICAgInRpbWVzdGFtcF9sYXJnZXJ8dGltZXN0YW1wX2xlfHRpbWVzdGFtcF9sZV9kYXRlfHRpbWVzdGFtcF9sZV90aW1lc3RhbXB0enwiICsNCiAgICAgICAgInRpbWVzdGFtcF9sdHx0aW1lc3RhbXBfbHRfZGF0ZXx0aW1lc3RhbXBfbHRfdGltZXN0YW1wdHp8dGltZXN0YW1wX21pfCIgKw0KICAgICAgICAidGltZXN0YW1wX21pX2ludGVydmFsfHRpbWVzdGFtcF9uZXx0aW1lc3RhbXBfbmVfZGF0ZXx0aW1lc3RhbXBfbmVfdGltZXN0YW1wdHp8IiArDQogICAgICAgICJ0aW1lc3RhbXBfb3V0fHRpbWVzdGFtcF9wbF9pbnRlcnZhbHx0aW1lc3RhbXBfcmVjdnx0aW1lc3RhbXBfc2VuZHx0aW1lc3RhbXBfc21hbGxlcnwiICsNCiAgICAgICAgInRpbWVzdGFtcHR5cG1vZGlufHRpbWVzdGFtcHR5cG1vZG91dHx0aW1lc3RhbXB0el9jbXB8dGltZXN0YW1wdHpfY21wX2RhdGV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9jbXBfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2VxfHRpbWVzdGFtcHR6X2VxX2RhdGV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9lcV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ2V8dGltZXN0YW1wdHpfZ2VfZGF0ZXwiICsNCiAgICAgICAgInRpbWVzdGFtcHR6X2dlX3RpbWVzdGFtcHx0aW1lc3RhbXB0el9ndHx0aW1lc3RhbXB0el9ndF9kYXRlfCIgKw0KICAgICAgICAidGltZXN0YW1wdHpfZ3RfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2lufHRpbWVzdGFtcHR6X2xhcmdlcnx0aW1lc3RhbXB0el9sZXwiICsNCiAgICAgICAgInRpbWVzdGFtcHR6X2xlX2RhdGV8dGltZXN0YW1wdHpfbGVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2x0fHRpbWVzdGFtcHR6X2x0X2RhdGV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9sdF90aW1lc3RhbXB8dGltZXN0YW1wdHpfbWl8dGltZXN0YW1wdHpfbWlfaW50ZXJ2YWx8dGltZXN0YW1wdHpfbmV8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9uZV9kYXRlfHRpbWVzdGFtcHR6X25lX3RpbWVzdGFtcHx0aW1lc3RhbXB0el9vdXR8IiArDQogICAgICAgICJ0aW1lc3RhbXB0el9wbF9pbnRlcnZhbHx0aW1lc3RhbXB0el9yZWN2fHRpbWVzdGFtcHR6X3NlbmR8dGltZXN0YW1wdHpfc21hbGxlcnwiICsNCiAgICAgICAgInRpbWVzdGFtcHR6dHlwbW9kaW58dGltZXN0YW1wdHp0eXBtb2RvdXR8dGltZXR5cG1vZGlufHRpbWV0eXBtb2RvdXR8dGltZXR6X2NtcHwiICsNCiAgICAgICAgInRpbWV0el9lcXx0aW1ldHpfZ2V8dGltZXR6X2d0fHRpbWV0el9oYXNofHRpbWV0el9pbnx0aW1ldHpfbGFyZ2VyfHRpbWV0el9sZXx0aW1ldHpfbHR8IiArDQogICAgICAgICJ0aW1ldHpfbWlfaW50ZXJ2YWx8dGltZXR6X25lfHRpbWV0el9vdXR8dGltZXR6X3BsX2ludGVydmFsfHRpbWV0el9yZWN2fHRpbWV0el9zZW5kfCIgKw0KICAgICAgICAidGltZXR6X3NtYWxsZXJ8dGltZXR6ZGF0ZV9wbHx0aW1ldHp0eXBtb2Rpbnx0aW1ldHp0eXBtb2RvdXR8dGltZXpvbmV8dGludGVydmFsfCIgKw0KICAgICAgICAidGludGVydmFsY3R8dGludGVydmFsZW5kfHRpbnRlcnZhbGVxfHRpbnRlcnZhbGdlfHRpbnRlcnZhbGd0fHRpbnRlcnZhbGlufHRpbnRlcnZhbGxlfCIgKw0KICAgICAgICAidGludGVydmFsbGVuZXF8dGludGVydmFsbGVuZ2V8dGludGVydmFsbGVuZ3R8dGludGVydmFsbGVubGV8dGludGVydmFsbGVubHR8IiArDQogICAgICAgICJ0aW50ZXJ2YWxsZW5uZXx0aW50ZXJ2YWxsdHx0aW50ZXJ2YWxuZXx0aW50ZXJ2YWxvdXR8dGludGVydmFsb3Z8dGludGVydmFscmVjdnwiICsNCiAgICAgICAgInRpbnRlcnZhbHJlbHx0aW50ZXJ2YWxzYW1lfHRpbnRlcnZhbHNlbmR8dGludGVydmFsc3RhcnR8dG9fYXNjaWl8dG9fY2hhcnx0b19kYXRlfHRvX2hleHwiICsNCiAgICAgICAgInRvX251bWJlcnx0b190aW1lc3RhbXB8dG9fdHNxdWVyeXx0b190c3ZlY3Rvcnx0cmFuc2FjdGlvbl90aW1lc3RhbXB8dHJhbnNsYXRlfCIgKw0KICAgICAgICAidHJpZ2dlcl9pbnx0cmlnZ2VyX291dHx0cnVuY3x0c19kZWJ1Z3x0c19oZWFkbGluZXx0c19sZXhpemV8dHNfbWF0Y2hfcXZ8dHNfbWF0Y2hfdHF8IiArDQogICAgICAgICJ0c19tYXRjaF90dHx0c19tYXRjaF92cXx0c19wYXJzZXx0c19yYW5rfHRzX3JhbmtfY2R8dHNfcmV3cml0ZXx0c19zdGF0fHRzX3Rva2VuX3R5cGV8IiArDQogICAgICAgICJ0c190eXBhbmFseXplfHRzbWF0Y2hqb2luc2VsfHRzbWF0Y2hzZWx8dHNxX21jb250YWluZWR8dHNxX21jb250YWluc3x0c3F1ZXJ5X2FuZHwiICsNCiAgICAgICAgInRzcXVlcnlfY21wfHRzcXVlcnlfZXF8dHNxdWVyeV9nZXx0c3F1ZXJ5X2d0fHRzcXVlcnlfbGV8dHNxdWVyeV9sdHx0c3F1ZXJ5X25lfCIgKw0KICAgICAgICAidHNxdWVyeV9ub3R8dHNxdWVyeV9vcnx0c3F1ZXJ5aW58dHNxdWVyeW91dHx0c3F1ZXJ5cmVjdnx0c3F1ZXJ5c2VuZHx0c3ZlY3Rvcl9jbXB8IiArDQogICAgICAgICJ0c3ZlY3Rvcl9jb25jYXR8dHN2ZWN0b3JfZXF8dHN2ZWN0b3JfZ2V8dHN2ZWN0b3JfZ3R8dHN2ZWN0b3JfbGV8dHN2ZWN0b3JfbHR8IiArDQogICAgICAgICJ0c3ZlY3Rvcl9uZXx0c3ZlY3Rvcl91cGRhdGVfdHJpZ2dlcnx0c3ZlY3Rvcl91cGRhdGVfdHJpZ2dlcl9jb2x1bW58dHN2ZWN0b3JpbnwiICsNCiAgICAgICAgInRzdmVjdG9yb3V0fHRzdmVjdG9ycmVjdnx0c3ZlY3RvcnNlbmR8dHhpZF9jdXJyZW50fHR4aWRfY3VycmVudF9zbmFwc2hvdHwiICsNCiAgICAgICAgInR4aWRfc25hcHNob3RfaW58dHhpZF9zbmFwc2hvdF9vdXR8dHhpZF9zbmFwc2hvdF9yZWN2fHR4aWRfc25hcHNob3Rfc2VuZHwiICsNCiAgICAgICAgInR4aWRfc25hcHNob3RfeGlwfHR4aWRfc25hcHNob3RfeG1heHx0eGlkX3NuYXBzaG90X3htaW58dHhpZF92aXNpYmxlX2luX3NuYXBzaG90fCIgKw0KICAgICAgICAidWhjX3RvX3V0Zjh8dW5pcXVlX2tleV9yZWNoZWNrfHVua25vd25pbnx1bmtub3dub3V0fHVua25vd25yZWN2fHVua25vd25zZW5kfHVubmVzdHwiICsNCiAgICAgICAgInVwcGVyfHV0ZjhfdG9fYXNjaWl8dXRmOF90b19iaWc1fHV0ZjhfdG9fZXVjX2NufHV0ZjhfdG9fZXVjX2ppc18yMDA0fHV0ZjhfdG9fZXVjX2pwfCIgKw0KICAgICAgICAidXRmOF90b19ldWNfa3J8dXRmOF90b19ldWNfdHd8dXRmOF90b19nYjE4MDMwfHV0ZjhfdG9fZ2JrfHV0ZjhfdG9faXNvODg1OXwiICsNCiAgICAgICAgInV0ZjhfdG9faXNvODg1OV8xfHV0ZjhfdG9fam9oYWJ8dXRmOF90b19rb2k4cnx1dGY4X3RvX2tvaTh1fHV0ZjhfdG9fc2hpZnRfamlzXzIwMDR8IiArDQogICAgICAgICJ1dGY4X3RvX3NqaXN8dXRmOF90b191aGN8dXRmOF90b193aW58dXVpZF9jbXB8dXVpZF9lcXx1dWlkX2dlfHV1aWRfZ3R8dXVpZF9oYXNofHV1aWRfaW58IiArDQogICAgICAgICJ1dWlkX2xlfHV1aWRfbHR8dXVpZF9uZXx1dWlkX291dHx1dWlkX3JlY3Z8dXVpZF9zZW5kfHZhcl9wb3B8dmFyX3NhbXB8dmFyYml0X2lufCIgKw0KICAgICAgICAidmFyYml0X291dHx2YXJiaXRfcmVjdnx2YXJiaXRfc2VuZHx2YXJiaXRjbXB8dmFyYml0ZXF8dmFyYml0Z2V8dmFyYml0Z3R8dmFyYml0bGV8IiArDQogICAgICAgICJ2YXJiaXRsdHx2YXJiaXRuZXx2YXJiaXR0eXBtb2Rpbnx2YXJiaXR0eXBtb2RvdXR8dmFyY2hhcmlufHZhcmNoYXJvdXR8dmFyY2hhcnJlY3Z8IiArDQogICAgICAgICJ2YXJjaGFyc2VuZHx2YXJjaGFydHlwbW9kaW58dmFyY2hhcnR5cG1vZG91dHx2YXJpYW5jZXx2ZXJzaW9ufHZvaWRfaW58dm9pZF9vdXR8IiArDQogICAgICAgICJ2b2lkX3JlY3Z8dm9pZF9zZW5kfHdpZHRofHdpZHRoX2J1Y2tldHx3aW4xMjUwX3RvX2xhdGluMnx3aW4xMjUwX3RvX21pY3x3aW4xMjUxX3RvX2lzb3wiICsNCiAgICAgICAgIndpbjEyNTFfdG9fa29pOHJ8d2luMTI1MV90b19taWN8d2luMTI1MV90b193aW44NjZ8d2luODY2X3RvX2lzb3x3aW44NjZfdG9fa29pOHJ8IiArDQogICAgICAgICJ3aW44NjZfdG9fbWljfHdpbjg2Nl90b193aW4xMjUxfHdpbl90b191dGY4fHhpZGVxfHhpZGVxaW50NHx4aWRpbnx4aWRvdXR8eGlkcmVjdnx4aWRzZW5kfCIgKw0KICAgICAgICAieG1sfHhtbF9pbnx4bWxfaXNfd2VsbF9mb3JtZWR8eG1sX2lzX3dlbGxfZm9ybWVkX2NvbnRlbnR8eG1sX2lzX3dlbGxfZm9ybWVkX2RvY3VtZW50fCIgKw0KICAgICAgICAieG1sX291dHx4bWxfcmVjdnx4bWxfc2VuZHx4bWxhZ2d8eG1sY29tbWVudHx4bWxjb25jYXQyfHhtbGV4aXN0c3x4bWx2YWxpZGF0ZXx4cGF0aHwiICsNCiAgICAgICAgInhwYXRoX2V4aXN0cyIpLnNwbGl0KCJ8IikNCiAgICApOw0KICAgIA0KICAgIHZhciBzcWxSdWxlcyA9IFsNCiAgICAgICAgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUgc3RyaW5nIC0tIGFzc3VtZSBkb2xsYXIgc3RyaW5ncyBpZiBtdWx0aS1saW5lIGZvciBub3cNCiAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlLmxhbmd1YWdlIiwgLy8gcGcgaWRlbnRpZmllcg0KICAgICAgICAgICAgcmVnZXggOiAnIi4qPyInDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl9dW2EtekEtWjAtOV8kXSpcXGIiIC8vIFRPRE8gLSBVbmljb2RlIGluIGlkZW50aWZpZXJzDQogICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgcmVnZXggOiAiIXwhIXwhfnwhflxcKnwhfn58IX5+XFwqfCN8IyN8Izx8Izw9fCM8PnwjPXwjPnwjPj18JXxcXCZ8XFwmXFwmfFxcJjx8XFwmPFxcfHxcXCY+fFxcKnxcXCt8IiArDQogICAgICAgICAgICAgICAgICAgICAgIlxcLXwvfDx8PCM+fDxcXC0+fDw8fDw8PXw8PFxcfHw8PXw8Pnw8XFw/Pnw8QHw8XFxefD18Pnw+PXw+Pnw+Pj18PlxcXnxcXD8jfFxcP1xcLXxcXD9cXC1cXHx8IiArDQogICAgICAgICAgICAgICAgICAgICAgIlxcP1xcfHxcXD9cXHxcXHx8QHxAXFwtQHxAPnxAQHxAQEB8XFxefFxcfHxcXHxcXCY+fFxcfC98XFx8Pj58XFx8XFx8fFxcfFxcfC98fnx+XFwqfH48PX58fjx+fCIgKw0KICAgICAgICAgICAgICAgICAgICAgICJ+PXx+Pj1+fH4+fnx+fnx+flxcKiINCiAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbi5wYXJlbiIsDQogICAgICAgICAgICAgIHJlZ2V4IDogIltcXChdIg0KICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgcmVnZXggOiAiW1xcKV0iDQogICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICB9DQogICAgXTsNCiAgICAgICAgICAgDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICItLS4qJCINCiAgICAgICAgICAgIH0sIA0KICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpLWxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgICAgIH0sew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQuc3RhdGVtZW50QmVnaW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIl5bYS16QS1aXSsiLCAvLyBDb3VsZCBlbnVtZXJhdGUgc3RhcnRpbmcga2V5d29yZHMgYnV0IHRoaXMgYWxsb3dzIHRoaW5ncyB0byB3b3JrIHdoZW4gbmV3IHN0YXRlbWVudHMgYXJlIGFkZGVkLg0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhdGVtZW50Ig0KICAgICAgICAgICAgfSx7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC5idWlsZGluIiwgLy8gcHNxbCBkaXJlY3RpdmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJeXFxcXFtcXFNdKy4qJCINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgDQogICAgICAgICJzdGF0ZW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi0tLiokIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aS1saW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRTdGF0ZW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RhdGVtZW50RW5kIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICI7IiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHBlcmwsIHB5dGhvbiwgdGNsIGFyZSBpbiB0aGUgcGcgZGVmYXVsdCBkaXN0IChubyB0Y2wgaGlnaGxpZ2h0ZXIpDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkcGVybFxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJwZXJsLXN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkcHl0aG9uXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInB5dGhvbi1zdGFydCINCiAgICAgICAgICAgIH0sew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkW1xcd18wLTldKlxcJCQiLCAvLyBkb2xsYXIgcXVvdGUgYXQgdGhlIGVuZCBvZiBhIGxpbmUNCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcJFtcXHdfMC05XSpcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3RhdGVtZW50U3RyaW5nIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLmNvbmNhdChzcWxSdWxlcyksDQogICAgICAgIA0KICAgICAgICAiZG9sbGFyU3FsIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICItLS4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGktbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50RG9sbGFyU3FsIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGVuZCBxdW90aW5nIHdpdGggZG9sbGFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJeXFwkW1xcd18wLTldKlxcJCIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGF0ZW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCRbXFx3XzAtOV0qXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbFN0cmluZyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXS5jb25jYXQoc3FsUnVsZXMpLA0KICAgICAgICANCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgDQogICAgICAgICJjb21tZW50U3RhdGVtZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXRlbWVudCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICANCiAgICAgICAgImNvbW1lbnREb2xsYXJTcWwiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3FsIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIA0KICAgICAgICAiZG9sbGFyU3RhdGVtZW50U3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBjbG9zaW5nIGRvbGxhcnN0cmluZw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcJFtcXHdfMC05XSpcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhdGVtZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGRvbGxhcnN0cmluZyBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICANCiAgICAgICAgImRvbGxhclNxbFN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gY2xvc2luZyBkb2xsYXJzdHJpbmcNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCRbXFx3XzAtOV0qXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBkb2xsYXJzdHJpbmcgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLCBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KICAgIHRoaXMuZW1iZWRSdWxlcyhQZXJsSGlnaGxpZ2h0UnVsZXMsICJwZXJsLSIsIFt7dG9rZW4gOiAic3RyaW5nIiwgcmVnZXggOiAiXFwkcGVybFxcJCIsIG5leHQgOiAic3RhdGVtZW50In1dKTsNCiAgICB0aGlzLmVtYmVkUnVsZXMoUHl0aG9uSGlnaGxpZ2h0UnVsZXMsICJweXRob24tIiwgW3t0b2tlbiA6ICJzdHJpbmciLCByZWdleCA6ICJcXCRweXRob25cXCQiLCBuZXh0IDogInN0YXRlbWVudCJ9XSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoUGdzcWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5QZ3NxbEhpZ2hsaWdodFJ1bGVzID0gUGdzcWxIaWdobGlnaHRSdWxlczsNCn0pOw0KDQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIFBhbmFnaW90aXMgQXN0aXRoYXMgPHBhc3RpdGggQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3BlcmxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJhc2V8Y29uc3RhbnR8Y29udGludWV8ZWxzZXxlbHNpZnxmb3J8Zm9yZWFjaHxmb3JtYXR8Z290b3xpZnxsYXN0fGxvY2FsfG15fG5leHR8IiArDQogICAgICAgICAibm98cGFja2FnZXxwYXJlbnR8cmVkb3xyZXF1aXJlfHNjYWxhcnxzdWJ8dW5sZXNzfHVudGlsfHdoaWxlfHVzZXx2YXJzIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJBUkdWfEVOVnxJTkN8U0lHIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnwiICsNCiAgICAgICAgICJnZXRob3N0YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0bmV0YnlhZGRyfGdldG5ldGJ5bmFtZXxnZXRzb2NrbmFtZXwiICsNCiAgICAgICAgICJnZXRwZWVybmFtZXxzZXRwcmlvcml0eXxnZXRwcm90b2VudHxzZXRwcm90b2VudHxnZXRwcmlvcml0eXwiICsNCiAgICAgICAgICJlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8IiArDQogICAgICAgICAiZ2V0c29ja29wdHxnZXRob3N0ZW50fGVuZGhvc3RlbnR8c2V0c29ja29wdHxzZXRuZXRlbnR8cXVvdGVtZXRhfCIgKw0KICAgICAgICAgImxvY2FsdGltZXxwcm90b3R5cGV8Z2V0bmV0ZW50fGVuZG5ldGVudHxyZXdpbmRkaXJ8d2FudGFycmF5fGdldHB3dWlkfCIgKw0KICAgICAgICAgImNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfCIgKw0KICAgICAgICAgInNodXRkb3dufHJlYWRsaW5lfGVuZHB3ZW50fHNldGdyZW50fHJlYWRwaXBlfGZvcm1saW5lfHRydW5jYXRlfCIgKw0KICAgICAgICAgImRibWNsb3NlfHN5c3dyaXRlfHNldHB3ZW50fGdldHB3bmFtfGdldGdyZW50fGdldHB3ZW50fHVjZmlyc3R8c3lzcmVhZHwiICsNCiAgICAgICAgICJzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8IiArDQogICAgICAgICAibGNmaXJzdHxnZXRwcGlkfGJpbm1vZGV8c3lzY2FsbHxzcHJpbnRmfGdldHBncnB8cmVhZGRpcnxzZWVrZGlyfCIgKw0KICAgICAgICAgIndhaXRwaWR8cmV2ZXJzZXx1bnNoaWZ0fHN5bWxpbmt8ZGJtb3BlbnxzZW1nZXR8bXNncmN2fHJlbmFtZXxsaXN0ZW58IiArDQogICAgICAgICAiY2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18IiArDQogICAgICAgICAidW5saW5rfHByaW50ZnxnbXRpbWV8bXNnY3RsfHNlbWN0bHx2YWx1ZXN8cmluZGV4fHN1YnN0cnxzcGxpY2V8IiArDQogICAgICAgICAibGVuZ3RofG1zZ2dldHxzZWxlY3R8c29ja2V0fHJldHVybnxjYWxsZXJ8ZGVsZXRlfGFsYXJtfGlvY3RsfGluZGV4fCIgKw0KICAgICAgICAgInVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fCIgKw0KICAgICAgICAgInNsZWVwfGNob21wfHVudGllfHByaW50fHV0aW1lfG1rZGlyfGF0YW4yfHNwbGl0fGNyeXB0fGZsb2NrfGNobW9kfCIgKw0KICAgICAgICAgIkJFR0lOfGJsZXNzfGNoZGlyfHNlbW9wfHNoaWZ0fHJlc2V0fGxpbmt8c3RhdHxjaG9wfGdyZXB8Zm9ya3xkdW1wfCIgKw0KICAgICAgICAgImpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8IiArDQogICAgICAgICAia2V5c3xnZXRjfGtpbGx8c2Vla3xzcXJ0fHNlbmR8d2FpdHxyYW5kfHRpZWR8cmVhZHx0aW1lfGV4ZWN8cmVjdnwiICsNCiAgICAgICAgICJlb2Z8Y2hyfGludHxvcmR8ZXhwfHBvc3xwb3B8c2lufGxvZ3xhYnN8b2N0fGhleHx0aWV8Y29zfHZlY3xFTkR8cmVmfCIgKw0KICAgICAgICAgIm1hcHxkaWV8dWN8bGN8ZG8iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIjLiokIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMHhbMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLlxcLlxcLnxcXHxcXHw9fD4+PXw8PD18PD0+fCYmPXw9PnwhfnxcXF49fCY9fFxcfD18XFwuPXx4PXwlPXxcXC89fFxcKj18XFwtPXxcXCs9fD1+fFxcKlxcKnxcXC1cXC18XFwuXFwufFxcfFxcfHwmJnxcXCtcXCt8XFwtPnwhPXw9PXw+PXw8PXw+Pnw8PHwsfD18XFw/XFw6fFxcXnxcXHx8eHwlfFxcL3xcXCp8PHwmfFxcXFx8fnwhfD58XFwufFxcLXxcXCt8XFwtQ3xcXC1ifFxcLVN8XFwtdXxcXC10fFxcLXB8XFwtbHxcXC1kfFxcLWZ8XFwtZ3xcXC1zfFxcLXp8XFwta3xcXC1lfFxcLU98XFwtVHxcXC1CfFxcLU18XFwtQXxcXC1YfFxcLVd8XFwtY3xcXC1SfFxcLW98XFwteHxcXC13fFxcLXJ8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhQZXJsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuUGVybEhpZ2hsaWdodFJ1bGVzID0gUGVybEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqDQogKiBUT0RPOiBweXRob24gZGVsaW1pdGVycw0KICovDQoNCmRlZmluZSgnYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBQeXRob25IaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFuZHxhc3xhc3NlcnR8YnJlYWt8Y2xhc3N8Y29udGludWV8ZGVmfGRlbHxlbGlmfGVsc2V8ZXhjZXB0fGV4ZWN8IiArDQogICAgICAgICJmaW5hbGx5fGZvcnxmcm9tfGdsb2JhbHxpZnxpbXBvcnR8aW58aXN8bGFtYmRhfG5vdHxvcnxwYXNzfHByaW50fCIgKw0KICAgICAgICAicmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJUcnVlfEZhbHNlfE5vbmV8Tm90SW1wbGVtZW50ZWR8RWxsaXBzaXN8X19kZWJ1Z19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYnN8ZGl2bW9kfGlucHV0fG9wZW58c3RhdGljbWV0aG9kfGFsbHxlbnVtZXJhdGV8aW50fG9yZHxzdHJ8YW55fCIgKw0KICAgICAgICAiZXZhbHxpc2luc3RhbmNlfHBvd3xzdW18YmFzZXN0cmluZ3xleGVjZmlsZXxpc3N1YmNsYXNzfHByaW50fHN1cGVyfCIgKw0KICAgICAgICAiYmluZmlsZXxpdGVyfHByb3BlcnR5fHR1cGxlfGJvb2x8ZmlsdGVyfGxlbnxyYW5nZXx0eXBlfGJ5dGVhcnJheXwiICsNCiAgICAgICAgImZsb2F0fGxpc3R8cmF3X2lucHV0fHVuaWNocnxjYWxsYWJsZXxmb3JtYXR8bG9jYWxzfHJlZHVjZXx1bmljb2RlfCIgKw0KICAgICAgICAiY2hyfGZyb3plbnNldHxsb25nfHJlbG9hZHx2YXJzfGNsYXNzbWV0aG9kfGdldGF0dHJ8bWFwfHJlcHJ8eHJhbmdlfCIgKw0KICAgICAgICAiY21wfGdsb2JhbHN8bWF4fHJldmVyc2VkfHppcHxjb21waWxlfGhhc2F0dHJ8bWVtb3J5dmlld3xyb3VuZHwiICsNCiAgICAgICAgIl9faW1wb3J0X198Y29tcGxleHxoYXNofG1pbnxzZXR8YXBwbHl8ZGVsYXR0cnxoZWxwfG5leHR8c2V0YXR0cnwiICsNCiAgICAgICAgImJ1ZmZlcnxkaWN0fGhleHxvYmplY3R8c2xpY2V8Y29lcmNlfGRpcnxpZHxvY3R8c29ydGVkfGludGVybiIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIiIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIHN0clByZSA9ICIoPzpyfHV8dXJ8UnxVfFVSfFVyfHVSKT8iOw0KDQogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsNCiAgICB2YXIgb2N0SW50ZWdlciA9ICIoPzowW29PXT9bMC03XSspIjsNCiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOw0KICAgIHZhciBiaW5JbnRlZ2VyID0gIig/OjBbYkJdWzAxXSspIjsNCiAgICB2YXIgaW50ZWdlciA9ICIoPzoiICsgZGVjaW1hbEludGVnZXIgKyAifCIgKyBvY3RJbnRlZ2VyICsgInwiICsgaGV4SW50ZWdlciArICJ8IiArIGJpbkludGVnZXIgKyAiKSI7DQoNCiAgICB2YXIgZXhwb25lbnQgPSAiKD86W2VFXVsrLV0/XFxkKykiOw0KICAgIHZhciBmcmFjdGlvbiA9ICIoPzpcXC5cXGQrKSI7DQogICAgdmFyIGludFBhcnQgPSAiKD86XFxkKykiOw0KICAgIHZhciBwb2ludEZsb2F0ID0gIig/Oig/OiIgKyBpbnRQYXJ0ICsgIj8iICsgZnJhY3Rpb24gKyAiKXwoPzoiICsgaW50UGFydCArICJcXC4pKSI7DQogICAgdmFyIGV4cG9uZW50RmxvYXQgPSAiKD86KD86IiArIHBvaW50RmxvYXQgKyAifCIgKyAgaW50UGFydCArICIpIiArIGV4cG9uZW50ICsgIikiOw0KICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgZXhwb25lbnRGbG9hdCArICJ8IiArIHBvaW50RmxvYXQgKyAiKSI7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICIjLiokIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiIiIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnInszfSg/OlteXFxcXF18XFxcXC4pKj8iezN9Jw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gbXVsdGkgbGluZSAiIiIgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciezN9LiokJywNCiAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAiIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnIig/OlteXFxcXF18XFxcXC4pKj8iJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJycnIHN0cmluZw0KICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJ3szfSg/OlteXFxcXF18XFxcXC4pKj8nezN9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gbXVsdGkgbGluZSAnJycgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICInezN9LiokIiwNCiAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICcgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICInKD86W15cXFxcXXxcXFxcLikqPyciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBpbWFnaW5hcnkNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBmbG9hdE51bWJlciArICJ8XFxkKylbakpdXFxiIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgIHJlZ2V4IDogZmxvYXROdW1iZXINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGxvbmcgaW50ZWdlcg0KICAgICAgICAgICAgcmVnZXggOiBpbnRlZ2VyICsgIltsTF1cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBpbnRlZ2VyDQogICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiXFxiIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwrfFxcLXxcXCp8XFwqXFwqfFxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuLnBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltcXFtcXChcXHtdIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcXVxcKVxcfV0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSBdLA0KICAgICAgICAicXFzdHJpbmciIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lICIiIiBzdHJpbmcgZW5kDQogICAgICAgICAgICByZWdleCA6ICcoPzpbXlxcXFxdfFxcXFwuKSo/InszfScsDQogICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXSwNCiAgICAgICAgInFzdHJpbmciIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgLy8gbXVsdGkgbGluZSAnJycgc3RyaW5nIGVuZA0KICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqPyd7M30iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICB9IF0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKFB5dGhvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gUHl0aG9uSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-pgsql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9wZ3NxbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9wZ3NxbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiYWNlL2xpYi9vb3AiKSxlPWEoImFjZS9tb2RlL3RleHQiKS5Nb2RlLGY9YSgiYWNlL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoImFjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlBnc3FsSGlnaGxpZ2h0UnVsZXMsaD1hKCJhY2UvcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSl9O2QuaW5oZXJpdHMoaSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKS0tLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGk9bmV3IGgoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aS5zdGFydC5yb3c9ZyxpLmVuZC5yb3c9ZyxpLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGksa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLS0iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE9PSJzdGFydCJ8fGE9PSJrZXl3b3JkLnN0YXRlbWVudEVuZCI/IiI6dGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChpLnByb3RvdHlwZSksYi5Nb2RlPWl9KSxkZWZpbmUoImFjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9wZXJsX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiYWNlL2xpYi9vb3AiKSxlPWEoImFjZS9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9wZXJsX2hpZ2hsaWdodF9ydWxlcyIpLlBlcmxIaWdobGlnaHRSdWxlcyxpPWEoIi4vcHl0aG9uX2hpZ2hsaWdodF9ydWxlcyIpLlB5dGhvbkhpZ2hsaWdodFJ1bGVzLGo9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFib3J0fGFic29sdXRlfGFic3RpbWV8YWNjZXNzfGFjbGl0ZW18YWN0aW9ufGFkZHxhZG1pbnxhZnRlcnxhZ2dyZWdhdGV8YWxsfGFsc298YWx0ZXJ8YWx3YXlzfGFuYWx5c2V8YW5hbHl6ZXxhbmR8YW55fGFueWFycmF5fGFueWVsZW1lbnR8YW55ZW51bXxhbnlub25hcnJheXxhcnJheXxhc3xhc2N8YXNzZXJ0aW9ufGFzc2lnbm1lbnR8YXN5bW1ldHJpY3xhdHxhdHRyaWJ1dGV8YXV0aG9yaXphdGlvbnxiYWNrd2FyZHxiZWZvcmV8YmVnaW58YmV0d2VlbnxiaWdpbnR8YmluYXJ5fGJpdHxib29sfGJvb2xlYW58Ym90aHxib3h8YnBjaGFyfGJ5fGJ5dGVhfGNhY2hlfGNhbGxlZHxjYXNjYWRlfGNhc2NhZGVkfGNhc2V8Y2FzdHxjYXRhbG9nfGNoYWlufGNoYXJ8Y2hhcmFjdGVyfGNoYXJhY3RlcmlzdGljc3xjaGVja3xjaGVja3BvaW50fGNpZHxjaWRyfGNpcmNsZXxjbGFzc3xjbG9zZXxjbHVzdGVyfGNvYWxlc2NlfGNvbGxhdGV8Y29sbGF0aW9ufGNvbHVtbnxjb21tZW50fGNvbW1lbnRzfGNvbW1pdHxjb21taXR0ZWR8Y29uY3VycmVudGx5fGNvbmZpZ3VyYXRpb258Y29ubmVjdGlvbnxjb25zdHJhaW50fGNvbnN0cmFpbnRzfGNvbnRlbnR8Y29udGludWV8Y29udmVyc2lvbnxjb3B5fGNvc3R8Y3JlYXRlfGNyb3NzfGNzdHJpbmd8Y3N2fGN1cnJlbnR8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF90aW1lfGN1cnJlbnRfdGltZXN0YW1wfGN1cnJlbnRfdXNlcnxjdXJzb3J8Y3ljbGV8ZGF0YXxkYXRhYmFzZXxkYXRlfGRheXxkZWFsbG9jYXRlfGRlY3xkZWNpbWFsfGRlY2xhcmV8ZGVmYXVsdHxkZWZhdWx0c3xkZWZlcnJhYmxlfGRlZmVycmVkfGRlZmluZXJ8ZGVsZXRlfGRlbGltaXRlcnxkZWxpbWl0ZXJzfGRlc2N8ZGljdGlvbmFyeXxkaXNhYmxlfGRpc2NhcmR8ZGlzdGluY3R8ZG98ZG9jdW1lbnR8ZG9tYWlufGRvdWJsZXxkcm9wfGVhY2h8ZWxzZXxlbmFibGV8ZW5jb2Rpbmd8ZW5jcnlwdGVkfGVuZHxlbnVtfGVzY2FwZXxleGNlcHR8ZXhjbHVkZXxleGNsdWRpbmd8ZXhjbHVzaXZlfGV4ZWN1dGV8ZXhpc3RzfGV4cGxhaW58ZXh0ZW5zaW9ufGV4dGVybmFsfGV4dHJhY3R8ZmFsc2V8ZmFtaWx5fGZkd19oYW5kbGVyfGZldGNofGZpcnN0fGZsb2F0fGZsb2F0NHxmbG9hdDh8Zm9sbG93aW5nfGZvcnxmb3JjZXxmb3JlaWdufGZvcndhcmR8ZnJlZXplfGZyb218ZnVsbHxmdW5jdGlvbnxmdW5jdGlvbnN8Z2xvYmFsfGdyYW50fGdyYW50ZWR8Z3JlYXRlc3R8Z3JvdXB8Z3RzdmVjdG9yfGhhbmRsZXJ8aGF2aW5nfGhlYWRlcnxob2xkfGhvdXJ8aWRlbnRpdHl8aWZ8aWxpa2V8aW1tZWRpYXRlfGltbXV0YWJsZXxpbXBsaWNpdHxpbnxpbmNsdWRpbmd8aW5jcmVtZW50fGluZGV4fGluZGV4ZXN8aW5ldHxpbmhlcml0fGluaGVyaXRzfGluaXRpYWxseXxpbmxpbmV8aW5uZXJ8aW5vdXR8aW5wdXR8aW5zZW5zaXRpdmV8aW5zZXJ0fGluc3RlYWR8aW50fGludDJ8aW50MnZlY3RvcnxpbnQ0fGludDh8aW50ZWdlcnxpbnRlcm5hbHxpbnRlcnNlY3R8aW50ZXJ2YWx8aW50b3xpbnZva2VyfGlzfGlzbnVsbHxpc29sYXRpb258am9pbnxrZXl8bGFiZWx8bGFuZ3VhZ2V8bGFuZ3VhZ2VfaGFuZGxlcnxsYXJnZXxsYXN0fGxjX2NvbGxhdGV8bGNfY3R5cGV8bGVhZGluZ3xsZWFzdHxsZWZ0fGxldmVsfGxpa2V8bGltaXR8bGluZXxsaXN0ZW58bG9hZHxsb2NhbHxsb2NhbHRpbWV8bG9jYWx0aW1lc3RhbXB8bG9jYXRpb258bG9ja3xsc2VnfG1hY2FkZHJ8bWFwcGluZ3xtYXRjaHxtYXh2YWx1ZXxtaW51dGV8bWludmFsdWV8bW9kZXxtb25leXxtb250aHxtb3ZlfG5hbWV8bmFtZXN8bmF0aW9uYWx8bmF0dXJhbHxuY2hhcnxuZXh0fG5vfG5vbmV8bm90fG5vdGhpbmd8bm90aWZ5fG5vdG51bGx8bm93YWl0fG51bGx8bnVsbGlmfG51bGxzfG51bWVyaWN8b2JqZWN0fG9mfG9mZnxvZmZzZXR8b2lkfG9pZHN8b2lkdmVjdG9yfG9ufG9ubHl8b3BhcXVlfG9wZXJhdG9yfG9wdGlvbnxvcHRpb25zfG9yfG9yZGVyfG91dHxvdXRlcnxvdmVyfG92ZXJsYXBzfG92ZXJsYXl8b3duZWR8b3duZXJ8cGFyc2VyfHBhcnRpYWx8cGFydGl0aW9ufHBhc3Npbmd8cGFzc3dvcmR8cGF0aHxwZ19hdHRyaWJ1dGV8cGdfYXV0aF9tZW1iZXJzfHBnX2F1dGhpZHxwZ19jbGFzc3xwZ19kYXRhYmFzZXxwZ19ub2RlX3RyZWV8cGdfcHJvY3xwZ190eXBlfHBsYWNpbmd8cGxhbnN8cG9pbnR8cG9seWdvbnxwb3NpdGlvbnxwcmVjZWRpbmd8cHJlY2lzaW9ufHByZXBhcmV8cHJlcGFyZWR8cHJlc2VydmV8cHJpbWFyeXxwcmlvcnxwcml2aWxlZ2VzfHByb2NlZHVyYWx8cHJvY2VkdXJlfHF1b3RlfHJhbmdlfHJlYWR8cmVhbHxyZWFzc2lnbnxyZWNoZWNrfHJlY29yZHxyZWN1cnNpdmV8cmVmfHJlZmN1cnNvcnxyZWZlcmVuY2VzfHJlZ2NsYXNzfHJlZ2NvbmZpZ3xyZWdkaWN0aW9uYXJ5fHJlZ29wZXJ8cmVnb3BlcmF0b3J8cmVncHJvY3xyZWdwcm9jZWR1cmV8cmVndHlwZXxyZWluZGV4fHJlbGF0aXZlfHJlbGVhc2V8cmVsdGltZXxyZW5hbWV8cmVwZWF0YWJsZXxyZXBsYWNlfHJlcGxpY2F8cmVzZXR8cmVzdGFydHxyZXN0cmljdHxyZXR1cm5pbmd8cmV0dXJuc3xyZXZva2V8cmlnaHR8cm9sZXxyb2xsYmFja3xyb3d8cm93c3xydWxlfHNhdmVwb2ludHxzY2hlbWF8c2Nyb2xsfHNlYXJjaHxzZWNvbmR8c2VjdXJpdHl8c2VsZWN0fHNlcXVlbmNlfHNlcXVlbmNlc3xzZXJpYWxpemFibGV8c2VydmVyfHNlc3Npb258c2Vzc2lvbl91c2VyfHNldHxzZXRvZnxzaGFyZXxzaG93fHNpbWlsYXJ8c2ltcGxlfHNtYWxsaW50fHNtZ3J8c29tZXxzdGFibGV8c3RhbmRhbG9uZXxzdGFydHxzdGF0ZW1lbnR8c3RhdGlzdGljc3xzdGRpbnxzdGRvdXR8c3RvcmFnZXxzdHJpY3R8c3RyaXB8c3Vic3RyaW5nfHN5bW1ldHJpY3xzeXNpZHxzeXN0ZW18dGFibGV8dGFibGVzfHRhYmxlc3BhY2V8dGVtcHx0ZW1wbGF0ZXx0ZW1wb3Jhcnl8dGV4dHx0aGVufHRpZHx0aW1lfHRpbWVzdGFtcHx0aW1lc3RhbXB0enx0aW1ldHp8dGludGVydmFsfHRvfHRyYWlsaW5nfHRyYW5zYWN0aW9ufHRyZWF0fHRyaWdnZXJ8dHJpbXx0cnVlfHRydW5jYXRlfHRydXN0ZWR8dHNxdWVyeXx0c3ZlY3Rvcnx0eGlkX3NuYXBzaG90fHR5cGV8dW5ib3VuZGVkfHVuY29tbWl0dGVkfHVuZW5jcnlwdGVkfHVuaW9ufHVuaXF1ZXx1bmtub3dufHVubGlzdGVufHVubG9nZ2VkfHVudGlsfHVwZGF0ZXx1c2VyfHVzaW5nfHV1aWR8dmFjdXVtfHZhbGlkfHZhbGlkYXRlfHZhbGlkYXRvcnx2YWx1ZXx2YWx1ZXN8dmFyYml0fHZhcmNoYXJ8dmFyaWFkaWN8dmFyeWluZ3x2ZXJib3NlfHZlcnNpb258dmlld3x2b2lkfHZvbGF0aWxlfHdoZW58d2hlcmV8d2hpdGVzcGFjZXx3aW5kb3d8d2l0aHx3aXRob3V0fHdvcmt8d3JhcHBlcnx3cml0ZXx4aWR8eG1sfHhtbGF0dHJpYnV0ZXN8eG1sY29uY2F0fHhtbGVsZW1lbnR8eG1sZXhpc3RzfHhtbGZvcmVzdHx4bWxwYXJzZXx4bWxwaXx4bWxyb290fHhtbHNlcmlhbGl6ZXx5ZWFyfHllc3x6b25lIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiUklfRktleV9jYXNjYWRlX2RlbHxSSV9GS2V5X2Nhc2NhZGVfdXBkfFJJX0ZLZXlfY2hlY2tfaW5zfFJJX0ZLZXlfY2hlY2tfdXBkfFJJX0ZLZXlfbm9hY3Rpb25fZGVsfFJJX0ZLZXlfbm9hY3Rpb25fdXBkfFJJX0ZLZXlfcmVzdHJpY3RfZGVsfFJJX0ZLZXlfcmVzdHJpY3RfdXBkfFJJX0ZLZXlfc2V0ZGVmYXVsdF9kZWx8UklfRktleV9zZXRkZWZhdWx0X3VwZHxSSV9GS2V5X3NldG51bGxfZGVsfFJJX0ZLZXlfc2V0bnVsbF91cGR8YWJicmV2fGFic3xhYnN0aW1lfGFic3RpbWVlcXxhYnN0aW1lZ2V8YWJzdGltZWd0fGFic3RpbWVpbnxhYnN0aW1lbGV8YWJzdGltZWx0fGFic3RpbWVuZXxhYnN0aW1lb3V0fGFic3RpbWVyZWN2fGFic3RpbWVzZW5kfGFjbGNvbnRhaW5zfGFjbGV4cGxvZGV8YWNsaW5zZXJ0fGFjbGl0ZW1lcXxhY2xpdGVtaW58YWNsaXRlbW91dHxhY2xyZW1vdmV8YWNvc3xhZ2V8YW55X2lufGFueV9vdXR8YW55YXJyYXlfaW58YW55YXJyYXlfb3V0fGFueWFycmF5X3JlY3Z8YW55YXJyYXlfc2VuZHxhbnllbGVtZW50X2lufGFueWVsZW1lbnRfb3V0fGFueWVudW1faW58YW55ZW51bV9vdXR8YW55bm9uYXJyYXlfaW58YW55bm9uYXJyYXlfb3V0fGFueXRleHRjYXR8YXJlYXxhcmVham9pbnNlbHxhcmVhc2VsfGFycmF5X2FnZ3xhcnJheV9hZ2dfZmluYWxmbnxhcnJheV9hZ2dfdHJhbnNmbnxhcnJheV9hcHBlbmR8YXJyYXlfY2F0fGFycmF5X2RpbXN8YXJyYXlfZXF8YXJyYXlfZmlsbHxhcnJheV9nZXxhcnJheV9ndHxhcnJheV9pbnxhcnJheV9sYXJnZXJ8YXJyYXlfbGV8YXJyYXlfbGVuZ3RofGFycmF5X2xvd2VyfGFycmF5X2x0fGFycmF5X25kaW1zfGFycmF5X25lfGFycmF5X291dHxhcnJheV9wcmVwZW5kfGFycmF5X3JlY3Z8YXJyYXlfc2VuZHxhcnJheV9zbWFsbGVyfGFycmF5X3RvX3N0cmluZ3xhcnJheV91cHBlcnxhcnJheWNvbnRhaW5lZHxhcnJheWNvbnRhaW5zfGFycmF5b3ZlcmxhcHxhc2NpaXxhc2NpaV90b19taWN8YXNjaWlfdG9fdXRmOHxhc2lufGF0YW58YXRhbjJ8YXZnfGJpZzVfdG9fZXVjX3R3fGJpZzVfdG9fbWljfGJpZzVfdG9fdXRmOHxiaXRfYW5kfGJpdF9pbnxiaXRfbGVuZ3RofGJpdF9vcnxiaXRfb3V0fGJpdF9yZWN2fGJpdF9zZW5kfGJpdGFuZHxiaXRjYXR8Yml0Y21wfGJpdGVxfGJpdGdlfGJpdGd0fGJpdGxlfGJpdGx0fGJpdG5lfGJpdG5vdHxiaXRvcnxiaXRzaGlmdGxlZnR8Yml0c2hpZnRyaWdodHxiaXR0eXBtb2RpbnxiaXR0eXBtb2RvdXR8Yml0eG9yfGJvb2x8Ym9vbF9hbmR8Ym9vbF9vcnxib29sYW5kX3N0YXRlZnVuY3xib29sZXF8Ym9vbGdlfGJvb2xndHxib29saW58Ym9vbGxlfGJvb2xsdHxib29sbmV8Ym9vbG9yX3N0YXRlZnVuY3xib29sb3V0fGJvb2xyZWN2fGJvb2xzZW5kfGJveHxib3hfYWJvdmV8Ym94X2Fib3ZlX2VxfGJveF9hZGR8Ym94X2JlbG93fGJveF9iZWxvd19lcXxib3hfY2VudGVyfGJveF9jb250YWlufGJveF9jb250YWluX3B0fGJveF9jb250YWluZWR8Ym94X2Rpc3RhbmNlfGJveF9kaXZ8Ym94X2VxfGJveF9nZXxib3hfZ3R8Ym94X2lufGJveF9pbnRlcnNlY3R8Ym94X2xlfGJveF9sZWZ0fGJveF9sdHxib3hfbXVsfGJveF9vdXR8Ym94X292ZXJhYm92ZXxib3hfb3ZlcmJlbG93fGJveF9vdmVybGFwfGJveF9vdmVybGVmdHxib3hfb3ZlcnJpZ2h0fGJveF9yZWN2fGJveF9yaWdodHxib3hfc2FtZXxib3hfc2VuZHxib3hfc3VifGJwY2hhcl9sYXJnZXJ8YnBjaGFyX3BhdHRlcm5fZ2V8YnBjaGFyX3BhdHRlcm5fZ3R8YnBjaGFyX3BhdHRlcm5fbGV8YnBjaGFyX3BhdHRlcm5fbHR8YnBjaGFyX3NtYWxsZXJ8YnBjaGFyY21wfGJwY2hhcmVxfGJwY2hhcmdlfGJwY2hhcmd0fGJwY2hhcmljbGlrZXxicGNoYXJpY25saWtlfGJwY2hhcmljcmVnZXhlcXxicGNoYXJpY3JlZ2V4bmV8YnBjaGFyaW58YnBjaGFybGV8YnBjaGFybGlrZXxicGNoYXJsdHxicGNoYXJuZXxicGNoYXJubGlrZXxicGNoYXJvdXR8YnBjaGFycmVjdnxicGNoYXJyZWdleGVxfGJwY2hhcnJlZ2V4bmV8YnBjaGFyc2VuZHxicGNoYXJ0eXBtb2RpbnxicGNoYXJ0eXBtb2RvdXR8YnJvYWRjYXN0fGJ0YWJzdGltZWNtcHxidGFycmF5Y21wfGJ0YmVnaW5zY2FufGJ0Ym9vbGNtcHxidGJwY2hhcl9wYXR0ZXJuX2NtcHxidGJ1aWxkfGJ0YnVpbGRlbXB0eXxidGJ1bGtkZWxldGV8YnRjaGFyY21wfGJ0Y29zdGVzdGltYXRlfGJ0ZW5kc2NhbnxidGZsb2F0NDhjbXB8YnRmbG9hdDRjbXB8YnRmbG9hdDg0Y21wfGJ0ZmxvYXQ4Y21wfGJ0Z2V0Yml0bWFwfGJ0Z2V0dHVwbGV8YnRpbnNlcnR8YnRpbnQyNGNtcHxidGludDI4Y21wfGJ0aW50MmNtcHxidGludDQyY21wfGJ0aW50NDhjbXB8YnRpbnQ0Y21wfGJ0aW50ODJjbXB8YnRpbnQ4NGNtcHxidGludDhjbXB8YnRtYXJrcG9zfGJ0bmFtZWNtcHxidG9pZGNtcHxidG9pZHZlY3RvcmNtcHxidG9wdGlvbnN8YnRyZWNvcmRjbXB8YnRyZWx0aW1lY21wfGJ0cmVzY2FufGJ0cmVzdHJwb3N8YnRyaW18YnR0ZXh0X3BhdHRlcm5fY21wfGJ0dGV4dGNtcHxidHRpZGNtcHxidHRpbnRlcnZhbGNtcHxidHZhY3V1bWNsZWFudXB8Ynl0ZWFjYXR8Ynl0ZWFjbXB8Ynl0ZWFlcXxieXRlYWdlfGJ5dGVhZ3R8Ynl0ZWFpbnxieXRlYWxlfGJ5dGVhbGlrZXxieXRlYWx0fGJ5dGVhbmV8Ynl0ZWFubGlrZXxieXRlYW91dHxieXRlYXJlY3Z8Ynl0ZWFzZW5kfGNhc2hfY21wfGNhc2hfZGl2X2Nhc2h8Y2FzaF9kaXZfZmx0NHxjYXNoX2Rpdl9mbHQ4fGNhc2hfZGl2X2ludDJ8Y2FzaF9kaXZfaW50NHxjYXNoX2VxfGNhc2hfZ2V8Y2FzaF9ndHxjYXNoX2lufGNhc2hfbGV8Y2FzaF9sdHxjYXNoX21pfGNhc2hfbXVsX2ZsdDR8Y2FzaF9tdWxfZmx0OHxjYXNoX211bF9pbnQyfGNhc2hfbXVsX2ludDR8Y2FzaF9uZXxjYXNoX291dHxjYXNoX3BsfGNhc2hfcmVjdnxjYXNoX3NlbmR8Y2FzaF93b3Jkc3xjYXNobGFyZ2VyfGNhc2hzbWFsbGVyfGNicnR8Y2VpbHxjZWlsaW5nfGNlbnRlcnxjaGFyfGNoYXJfbGVuZ3RofGNoYXJhY3Rlcl9sZW5ndGh8Y2hhcmVxfGNoYXJnZXxjaGFyZ3R8Y2hhcmlufGNoYXJsZXxjaGFybHR8Y2hhcm5lfGNoYXJvdXR8Y2hhcnJlY3Z8Y2hhcnNlbmR8Y2hyfGNpZGVxfGNpZGlufGNpZG91dHxjaWRyfGNpZHJfaW58Y2lkcl9vdXR8Y2lkcl9yZWN2fGNpZHJfc2VuZHxjaWRyZWN2fGNpZHNlbmR8Y2lyY2xlfGNpcmNsZV9hYm92ZXxjaXJjbGVfYWRkX3B0fGNpcmNsZV9iZWxvd3xjaXJjbGVfY2VudGVyfGNpcmNsZV9jb250YWlufGNpcmNsZV9jb250YWluX3B0fGNpcmNsZV9jb250YWluZWR8Y2lyY2xlX2Rpc3RhbmNlfGNpcmNsZV9kaXZfcHR8Y2lyY2xlX2VxfGNpcmNsZV9nZXxjaXJjbGVfZ3R8Y2lyY2xlX2lufGNpcmNsZV9sZXxjaXJjbGVfbGVmdHxjaXJjbGVfbHR8Y2lyY2xlX211bF9wdHxjaXJjbGVfbmV8Y2lyY2xlX291dHxjaXJjbGVfb3ZlcmFib3ZlfGNpcmNsZV9vdmVyYmVsb3d8Y2lyY2xlX292ZXJsYXB8Y2lyY2xlX292ZXJsZWZ0fGNpcmNsZV9vdmVycmlnaHR8Y2lyY2xlX3JlY3Z8Y2lyY2xlX3JpZ2h0fGNpcmNsZV9zYW1lfGNpcmNsZV9zZW5kfGNpcmNsZV9zdWJfcHR8Y2xvY2tfdGltZXN0YW1wfGNsb3NlX2xifGNsb3NlX2xzfGNsb3NlX2xzZWd8Y2xvc2VfcGJ8Y2xvc2VfcGx8Y2xvc2VfcHN8Y2xvc2Vfc2J8Y2xvc2Vfc2x8Y29sX2Rlc2NyaXB0aW9ufGNvbmNhdHxjb25jYXRfd3N8Y29udGpvaW5zZWx8Y29udHNlbHxjb252ZXJ0fGNvbnZlcnRfZnJvbXxjb252ZXJ0X3RvfGNvcnJ8Y29zfGNvdHxjb3VudHxjb3Zhcl9wb3B8Y292YXJfc2FtcHxjc3RyaW5nX2lufGNzdHJpbmdfb3V0fGNzdHJpbmdfcmVjdnxjc3RyaW5nX3NlbmR8Y3VtZV9kaXN0fGN1cnJlbnRfZGF0YWJhc2V8Y3VycmVudF9xdWVyeXxjdXJyZW50X3NjaGVtYXxjdXJyZW50X3NjaGVtYXN8Y3VycmVudF9zZXR0aW5nfGN1cnJlbnRfdXNlcnxjdXJydGlkfGN1cnJ0aWQyfGN1cnJ2YWx8Y3Vyc29yX3RvX3htbHxjdXJzb3JfdG9feG1sc2NoZW1hfGRhdGFiYXNlX3RvX3htbHxkYXRhYmFzZV90b194bWxfYW5kX3htbHNjaGVtYXxkYXRhYmFzZV90b194bWxzY2hlbWF8ZGF0ZXxkYXRlX2NtcHxkYXRlX2NtcF90aW1lc3RhbXB8ZGF0ZV9jbXBfdGltZXN0YW1wdHp8ZGF0ZV9lcXxkYXRlX2VxX3RpbWVzdGFtcHxkYXRlX2VxX3RpbWVzdGFtcHR6fGRhdGVfZ2V8ZGF0ZV9nZV90aW1lc3RhbXB8ZGF0ZV9nZV90aW1lc3RhbXB0enxkYXRlX2d0fGRhdGVfZ3RfdGltZXN0YW1wfGRhdGVfZ3RfdGltZXN0YW1wdHp8ZGF0ZV9pbnxkYXRlX2xhcmdlcnxkYXRlX2xlfGRhdGVfbGVfdGltZXN0YW1wfGRhdGVfbGVfdGltZXN0YW1wdHp8ZGF0ZV9sdHxkYXRlX2x0X3RpbWVzdGFtcHxkYXRlX2x0X3RpbWVzdGFtcHR6fGRhdGVfbWl8ZGF0ZV9taV9pbnRlcnZhbHxkYXRlX21paXxkYXRlX25lfGRhdGVfbmVfdGltZXN0YW1wfGRhdGVfbmVfdGltZXN0YW1wdHp8ZGF0ZV9vdXR8ZGF0ZV9wYXJ0fGRhdGVfcGxfaW50ZXJ2YWx8ZGF0ZV9wbGl8ZGF0ZV9yZWN2fGRhdGVfc2VuZHxkYXRlX3NtYWxsZXJ8ZGF0ZV90cnVuY3xkYXRldGltZV9wbHxkYXRldGltZXR6X3BsfGRjYnJ0fGRlY29kZXxkZWdyZWVzfGRlbnNlX3Jhbmt8ZGV4cHxkaWFnb25hbHxkaWFtZXRlcnxkaXNwZWxsX2luaXR8ZGlzcGVsbF9sZXhpemV8ZGlzdF9jcG9seXxkaXN0X2xifGRpc3RfcGJ8ZGlzdF9wY3xkaXN0X3BsfGRpc3RfcHBhdGh8ZGlzdF9wc3xkaXN0X3NifGRpc3Rfc2x8ZGl2fGRsb2cxfGRsb2cxMHxkb21haW5faW58ZG9tYWluX3JlY3Z8ZHBvd3xkcm91bmR8ZHNpbXBsZV9pbml0fGRzaW1wbGVfbGV4aXplfGRzbm93YmFsbF9pbml0fGRzbm93YmFsbF9sZXhpemV8ZHNxcnR8ZHN5bm9ueW1faW5pdHxkc3lub255bV9sZXhpemV8ZHRydW5jfGVuY29kZXxlbnVtX2NtcHxlbnVtX2VxfGVudW1fZmlyc3R8ZW51bV9nZXxlbnVtX2d0fGVudW1faW58ZW51bV9sYXJnZXJ8ZW51bV9sYXN0fGVudW1fbGV8ZW51bV9sdHxlbnVtX25lfGVudW1fb3V0fGVudW1fcmFuZ2V8ZW51bV9yZWN2fGVudW1fc2VuZHxlbnVtX3NtYWxsZXJ8ZXFqb2luc2VsfGVxc2VsfGV1Y19jbl90b19taWN8ZXVjX2NuX3RvX3V0Zjh8ZXVjX2ppc18yMDA0X3RvX3NoaWZ0X2ppc18yMDA0fGV1Y19qaXNfMjAwNF90b191dGY4fGV1Y19qcF90b19taWN8ZXVjX2pwX3RvX3NqaXN8ZXVjX2pwX3RvX3V0Zjh8ZXVjX2tyX3RvX21pY3xldWNfa3JfdG9fdXRmOHxldWNfdHdfdG9fYmlnNXxldWNfdHdfdG9fbWljfGV1Y190d190b191dGY4fGV2ZXJ5fGV4cHxmYWN0b3JpYWx8ZmFtaWx5fGZkd19oYW5kbGVyX2lufGZkd19oYW5kbGVyX291dHxmaXJzdF92YWx1ZXxmbG9hdDR8ZmxvYXQ0OGRpdnxmbG9hdDQ4ZXF8ZmxvYXQ0OGdlfGZsb2F0NDhndHxmbG9hdDQ4bGV8ZmxvYXQ0OGx0fGZsb2F0NDhtaXxmbG9hdDQ4bXVsfGZsb2F0NDhuZXxmbG9hdDQ4cGx8ZmxvYXQ0X2FjY3VtfGZsb2F0NGFic3xmbG9hdDRkaXZ8ZmxvYXQ0ZXF8ZmxvYXQ0Z2V8ZmxvYXQ0Z3R8ZmxvYXQ0aW58ZmxvYXQ0bGFyZ2VyfGZsb2F0NGxlfGZsb2F0NGx0fGZsb2F0NG1pfGZsb2F0NG11bHxmbG9hdDRuZXxmbG9hdDRvdXR8ZmxvYXQ0cGx8ZmxvYXQ0cmVjdnxmbG9hdDRzZW5kfGZsb2F0NHNtYWxsZXJ8ZmxvYXQ0dW18ZmxvYXQ0dXB8ZmxvYXQ4fGZsb2F0ODRkaXZ8ZmxvYXQ4NGVxfGZsb2F0ODRnZXxmbG9hdDg0Z3R8ZmxvYXQ4NGxlfGZsb2F0ODRsdHxmbG9hdDg0bWl8ZmxvYXQ4NG11bHxmbG9hdDg0bmV8ZmxvYXQ4NHBsfGZsb2F0OF9hY2N1bXxmbG9hdDhfYXZnfGZsb2F0OF9jb3JyfGZsb2F0OF9jb3Zhcl9wb3B8ZmxvYXQ4X2NvdmFyX3NhbXB8ZmxvYXQ4X3JlZ3JfYWNjdW18ZmxvYXQ4X3JlZ3JfYXZneHxmbG9hdDhfcmVncl9hdmd5fGZsb2F0OF9yZWdyX2ludGVyY2VwdHxmbG9hdDhfcmVncl9yMnxmbG9hdDhfcmVncl9zbG9wZXxmbG9hdDhfcmVncl9zeHh8ZmxvYXQ4X3JlZ3Jfc3h5fGZsb2F0OF9yZWdyX3N5eXxmbG9hdDhfc3RkZGV2X3BvcHxmbG9hdDhfc3RkZGV2X3NhbXB8ZmxvYXQ4X3Zhcl9wb3B8ZmxvYXQ4X3Zhcl9zYW1wfGZsb2F0OGFic3xmbG9hdDhkaXZ8ZmxvYXQ4ZXF8ZmxvYXQ4Z2V8ZmxvYXQ4Z3R8ZmxvYXQ4aW58ZmxvYXQ4bGFyZ2VyfGZsb2F0OGxlfGZsb2F0OGx0fGZsb2F0OG1pfGZsb2F0OG11bHxmbG9hdDhuZXxmbG9hdDhvdXR8ZmxvYXQ4cGx8ZmxvYXQ4cmVjdnxmbG9hdDhzZW5kfGZsb2F0OHNtYWxsZXJ8ZmxvYXQ4dW18ZmxvYXQ4dXB8Zmxvb3J8Zmx0NF9tdWxfY2FzaHxmbHQ4X211bF9jYXNofGZtZ3JfY192YWxpZGF0b3J8Zm1ncl9pbnRlcm5hbF92YWxpZGF0b3J8Zm1ncl9zcWxfdmFsaWRhdG9yfGZvcm1hdHxmb3JtYXRfdHlwZXxnYjE4MDMwX3RvX3V0Zjh8Z2JrX3RvX3V0Zjh8Z2VuZXJhdGVfc2VyaWVzfGdlbmVyYXRlX3N1YnNjcmlwdHN8Z2V0X2JpdHxnZXRfYnl0ZXxnZXRfY3VycmVudF90c19jb25maWd8Z2V0ZGF0YWJhc2VlbmNvZGluZ3xnZXRwZ3VzZXJuYW1lfGdpbl9jbXBfcHJlZml4fGdpbl9jbXBfdHNsZXhlbWV8Z2luX2V4dHJhY3RfdHNxdWVyeXxnaW5fZXh0cmFjdF90c3ZlY3RvcnxnaW5fdHNxdWVyeV9jb25zaXN0ZW50fGdpbmFycmF5Y29uc2lzdGVudHxnaW5hcnJheWV4dHJhY3R8Z2luYmVnaW5zY2FufGdpbmJ1aWxkfGdpbmJ1aWxkZW1wdHl8Z2luYnVsa2RlbGV0ZXxnaW5jb3N0ZXN0aW1hdGV8Z2luZW5kc2NhbnxnaW5nZXRiaXRtYXB8Z2luaW5zZXJ0fGdpbm1hcmtwb3N8Z2lub3B0aW9uc3xnaW5xdWVyeWFycmF5ZXh0cmFjdHxnaW5yZXNjYW58Z2lucmVzdHJwb3N8Z2ludmFjdXVtY2xlYW51cHxnaXN0X2JveF9jb21wcmVzc3xnaXN0X2JveF9jb25zaXN0ZW50fGdpc3RfYm94X2RlY29tcHJlc3N8Z2lzdF9ib3hfcGVuYWx0eXxnaXN0X2JveF9waWNrc3BsaXR8Z2lzdF9ib3hfc2FtZXxnaXN0X2JveF91bmlvbnxnaXN0X2NpcmNsZV9jb21wcmVzc3xnaXN0X2NpcmNsZV9jb25zaXN0ZW50fGdpc3RfcG9pbnRfY29tcHJlc3N8Z2lzdF9wb2ludF9jb25zaXN0ZW50fGdpc3RfcG9pbnRfZGlzdGFuY2V8Z2lzdF9wb2x5X2NvbXByZXNzfGdpc3RfcG9seV9jb25zaXN0ZW50fGdpc3RiZWdpbnNjYW58Z2lzdGJ1aWxkfGdpc3RidWlsZGVtcHR5fGdpc3RidWxrZGVsZXRlfGdpc3Rjb3N0ZXN0aW1hdGV8Z2lzdGVuZHNjYW58Z2lzdGdldGJpdG1hcHxnaXN0Z2V0dHVwbGV8Z2lzdGluc2VydHxnaXN0bWFya3Bvc3xnaXN0b3B0aW9uc3xnaXN0cmVzY2FufGdpc3RyZXN0cnBvc3xnaXN0dmFjdXVtY2xlYW51cHxndHNxdWVyeV9jb21wcmVzc3xndHNxdWVyeV9jb25zaXN0ZW50fGd0c3F1ZXJ5X2RlY29tcHJlc3N8Z3RzcXVlcnlfcGVuYWx0eXxndHNxdWVyeV9waWNrc3BsaXR8Z3RzcXVlcnlfc2FtZXxndHNxdWVyeV91bmlvbnxndHN2ZWN0b3JfY29tcHJlc3N8Z3RzdmVjdG9yX2NvbnNpc3RlbnR8Z3RzdmVjdG9yX2RlY29tcHJlc3N8Z3RzdmVjdG9yX3BlbmFsdHl8Z3RzdmVjdG9yX3BpY2tzcGxpdHxndHN2ZWN0b3Jfc2FtZXxndHN2ZWN0b3JfdW5pb258Z3RzdmVjdG9yaW58Z3RzdmVjdG9yb3V0fGhhc19hbnlfY29sdW1uX3ByaXZpbGVnZXxoYXNfY29sdW1uX3ByaXZpbGVnZXxoYXNfZGF0YWJhc2VfcHJpdmlsZWdlfGhhc19mb3JlaWduX2RhdGFfd3JhcHBlcl9wcml2aWxlZ2V8aGFzX2Z1bmN0aW9uX3ByaXZpbGVnZXxoYXNfbGFuZ3VhZ2VfcHJpdmlsZWdlfGhhc19zY2hlbWFfcHJpdmlsZWdlfGhhc19zZXF1ZW5jZV9wcml2aWxlZ2V8aGFzX3NlcnZlcl9wcml2aWxlZ2V8aGFzX3RhYmxlX3ByaXZpbGVnZXxoYXNfdGFibGVzcGFjZV9wcml2aWxlZ2V8aGFzaF9hY2xpdGVtfGhhc2hfYXJyYXl8aGFzaF9udW1lcmljfGhhc2hiZWdpbnNjYW58aGFzaGJwY2hhcnxoYXNoYnVpbGR8aGFzaGJ1aWxkZW1wdHl8aGFzaGJ1bGtkZWxldGV8aGFzaGNoYXJ8aGFzaGNvc3Rlc3RpbWF0ZXxoYXNoZW5kc2NhbnxoYXNoZW51bXxoYXNoZmxvYXQ0fGhhc2hmbG9hdDh8aGFzaGdldGJpdG1hcHxoYXNoZ2V0dHVwbGV8aGFzaGluZXR8aGFzaGluc2VydHxoYXNoaW50MnxoYXNoaW50MnZlY3RvcnxoYXNoaW50NHxoYXNoaW50OHxoYXNobWFjYWRkcnxoYXNobWFya3Bvc3xoYXNobmFtZXxoYXNob2lkfGhhc2hvaWR2ZWN0b3J8aGFzaG9wdGlvbnN8aGFzaHJlc2NhbnxoYXNocmVzdHJwb3N8aGFzaHRleHR8aGFzaHZhY3V1bWNsZWFudXB8aGFzaHZhcmxlbmF8aGVpZ2h0fGhvc3R8aG9zdG1hc2t8aWNsaWtlam9pbnNlbHxpY2xpa2VzZWx8aWNubGlrZWpvaW5zZWx8aWNubGlrZXNlbHxpY3JlZ2V4ZXFqb2luc2VsfGljcmVnZXhlcXNlbHxpY3JlZ2V4bmVqb2luc2VsfGljcmVnZXhuZXNlbHxpbmV0X2NsaWVudF9hZGRyfGluZXRfY2xpZW50X3BvcnR8aW5ldF9pbnxpbmV0X291dHxpbmV0X3JlY3Z8aW5ldF9zZW5kfGluZXRfc2VydmVyX2FkZHJ8aW5ldF9zZXJ2ZXJfcG9ydHxpbmV0YW5kfGluZXRtaXxpbmV0bWlfaW50OHxpbmV0bm90fGluZXRvcnxpbmV0cGx8aW5pdGNhcHxpbnQyfGludDI0ZGl2fGludDI0ZXF8aW50MjRnZXxpbnQyNGd0fGludDI0bGV8aW50MjRsdHxpbnQyNG1pfGludDI0bXVsfGludDI0bmV8aW50MjRwbHxpbnQyOGRpdnxpbnQyOGVxfGludDI4Z2V8aW50MjhndHxpbnQyOGxlfGludDI4bHR8aW50MjhtaXxpbnQyOG11bHxpbnQyOG5lfGludDI4cGx8aW50Ml9hY2N1bXxpbnQyX2F2Z19hY2N1bXxpbnQyX211bF9jYXNofGludDJfc3VtfGludDJhYnN8aW50MmFuZHxpbnQyZGl2fGludDJlcXxpbnQyZ2V8aW50Mmd0fGludDJpbnxpbnQybGFyZ2VyfGludDJsZXxpbnQybHR8aW50Mm1pfGludDJtb2R8aW50Mm11bHxpbnQybmV8aW50Mm5vdHxpbnQyb3J8aW50Mm91dHxpbnQycGx8aW50MnJlY3Z8aW50MnNlbmR8aW50MnNobHxpbnQyc2hyfGludDJzbWFsbGVyfGludDJ1bXxpbnQydXB8aW50MnZlY3RvcmVxfGludDJ2ZWN0b3JpbnxpbnQydmVjdG9yb3V0fGludDJ2ZWN0b3JyZWN2fGludDJ2ZWN0b3JzZW5kfGludDJ4b3J8aW50NHxpbnQ0MmRpdnxpbnQ0MmVxfGludDQyZ2V8aW50NDJndHxpbnQ0MmxlfGludDQybHR8aW50NDJtaXxpbnQ0Mm11bHxpbnQ0Mm5lfGludDQycGx8aW50NDhkaXZ8aW50NDhlcXxpbnQ0OGdlfGludDQ4Z3R8aW50NDhsZXxpbnQ0OGx0fGludDQ4bWl8aW50NDhtdWx8aW50NDhuZXxpbnQ0OHBsfGludDRfYWNjdW18aW50NF9hdmdfYWNjdW18aW50NF9tdWxfY2FzaHxpbnQ0X3N1bXxpbnQ0YWJzfGludDRhbmR8aW50NGRpdnxpbnQ0ZXF8aW50NGdlfGludDRndHxpbnQ0aW58aW50NGluY3xpbnQ0bGFyZ2VyfGludDRsZXxpbnQ0bHR8aW50NG1pfGludDRtb2R8aW50NG11bHxpbnQ0bmV8aW50NG5vdHxpbnQ0b3J8aW50NG91dHxpbnQ0cGx8aW50NHJlY3Z8aW50NHNlbmR8aW50NHNobHxpbnQ0c2hyfGludDRzbWFsbGVyfGludDR1bXxpbnQ0dXB8aW50NHhvcnxpbnQ4fGludDgyZGl2fGludDgyZXF8aW50ODJnZXxpbnQ4Mmd0fGludDgybGV8aW50ODJsdHxpbnQ4Mm1pfGludDgybXVsfGludDgybmV8aW50ODJwbHxpbnQ4NGRpdnxpbnQ4NGVxfGludDg0Z2V8aW50ODRndHxpbnQ4NGxlfGludDg0bHR8aW50ODRtaXxpbnQ4NG11bHxpbnQ4NG5lfGludDg0cGx8aW50OF9hY2N1bXxpbnQ4X2F2Z3xpbnQ4X2F2Z19hY2N1bXxpbnQ4X3N1bXxpbnQ4YWJzfGludDhhbmR8aW50OGRpdnxpbnQ4ZXF8aW50OGdlfGludDhndHxpbnQ4aW58aW50OGluY3xpbnQ4aW5jX2FueXxpbnQ4aW5jX2Zsb2F0OF9mbG9hdDh8aW50OGxhcmdlcnxpbnQ4bGV8aW50OGx0fGludDhtaXxpbnQ4bW9kfGludDhtdWx8aW50OG5lfGludDhub3R8aW50OG9yfGludDhvdXR8aW50OHBsfGludDhwbF9pbmV0fGludDhyZWN2fGludDhzZW5kfGludDhzaGx8aW50OHNocnxpbnQ4c21hbGxlcnxpbnQ4dW18aW50OHVwfGludDh4b3J8aW50ZWdlcl9wbF9kYXRlfGludGVyX2xifGludGVyX3NifGludGVyX3NsfGludGVybmFsX2lufGludGVybmFsX291dHxpbnRlcnZhbF9hY2N1bXxpbnRlcnZhbF9hdmd8aW50ZXJ2YWxfY21wfGludGVydmFsX2RpdnxpbnRlcnZhbF9lcXxpbnRlcnZhbF9nZXxpbnRlcnZhbF9ndHxpbnRlcnZhbF9oYXNofGludGVydmFsX2lufGludGVydmFsX2xhcmdlcnxpbnRlcnZhbF9sZXxpbnRlcnZhbF9sdHxpbnRlcnZhbF9taXxpbnRlcnZhbF9tdWx8aW50ZXJ2YWxfbmV8aW50ZXJ2YWxfb3V0fGludGVydmFsX3BsfGludGVydmFsX3BsX2RhdGV8aW50ZXJ2YWxfcGxfdGltZXxpbnRlcnZhbF9wbF90aW1lc3RhbXB8aW50ZXJ2YWxfcGxfdGltZXN0YW1wdHp8aW50ZXJ2YWxfcGxfdGltZXR6fGludGVydmFsX3JlY3Z8aW50ZXJ2YWxfc2VuZHxpbnRlcnZhbF9zbWFsbGVyfGludGVydmFsX3VtfGludGVydmFsdHlwbW9kaW58aW50ZXJ2YWx0eXBtb2RvdXR8aW50aW50ZXJ2YWx8aXNjbG9zZWR8aXNmaW5pdGV8aXNob3Jpem9udGFsfGlzbzg4NTlfMV90b191dGY4fGlzbzg4NTlfdG9fdXRmOHxpc29fdG9fa29pOHJ8aXNvX3RvX21pY3xpc29fdG9fd2luMTI1MXxpc29fdG9fd2luODY2fGlzb3Blbnxpc3BhcmFsbGVsfGlzcGVycHxpc3ZlcnRpY2FsfGpvaGFiX3RvX3V0Zjh8anVzdGlmeV9kYXlzfGp1c3RpZnlfaG91cnN8anVzdGlmeV9pbnRlcnZhbHxrb2k4cl90b19pc298a29pOHJfdG9fbWljfGtvaThyX3RvX3V0Zjh8a29pOHJfdG9fd2luMTI1MXxrb2k4cl90b193aW44NjZ8a29pOHVfdG9fdXRmOHxsYWd8bGFuZ3VhZ2VfaGFuZGxlcl9pbnxsYW5ndWFnZV9oYW5kbGVyX291dHxsYXN0X3ZhbHVlfGxhc3R2YWx8bGF0aW4xX3RvX21pY3xsYXRpbjJfdG9fbWljfGxhdGluMl90b193aW4xMjUwfGxhdGluM190b19taWN8bGF0aW40X3RvX21pY3xsZWFkfGxlZnR8bGVuZ3RofGxpa2V8bGlrZV9lc2NhcGV8bGlrZWpvaW5zZWx8bGlrZXNlbHxsaW5lfGxpbmVfZGlzdGFuY2V8bGluZV9lcXxsaW5lX2hvcml6b250YWx8bGluZV9pbnxsaW5lX2ludGVycHR8bGluZV9pbnRlcnNlY3R8bGluZV9vdXR8bGluZV9wYXJhbGxlbHxsaW5lX3BlcnB8bGluZV9yZWN2fGxpbmVfc2VuZHxsaW5lX3ZlcnRpY2FsfGxufGxvX2Nsb3NlfGxvX2NyZWF0fGxvX2NyZWF0ZXxsb19leHBvcnR8bG9faW1wb3J0fGxvX2xzZWVrfGxvX29wZW58bG9fdGVsbHxsb190cnVuY2F0ZXxsb191bmxpbmt8bG9nfGxvcmVhZHxsb3dlcnxsb3dyaXRlfGxwYWR8bHNlZ3xsc2VnX2NlbnRlcnxsc2VnX2Rpc3RhbmNlfGxzZWdfZXF8bHNlZ19nZXxsc2VnX2d0fGxzZWdfaG9yaXpvbnRhbHxsc2VnX2lufGxzZWdfaW50ZXJwdHxsc2VnX2ludGVyc2VjdHxsc2VnX2xlfGxzZWdfbGVuZ3RofGxzZWdfbHR8bHNlZ19uZXxsc2VnX291dHxsc2VnX3BhcmFsbGVsfGxzZWdfcGVycHxsc2VnX3JlY3Z8bHNlZ19zZW5kfGxzZWdfdmVydGljYWx8bHRyaW18bWFjYWRkcl9jbXB8bWFjYWRkcl9lcXxtYWNhZGRyX2dlfG1hY2FkZHJfZ3R8bWFjYWRkcl9pbnxtYWNhZGRyX2xlfG1hY2FkZHJfbHR8bWFjYWRkcl9uZXxtYWNhZGRyX291dHxtYWNhZGRyX3JlY3Z8bWFjYWRkcl9zZW5kfG1ha2VhY2xpdGVtfG1hc2tsZW58bWF4fG1kNXxtaWNfdG9fYXNjaWl8bWljX3RvX2JpZzV8bWljX3RvX2V1Y19jbnxtaWNfdG9fZXVjX2pwfG1pY190b19ldWNfa3J8bWljX3RvX2V1Y190d3xtaWNfdG9faXNvfG1pY190b19rb2k4cnxtaWNfdG9fbGF0aW4xfG1pY190b19sYXRpbjJ8bWljX3RvX2xhdGluM3xtaWNfdG9fbGF0aW40fG1pY190b19zamlzfG1pY190b193aW4xMjUwfG1pY190b193aW4xMjUxfG1pY190b193aW44NjZ8bWlufG1rdGludGVydmFsfG1vZHxtb25leXxtdWxfZF9pbnRlcnZhbHxuYW1lfG5hbWVlcXxuYW1lZ2V8bmFtZWd0fG5hbWVpY2xpa2V8bmFtZWljbmxpa2V8bmFtZWljcmVnZXhlcXxuYW1laWNyZWdleG5lfG5hbWVpbnxuYW1lbGV8bmFtZWxpa2V8bmFtZWx0fG5hbWVuZXxuYW1lbmxpa2V8bmFtZW91dHxuYW1lcmVjdnxuYW1lcmVnZXhlcXxuYW1lcmVnZXhuZXxuYW1lc2VuZHxuZXFqb2luc2VsfG5lcXNlbHxuZXRtYXNrfG5ldHdvcmt8bmV0d29ya19jbXB8bmV0d29ya19lcXxuZXR3b3JrX2dlfG5ldHdvcmtfZ3R8bmV0d29ya19sZXxuZXR3b3JrX2x0fG5ldHdvcmtfbmV8bmV0d29ya19zdWJ8bmV0d29ya19zdWJlcXxuZXR3b3JrX3N1cHxuZXR3b3JrX3N1cGVxfG5leHR2YWx8bmxpa2Vqb2luc2VsfG5saWtlc2VsfG5vdGxpa2V8bm93fG5wb2ludHN8bnRoX3ZhbHVlfG50aWxlfG51bWVyaWNfYWJzfG51bWVyaWNfYWNjdW18bnVtZXJpY19hZGR8bnVtZXJpY19hdmd8bnVtZXJpY19hdmdfYWNjdW18bnVtZXJpY19jbXB8bnVtZXJpY19kaXZ8bnVtZXJpY19kaXZfdHJ1bmN8bnVtZXJpY19lcXxudW1lcmljX2V4cHxudW1lcmljX2ZhY3xudW1lcmljX2dlfG51bWVyaWNfZ3R8bnVtZXJpY19pbnxudW1lcmljX2luY3xudW1lcmljX2xhcmdlcnxudW1lcmljX2xlfG51bWVyaWNfbG58bnVtZXJpY19sb2d8bnVtZXJpY19sdHxudW1lcmljX21vZHxudW1lcmljX211bHxudW1lcmljX25lfG51bWVyaWNfb3V0fG51bWVyaWNfcG93ZXJ8bnVtZXJpY19yZWN2fG51bWVyaWNfc2VuZHxudW1lcmljX3NtYWxsZXJ8bnVtZXJpY19zcXJ0fG51bWVyaWNfc3RkZGV2X3BvcHxudW1lcmljX3N0ZGRldl9zYW1wfG51bWVyaWNfc3VifG51bWVyaWNfdW1pbnVzfG51bWVyaWNfdXBsdXN8bnVtZXJpY192YXJfcG9wfG51bWVyaWNfdmFyX3NhbXB8bnVtZXJpY3R5cG1vZGlufG51bWVyaWN0eXBtb2RvdXR8bnVtbm9kZXxvYmpfZGVzY3JpcHRpb258b2N0ZXRfbGVuZ3RofG9pZHxvaWRlcXxvaWRnZXxvaWRndHxvaWRpbnxvaWRsYXJnZXJ8b2lkbGV8b2lkbHR8b2lkbmV8b2lkb3V0fG9pZHJlY3Z8b2lkc2VuZHxvaWRzbWFsbGVyfG9pZHZlY3RvcmVxfG9pZHZlY3RvcmdlfG9pZHZlY3Rvcmd0fG9pZHZlY3RvcmlufG9pZHZlY3RvcmxlfG9pZHZlY3Rvcmx0fG9pZHZlY3Rvcm5lfG9pZHZlY3Rvcm91dHxvaWR2ZWN0b3JyZWN2fG9pZHZlY3RvcnNlbmR8b2lkdmVjdG9ydHlwZXN8b25fcGJ8b25fcGx8b25fcHBhdGh8b25fcHN8b25fc2J8b25fc2x8b3BhcXVlX2lufG9wYXF1ZV9vdXR8b3ZlcmxhcHN8b3ZlcmxheXxwYXRofHBhdGhfYWRkfHBhdGhfYWRkX3B0fHBhdGhfY2VudGVyfHBhdGhfY29udGFpbl9wdHxwYXRoX2Rpc3RhbmNlfHBhdGhfZGl2X3B0fHBhdGhfaW58cGF0aF9pbnRlcnxwYXRoX2xlbmd0aHxwYXRoX211bF9wdHxwYXRoX25fZXF8cGF0aF9uX2dlfHBhdGhfbl9ndHxwYXRoX25fbGV8cGF0aF9uX2x0fHBhdGhfbnBvaW50c3xwYXRoX291dHxwYXRoX3JlY3Z8cGF0aF9zZW5kfHBhdGhfc3ViX3B0fHBjbG9zZXxwZXJjZW50X3Jhbmt8cGdfYWR2aXNvcnlfbG9ja3xwZ19hZHZpc29yeV9sb2NrX3NoYXJlZHxwZ19hZHZpc29yeV91bmxvY2t8cGdfYWR2aXNvcnlfdW5sb2NrX2FsbHxwZ19hZHZpc29yeV91bmxvY2tfc2hhcmVkfHBnX2Fkdmlzb3J5X3hhY3RfbG9ja3xwZ19hZHZpc29yeV94YWN0X2xvY2tfc2hhcmVkfHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnN8cGdfYXZhaWxhYmxlX2V4dGVuc2lvbnN8cGdfYmFja2VuZF9waWR8cGdfY2FuY2VsX2JhY2tlbmR8cGdfY2hhcl90b19lbmNvZGluZ3xwZ19jbGllbnRfZW5jb2Rpbmd8cGdfY29sbGF0aW9uX2lzX3Zpc2libGV8cGdfY29sdW1uX3NpemV8cGdfY29uZl9sb2FkX3RpbWV8cGdfY29udmVyc2lvbl9pc192aXNpYmxlfHBnX2NyZWF0ZV9yZXN0b3JlX3BvaW50fHBnX2N1cnJlbnRfeGxvZ19pbnNlcnRfbG9jYXRpb258cGdfY3VycmVudF94bG9nX2xvY2F0aW9ufHBnX2N1cnNvcnxwZ19kYXRhYmFzZV9zaXplfHBnX2Rlc2NyaWJlX29iamVjdHxwZ19lbmNvZGluZ19tYXhfbGVuZ3RofHBnX2VuY29kaW5nX3RvX2NoYXJ8cGdfZXh0ZW5zaW9uX2NvbmZpZ19kdW1wfHBnX2V4dGVuc2lvbl91cGRhdGVfcGF0aHN8cGdfZnVuY3Rpb25faXNfdmlzaWJsZXxwZ19nZXRfY29uc3RyYWludGRlZnxwZ19nZXRfZXhwcnxwZ19nZXRfZnVuY3Rpb25fYXJndW1lbnRzfHBnX2dldF9mdW5jdGlvbl9pZGVudGl0eV9hcmd1bWVudHN8cGdfZ2V0X2Z1bmN0aW9uX3Jlc3VsdHxwZ19nZXRfZnVuY3Rpb25kZWZ8cGdfZ2V0X2luZGV4ZGVmfHBnX2dldF9rZXl3b3Jkc3xwZ19nZXRfcnVsZWRlZnxwZ19nZXRfc2VyaWFsX3NlcXVlbmNlfHBnX2dldF90cmlnZ2VyZGVmfHBnX2dldF91c2VyYnlpZHxwZ19nZXRfdmlld2RlZnxwZ19oYXNfcm9sZXxwZ19pbmRleGVzX3NpemV8cGdfaXNfaW5fcmVjb3Zlcnl8cGdfaXNfb3RoZXJfdGVtcF9zY2hlbWF8cGdfaXNfeGxvZ19yZXBsYXlfcGF1c2VkfHBnX2xhc3RfeGFjdF9yZXBsYXlfdGltZXN0YW1wfHBnX2xhc3RfeGxvZ19yZWNlaXZlX2xvY2F0aW9ufHBnX2xhc3RfeGxvZ19yZXBsYXlfbG9jYXRpb258cGdfbGlzdGVuaW5nX2NoYW5uZWxzfHBnX2xvY2tfc3RhdHVzfHBnX2xzX2RpcnxwZ19teV90ZW1wX3NjaGVtYXxwZ19ub2RlX3RyZWVfaW58cGdfbm9kZV90cmVlX291dHxwZ19ub2RlX3RyZWVfcmVjdnxwZ19ub2RlX3RyZWVfc2VuZHxwZ19ub3RpZnl8cGdfb3BjbGFzc19pc192aXNpYmxlfHBnX29wZXJhdG9yX2lzX3Zpc2libGV8cGdfb3B0aW9uc190b190YWJsZXxwZ19wb3N0bWFzdGVyX3N0YXJ0X3RpbWV8cGdfcHJlcGFyZWRfc3RhdGVtZW50fHBnX3ByZXBhcmVkX3hhY3R8cGdfcmVhZF9iaW5hcnlfZmlsZXxwZ19yZWFkX2ZpbGV8cGdfcmVsYXRpb25fZmlsZW5vZGV8cGdfcmVsYXRpb25fZmlsZXBhdGh8cGdfcmVsYXRpb25fc2l6ZXxwZ19yZWxvYWRfY29uZnxwZ19yb3RhdGVfbG9nZmlsZXxwZ19zZXF1ZW5jZV9wYXJhbWV0ZXJzfHBnX3Nob3dfYWxsX3NldHRpbmdzfHBnX3NpemVfcHJldHR5fHBnX3NsZWVwfHBnX3N0YXJ0X2JhY2t1cHxwZ19zdGF0X2NsZWFyX3NuYXBzaG90fHBnX3N0YXRfZmlsZXxwZ19zdGF0X2dldF9hY3Rpdml0eXxwZ19zdGF0X2dldF9hbmFseXplX2NvdW50fHBnX3N0YXRfZ2V0X2F1dG9hbmFseXplX2NvdW50fHBnX3N0YXRfZ2V0X2F1dG92YWN1dW1fY291bnR8cGdfc3RhdF9nZXRfYmFja2VuZF9hY3Rpdml0eXxwZ19zdGF0X2dldF9iYWNrZW5kX2FjdGl2aXR5X3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfY2xpZW50X2FkZHJ8cGdfc3RhdF9nZXRfYmFja2VuZF9jbGllbnRfcG9ydHxwZ19zdGF0X2dldF9iYWNrZW5kX2RiaWR8cGdfc3RhdF9nZXRfYmFja2VuZF9pZHNldHxwZ19zdGF0X2dldF9iYWNrZW5kX3BpZHxwZ19zdGF0X2dldF9iYWNrZW5kX3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfdXNlcmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfd2FpdGluZ3xwZ19zdGF0X2dldF9iYWNrZW5kX3hhY3Rfc3RhcnR8cGdfc3RhdF9nZXRfYmd3cml0ZXJfYnVmX3dyaXR0ZW5fY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfYnVmX3dyaXR0ZW5fY2xlYW58cGdfc3RhdF9nZXRfYmd3cml0ZXJfbWF4d3JpdHRlbl9jbGVhbnxwZ19zdGF0X2dldF9iZ3dyaXRlcl9yZXF1ZXN0ZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfc3RhdF9yZXNldF90aW1lfHBnX3N0YXRfZ2V0X2Jnd3JpdGVyX3RpbWVkX2NoZWNrcG9pbnRzfHBnX3N0YXRfZ2V0X2Jsb2Nrc19mZXRjaGVkfHBnX3N0YXRfZ2V0X2Jsb2Nrc19oaXR8cGdfc3RhdF9nZXRfYnVmX2FsbG9jfHBnX3N0YXRfZ2V0X2J1Zl9mc3luY19iYWNrZW5kfHBnX3N0YXRfZ2V0X2J1Zl93cml0dGVuX2JhY2tlbmR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2ZldGNoZWR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2hpdHxwZ19zdGF0X2dldF9kYl9jb25mbGljdF9hbGx8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3RfYnVmZmVycGlufHBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X2xvY2t8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc25hcHNob3R8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc3RhcnR1cF9kZWFkbG9ja3xwZ19zdGF0X2dldF9kYl9jb25mbGljdF90YWJsZXNwYWNlfHBnX3N0YXRfZ2V0X2RiX251bWJhY2tlbmRzfHBnX3N0YXRfZ2V0X2RiX3N0YXRfcmVzZXRfdGltZXxwZ19zdGF0X2dldF9kYl90dXBsZXNfZGVsZXRlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfaW5zZXJ0ZWR8cGdfc3RhdF9nZXRfZGJfdHVwbGVzX3JldHVybmVkfHBnX3N0YXRfZ2V0X2RiX3R1cGxlc191cGRhdGVkfHBnX3N0YXRfZ2V0X2RiX3hhY3RfY29tbWl0fHBnX3N0YXRfZ2V0X2RiX3hhY3Rfcm9sbGJhY2t8cGdfc3RhdF9nZXRfZGVhZF90dXBsZXN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fc2VsZl90aW1lfHBnX3N0YXRfZ2V0X2Z1bmN0aW9uX3RpbWV8cGdfc3RhdF9nZXRfbGFzdF9hbmFseXplX3RpbWV8cGdfc3RhdF9nZXRfbGFzdF9hdXRvYW5hbHl6ZV90aW1lfHBnX3N0YXRfZ2V0X2xhc3RfYXV0b3ZhY3V1bV90aW1lfHBnX3N0YXRfZ2V0X2xhc3RfdmFjdXVtX3RpbWV8cGdfc3RhdF9nZXRfbGl2ZV90dXBsZXN8cGdfc3RhdF9nZXRfbnVtc2NhbnN8cGdfc3RhdF9nZXRfdHVwbGVzX2RlbGV0ZWR8cGdfc3RhdF9nZXRfdHVwbGVzX2ZldGNoZWR8cGdfc3RhdF9nZXRfdHVwbGVzX2hvdF91cGRhdGVkfHBnX3N0YXRfZ2V0X3R1cGxlc19pbnNlcnRlZHxwZ19zdGF0X2dldF90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9nZXRfdmFjdXVtX2NvdW50fHBnX3N0YXRfZ2V0X3dhbF9zZW5kZXJzfHBnX3N0YXRfZ2V0X3hhY3RfYmxvY2tzX2ZldGNoZWR8cGdfc3RhdF9nZXRfeGFjdF9ibG9ja3NfaGl0fHBnX3N0YXRfZ2V0X3hhY3RfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl9zZWxmX3RpbWV8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl90aW1lfHBnX3N0YXRfZ2V0X3hhY3RfbnVtc2NhbnN8cGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfZGVsZXRlZHxwZ19zdGF0X2dldF94YWN0X3R1cGxlc19mZXRjaGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2hvdF91cGRhdGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2luc2VydGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3JldHVybmVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9yZXNldHxwZ19zdGF0X3Jlc2V0X3NoYXJlZHxwZ19zdGF0X3Jlc2V0X3NpbmdsZV9mdW5jdGlvbl9jb3VudGVyc3xwZ19zdGF0X3Jlc2V0X3NpbmdsZV90YWJsZV9jb3VudGVyc3xwZ19zdG9wX2JhY2t1cHxwZ19zd2l0Y2hfeGxvZ3xwZ190YWJsZV9pc192aXNpYmxlfHBnX3RhYmxlX3NpemV8cGdfdGFibGVzcGFjZV9kYXRhYmFzZXN8cGdfdGFibGVzcGFjZV9zaXplfHBnX3Rlcm1pbmF0ZV9iYWNrZW5kfHBnX3RpbWV6b25lX2FiYnJldnN8cGdfdGltZXpvbmVfbmFtZXN8cGdfdG90YWxfcmVsYXRpb25fc2l6ZXxwZ190cnlfYWR2aXNvcnlfbG9ja3xwZ190cnlfYWR2aXNvcnlfbG9ja19zaGFyZWR8cGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9ja3xwZ190cnlfYWR2aXNvcnlfeGFjdF9sb2NrX3NoYXJlZHxwZ190c19jb25maWdfaXNfdmlzaWJsZXxwZ190c19kaWN0X2lzX3Zpc2libGV8cGdfdHNfcGFyc2VyX2lzX3Zpc2libGV8cGdfdHNfdGVtcGxhdGVfaXNfdmlzaWJsZXxwZ190eXBlX2lzX3Zpc2libGV8cGdfdHlwZW9mfHBnX3hsb2dfcmVwbGF5X3BhdXNlfHBnX3hsb2dfcmVwbGF5X3Jlc3VtZXxwZ194bG9nZmlsZV9uYW1lfHBnX3hsb2dmaWxlX25hbWVfb2Zmc2V0fHBpfHBsYWludG9fdHNxdWVyeXxwbHBnc3FsX2NhbGxfaGFuZGxlcnxwbHBnc3FsX2lubGluZV9oYW5kbGVyfHBscGdzcWxfdmFsaWRhdG9yfHBvaW50fHBvaW50X2Fib3ZlfHBvaW50X2FkZHxwb2ludF9iZWxvd3xwb2ludF9kaXN0YW5jZXxwb2ludF9kaXZ8cG9pbnRfZXF8cG9pbnRfaG9yaXp8cG9pbnRfaW58cG9pbnRfbGVmdHxwb2ludF9tdWx8cG9pbnRfbmV8cG9pbnRfb3V0fHBvaW50X3JlY3Z8cG9pbnRfcmlnaHR8cG9pbnRfc2VuZHxwb2ludF9zdWJ8cG9pbnRfdmVydHxwb2x5X2Fib3ZlfHBvbHlfYmVsb3d8cG9seV9jZW50ZXJ8cG9seV9jb250YWlufHBvbHlfY29udGFpbl9wdHxwb2x5X2NvbnRhaW5lZHxwb2x5X2Rpc3RhbmNlfHBvbHlfaW58cG9seV9sZWZ0fHBvbHlfbnBvaW50c3xwb2x5X291dHxwb2x5X292ZXJhYm92ZXxwb2x5X292ZXJiZWxvd3xwb2x5X292ZXJsYXB8cG9seV9vdmVybGVmdHxwb2x5X292ZXJyaWdodHxwb2x5X3JlY3Z8cG9seV9yaWdodHxwb2x5X3NhbWV8cG9seV9zZW5kfHBvbHlnb258cG9wZW58cG9zaXRpb258cG9zaXRpb25qb2luc2VsfHBvc2l0aW9uc2VsfHBvc3RncmVzcWxfZmR3X3ZhbGlkYXRvcnxwb3d8cG93ZXJ8cHJzZF9lbmR8cHJzZF9oZWFkbGluZXxwcnNkX2xleHR5cGV8cHJzZF9uZXh0dG9rZW58cHJzZF9zdGFydHxwdF9jb250YWluZWRfY2lyY2xlfHB0X2NvbnRhaW5lZF9wb2x5fHF1ZXJ5X3RvX3htbHxxdWVyeV90b194bWxfYW5kX3htbHNjaGVtYXxxdWVyeV90b194bWxzY2hlbWF8cXVlcnl0cmVlfHF1b3RlX2lkZW50fHF1b3RlX2xpdGVyYWx8cXVvdGVfbnVsbGFibGV8cmFkaWFuc3xyYWRpdXN8cmFuZG9tfHJhbmt8cmVjb3JkX2VxfHJlY29yZF9nZXxyZWNvcmRfZ3R8cmVjb3JkX2lufHJlY29yZF9sZXxyZWNvcmRfbHR8cmVjb3JkX25lfHJlY29yZF9vdXR8cmVjb3JkX3JlY3Z8cmVjb3JkX3NlbmR8cmVnY2xhc3N8cmVnY2xhc3NpbnxyZWdjbGFzc291dHxyZWdjbGFzc3JlY3Z8cmVnY2xhc3NzZW5kfHJlZ2NvbmZpZ2lufHJlZ2NvbmZpZ291dHxyZWdjb25maWdyZWN2fHJlZ2NvbmZpZ3NlbmR8cmVnZGljdGlvbmFyeWlufHJlZ2RpY3Rpb25hcnlvdXR8cmVnZGljdGlvbmFyeXJlY3Z8cmVnZGljdGlvbmFyeXNlbmR8cmVnZXhlcWpvaW5zZWx8cmVnZXhlcXNlbHxyZWdleG5lam9pbnNlbHxyZWdleG5lc2VsfHJlZ2V4cF9tYXRjaGVzfHJlZ2V4cF9yZXBsYWNlfHJlZ2V4cF9zcGxpdF90b19hcnJheXxyZWdleHBfc3BsaXRfdG9fdGFibGV8cmVnb3BlcmF0b3JpbnxyZWdvcGVyYXRvcm91dHxyZWdvcGVyYXRvcnJlY3Z8cmVnb3BlcmF0b3JzZW5kfHJlZ29wZXJpbnxyZWdvcGVyb3V0fHJlZ29wZXJyZWN2fHJlZ29wZXJzZW5kfHJlZ3Byb2NlZHVyZWlufHJlZ3Byb2NlZHVyZW91dHxyZWdwcm9jZWR1cmVyZWN2fHJlZ3Byb2NlZHVyZXNlbmR8cmVncHJvY2lufHJlZ3Byb2NvdXR8cmVncHJvY3JlY3Z8cmVncHJvY3NlbmR8cmVncl9hdmd4fHJlZ3JfYXZneXxyZWdyX2NvdW50fHJlZ3JfaW50ZXJjZXB0fHJlZ3JfcjJ8cmVncl9zbG9wZXxyZWdyX3N4eHxyZWdyX3N4eXxyZWdyX3N5eXxyZWd0eXBlaW58cmVndHlwZW91dHxyZWd0eXBlcmVjdnxyZWd0eXBlc2VuZHxyZWx0aW1lfHJlbHRpbWVlcXxyZWx0aW1lZ2V8cmVsdGltZWd0fHJlbHRpbWVpbnxyZWx0aW1lbGV8cmVsdGltZWx0fHJlbHRpbWVuZXxyZWx0aW1lb3V0fHJlbHRpbWVyZWN2fHJlbHRpbWVzZW5kfHJlcGVhdHxyZXBsYWNlfHJldmVyc2V8cmlnaHR8cm91bmR8cm93X251bWJlcnxycGFkfHJ0cmltfHNjYWxhcmd0am9pbnNlbHxzY2FsYXJndHNlbHxzY2FsYXJsdGpvaW5zZWx8c2NhbGFybHRzZWx8c2NoZW1hX3RvX3htbHxzY2hlbWFfdG9feG1sX2FuZF94bWxzY2hlbWF8c2NoZW1hX3RvX3htbHNjaGVtYXxzZXNzaW9uX3VzZXJ8c2V0X2JpdHxzZXRfYnl0ZXxzZXRfY29uZmlnfHNldF9tYXNrbGVufHNldHNlZWR8c2V0dmFsfHNldHdlaWdodHxzaGVsbF9pbnxzaGVsbF9vdXR8c2hpZnRfamlzXzIwMDRfdG9fZXVjX2ppc18yMDA0fHNoaWZ0X2ppc18yMDA0X3RvX3V0Zjh8c2hvYmpfZGVzY3JpcHRpb258c2lnbnxzaW1pbGFyX2VzY2FwZXxzaW58c2ppc190b19ldWNfanB8c2ppc190b19taWN8c2ppc190b191dGY4fHNsb3BlfHNtZ3JlcXxzbWdyaW58c21ncm5lfHNtZ3JvdXR8c3BsaXRfcGFydHxzcXJ0fHN0YXRlbWVudF90aW1lc3RhbXB8c3RkZGV2fHN0ZGRldl9wb3B8c3RkZGV2X3NhbXB8c3RyaW5nX2FnZ3xzdHJpbmdfYWdnX2ZpbmFsZm58c3RyaW5nX2FnZ190cmFuc2ZufHN0cmluZ190b19hcnJheXxzdHJpcHxzdHJwb3N8c3Vic3RyfHN1YnN0cmluZ3xzdW18c3VwcHJlc3NfcmVkdW5kYW50X3VwZGF0ZXNfdHJpZ2dlcnx0YWJsZV90b194bWx8dGFibGVfdG9feG1sX2FuZF94bWxzY2hlbWF8dGFibGVfdG9feG1sc2NoZW1hfHRhbnx0ZXh0fHRleHRfZ2V8dGV4dF9ndHx0ZXh0X2xhcmdlcnx0ZXh0X2xlfHRleHRfbHR8dGV4dF9wYXR0ZXJuX2dlfHRleHRfcGF0dGVybl9ndHx0ZXh0X3BhdHRlcm5fbGV8dGV4dF9wYXR0ZXJuX2x0fHRleHRfc21hbGxlcnx0ZXh0YW55Y2F0fHRleHRjYXR8dGV4dGVxfHRleHRpY2xpa2V8dGV4dGljbmxpa2V8dGV4dGljcmVnZXhlcXx0ZXh0aWNyZWdleG5lfHRleHRpbnx0ZXh0bGVufHRleHRsaWtlfHRleHRuZXx0ZXh0bmxpa2V8dGV4dG91dHx0ZXh0cmVjdnx0ZXh0cmVnZXhlcXx0ZXh0cmVnZXhuZXx0ZXh0c2VuZHx0aGVzYXVydXNfaW5pdHx0aGVzYXVydXNfbGV4aXplfHRpZGVxfHRpZGdlfHRpZGd0fHRpZGlufHRpZGxhcmdlcnx0aWRsZXx0aWRsdHx0aWRuZXx0aWRvdXR8dGlkcmVjdnx0aWRzZW5kfHRpZHNtYWxsZXJ8dGltZV9jbXB8dGltZV9lcXx0aW1lX2dlfHRpbWVfZ3R8dGltZV9oYXNofHRpbWVfaW58dGltZV9sYXJnZXJ8dGltZV9sZXx0aW1lX2x0fHRpbWVfbWlfaW50ZXJ2YWx8dGltZV9taV90aW1lfHRpbWVfbmV8dGltZV9vdXR8dGltZV9wbF9pbnRlcnZhbHx0aW1lX3JlY3Z8dGltZV9zZW5kfHRpbWVfc21hbGxlcnx0aW1lZGF0ZV9wbHx0aW1lbWl8dGltZW5vd3x0aW1lb2ZkYXl8dGltZXBsfHRpbWVzdGFtcF9jbXB8dGltZXN0YW1wX2NtcF9kYXRlfHRpbWVzdGFtcF9jbXBfdGltZXN0YW1wdHp8dGltZXN0YW1wX2VxfHRpbWVzdGFtcF9lcV9kYXRlfHRpbWVzdGFtcF9lcV90aW1lc3RhbXB0enx0aW1lc3RhbXBfZ2V8dGltZXN0YW1wX2dlX2RhdGV8dGltZXN0YW1wX2dlX3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9ndHx0aW1lc3RhbXBfZ3RfZGF0ZXx0aW1lc3RhbXBfZ3RfdGltZXN0YW1wdHp8dGltZXN0YW1wX2hhc2h8dGltZXN0YW1wX2lufHRpbWVzdGFtcF9sYXJnZXJ8dGltZXN0YW1wX2xlfHRpbWVzdGFtcF9sZV9kYXRlfHRpbWVzdGFtcF9sZV90aW1lc3RhbXB0enx0aW1lc3RhbXBfbHR8dGltZXN0YW1wX2x0X2RhdGV8dGltZXN0YW1wX2x0X3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9taXx0aW1lc3RhbXBfbWlfaW50ZXJ2YWx8dGltZXN0YW1wX25lfHRpbWVzdGFtcF9uZV9kYXRlfHRpbWVzdGFtcF9uZV90aW1lc3RhbXB0enx0aW1lc3RhbXBfb3V0fHRpbWVzdGFtcF9wbF9pbnRlcnZhbHx0aW1lc3RhbXBfcmVjdnx0aW1lc3RhbXBfc2VuZHx0aW1lc3RhbXBfc21hbGxlcnx0aW1lc3RhbXB0eXBtb2Rpbnx0aW1lc3RhbXB0eXBtb2RvdXR8dGltZXN0YW1wdHpfY21wfHRpbWVzdGFtcHR6X2NtcF9kYXRlfHRpbWVzdGFtcHR6X2NtcF90aW1lc3RhbXB8dGltZXN0YW1wdHpfZXF8dGltZXN0YW1wdHpfZXFfZGF0ZXx0aW1lc3RhbXB0el9lcV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ2V8dGltZXN0YW1wdHpfZ2VfZGF0ZXx0aW1lc3RhbXB0el9nZV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ3R8dGltZXN0YW1wdHpfZ3RfZGF0ZXx0aW1lc3RhbXB0el9ndF90aW1lc3RhbXB8dGltZXN0YW1wdHpfaW58dGltZXN0YW1wdHpfbGFyZ2VyfHRpbWVzdGFtcHR6X2xlfHRpbWVzdGFtcHR6X2xlX2RhdGV8dGltZXN0YW1wdHpfbGVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2x0fHRpbWVzdGFtcHR6X2x0X2RhdGV8dGltZXN0YW1wdHpfbHRfdGltZXN0YW1wfHRpbWVzdGFtcHR6X21pfHRpbWVzdGFtcHR6X21pX2ludGVydmFsfHRpbWVzdGFtcHR6X25lfHRpbWVzdGFtcHR6X25lX2RhdGV8dGltZXN0YW1wdHpfbmVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X291dHx0aW1lc3RhbXB0el9wbF9pbnRlcnZhbHx0aW1lc3RhbXB0el9yZWN2fHRpbWVzdGFtcHR6X3NlbmR8dGltZXN0YW1wdHpfc21hbGxlcnx0aW1lc3RhbXB0enR5cG1vZGlufHRpbWVzdGFtcHR6dHlwbW9kb3V0fHRpbWV0eXBtb2Rpbnx0aW1ldHlwbW9kb3V0fHRpbWV0el9jbXB8dGltZXR6X2VxfHRpbWV0el9nZXx0aW1ldHpfZ3R8dGltZXR6X2hhc2h8dGltZXR6X2lufHRpbWV0el9sYXJnZXJ8dGltZXR6X2xlfHRpbWV0el9sdHx0aW1ldHpfbWlfaW50ZXJ2YWx8dGltZXR6X25lfHRpbWV0el9vdXR8dGltZXR6X3BsX2ludGVydmFsfHRpbWV0el9yZWN2fHRpbWV0el9zZW5kfHRpbWV0el9zbWFsbGVyfHRpbWV0emRhdGVfcGx8dGltZXR6dHlwbW9kaW58dGltZXR6dHlwbW9kb3V0fHRpbWV6b25lfHRpbnRlcnZhbHx0aW50ZXJ2YWxjdHx0aW50ZXJ2YWxlbmR8dGludGVydmFsZXF8dGludGVydmFsZ2V8dGludGVydmFsZ3R8dGludGVydmFsaW58dGludGVydmFsbGV8dGludGVydmFsbGVuZXF8dGludGVydmFsbGVuZ2V8dGludGVydmFsbGVuZ3R8dGludGVydmFsbGVubGV8dGludGVydmFsbGVubHR8dGludGVydmFsbGVubmV8dGludGVydmFsbHR8dGludGVydmFsbmV8dGludGVydmFsb3V0fHRpbnRlcnZhbG92fHRpbnRlcnZhbHJlY3Z8dGludGVydmFscmVsfHRpbnRlcnZhbHNhbWV8dGludGVydmFsc2VuZHx0aW50ZXJ2YWxzdGFydHx0b19hc2NpaXx0b19jaGFyfHRvX2RhdGV8dG9faGV4fHRvX251bWJlcnx0b190aW1lc3RhbXB8dG9fdHNxdWVyeXx0b190c3ZlY3Rvcnx0cmFuc2FjdGlvbl90aW1lc3RhbXB8dHJhbnNsYXRlfHRyaWdnZXJfaW58dHJpZ2dlcl9vdXR8dHJ1bmN8dHNfZGVidWd8dHNfaGVhZGxpbmV8dHNfbGV4aXplfHRzX21hdGNoX3F2fHRzX21hdGNoX3RxfHRzX21hdGNoX3R0fHRzX21hdGNoX3ZxfHRzX3BhcnNlfHRzX3Jhbmt8dHNfcmFua19jZHx0c19yZXdyaXRlfHRzX3N0YXR8dHNfdG9rZW5fdHlwZXx0c190eXBhbmFseXplfHRzbWF0Y2hqb2luc2VsfHRzbWF0Y2hzZWx8dHNxX21jb250YWluZWR8dHNxX21jb250YWluc3x0c3F1ZXJ5X2FuZHx0c3F1ZXJ5X2NtcHx0c3F1ZXJ5X2VxfHRzcXVlcnlfZ2V8dHNxdWVyeV9ndHx0c3F1ZXJ5X2xlfHRzcXVlcnlfbHR8dHNxdWVyeV9uZXx0c3F1ZXJ5X25vdHx0c3F1ZXJ5X29yfHRzcXVlcnlpbnx0c3F1ZXJ5b3V0fHRzcXVlcnlyZWN2fHRzcXVlcnlzZW5kfHRzdmVjdG9yX2NtcHx0c3ZlY3Rvcl9jb25jYXR8dHN2ZWN0b3JfZXF8dHN2ZWN0b3JfZ2V8dHN2ZWN0b3JfZ3R8dHN2ZWN0b3JfbGV8dHN2ZWN0b3JfbHR8dHN2ZWN0b3JfbmV8dHN2ZWN0b3JfdXBkYXRlX3RyaWdnZXJ8dHN2ZWN0b3JfdXBkYXRlX3RyaWdnZXJfY29sdW1ufHRzdmVjdG9yaW58dHN2ZWN0b3JvdXR8dHN2ZWN0b3JyZWN2fHRzdmVjdG9yc2VuZHx0eGlkX2N1cnJlbnR8dHhpZF9jdXJyZW50X3NuYXBzaG90fHR4aWRfc25hcHNob3RfaW58dHhpZF9zbmFwc2hvdF9vdXR8dHhpZF9zbmFwc2hvdF9yZWN2fHR4aWRfc25hcHNob3Rfc2VuZHx0eGlkX3NuYXBzaG90X3hpcHx0eGlkX3NuYXBzaG90X3htYXh8dHhpZF9zbmFwc2hvdF94bWlufHR4aWRfdmlzaWJsZV9pbl9zbmFwc2hvdHx1aGNfdG9fdXRmOHx1bmlxdWVfa2V5X3JlY2hlY2t8dW5rbm93bmlufHVua25vd25vdXR8dW5rbm93bnJlY3Z8dW5rbm93bnNlbmR8dW5uZXN0fHVwcGVyfHV0ZjhfdG9fYXNjaWl8dXRmOF90b19iaWc1fHV0ZjhfdG9fZXVjX2NufHV0ZjhfdG9fZXVjX2ppc18yMDA0fHV0ZjhfdG9fZXVjX2pwfHV0ZjhfdG9fZXVjX2tyfHV0ZjhfdG9fZXVjX3R3fHV0ZjhfdG9fZ2IxODAzMHx1dGY4X3RvX2dia3x1dGY4X3RvX2lzbzg4NTl8dXRmOF90b19pc284ODU5XzF8dXRmOF90b19qb2hhYnx1dGY4X3RvX2tvaThyfHV0ZjhfdG9fa29pOHV8dXRmOF90b19zaGlmdF9qaXNfMjAwNHx1dGY4X3RvX3NqaXN8dXRmOF90b191aGN8dXRmOF90b193aW58dXVpZF9jbXB8dXVpZF9lcXx1dWlkX2dlfHV1aWRfZ3R8dXVpZF9oYXNofHV1aWRfaW58dXVpZF9sZXx1dWlkX2x0fHV1aWRfbmV8dXVpZF9vdXR8dXVpZF9yZWN2fHV1aWRfc2VuZHx2YXJfcG9wfHZhcl9zYW1wfHZhcmJpdF9pbnx2YXJiaXRfb3V0fHZhcmJpdF9yZWN2fHZhcmJpdF9zZW5kfHZhcmJpdGNtcHx2YXJiaXRlcXx2YXJiaXRnZXx2YXJiaXRndHx2YXJiaXRsZXx2YXJiaXRsdHx2YXJiaXRuZXx2YXJiaXR0eXBtb2Rpbnx2YXJiaXR0eXBtb2RvdXR8dmFyY2hhcmlufHZhcmNoYXJvdXR8dmFyY2hhcnJlY3Z8dmFyY2hhcnNlbmR8dmFyY2hhcnR5cG1vZGlufHZhcmNoYXJ0eXBtb2RvdXR8dmFyaWFuY2V8dmVyc2lvbnx2b2lkX2lufHZvaWRfb3V0fHZvaWRfcmVjdnx2b2lkX3NlbmR8d2lkdGh8d2lkdGhfYnVja2V0fHdpbjEyNTBfdG9fbGF0aW4yfHdpbjEyNTBfdG9fbWljfHdpbjEyNTFfdG9faXNvfHdpbjEyNTFfdG9fa29pOHJ8d2luMTI1MV90b19taWN8d2luMTI1MV90b193aW44NjZ8d2luODY2X3RvX2lzb3x3aW44NjZfdG9fa29pOHJ8d2luODY2X3RvX21pY3x3aW44NjZfdG9fd2luMTI1MXx3aW5fdG9fdXRmOHx4aWRlcXx4aWRlcWludDR8eGlkaW58eGlkb3V0fHhpZHJlY3Z8eGlkc2VuZHx4bWx8eG1sX2lufHhtbF9pc193ZWxsX2Zvcm1lZHx4bWxfaXNfd2VsbF9mb3JtZWRfY29udGVudHx4bWxfaXNfd2VsbF9mb3JtZWRfZG9jdW1lbnR8eG1sX291dHx4bWxfcmVjdnx4bWxfc2VuZHx4bWxhZ2d8eG1sY29tbWVudHx4bWxjb25jYXQyfHhtbGV4aXN0c3x4bWx2YWxpZGF0ZXx4cGF0aHx4cGF0aF9leGlzdHMiLnNwbGl0KCJ8IikpLGM9W3t0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoidmFyaWFibGUubGFuZ3VhZ2UiLHJlZ2V4OiciLio/Iid9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBjPWMudG9Mb3dlckNhc2UoKSxhLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjpiLmhhc093blByb3BlcnR5KGMpPyJzdXBwb3J0LmZ1bmN0aW9uIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aX11bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8ISF8IX58IX5cXCp8IX5+fCF+flxcKnwjfCMjfCM8fCM8PXwjPD58Iz18Iz58Iz49fCV8XFwmfFxcJlxcJnxcXCY8fFxcJjxcXHx8XFwmPnxcXCp8XFwrfFxcLXwvfDx8PCM+fDxcXC0+fDw8fDw8PXw8PFxcfHw8PXw8Pnw8XFw/Pnw8QHw8XFxefD18Pnw+PXw+Pnw+Pj18PlxcXnxcXD8jfFxcP1xcLXxcXD9cXC1cXHx8XFw/XFx8fFxcP1xcfFxcfHxAfEBcXC1AfEA+fEBAfEBAQHxcXF58XFx8fFxcfFxcJj58XFx8L3xcXHw+PnxcXHxcXHx8XFx8XFx8L3x+fH5cXCp8fjw9fnx+PH58fj18fj49fnx+Pn58fn58fn5cXCoifSx7dG9rZW46ImxwYXJlbi5wYXJlbiIscmVnZXg6IltcXChdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFwpXSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV07dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiItLS4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46ImtleXdvcmQuc3RhdGVtZW50QmVnaW4iLHJlZ2V4OiJeW2EtekEtWl0rIixuZXh0OiJzdGF0ZW1lbnQifSx7dG9rZW46InN1cHBvcnQuYnVpbGRpbiIscmVnZXg6Il5cXFxcW1xcU10rLiokIn1dLHN0YXRlbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLS0uKiQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnRTdGF0ZW1lbnQifSx7dG9rZW46InN0YXRlbWVudEVuZCIscmVnZXg6IjsiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRwZXJsXFwkIixuZXh0OiJwZXJsLXN0YXJ0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRweXRob25cXCQiLG5leHQ6InB5dGhvbi1zdGFydCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFwkW1xcd18wLTldKlxcJCQiLG5leHQ6ImRvbGxhclNxbCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFwkW1xcd18wLTldKlxcJCIsbmV4dDoiZG9sbGFyU3RhdGVtZW50U3RyaW5nIn1dLmNvbmNhdChjKSxkb2xsYXJTcWw6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii0tLiokIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50RG9sbGFyU3FsIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJeXFwkW1xcd18wLTldKlxcJCIsbmV4dDoic3RhdGVtZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRbXFx3XzAtOV0qXFwkIixuZXh0OiJkb2xsYXJTcWxTdHJpbmcifV0uY29uY2F0KGMpLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50U3RhdGVtZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXRlbWVudCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnREb2xsYXJTcWw6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoiZG9sbGFyU3FsIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sZG9sbGFyU3RhdGVtZW50U3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Ii4qP1xcJFtcXHdfMC05XSpcXCQiLG5leHQ6InN0YXRlbWVudCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0sZG9sbGFyU3FsU3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Ii4qP1xcJFtcXHdfMC05XSpcXCQiLG5leHQ6ImRvbGxhclNxbCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSksdGhpcy5lbWJlZFJ1bGVzKGgsInBlcmwtIixbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRwZXJsXFwkIixuZXh0OiJzdGF0ZW1lbnQifV0pLHRoaXMuZW1iZWRSdWxlcyhpLCJweXRob24tIixbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRweXRob25cXCQiLG5leHQ6InN0YXRlbWVudCJ9XSl9O2QuaW5oZXJpdHMoaixnKSxiLlBnc3FsSGlnaGxpZ2h0UnVsZXM9an0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJiYXNlfGNvbnN0YW50fGNvbnRpbnVlfGVsc2V8ZWxzaWZ8Zm9yfGZvcmVhY2h8Zm9ybWF0fGdvdG98aWZ8bGFzdHxsb2NhbHxteXxuZXh0fG5vfHBhY2thZ2V8cGFyZW50fHJlZG98cmVxdWlyZXxzY2FsYXJ8c3VifHVubGVzc3x1bnRpbHx3aGlsZXx1c2V8dmFycyIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIkFSR1Z8RU5WfElOQ3xTSUciLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0bmV0YnlhZGRyfGdldG5ldGJ5bmFtZXxnZXRzb2NrbmFtZXxnZXRwZWVybmFtZXxzZXRwcmlvcml0eXxnZXRwcm90b2VudHxzZXRwcm90b2VudHxnZXRwcmlvcml0eXxlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8Z2V0c29ja29wdHxnZXRob3N0ZW50fGVuZGhvc3RlbnR8c2V0c29ja29wdHxzZXRuZXRlbnR8cXVvdGVtZXRhfGxvY2FsdGltZXxwcm90b3R5cGV8Z2V0bmV0ZW50fGVuZG5ldGVudHxyZXdpbmRkaXJ8d2FudGFycmF5fGdldHB3dWlkfGNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfHNodXRkb3dufHJlYWRsaW5lfGVuZHB3ZW50fHNldGdyZW50fHJlYWRwaXBlfGZvcm1saW5lfHRydW5jYXRlfGRibWNsb3NlfHN5c3dyaXRlfHNldHB3ZW50fGdldHB3bmFtfGdldGdyZW50fGdldHB3ZW50fHVjZmlyc3R8c3lzcmVhZHxzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8bGNmaXJzdHxnZXRwcGlkfGJpbm1vZGV8c3lzY2FsbHxzcHJpbnRmfGdldHBncnB8cmVhZGRpcnxzZWVrZGlyfHdhaXRwaWR8cmV2ZXJzZXx1bnNoaWZ0fHN5bWxpbmt8ZGJtb3BlbnxzZW1nZXR8bXNncmN2fHJlbmFtZXxsaXN0ZW58Y2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18dW5saW5rfHByaW50ZnxnbXRpbWV8bXNnY3RsfHNlbWN0bHx2YWx1ZXN8cmluZGV4fHN1YnN0cnxzcGxpY2V8bGVuZ3RofG1zZ2dldHxzZWxlY3R8c29ja2V0fHJldHVybnxjYWxsZXJ8ZGVsZXRlfGFsYXJtfGlvY3RsfGluZGV4fHVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fHNsZWVwfGNob21wfHVudGllfHByaW50fHV0aW1lfG1rZGlyfGF0YW4yfHNwbGl0fGNyeXB0fGZsb2NrfGNobW9kfEJFR0lOfGJsZXNzfGNoZGlyfHNlbW9wfHNoaWZ0fHJlc2V0fGxpbmt8c3RhdHxjaG9wfGdyZXB8Zm9ya3xkdW1wfGpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8a2V5c3xnZXRjfGtpbGx8c2Vla3xzcXJ0fHNlbmR8d2FpdHxyYW5kfHRpZWR8cmVhZHx0aW1lfGV4ZWN8cmVjdnxlb2Z8Y2hyfGludHxvcmR8ZXhwfHBvc3xwb3B8c2lufGxvZ3xhYnN8b2N0fGhleHx0aWV8Y29zfHZlY3xFTkR8cmVmfG1hcHxkaWV8dWN8bGN8ZG8iLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMHhbMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmMuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLlxcLlxcLnxcXHxcXHw9fD4+PXw8PD18PD0+fCYmPXw9PnwhfnxcXF49fCY9fFxcfD18XFwuPXx4PXwlPXxcXC89fFxcKj18XFwtPXxcXCs9fD1+fFxcKlxcKnxcXC1cXC18XFwuXFwufFxcfFxcfHwmJnxcXCtcXCt8XFwtPnwhPXw9PXw+PXw8PXw+Pnw8PHwsfD18XFw/XFw6fFxcXnxcXHx8eHwlfFxcL3xcXCp8PHwmfFxcXFx8fnwhfD58XFwufFxcLXxcXCt8XFwtQ3xcXC1ifFxcLVN8XFwtdXxcXC10fFxcLXB8XFwtbHxcXC1kfFxcLWZ8XFwtZ3xcXC1zfFxcLXp8XFwta3xcXC1lfFxcLU98XFwtVHxcXC1CfFxcLU18XFwtQXxcXC1YfFxcLVd8XFwtY3xcXC1SfFxcLW98XFwteHxcXC13fFxcLXJ8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKSJ9LHt0b2tlbjoibHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuUGVybEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJhbmR8YXN8YXNzZXJ0fGJyZWFrfGNsYXNzfGNvbnRpbnVlfGRlZnxkZWx8ZWxpZnxlbHNlfGV4Y2VwdHxleGVjfGZpbmFsbHl8Zm9yfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpc3xsYW1iZGF8bm90fG9yfHBhc3N8cHJpbnR8cmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiVHJ1ZXxGYWxzZXxOb25lfE5vdEltcGxlbWVudGVkfEVsbGlwc2lzfF9fZGVidWdfXyIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoImFic3xkaXZtb2R8aW5wdXR8b3BlbnxzdGF0aWNtZXRob2R8YWxsfGVudW1lcmF0ZXxpbnR8b3JkfHN0cnxhbnl8ZXZhbHxpc2luc3RhbmNlfHBvd3xzdW18YmFzZXN0cmluZ3xleGVjZmlsZXxpc3N1YmNsYXNzfHByaW50fHN1cGVyfGJpbmZpbGV8aXRlcnxwcm9wZXJ0eXx0dXBsZXxib29sfGZpbHRlcnxsZW58cmFuZ2V8dHlwZXxieXRlYXJyYXl8ZmxvYXR8bGlzdHxyYXdfaW5wdXR8dW5pY2hyfGNhbGxhYmxlfGZvcm1hdHxsb2NhbHN8cmVkdWNlfHVuaWNvZGV8Y2hyfGZyb3plbnNldHxsb25nfHJlbG9hZHx2YXJzfGNsYXNzbWV0aG9kfGdldGF0dHJ8bWFwfHJlcHJ8eHJhbmdlfGNtcHxnbG9iYWxzfG1heHxyZXZlcnNlZHx6aXB8Y29tcGlsZXxoYXNhdHRyfG1lbW9yeXZpZXd8cm91bmR8X19pbXBvcnRfX3xjb21wbGV4fGhhc2h8bWlufHNldHxhcHBseXxkZWxhdHRyfGhlbHB8bmV4dHxzZXRhdHRyfGJ1ZmZlcnxkaWN0fGhleHxvYmplY3R8c2xpY2V8Y29lcmNlfGRpcnxpZHxvY3R8c29ydGVkfGludGVybiIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiIuc3BsaXQoInwiKSksZj0iKD86cnx1fHVyfFJ8VXxVUnxVcnx1Uik/IixnPSIoPzooPzpbMS05XVxcZCopfCg/OjApKSIsaD0iKD86MFtvT10/WzAtN10rKSIsaT0iKD86MFt4WF1bXFxkQS1GYS1mXSspIixqPSIoPzowW2JCXVswMV0rKSIsaz0iKD86IitnKyJ8IitoKyJ8IitpKyJ8IitqKyIpIixsPSIoPzpbZUVdWystXT9cXGQrKSIsbT0iKD86XFwuXFxkKykiLG49Iig/OlxcZCspIixvPSIoPzooPzoiK24rIj8iK20rIil8KD86IituKyJcXC4pKSIscD0iKD86KD86IitvKyJ8IituKyIpIitsKyIpIixxPSIoPzoiK3ArInwiK28rIikiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDpmKyciezN9KD86W15cXFxcXXxcXFxcLikqPyJ7M30nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6ZisnInszfS4qJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6ZisnIig/OlteXFxcXF18XFxcXC4pKj8iJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmYrIid7M30oPzpbXlxcXFxdfFxcXFwuKSo/J3szfSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDpmKyInezN9LiokIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmYrIicoPzpbXlxcXFxdfFxcXFwuKSo/JyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6Iig/OiIrcSsifFxcZCspW2pKXVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6cX0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDprKyJbbExdXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDprKyJcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGUpPyJpbnZhbGlkLmlsbGVnYWwiOmMuaGFzT3duUHJvcGVydHkoZSk/InN1cHBvcnQuZnVuY3Rpb24iOmU9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwrfFxcLXxcXCp8XFwqXFwqfFxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PSJ9LHt0b2tlbjoibHBhcmVuLnBhcmVuIixyZWdleDoiW1xcW1xcKFxce10ifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF1cXClcXH1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzpbXlxcXFxdfFxcXFwuKSo/InszfScsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqPyd7M30iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX19O2QuaW5oZXJpdHMoZyxmKSxiLlB5dGhvbkhpZ2hsaWdodFJ1bGVzPWd9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-php-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+DQoqDQoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQoqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQoqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQoqDQoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcGhwJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcGhwX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgUGhwSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3BocF9oaWdobGlnaHRfcnVsZXMiKS5QaHBIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUGhwSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIjIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtcOl1ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3BocF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFBocEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGRvY0NvbW1lbnQgPSBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCk7DQogICAgLy8gaHR0cDovL3BocC5uZXQvcXVpY2tyZWYucGhwDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnYWJzfGFjb3N8YWNvc2h8YWRkY3NsYXNoZXN8YWRkc2xhc2hlc3xhZ2dyZWdhdGV8YWdncmVnYXRlX2luZm98YWdncmVnYXRlX21ldGhvZHN8YWdncmVnYXRlX21ldGhvZHNfYnlfbGlzdHxhZ2dyZWdhdGVfbWV0aG9kc19ieV9yZWdleHB8JyArDQogICAgICAgICdhZ2dyZWdhdGVfcHJvcGVydGllc3xhZ2dyZWdhdGVfcHJvcGVydGllc19ieV9saXN0fGFnZ3JlZ2F0ZV9wcm9wZXJ0aWVzX2J5X3JlZ2V4cHxhZ2dyZWdhdGlvbl9pbmZvfGFtcXBjb25uZWN0aW9ufGFtcXBleGNoYW5nZXxhbXFwcXVldWV8JyArDQogICAgICAgICdhcGFjaGVfY2hpbGRfdGVybWluYXRlfGFwYWNoZV9nZXRfbW9kdWxlc3xhcGFjaGVfZ2V0X3ZlcnNpb258YXBhY2hlX2dldGVudnxhcGFjaGVfbG9va3VwX3VyaXxhcGFjaGVfbm90ZXxhcGFjaGVfcmVxdWVzdF9oZWFkZXJzfCcgKw0KICAgICAgICAnYXBhY2hlX3Jlc2V0X3RpbWVvdXR8YXBhY2hlX3Jlc3BvbnNlX2hlYWRlcnN8YXBhY2hlX3NldGVudnxhcGNfYWRkfGFwY19iaW5fZHVtcHxhcGNfYmluX2R1bXBmaWxlfGFwY19iaW5fbG9hZHxhcGNfYmluX2xvYWRmaWxlfCcgKw0KICAgICAgICAnYXBjX2NhY2hlX2luZm98YXBjX2Nhc3xhcGNfY2xlYXJfY2FjaGV8YXBjX2NvbXBpbGVfZmlsZXxhcGNfZGVjfGFwY19kZWZpbmVfY29uc3RhbnRzfGFwY19kZWxldGV8YXBjX2RlbGV0ZV9maWxlfGFwY19leGlzdHN8YXBjX2ZldGNofCcgKw0KICAgICAgICAnYXBjX2luY3xhcGNfbG9hZF9jb25zdGFudHN8YXBjX3NtYV9pbmZvfGFwY19zdG9yZXxhcGNpdGVyYXRvcnxhcGRfYnJlYWtwb2ludHxhcGRfY2FsbHN0YWNrfGFwZF9jbHVua3xhcGRfY29udGludWV8YXBkX2Nyb2FrfCcgKw0KICAgICAgICAnYXBkX2R1bXBfZnVuY3Rpb25fdGFibGV8YXBkX2R1bXBfcGVyc2lzdGVudF9yZXNvdXJjZXN8YXBkX2R1bXBfcmVndWxhcl9yZXNvdXJjZXN8YXBkX2VjaG98YXBkX2dldF9hY3RpdmVfc3ltYm9sc3xhcGRfc2V0X3Bwcm9mX3RyYWNlfCcgKw0KICAgICAgICAnYXBkX3NldF9zZXNzaW9ufGFwZF9zZXRfc2Vzc2lvbl90cmFjZXxhcGRfc2V0X3Nlc3Npb25fdHJhY2Vfc29ja2V0fGFwcGVuZGl0ZXJhdG9yfGFycmF5fGFycmF5X2NoYW5nZV9rZXlfY2FzZXxhcnJheV9jaHVua3xhcnJheV9jb21iaW5lfCcgKw0KICAgICAgICAnYXJyYXlfY291bnRfdmFsdWVzfGFycmF5X2RpZmZ8YXJyYXlfZGlmZl9hc3NvY3xhcnJheV9kaWZmX2tleXxhcnJheV9kaWZmX3Vhc3NvY3xhcnJheV9kaWZmX3VrZXl8YXJyYXlfZmlsbHxhcnJheV9maWxsX2tleXN8YXJyYXlfZmlsdGVyfCcgKw0KICAgICAgICAnYXJyYXlfZmxpcHxhcnJheV9pbnRlcnNlY3R8YXJyYXlfaW50ZXJzZWN0X2Fzc29jfGFycmF5X2ludGVyc2VjdF9rZXl8YXJyYXlfaW50ZXJzZWN0X3Vhc3NvY3xhcnJheV9pbnRlcnNlY3RfdWtleXxhcnJheV9rZXlfZXhpc3RzfCcgKw0KICAgICAgICAnYXJyYXlfa2V5c3xhcnJheV9tYXB8YXJyYXlfbWVyZ2V8YXJyYXlfbWVyZ2VfcmVjdXJzaXZlfGFycmF5X211bHRpc29ydHxhcnJheV9wYWR8YXJyYXlfcG9wfGFycmF5X3Byb2R1Y3R8YXJyYXlfcHVzaHxhcnJheV9yYW5kfCcgKw0KICAgICAgICAnYXJyYXlfcmVkdWNlfGFycmF5X3JlcGxhY2V8YXJyYXlfcmVwbGFjZV9yZWN1cnNpdmV8YXJyYXlfcmV2ZXJzZXxhcnJheV9zZWFyY2h8YXJyYXlfc2hpZnR8YXJyYXlfc2xpY2V8YXJyYXlfc3BsaWNlfGFycmF5X3N1bXxhcnJheV91ZGlmZnwnICsNCiAgICAgICAgJ2FycmF5X3VkaWZmX2Fzc29jfGFycmF5X3VkaWZmX3Vhc3NvY3xhcnJheV91aW50ZXJzZWN0fGFycmF5X3VpbnRlcnNlY3RfYXNzb2N8YXJyYXlfdWludGVyc2VjdF91YXNzb2N8YXJyYXlfdW5pcXVlfGFycmF5X3Vuc2hpZnR8JyArDQogICAgICAgICdhcnJheV92YWx1ZXN8YXJyYXlfd2Fsa3xhcnJheV93YWxrX3JlY3Vyc2l2ZXxhcnJheWFjY2Vzc3xhcnJheWl0ZXJhdG9yfGFycmF5b2JqZWN0fGFyc29ydHxhc2lufGFzaW5ofGFzb3J0fGFzc2VydHxhc3NlcnRfb3B0aW9uc3xhdGFufCcgKw0KICAgICAgICAnYXRhbjJ8YXRhbmh8YXVkaW9wcm9wZXJ0aWVzfGJhZGZ1bmN0aW9uY2FsbGV4Y2VwdGlvbnxiYWRtZXRob2RjYWxsZXhjZXB0aW9ufGJhc2U2NF9kZWNvZGV8YmFzZTY0X2VuY29kZXxiYXNlX2NvbnZlcnR8YmFzZW5hbWV8JyArDQogICAgICAgICdiYmNvZGVfYWRkX2VsZW1lbnR8YmJjb2RlX2FkZF9zbWlsZXl8YmJjb2RlX2NyZWF0ZXxiYmNvZGVfZGVzdHJveXxiYmNvZGVfcGFyc2V8YmJjb2RlX3NldF9hcmdfcGFyc2VyfGJiY29kZV9zZXRfZmxhZ3N8YmNhZGR8YmNjb21wfGJjZGl2fCcgKw0KICAgICAgICAnYmNtb2R8YmNtdWx8YmNvbXBpbGVyX2xvYWR8YmNvbXBpbGVyX2xvYWRfZXhlfGJjb21waWxlcl9wYXJzZV9jbGFzc3xiY29tcGlsZXJfcmVhZHxiY29tcGlsZXJfd3JpdGVfY2xhc3N8YmNvbXBpbGVyX3dyaXRlX2NvbnN0YW50fCcgKw0KICAgICAgICAnYmNvbXBpbGVyX3dyaXRlX2V4ZV9mb290ZXJ8YmNvbXBpbGVyX3dyaXRlX2ZpbGV8YmNvbXBpbGVyX3dyaXRlX2Zvb3RlcnxiY29tcGlsZXJfd3JpdGVfZnVuY3Rpb258YmNvbXBpbGVyX3dyaXRlX2Z1bmN0aW9uc19mcm9tX2ZpbGV8JyArDQogICAgICAgICdiY29tcGlsZXJfd3JpdGVfaGVhZGVyfGJjb21waWxlcl93cml0ZV9pbmNsdWRlZF9maWxlbmFtZXxiY3Bvd3xiY3Bvd21vZHxiY3NjYWxlfGJjc3FydHxiY3N1YnxiaW4yaGV4fGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0fGJpbmRlY3wnICsNCiAgICAgICAgJ2JpbmR0ZXh0ZG9tYWlufGJzb25fZGVjb2RlfGJzb25fZW5jb2RlfGJ1bXBWYWx1ZXxiemNsb3NlfGJ6Y29tcHJlc3N8YnpkZWNvbXByZXNzfGJ6ZXJybm98YnplcnJvcnxiemVycnN0cnxiemZsdXNofGJ6b3BlbnxienJlYWR8Ynp3cml0ZXwnICsNCiAgICAgICAgJ2NhY2hpbmdpdGVyYXRvcnxjYWlyb3xjYWlyb19jcmVhdGV8Y2Fpcm9fZm9udF9mYWNlX2dldF90eXBlfGNhaXJvX2ZvbnRfZmFjZV9zdGF0dXN8Y2Fpcm9fZm9udF9vcHRpb25zX2NyZWF0ZXxjYWlyb19mb250X29wdGlvbnNfZXF1YWx8JyArDQogICAgICAgICdjYWlyb19mb250X29wdGlvbnNfZ2V0X2FudGlhbGlhc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfbWV0cmljc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfc3R5bGV8JyArDQogICAgICAgICdjYWlyb19mb250X29wdGlvbnNfZ2V0X3N1YnBpeGVsX29yZGVyfGNhaXJvX2ZvbnRfb3B0aW9uc19oYXNofGNhaXJvX2ZvbnRfb3B0aW9uc19tZXJnZXxjYWlyb19mb250X29wdGlvbnNfc2V0X2FudGlhbGlhc3wnICsNCiAgICAgICAgJ2NhaXJvX2ZvbnRfb3B0aW9uc19zZXRfaGludF9tZXRyaWNzfGNhaXJvX2ZvbnRfb3B0aW9uc19zZXRfaGludF9zdHlsZXxjYWlyb19mb250X29wdGlvbnNfc2V0X3N1YnBpeGVsX29yZGVyfGNhaXJvX2ZvbnRfb3B0aW9uc19zdGF0dXN8JyArDQogICAgICAgICdjYWlyb19mb3JtYXRfc3RyaWRlX2Zvcl93aWR0aHxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mcm9tX3BuZ3wnICsNCiAgICAgICAgJ2NhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGF8Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZm9ybWF0fGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2hlaWdodHxjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9zdHJpZGV8JyArDQogICAgICAgICdjYWlyb19pbWFnZV9zdXJmYWNlX2dldF93aWR0aHxjYWlyb19tYXRyaXhfY3JlYXRlX3NjYWxlfGNhaXJvX21hdHJpeF9jcmVhdGVfdHJhbnNsYXRlfGNhaXJvX21hdHJpeF9pbnZlcnR8Y2Fpcm9fbWF0cml4X211bHRpcGx5fCcgKw0KICAgICAgICAnY2Fpcm9fbWF0cml4X3JvdGF0ZXxjYWlyb19tYXRyaXhfdHJhbnNmb3JtX2Rpc3RhbmNlfGNhaXJvX21hdHJpeF90cmFuc2Zvcm1fcG9pbnR8Y2Fpcm9fbWF0cml4X3RyYW5zbGF0ZXxjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYnwnICsNCiAgICAgICAgJ2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYXxjYWlyb19wYXR0ZXJuX2NyZWF0ZV9mb3Jfc3VyZmFjZXxjYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXJ8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsfCcgKw0KICAgICAgICAnY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmdifGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JnYmF8Y2Fpcm9fcGF0dGVybl9nZXRfY29sb3Jfc3RvcF9jb3VudHxjYWlyb19wYXR0ZXJuX2dldF9jb2xvcl9zdG9wX3JnYmF8JyArDQogICAgICAgICdjYWlyb19wYXR0ZXJuX2dldF9leHRlbmR8Y2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fZ2V0X2xpbmVhcl9wb2ludHN8Y2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4fCcgKw0KICAgICAgICAnY2Fpcm9fcGF0dGVybl9nZXRfcmFkaWFsX2NpcmNsZXN8Y2Fpcm9fcGF0dGVybl9nZXRfcmdiYXxjYWlyb19wYXR0ZXJuX2dldF9zdXJmYWNlfGNhaXJvX3BhdHRlcm5fZ2V0X3R5cGV8Y2Fpcm9fcGF0dGVybl9zZXRfZXh0ZW5kfCcgKw0KICAgICAgICAnY2Fpcm9fcGF0dGVybl9zZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fc2V0X21hdHJpeHxjYWlyb19wYXR0ZXJuX3N0YXR1c3xjYWlyb19wZGZfc3VyZmFjZV9jcmVhdGV8Y2Fpcm9fcGRmX3N1cmZhY2Vfc2V0X3NpemV8JyArDQogICAgICAgICdjYWlyb19wc19nZXRfbGV2ZWxzfGNhaXJvX3BzX2xldmVsX3RvX3N0cmluZ3xjYWlyb19wc19zdXJmYWNlX2NyZWF0ZXxjYWlyb19wc19zdXJmYWNlX2RzY19iZWdpbl9wYWdlX3NldHVwfCcgKw0KICAgICAgICAnY2Fpcm9fcHNfc3VyZmFjZV9kc2NfYmVnaW5fc2V0dXB8Y2Fpcm9fcHNfc3VyZmFjZV9kc2NfY29tbWVudHxjYWlyb19wc19zdXJmYWNlX2dldF9lcHN8Y2Fpcm9fcHNfc3VyZmFjZV9yZXN0cmljdF90b19sZXZlbHwnICsNCiAgICAgICAgJ2NhaXJvX3BzX3N1cmZhY2Vfc2V0X2Vwc3xjYWlyb19wc19zdXJmYWNlX3NldF9zaXplfGNhaXJvX3NjYWxlZF9mb250X2NyZWF0ZXxjYWlyb19zY2FsZWRfZm9udF9leHRlbnRzfGNhaXJvX3NjYWxlZF9mb250X2dldF9jdG18JyArDQogICAgICAgICdjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9mYWNlfGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X21hdHJpeHxjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3NjYWxlZF9mb250X2dldF9zY2FsZV9tYXRyaXh8JyArDQogICAgICAgICdjYWlyb19zY2FsZWRfZm9udF9nZXRfdHlwZXxjYWlyb19zY2FsZWRfZm9udF9nbHlwaF9leHRlbnRzfGNhaXJvX3NjYWxlZF9mb250X3N0YXR1c3xjYWlyb19zY2FsZWRfZm9udF90ZXh0X2V4dGVudHN8JyArDQogICAgICAgICdjYWlyb19zdXJmYWNlX2NvcHlfcGFnZXxjYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyfGNhaXJvX3N1cmZhY2VfZmluaXNofGNhaXJvX3N1cmZhY2VfZmx1c2h8Y2Fpcm9fc3VyZmFjZV9nZXRfY29udGVudHwnICsNCiAgICAgICAgJ2NhaXJvX3N1cmZhY2VfZ2V0X2RldmljZV9vZmZzZXR8Y2Fpcm9fc3VyZmFjZV9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGV8Y2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5fCcgKw0KICAgICAgICAnY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5X3JlY3RhbmdsZXxjYWlyb19zdXJmYWNlX3NldF9kZXZpY2Vfb2Zmc2V0fGNhaXJvX3N1cmZhY2Vfc2V0X2ZhbGxiYWNrX3Jlc29sdXRpb258Y2Fpcm9fc3VyZmFjZV9zaG93X3BhZ2V8JyArDQogICAgICAgICdjYWlyb19zdXJmYWNlX3N0YXR1c3xjYWlyb19zdXJmYWNlX3dyaXRlX3RvX3BuZ3xjYWlyb19zdmdfc3VyZmFjZV9jcmVhdGV8Y2Fpcm9fc3ZnX3N1cmZhY2VfcmVzdHJpY3RfdG9fdmVyc2lvbnwnICsNCiAgICAgICAgJ2NhaXJvX3N2Z192ZXJzaW9uX3RvX3N0cmluZ3xjYWlyb2FudGlhbGlhc3xjYWlyb2NvbnRlbnR8Y2Fpcm9jb250ZXh0fGNhaXJvZXhjZXB0aW9ufGNhaXJvZXh0ZW5kfGNhaXJvZmlsbHJ1bGV8Y2Fpcm9maWx0ZXJ8Y2Fpcm9mb250ZmFjZXwnICsNCiAgICAgICAgJ2NhaXJvZm9udG9wdGlvbnN8Y2Fpcm9mb250c2xhbnR8Y2Fpcm9mb250dHlwZXxjYWlyb2ZvbnR3ZWlnaHR8Y2Fpcm9mb3JtYXR8Y2Fpcm9ncmFkaWVudHBhdHRlcm58Y2Fpcm9oaW50bWV0cmljc3xjYWlyb2hpbnRzdHlsZXwnICsNCiAgICAgICAgJ2NhaXJvaW1hZ2VzdXJmYWNlfGNhaXJvbGluZWFyZ3JhZGllbnR8Y2Fpcm9saW5lY2FwfGNhaXJvbGluZWpvaW58Y2Fpcm9tYXRyaXh8Y2Fpcm9vcGVyYXRvcnxjYWlyb3BhdGh8Y2Fpcm9wYXR0ZXJufGNhaXJvcGF0dGVybnR5cGV8JyArDQogICAgICAgICdjYWlyb3BkZnN1cmZhY2V8Y2Fpcm9wc2xldmVsfGNhaXJvcHNzdXJmYWNlfGNhaXJvcmFkaWFsZ3JhZGllbnR8Y2Fpcm9zY2FsZWRmb250fGNhaXJvc29saWRwYXR0ZXJufGNhaXJvc3RhdHVzfGNhaXJvc3VicGl4ZWxvcmRlcnwnICsNCiAgICAgICAgJ2NhaXJvc3VyZmFjZXxjYWlyb3N1cmZhY2VwYXR0ZXJufGNhaXJvc3VyZmFjZXR5cGV8Y2Fpcm9zdmdzdXJmYWNlfGNhaXJvc3ZndmVyc2lvbnxjYWlyb3RveWZvbnRmYWNlfGNhbF9kYXlzX2luX21vbnRofGNhbF9mcm9tX2pkfGNhbF9pbmZvfCcgKw0KICAgICAgICAnY2FsX3RvX2pkfGNhbGN1bF9obWFjfGNhbGN1bGhtYWN8Y2FsbF91c2VyX2Z1bmN8Y2FsbF91c2VyX2Z1bmNfYXJyYXl8Y2FsbF91c2VyX21ldGhvZHxjYWxsX3VzZXJfbWV0aG9kX2FycmF5fGNhbGxiYWNrZmlsdGVyaXRlcmF0b3J8Y2VpbHwnICsNCiAgICAgICAgJ2NoZGJ8Y2hkYl9jcmVhdGV8Y2hkaXJ8Y2hlY2tkYXRlfGNoZWNrZG5zcnJ8Y2hncnB8Y2htb2R8Y2hvcHxjaG93bnxjaHJ8Y2hyb290fGNodW5rX3NwbGl0fGNsYXNzX2FsaWFzfGNsYXNzX2V4aXN0c3xjbGFzc19pbXBsZW1lbnRzfCcgKw0KICAgICAgICAnY2xhc3NfcGFyZW50c3xjbGFzc2tpdF9pbXBvcnR8Y2xhc3NraXRfbWV0aG9kX2FkZHxjbGFzc2tpdF9tZXRob2RfY29weXxjbGFzc2tpdF9tZXRob2RfcmVkZWZpbmV8Y2xhc3NraXRfbWV0aG9kX3JlbW92ZXwnICsNCiAgICAgICAgJ2NsYXNza2l0X21ldGhvZF9yZW5hbWV8Y2xlYXJzdGF0Y2FjaGV8Y2xvbmV8Y2xvc2VkaXJ8Y2xvc2Vsb2d8Y29sbGF0b3J8Y29tfGNvbV9hZGRyZWZ8Y29tX2NyZWF0ZV9ndWlkfGNvbV9ldmVudF9zaW5rfGNvbV9nZXR8JyArDQogICAgICAgICdjb21fZ2V0X2FjdGl2ZV9vYmplY3R8Y29tX2ludm9rZXxjb21faXNlbnVtfGNvbV9sb2FkfGNvbV9sb2FkX3R5cGVsaWJ8Y29tX21lc3NhZ2VfcHVtcHxjb21fcHJpbnRfdHlwZWluZm98Y29tX3Byb3BnZXR8Y29tX3Byb3BwdXR8JyArDQogICAgICAgICdjb21fcHJvcHNldHxjb21fcmVsZWFzZXxjb21fc2V0fGNvbXBhY3R8Y29ubmVjdGlvbl9hYm9ydGVkfGNvbm5lY3Rpb25fc3RhdHVzfGNvbm5lY3Rpb25fdGltZW91dHxjb25zdGFudHxjb25zdHJ1Y3R8Y29uc3RydWN0fGNvbnN0cnVjdHwnICsNCiAgICAgICAgJ2NvbnZlcnRfY3lyX3N0cmluZ3xjb252ZXJ0X3V1ZGVjb2RlfGNvbnZlcnRfdXVlbmNvZGV8Y29weXxjb3N8Y29zaHxjb3VudHxjb3VudF9jaGFyc3xjb3VudGFibGV8Y291bnRlcl9idW1wfGNvdW50ZXJfYnVtcF92YWx1ZXwnICsNCiAgICAgICAgJ2NvdW50ZXJfY3JlYXRlfGNvdW50ZXJfZ2V0fGNvdW50ZXJfZ2V0X21ldGF8Y291bnRlcl9nZXRfbmFtZWR8Y291bnRlcl9nZXRfdmFsdWV8Y291bnRlcl9yZXNldHxjb3VudGVyX3Jlc2V0X3ZhbHVlfGNyYWNrX2NoZWNrfCcgKw0KICAgICAgICAnY3JhY2tfY2xvc2VkaWN0fGNyYWNrX2dldGxhc3RtZXNzYWdlfGNyYWNrX29wZW5kaWN0fGNyYzMyfGNyZWF0ZV9mdW5jdGlvbnxjcnlwdHxjdHlwZV9hbG51bXxjdHlwZV9hbHBoYXxjdHlwZV9jbnRybHxjdHlwZV9kaWdpdHwnICsNCiAgICAgICAgJ2N0eXBlX2dyYXBofGN0eXBlX2xvd2VyfGN0eXBlX3ByaW50fGN0eXBlX3B1bmN0fGN0eXBlX3NwYWNlfGN0eXBlX3VwcGVyfGN0eXBlX3hkaWdpdHxjdWJyaWRfYWZmZWN0ZWRfcm93c3xjdWJyaWRfYmluZHwnICsNCiAgICAgICAgJ2N1YnJpZF9jbGllbnRfZW5jb2Rpbmd8Y3VicmlkX2Nsb3NlfGN1YnJpZF9jbG9zZV9wcmVwYXJlfGN1YnJpZF9jbG9zZV9yZXF1ZXN0fGN1YnJpZF9jb2xfZ2V0fGN1YnJpZF9jb2xfc2l6ZXxjdWJyaWRfY29sdW1uX25hbWVzfCcgKw0KICAgICAgICAnY3VicmlkX2NvbHVtbl90eXBlc3xjdWJyaWRfY29tbWl0fGN1YnJpZF9jb25uZWN0fGN1YnJpZF9jb25uZWN0X3dpdGhfdXJsfGN1YnJpZF9jdXJyZW50X29pZHxjdWJyaWRfZGF0YV9zZWVrfGN1YnJpZF9kYl9uYW1lfCcgKw0KICAgICAgICAnY3VicmlkX2Rpc2Nvbm5lY3R8Y3VicmlkX2Ryb3B8Y3VicmlkX2Vycm5vfGN1YnJpZF9lcnJvcnxjdWJyaWRfZXJyb3JfY29kZXxjdWJyaWRfZXJyb3JfY29kZV9mYWNpbGl0eXxjdWJyaWRfZXJyb3JfbXNnfGN1YnJpZF9leGVjdXRlfCcgKw0KICAgICAgICAnY3VicmlkX2ZldGNofGN1YnJpZF9mZXRjaF9hcnJheXxjdWJyaWRfZmV0Y2hfYXNzb2N8Y3VicmlkX2ZldGNoX2ZpZWxkfGN1YnJpZF9mZXRjaF9sZW5ndGhzfGN1YnJpZF9mZXRjaF9vYmplY3R8Y3VicmlkX2ZldGNoX3Jvd3wnICsNCiAgICAgICAgJ2N1YnJpZF9maWVsZF9mbGFnc3xjdWJyaWRfZmllbGRfbGVufGN1YnJpZF9maWVsZF9uYW1lfGN1YnJpZF9maWVsZF9zZWVrfGN1YnJpZF9maWVsZF90YWJsZXxjdWJyaWRfZmllbGRfdHlwZXxjdWJyaWRfZnJlZV9yZXN1bHR8JyArDQogICAgICAgICdjdWJyaWRfZ2V0fGN1YnJpZF9nZXRfYXV0b2NvbW1pdHxjdWJyaWRfZ2V0X2NoYXJzZXR8Y3VicmlkX2dldF9jbGFzc19uYW1lfGN1YnJpZF9nZXRfY2xpZW50X2luZm98Y3VicmlkX2dldF9kYl9wYXJhbWV0ZXJ8JyArDQogICAgICAgICdjdWJyaWRfZ2V0X3NlcnZlcl9pbmZvfGN1YnJpZF9pbnNlcnRfaWR8Y3VicmlkX2lzX2luc3RhbmNlfGN1YnJpZF9saXN0X2Ric3xjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbG9iX2Nsb3NlfGN1YnJpZF9sb2JfZXhwb3J0fCcgKw0KICAgICAgICAnY3VicmlkX2xvYl9nZXR8Y3VicmlkX2xvYl9zZW5kfGN1YnJpZF9sb2Jfc2l6ZXxjdWJyaWRfbG9ja19yZWFkfGN1YnJpZF9sb2NrX3dyaXRlfGN1YnJpZF9tb3ZlX2N1cnNvcnxjdWJyaWRfbmV3X2dsb3xjdWJyaWRfbmV4dF9yZXN1bHR8JyArDQogICAgICAgICdjdWJyaWRfbnVtX2NvbHN8Y3VicmlkX251bV9maWVsZHN8Y3VicmlkX251bV9yb3dzfGN1YnJpZF9waW5nfGN1YnJpZF9wcmVwYXJlfGN1YnJpZF9wdXR8Y3VicmlkX3F1ZXJ5fGN1YnJpZF9yZWFsX2VzY2FwZV9zdHJpbmd8JyArDQogICAgICAgICdjdWJyaWRfcmVzdWx0fGN1YnJpZF9yb2xsYmFja3xjdWJyaWRfc2F2ZV90b19nbG98Y3VicmlkX3NjaGVtYXxjdWJyaWRfc2VuZF9nbG98Y3VicmlkX3NlcV9kcm9wfGN1YnJpZF9zZXFfaW5zZXJ0fGN1YnJpZF9zZXFfcHV0fCcgKw0KICAgICAgICAnY3VicmlkX3NldF9hZGR8Y3VicmlkX3NldF9hdXRvY29tbWl0fGN1YnJpZF9zZXRfZGJfcGFyYW1ldGVyfGN1YnJpZF9zZXRfZHJvcHxjdWJyaWRfdW5idWZmZXJlZF9xdWVyeXxjdWJyaWRfdmVyc2lvbnxjdXJsX2Nsb3NlfCcgKw0KICAgICAgICAnY3VybF9jb3B5X2hhbmRsZXxjdXJsX2Vycm5vfGN1cmxfZXJyb3J8Y3VybF9leGVjfGN1cmxfZ2V0aW5mb3xjdXJsX2luaXR8Y3VybF9tdWx0aV9hZGRfaGFuZGxlfGN1cmxfbXVsdGlfY2xvc2V8Y3VybF9tdWx0aV9leGVjfCcgKw0KICAgICAgICAnY3VybF9tdWx0aV9nZXRjb250ZW50fGN1cmxfbXVsdGlfaW5mb19yZWFkfGN1cmxfbXVsdGlfaW5pdHxjdXJsX211bHRpX3JlbW92ZV9oYW5kbGV8Y3VybF9tdWx0aV9zZWxlY3R8Y3VybF9zZXRvcHR8Y3VybF9zZXRvcHRfYXJyYXl8JyArDQogICAgICAgICdjdXJsX3ZlcnNpb258Y3VycmVudHxjeXJ1c19hdXRoZW50aWNhdGV8Y3lydXNfYmluZHxjeXJ1c19jbG9zZXxjeXJ1c19jb25uZWN0fGN5cnVzX3F1ZXJ5fGN5cnVzX3VuYmluZHxkYXRlfGRhdGVfYWRkfGRhdGVfY3JlYXRlfCcgKw0KICAgICAgICAnZGF0ZV9jcmVhdGVfZnJvbV9mb3JtYXR8ZGF0ZV9kYXRlX3NldHxkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0fGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXR8ZGF0ZV9kaWZmfGRhdGVfZm9ybWF0fGRhdGVfZ2V0X2xhc3RfZXJyb3JzfCcgKw0KICAgICAgICAnZGF0ZV9pbnRlcnZhbF9jcmVhdGVfZnJvbV9kYXRlX3N0cmluZ3xkYXRlX2ludGVydmFsX2Zvcm1hdHxkYXRlX2lzb2RhdGVfc2V0fGRhdGVfbW9kaWZ5fGRhdGVfb2Zmc2V0X2dldHxkYXRlX3BhcnNlfGRhdGVfcGFyc2VfZnJvbV9mb3JtYXR8JyArDQogICAgICAgICdkYXRlX3N1YnxkYXRlX3N1bl9pbmZvfGRhdGVfc3VucmlzZXxkYXRlX3N1bnNldHxkYXRlX3RpbWVfc2V0fGRhdGVfdGltZXN0YW1wX2dldHxkYXRlX3RpbWVzdGFtcF9zZXR8ZGF0ZV90aW1lem9uZV9nZXR8ZGF0ZV90aW1lem9uZV9zZXR8JyArDQogICAgICAgICdkYXRlaW50ZXJ2YWx8ZGF0ZXBlcmlvZHxkYXRldGltZXxkYXRldGltZXpvbmV8ZGIyX2F1dG9jb21taXR8ZGIyX2JpbmRfcGFyYW18ZGIyX2NsaWVudF9pbmZvfGRiMl9jbG9zZXxkYjJfY29sdW1uX3ByaXZpbGVnZXN8ZGIyX2NvbHVtbnN8JyArDQogICAgICAgICdkYjJfY29tbWl0fGRiMl9jb25uX2Vycm9yfGRiMl9jb25uX2Vycm9ybXNnfGRiMl9jb25uZWN0fGRiMl9jdXJzb3JfdHlwZXxkYjJfZXNjYXBlX3N0cmluZ3xkYjJfZXhlY3xkYjJfZXhlY3V0ZXxkYjJfZmV0Y2hfYXJyYXl8JyArDQogICAgICAgICdkYjJfZmV0Y2hfYXNzb2N8ZGIyX2ZldGNoX2JvdGh8ZGIyX2ZldGNoX29iamVjdHxkYjJfZmV0Y2hfcm93fGRiMl9maWVsZF9kaXNwbGF5X3NpemV8ZGIyX2ZpZWxkX25hbWV8ZGIyX2ZpZWxkX251bXxkYjJfZmllbGRfcHJlY2lzaW9ufCcgKw0KICAgICAgICAnZGIyX2ZpZWxkX3NjYWxlfGRiMl9maWVsZF90eXBlfGRiMl9maWVsZF93aWR0aHxkYjJfZm9yZWlnbl9rZXlzfGRiMl9mcmVlX3Jlc3VsdHxkYjJfZnJlZV9zdG10fGRiMl9nZXRfb3B0aW9ufGRiMl9sYXN0X2luc2VydF9pZHwnICsNCiAgICAgICAgJ2RiMl9sb2JfcmVhZHxkYjJfbmV4dF9yZXN1bHR8ZGIyX251bV9maWVsZHN8ZGIyX251bV9yb3dzfGRiMl9wY2xvc2V8ZGIyX3Bjb25uZWN0fGRiMl9wcmVwYXJlfGRiMl9wcmltYXJ5X2tleXN8ZGIyX3Byb2NlZHVyZV9jb2x1bW5zfCcgKw0KICAgICAgICAnZGIyX3Byb2NlZHVyZXN8ZGIyX3Jlc3VsdHxkYjJfcm9sbGJhY2t8ZGIyX3NlcnZlcl9pbmZvfGRiMl9zZXRfb3B0aW9ufGRiMl9zcGVjaWFsX2NvbHVtbnN8ZGIyX3N0YXRpc3RpY3N8ZGIyX3N0bXRfZXJyb3J8ZGIyX3N0bXRfZXJyb3Jtc2d8JyArDQogICAgICAgICdkYjJfdGFibGVfcHJpdmlsZWdlc3xkYjJfdGFibGVzfGRiYV9jbG9zZXxkYmFfZGVsZXRlfGRiYV9leGlzdHN8ZGJhX2ZldGNofGRiYV9maXJzdGtleXxkYmFfaGFuZGxlcnN8ZGJhX2luc2VydHxkYmFfa2V5X3NwbGl0fGRiYV9saXN0fCcgKw0KICAgICAgICAnZGJhX25leHRrZXl8ZGJhX29wZW58ZGJhX29wdGltaXplfGRiYV9wb3BlbnxkYmFfcmVwbGFjZXxkYmFfc3luY3xkYmFzZV9hZGRfcmVjb3JkfGRiYXNlX2Nsb3NlfGRiYXNlX2NyZWF0ZXxkYmFzZV9kZWxldGVfcmVjb3JkfCcgKw0KICAgICAgICAnZGJhc2VfZ2V0X2hlYWRlcl9pbmZvfGRiYXNlX2dldF9yZWNvcmR8ZGJhc2VfZ2V0X3JlY29yZF93aXRoX25hbWVzfGRiYXNlX251bWZpZWxkc3xkYmFzZV9udW1yZWNvcmRzfGRiYXNlX29wZW58ZGJhc2VfcGFja3wnICsNCiAgICAgICAgJ2RiYXNlX3JlcGxhY2VfcmVjb3JkfGRicGx1c19hZGR8ZGJwbHVzX2FxbHxkYnBsdXNfY2hkaXJ8ZGJwbHVzX2Nsb3NlfGRicGx1c19jdXJyfGRicGx1c19lcnJjb2RlfGRicGx1c19lcnJub3xkYnBsdXNfZmluZHxkYnBsdXNfZmlyc3R8JyArDQogICAgICAgICdkYnBsdXNfZmx1c2h8ZGJwbHVzX2ZyZWVhbGxsb2Nrc3xkYnBsdXNfZnJlZWxvY2t8ZGJwbHVzX2ZyZWVybG9ja3N8ZGJwbHVzX2dldGxvY2t8ZGJwbHVzX2dldHVuaXF1ZXxkYnBsdXNfaW5mb3xkYnBsdXNfbGFzdHxkYnBsdXNfbG9ja3JlbHwnICsNCiAgICAgICAgJ2RicGx1c19uZXh0fGRicGx1c19vcGVufGRicGx1c19wcmV2fGRicGx1c19yY2hwZXJtfGRicGx1c19yY3JlYXRlfGRicGx1c19yY3J0ZXhhY3R8ZGJwbHVzX3JjcnRsaWtlfGRicGx1c19yZXNvbHZlfGRicGx1c19yZXN0b3JlcG9zfCcgKw0KICAgICAgICAnZGJwbHVzX3JrZXlzfGRicGx1c19yb3BlbnxkYnBsdXNfcnF1ZXJ5fGRicGx1c19ycmVuYW1lfGRicGx1c19yc2VjaW5kZXh8ZGJwbHVzX3J1bmxpbmt8ZGJwbHVzX3J6YXB8ZGJwbHVzX3NhdmVwb3N8ZGJwbHVzX3NldGluZGV4fCcgKw0KICAgICAgICAnZGJwbHVzX3NldGluZGV4YnludW1iZXJ8ZGJwbHVzX3NxbHxkYnBsdXNfdGNsfGRicGx1c190cmVtb3ZlfGRicGx1c191bmRvfGRicGx1c191bmRvcHJlcGFyZXxkYnBsdXNfdW5sb2NrcmVsfGRicGx1c191bnNlbGVjdHwnICsNCiAgICAgICAgJ2RicGx1c191cGRhdGV8ZGJwbHVzX3hsb2NrcmVsfGRicGx1c194dW5sb2NrcmVsfGRieF9jbG9zZXxkYnhfY29tcGFyZXxkYnhfY29ubmVjdHxkYnhfZXJyb3J8ZGJ4X2VzY2FwZV9zdHJpbmd8ZGJ4X2ZldGNoX3Jvd3xkYnhfcXVlcnl8JyArDQogICAgICAgICdkYnhfc29ydHxkY2dldHRleHR8ZGNuZ2V0dGV4dHxkZWFnZ3JlZ2F0ZXxkZWJ1Z19iYWNrdHJhY2V8ZGVidWdfcHJpbnRfYmFja3RyYWNlfGRlYnVnX3p2YWxfZHVtcHxkZWNiaW58ZGVjaGV4fGRlY29jdHxkZWZpbmV8JyArDQogICAgICAgICdkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkZWZpbmVkfGRlZzJyYWR8ZGVsZXRlfGRnZXR0ZXh0fGRpZXxkaW9fY2xvc2V8ZGlvX2ZjbnRsfGRpb19vcGVufGRpb19yZWFkfGRpb19zZWVrfGRpb19zdGF0fGRpb190Y3NldGF0dHJ8JyArDQogICAgICAgICdkaW9fdHJ1bmNhdGV8ZGlvX3dyaXRlfGRpcnxkaXJlY3RvcnlpdGVyYXRvcnxkaXJuYW1lfGRpc2tfZnJlZV9zcGFjZXxkaXNrX3RvdGFsX3NwYWNlfGRpc2tmcmVlc3BhY2V8ZGx8ZG5nZXR0ZXh0fGRuc19jaGVja19yZWNvcmR8JyArDQogICAgICAgICdkbnNfZ2V0X214fGRuc19nZXRfcmVjb3JkfGRvbV9pbXBvcnRfc2ltcGxleG1sfGRvbWFpbmV4Y2VwdGlvbnxkb21hdHRyfGRvbWF0dHJpYnV0ZV9uYW1lfGRvbWF0dHJpYnV0ZV9zZXRfdmFsdWV8ZG9tYXR0cmlidXRlX3NwZWNpZmllZHwnICsNCiAgICAgICAgJ2RvbWF0dHJpYnV0ZV92YWx1ZXxkb21jaGFyYWN0ZXJkYXRhfGRvbWNvbW1lbnR8ZG9tZG9jdW1lbnR8ZG9tZG9jdW1lbnRfYWRkX3Jvb3R8ZG9tZG9jdW1lbnRfY3JlYXRlX2F0dHJpYnV0ZXwnICsNCiAgICAgICAgJ2RvbWRvY3VtZW50X2NyZWF0ZV9jZGF0YV9zZWN0aW9ufGRvbWRvY3VtZW50X2NyZWF0ZV9jb21tZW50fGRvbWRvY3VtZW50X2NyZWF0ZV9lbGVtZW50fGRvbWRvY3VtZW50X2NyZWF0ZV9lbGVtZW50X25zfCcgKw0KICAgICAgICAnZG9tZG9jdW1lbnRfY3JlYXRlX2VudGl0eV9yZWZlcmVuY2V8ZG9tZG9jdW1lbnRfY3JlYXRlX3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb258ZG9tZG9jdW1lbnRfY3JlYXRlX3RleHRfbm9kZXxkb21kb2N1bWVudF9kb2N0eXBlfCcgKw0KICAgICAgICAnZG9tZG9jdW1lbnRfZG9jdW1lbnRfZWxlbWVudHxkb21kb2N1bWVudF9kdW1wX2ZpbGV8ZG9tZG9jdW1lbnRfZHVtcF9tZW18ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRfYnlfaWR8ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRzX2J5X3RhZ25hbWV8JyArDQogICAgICAgICdkb21kb2N1bWVudF9odG1sX2R1bXBfbWVtfGRvbWRvY3VtZW50X3hpbmNsdWRlfGRvbWRvY3VtZW50ZnJhZ21lbnR8ZG9tZG9jdW1lbnR0eXBlfGRvbWRvY3VtZW50dHlwZV9lbnRpdGllc3wnICsNCiAgICAgICAgJ2RvbWRvY3VtZW50dHlwZV9pbnRlcm5hbF9zdWJzZXR8ZG9tZG9jdW1lbnR0eXBlX25hbWV8ZG9tZG9jdW1lbnR0eXBlX25vdGF0aW9uc3xkb21kb2N1bWVudHR5cGVfcHVibGljX2lkfGRvbWRvY3VtZW50dHlwZV9zeXN0ZW1faWR8JyArDQogICAgICAgICdkb21lbGVtZW50fGRvbWVsZW1lbnRfZ2V0X2F0dHJpYnV0ZXxkb21lbGVtZW50X2dldF9hdHRyaWJ1dGVfbm9kZXxkb21lbGVtZW50X2dldF9lbGVtZW50c19ieV90YWduYW1lfGRvbWVsZW1lbnRfaGFzX2F0dHJpYnV0ZXwnICsNCiAgICAgICAgJ2RvbWVsZW1lbnRfcmVtb3ZlX2F0dHJpYnV0ZXxkb21lbGVtZW50X3NldF9hdHRyaWJ1dGV8ZG9tZWxlbWVudF9zZXRfYXR0cmlidXRlX25vZGV8ZG9tZWxlbWVudF90YWduYW1lfGRvbWVudGl0eXxkb21lbnRpdHlyZWZlcmVuY2V8JyArDQogICAgICAgICdkb21leGNlcHRpb258ZG9taW1wbGVtZW50YXRpb258ZG9tbmFtZWRub2RlbWFwfGRvbW5vZGV8ZG9tbm9kZV9hZGRfbmFtZXNwYWNlfGRvbW5vZGVfYXBwZW5kX2NoaWxkfGRvbW5vZGVfYXBwZW5kX3NpYmxpbmd8JyArDQogICAgICAgICdkb21ub2RlX2F0dHJpYnV0ZXN8ZG9tbm9kZV9jaGlsZF9ub2Rlc3xkb21ub2RlX2Nsb25lX25vZGV8ZG9tbm9kZV9kdW1wX25vZGV8ZG9tbm9kZV9maXJzdF9jaGlsZHxkb21ub2RlX2dldF9jb250ZW50fCcgKw0KICAgICAgICAnZG9tbm9kZV9oYXNfYXR0cmlidXRlc3xkb21ub2RlX2hhc19jaGlsZF9ub2Rlc3xkb21ub2RlX2luc2VydF9iZWZvcmV8ZG9tbm9kZV9pc19ibGFua19ub2RlfGRvbW5vZGVfbGFzdF9jaGlsZHxkb21ub2RlX25leHRfc2libGluZ3wnICsNCiAgICAgICAgJ2RvbW5vZGVfbm9kZV9uYW1lfGRvbW5vZGVfbm9kZV90eXBlfGRvbW5vZGVfbm9kZV92YWx1ZXxkb21ub2RlX293bmVyX2RvY3VtZW50fGRvbW5vZGVfcGFyZW50X25vZGV8ZG9tbm9kZV9wcmVmaXh8ZG9tbm9kZV9wcmV2aW91c19zaWJsaW5nfCcgKw0KICAgICAgICAnZG9tbm9kZV9yZW1vdmVfY2hpbGR8ZG9tbm9kZV9yZXBsYWNlX2NoaWxkfGRvbW5vZGVfcmVwbGFjZV9ub2RlfGRvbW5vZGVfc2V0X2NvbnRlbnR8ZG9tbm9kZV9zZXRfbmFtZXxkb21ub2RlX3NldF9uYW1lc3BhY2V8JyArDQogICAgICAgICdkb21ub2RlX3VubGlua19ub2RlfGRvbW5vZGVsaXN0fGRvbW5vdGF0aW9ufGRvbXByb2Nlc3NpbmdpbnN0cnVjdGlvbnxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb25fZGF0YXxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb25fdGFyZ2V0fCcgKw0KICAgICAgICAnZG9tdGV4dHxkb214bWxfbmV3X2RvY3xkb214bWxfb3Blbl9maWxlfGRvbXhtbF9vcGVuX21lbXxkb214bWxfdmVyc2lvbnxkb214bWxfeG1sdHJlZXxkb214bWxfeHNsdF9zdHlsZXNoZWV0fGRvbXhtbF94c2x0X3N0eWxlc2hlZXRfZG9jfCcgKw0KICAgICAgICAnZG9teG1sX3hzbHRfc3R5bGVzaGVldF9maWxlfGRvbXhtbF94c2x0X3ZlcnNpb258ZG9teHBhdGh8ZG9teHNsdHN0eWxlc2hlZXRfcHJvY2Vzc3xkb214c2x0c3R5bGVzaGVldF9yZXN1bHRfZHVtcF9maWxlfCcgKw0KICAgICAgICAnZG9teHNsdHN0eWxlc2hlZXRfcmVzdWx0X2R1bXBfbWVtfGRvdG5ldHxkb3RuZXRfbG9hZHxkb3VibGV2YWx8ZWFjaHxlYXN0ZXJfZGF0ZXxlYXN0ZXJfZGF5c3xlY2hvfGVtcHR5fGVtcHR5aXRlcmF0b3J8JyArDQogICAgICAgICdlbmNoYW50X2Jyb2tlcl9kZXNjcmliZXxlbmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0c3xlbmNoYW50X2Jyb2tlcl9mcmVlfGVuY2hhbnRfYnJva2VyX2ZyZWVfZGljdHxlbmNoYW50X2Jyb2tlcl9nZXRfZXJyb3J8JyArDQogICAgICAgICdlbmNoYW50X2Jyb2tlcl9pbml0fGVuY2hhbnRfYnJva2VyX2xpc3RfZGljdHN8ZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0fGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfcHdsX2RpY3R8ZW5jaGFudF9icm9rZXJfc2V0X29yZGVyaW5nfCcgKw0KICAgICAgICAnZW5jaGFudF9kaWN0X2FkZF90b19wZXJzb25hbHxlbmNoYW50X2RpY3RfYWRkX3RvX3Nlc3Npb258ZW5jaGFudF9kaWN0X2NoZWNrfGVuY2hhbnRfZGljdF9kZXNjcmliZXxlbmNoYW50X2RpY3RfZ2V0X2Vycm9yfCcgKw0KICAgICAgICAnZW5jaGFudF9kaWN0X2lzX2luX3Nlc3Npb258ZW5jaGFudF9kaWN0X3F1aWNrX2NoZWNrfGVuY2hhbnRfZGljdF9zdG9yZV9yZXBsYWNlbWVudHxlbmNoYW50X2RpY3Rfc3VnZ2VzdHxlbmR8ZXJlZ3xlcmVnX3JlcGxhY2V8ZXJlZ2l8JyArDQogICAgICAgICdlcmVnaV9yZXBsYWNlfGVycm9yX2dldF9sYXN0fGVycm9yX2xvZ3xlcnJvcl9yZXBvcnRpbmd8ZXJyb3JleGNlcHRpb258ZXNjYXBlc2hlbGxhcmd8ZXNjYXBlc2hlbGxjbWR8ZXZhbHxldmVudF9hZGR8ZXZlbnRfYmFzZV9mcmVlfCcgKw0KICAgICAgICAnZXZlbnRfYmFzZV9sb29wfGV2ZW50X2Jhc2VfbG9vcGJyZWFrfGV2ZW50X2Jhc2VfbG9vcGV4aXR8ZXZlbnRfYmFzZV9uZXd8ZXZlbnRfYmFzZV9wcmlvcml0eV9pbml0fGV2ZW50X2Jhc2Vfc2V0fGV2ZW50X2J1ZmZlcl9iYXNlX3NldHwnICsNCiAgICAgICAgJ2V2ZW50X2J1ZmZlcl9kaXNhYmxlfGV2ZW50X2J1ZmZlcl9lbmFibGV8ZXZlbnRfYnVmZmVyX2ZkX3NldHxldmVudF9idWZmZXJfZnJlZXxldmVudF9idWZmZXJfbmV3fGV2ZW50X2J1ZmZlcl9wcmlvcml0eV9zZXR8JyArDQogICAgICAgICdldmVudF9idWZmZXJfcmVhZHxldmVudF9idWZmZXJfc2V0X2NhbGxiYWNrfGV2ZW50X2J1ZmZlcl90aW1lb3V0X3NldHxldmVudF9idWZmZXJfd2F0ZXJtYXJrX3NldHxldmVudF9idWZmZXJfd3JpdGV8ZXZlbnRfZGVsfGV2ZW50X2ZyZWV8JyArDQogICAgICAgICdldmVudF9uZXd8ZXZlbnRfc2V0fGV4Y2VwdGlvbnxleGVjfGV4aWZfaW1hZ2V0eXBlfGV4aWZfcmVhZF9kYXRhfGV4aWZfdGFnbmFtZXxleGlmX3RodW1ibmFpbHxleGl0fGV4cHxleHBlY3RfZXhwZWN0bHxleHBlY3RfcG9wZW58ZXhwbG9kZXwnICsNCiAgICAgICAgJ2V4cG0xfGV4cG9ydHxleHBvcnR8ZXh0ZW5zaW9uX2xvYWRlZHxleHRyYWN0fGV6bWxtX2hhc2h8ZmFtX2NhbmNlbF9tb25pdG9yfGZhbV9jbG9zZXxmYW1fbW9uaXRvcl9jb2xsZWN0aW9ufGZhbV9tb25pdG9yX2RpcmVjdG9yeXwnICsNCiAgICAgICAgJ2ZhbV9tb25pdG9yX2ZpbGV8ZmFtX25leHRfZXZlbnR8ZmFtX29wZW58ZmFtX3BlbmRpbmd8ZmFtX3Jlc3VtZV9tb25pdG9yfGZhbV9zdXNwZW5kX21vbml0b3J8ZmJzcWxfYWZmZWN0ZWRfcm93c3xmYnNxbF9hdXRvY29tbWl0fCcgKw0KICAgICAgICAnZmJzcWxfYmxvYl9zaXplfGZic3FsX2NoYW5nZV91c2VyfGZic3FsX2Nsb2Jfc2l6ZXxmYnNxbF9jbG9zZXxmYnNxbF9jb21taXR8ZmJzcWxfY29ubmVjdHxmYnNxbF9jcmVhdGVfYmxvYnxmYnNxbF9jcmVhdGVfY2xvYnwnICsNCiAgICAgICAgJ2Zic3FsX2NyZWF0ZV9kYnxmYnNxbF9kYXRhX3NlZWt8ZmJzcWxfZGF0YWJhc2V8ZmJzcWxfZGF0YWJhc2VfcGFzc3dvcmR8ZmJzcWxfZGJfcXVlcnl8ZmJzcWxfZGJfc3RhdHVzfGZic3FsX2Ryb3BfZGJ8ZmJzcWxfZXJybm98JyArDQogICAgICAgICdmYnNxbF9lcnJvcnxmYnNxbF9mZXRjaF9hcnJheXxmYnNxbF9mZXRjaF9hc3NvY3xmYnNxbF9mZXRjaF9maWVsZHxmYnNxbF9mZXRjaF9sZW5ndGhzfGZic3FsX2ZldGNoX29iamVjdHxmYnNxbF9mZXRjaF9yb3d8JyArDQogICAgICAgICdmYnNxbF9maWVsZF9mbGFnc3xmYnNxbF9maWVsZF9sZW58ZmJzcWxfZmllbGRfbmFtZXxmYnNxbF9maWVsZF9zZWVrfGZic3FsX2ZpZWxkX3RhYmxlfGZic3FsX2ZpZWxkX3R5cGV8ZmJzcWxfZnJlZV9yZXN1bHR8JyArDQogICAgICAgICdmYnNxbF9nZXRfYXV0b3N0YXJ0X2luZm98ZmJzcWxfaG9zdG5hbWV8ZmJzcWxfaW5zZXJ0X2lkfGZic3FsX2xpc3RfZGJzfGZic3FsX2xpc3RfZmllbGRzfGZic3FsX2xpc3RfdGFibGVzfGZic3FsX25leHRfcmVzdWx0fCcgKw0KICAgICAgICAnZmJzcWxfbnVtX2ZpZWxkc3xmYnNxbF9udW1fcm93c3xmYnNxbF9wYXNzd29yZHxmYnNxbF9wY29ubmVjdHxmYnNxbF9xdWVyeXxmYnNxbF9yZWFkX2Jsb2J8ZmJzcWxfcmVhZF9jbG9ifGZic3FsX3Jlc3VsdHxmYnNxbF9yb2xsYmFja3wnICsNCiAgICAgICAgJ2Zic3FsX3Jvd3NfZmV0Y2hlZHxmYnNxbF9zZWxlY3RfZGJ8ZmJzcWxfc2V0X2NoYXJhY3RlcnNldHxmYnNxbF9zZXRfbG9iX21vZGV8ZmJzcWxfc2V0X3Bhc3N3b3JkfGZic3FsX3NldF90cmFuc2FjdGlvbnxmYnNxbF9zdGFydF9kYnwnICsNCiAgICAgICAgJ2Zic3FsX3N0b3BfZGJ8ZmJzcWxfdGFibGVfbmFtZXxmYnNxbF90YWJsZW5hbWV8ZmJzcWxfdXNlcm5hbWV8ZmJzcWxfd2FybmluZ3N8ZmNsb3NlfGZkZl9hZGRfZG9jX2phdmFzY3JpcHR8ZmRmX2FkZF90ZW1wbGF0ZXxmZGZfY2xvc2V8JyArDQogICAgICAgICdmZGZfY3JlYXRlfGZkZl9lbnVtX3ZhbHVlc3xmZGZfZXJybm98ZmRmX2Vycm9yfGZkZl9nZXRfYXB8ZmRmX2dldF9hdHRhY2htZW50fGZkZl9nZXRfZW5jb2Rpbmd8ZmRmX2dldF9maWxlfGZkZl9nZXRfZmxhZ3N8ZmRmX2dldF9vcHR8JyArDQogICAgICAgICdmZGZfZ2V0X3N0YXR1c3xmZGZfZ2V0X3ZhbHVlfGZkZl9nZXRfdmVyc2lvbnxmZGZfaGVhZGVyfGZkZl9uZXh0X2ZpZWxkX25hbWV8ZmRmX29wZW58ZmRmX29wZW5fc3RyaW5nfGZkZl9yZW1vdmVfaXRlbXxmZGZfc2F2ZXwnICsNCiAgICAgICAgJ2ZkZl9zYXZlX3N0cmluZ3xmZGZfc2V0X2FwfGZkZl9zZXRfZW5jb2Rpbmd8ZmRmX3NldF9maWxlfGZkZl9zZXRfZmxhZ3N8ZmRmX3NldF9qYXZhc2NyaXB0X2FjdGlvbnxmZGZfc2V0X29uX2ltcG9ydF9qYXZhc2NyaXB0fGZkZl9zZXRfb3B0fCcgKw0KICAgICAgICAnZmRmX3NldF9zdGF0dXN8ZmRmX3NldF9zdWJtaXRfZm9ybV9hY3Rpb258ZmRmX3NldF90YXJnZXRfZnJhbWV8ZmRmX3NldF92YWx1ZXxmZGZfc2V0X3ZlcnNpb258ZmVvZnxmZmx1c2h8ZmdldGN8ZmdldGNzdnxmZ2V0c3xmZ2V0c3N8ZmlsZXwnICsNCiAgICAgICAgJ2ZpbGVfZXhpc3RzfGZpbGVfZ2V0X2NvbnRlbnRzfGZpbGVfcHV0X2NvbnRlbnRzfGZpbGVhdGltZXxmaWxlY3RpbWV8ZmlsZWdyb3VwfGZpbGVpbm9kZXxmaWxlbXRpbWV8ZmlsZW93bmVyfGZpbGVwZXJtc3xmaWxlcHJvfCcgKw0KICAgICAgICAnZmlsZXByb19maWVsZGNvdW50fGZpbGVwcm9fZmllbGRuYW1lfGZpbGVwcm9fZmllbGR0eXBlfGZpbGVwcm9fZmllbGR3aWR0aHxmaWxlcHJvX3JldHJpZXZlfGZpbGVwcm9fcm93Y291bnR8ZmlsZXNpemV8ZmlsZXN5c3RlbWl0ZXJhdG9yfCcgKw0KICAgICAgICAnZmlsZXR5cGV8ZmlsdGVyX2hhc192YXJ8ZmlsdGVyX2lkfGZpbHRlcl9pbnB1dHxmaWx0ZXJfaW5wdXRfYXJyYXl8ZmlsdGVyX2xpc3R8ZmlsdGVyX3ZhcnxmaWx0ZXJfdmFyX2FycmF5fGZpbHRlcml0ZXJhdG9yfGZpbmZvX2J1ZmZlcnwnICsNCiAgICAgICAgJ2ZpbmZvX2Nsb3NlfGZpbmZvX2ZpbGV8ZmluZm9fb3BlbnxmaW5mb19zZXRfZmxhZ3N8ZmxvYXR2YWx8ZmxvY2t8Zmxvb3J8Zmx1c2h8Zm1vZHxmbm1hdGNofGZvcGVufGZvcndhcmRfc3RhdGljX2NhbGx8JyArDQogICAgICAgICdmb3J3YXJkX3N0YXRpY19jYWxsX2FycmF5fGZwYXNzdGhydXxmcHJpbnRmfGZwdXRjc3Z8ZnB1dHN8ZnJlYWR8ZnJlbmNodG9qZHxmcmliaWRpX2xvZzJ2aXN8ZnNjYW5mfGZzZWVrfGZzb2Nrb3Blbnxmc3RhdHxmdGVsbHxmdG9rfCcgKw0KICAgICAgICAnZnRwX2FsbG9jfGZ0cF9jZHVwfGZ0cF9jaGRpcnxmdHBfY2htb2R8ZnRwX2Nsb3NlfGZ0cF9jb25uZWN0fGZ0cF9kZWxldGV8ZnRwX2V4ZWN8ZnRwX2ZnZXR8ZnRwX2ZwdXR8ZnRwX2dldHxmdHBfZ2V0X29wdGlvbnxmdHBfbG9naW58JyArDQogICAgICAgICdmdHBfbWR0bXxmdHBfbWtkaXJ8ZnRwX25iX2NvbnRpbnVlfGZ0cF9uYl9mZ2V0fGZ0cF9uYl9mcHV0fGZ0cF9uYl9nZXR8ZnRwX25iX3B1dHxmdHBfbmxpc3R8ZnRwX3Bhc3Z8ZnRwX3B1dHxmdHBfcHdkfGZ0cF9xdWl0fGZ0cF9yYXd8JyArDQogICAgICAgICdmdHBfcmF3bGlzdHxmdHBfcmVuYW1lfGZ0cF9ybWRpcnxmdHBfc2V0X29wdGlvbnxmdHBfc2l0ZXxmdHBfc2l6ZXxmdHBfc3NsX2Nvbm5lY3R8ZnRwX3N5c3R5cGV8ZnRydW5jYXRlfGZ1bmNfZ2V0X2FyZ3xmdW5jX2dldF9hcmdzfCcgKw0KICAgICAgICAnZnVuY19udW1fYXJnc3xmdW5jdGlvbl9leGlzdHN8ZndyaXRlfGdjX2NvbGxlY3RfY3ljbGVzfGdjX2Rpc2FibGV8Z2NfZW5hYmxlfGdjX2VuYWJsZWR8Z2RfaW5mb3xnZWFybWFuY2xpZW50fGdlYXJtYW5qb2J8Z2Vhcm1hbnRhc2t8JyArDQogICAgICAgICdnZWFybWFud29ya2VyfGdlb2lwX2NvbnRpbmVudF9jb2RlX2J5X25hbWV8Z2VvaXBfY291bnRyeV9jb2RlM19ieV9uYW1lfGdlb2lwX2NvdW50cnlfY29kZV9ieV9uYW1lfGdlb2lwX2NvdW50cnlfbmFtZV9ieV9uYW1lfCcgKw0KICAgICAgICAnZ2VvaXBfZGF0YWJhc2VfaW5mb3xnZW9pcF9kYl9hdmFpbHxnZW9pcF9kYl9maWxlbmFtZXxnZW9pcF9kYl9nZXRfYWxsX2luZm98Z2VvaXBfaWRfYnlfbmFtZXxnZW9pcF9pc3BfYnlfbmFtZXxnZW9pcF9vcmdfYnlfbmFtZXwnICsNCiAgICAgICAgJ2dlb2lwX3JlY29yZF9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9uYW1lX2J5X2NvZGV8Z2VvaXBfdGltZV96b25lX2J5X2NvdW50cnlfYW5kX3JlZ2lvbnxnZXRNZXRhfGdldE5hbWVkfGdldFZhbHVlfCcgKw0KICAgICAgICAnZ2V0X2Jyb3dzZXJ8Z2V0X2NhbGxlZF9jbGFzc3xnZXRfY2ZnX3ZhcnxnZXRfY2xhc3N8Z2V0X2NsYXNzX21ldGhvZHN8Z2V0X2NsYXNzX3ZhcnN8Z2V0X2N1cnJlbnRfdXNlcnxnZXRfZGVjbGFyZWRfY2xhc3Nlc3wnICsNCiAgICAgICAgJ2dldF9kZWNsYXJlZF9pbnRlcmZhY2VzfGdldF9kZWZpbmVkX2NvbnN0YW50c3xnZXRfZGVmaW5lZF9mdW5jdGlvbnN8Z2V0X2RlZmluZWRfdmFyc3xnZXRfZXh0ZW5zaW9uX2Z1bmNzfGdldF9oZWFkZXJzfCcgKw0KICAgICAgICAnZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGV8Z2V0X2luY2x1ZGVfcGF0aHxnZXRfaW5jbHVkZWRfZmlsZXN8Z2V0X2xvYWRlZF9leHRlbnNpb25zfGdldF9tYWdpY19xdW90ZXNfZ3BjfGdldF9tYWdpY19xdW90ZXNfcnVudGltZXwnICsNCiAgICAgICAgJ2dldF9tZXRhX3RhZ3N8Z2V0X29iamVjdF92YXJzfGdldF9wYXJlbnRfY2xhc3N8Z2V0X3JlcXVpcmVkX2ZpbGVzfGdldF9yZXNvdXJjZV90eXBlfGdldGFsbGhlYWRlcnN8Z2V0Y29uc3RhbnR8Z2V0Y29uc3RhbnRzfGdldGNvbnN0cnVjdG9yfCcgKw0KICAgICAgICAnZ2V0Y3dkfGdldGRhdGV8Z2V0ZGVmYXVsdHByb3BlcnRpZXN8Z2V0ZG9jY29tbWVudHxnZXRlbmRsaW5lfGdldGVudnxnZXRleHRlbnNpb258Z2V0ZXh0ZW5zaW9ubmFtZXxnZXRmaWxlbmFtZXxnZXRob3N0YnlhZGRyfGdldGhvc3RieW5hbWV8JyArDQogICAgICAgICdnZXRob3N0YnluYW1lbHxnZXRob3N0bmFtZXxnZXRpbWFnZXNpemV8Z2V0aW50ZXJmYWNlbmFtZXN8Z2V0aW50ZXJmYWNlc3xnZXRsYXN0bW9kfGdldG1ldGhvZHxnZXRtZXRob2RzfGdldG1vZGlmaWVyc3xnZXRteHJyfGdldG15Z2lkfCcgKw0KICAgICAgICAnZ2V0bXlpbm9kZXxnZXRteXBpZHxnZXRteXVpZHxnZXRuYW1lfGdldG5hbWVzcGFjZW5hbWV8Z2V0b3B0fGdldHBhcmVudGNsYXNzfGdldHByb3BlcnRpZXN8Z2V0cHJvcGVydHl8Z2V0cHJvdG9ieW5hbWV8Z2V0cHJvdG9ieW51bWJlcnwnICsNCiAgICAgICAgJ2dldHJhbmRtYXh8Z2V0cnVzYWdlfGdldHNlcnZieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRzaG9ydG5hbWV8Z2V0c3RhcnRsaW5lfGdldHN0YXRpY3Byb3BlcnRpZXN8Z2V0c3RhdGljcHJvcGVydHl2YWx1ZXxnZXR0ZXh0fCcgKw0KICAgICAgICAnZ2V0dGltZW9mZGF5fGdldHR5cGV8Z2xvYnxnbG9iaXRlcmF0b3J8Z21hZ2lja3xnbWFnaWNrZHJhd3xnbWFnaWNrcGl4ZWx8Z21kYXRlfGdtbWt0aW1lfGdtcF9hYnN8Z21wX2FkZHxnbXBfYW5kfGdtcF9jbHJiaXR8Z21wX2NtcHwnICsNCiAgICAgICAgJ2dtcF9jb218Z21wX2RpdnxnbXBfZGl2X3F8Z21wX2Rpdl9xcnxnbXBfZGl2X3J8Z21wX2RpdmV4YWN0fGdtcF9mYWN0fGdtcF9nY2R8Z21wX2djZGV4dHxnbXBfaGFtZGlzdHxnbXBfaW5pdHxnbXBfaW50dmFsfGdtcF9pbnZlcnR8JyArDQogICAgICAgICdnbXBfamFjb2JpfGdtcF9sZWdlbmRyZXxnbXBfbW9kfGdtcF9tdWx8Z21wX25lZ3xnbXBfbmV4dHByaW1lfGdtcF9vcnxnbXBfcGVyZmVjdF9zcXVhcmV8Z21wX3BvcGNvdW50fGdtcF9wb3d8Z21wX3Bvd218Z21wX3Byb2JfcHJpbWV8JyArDQogICAgICAgICdnbXBfcmFuZG9tfGdtcF9zY2FuMHxnbXBfc2NhbjF8Z21wX3NldGJpdHxnbXBfc2lnbnxnbXBfc3FydHxnbXBfc3FydHJlbXxnbXBfc3RydmFsfGdtcF9zdWJ8Z21wX3Rlc3RiaXR8Z21wX3hvcnxnbXN0cmZ0aW1lfCcgKw0KICAgICAgICAnZ251cGdfYWRkZGVjcnlwdGtleXxnbnVwZ19hZGRlbmNyeXB0a2V5fGdudXBnX2FkZHNpZ25rZXl8Z251cGdfY2xlYXJkZWNyeXB0a2V5c3xnbnVwZ19jbGVhcmVuY3J5cHRrZXlzfGdudXBnX2NsZWFyc2lnbmtleXN8Z251cGdfZGVjcnlwdHwnICsNCiAgICAgICAgJ2dudXBnX2RlY3J5cHR2ZXJpZnl8Z251cGdfZW5jcnlwdHxnbnVwZ19lbmNyeXB0c2lnbnxnbnVwZ19leHBvcnR8Z251cGdfZ2V0ZXJyb3J8Z251cGdfZ2V0cHJvdG9jb2x8Z251cGdfaW1wb3J0fGdudXBnX2luaXR8Z251cGdfa2V5aW5mb3wnICsNCiAgICAgICAgJ2dudXBnX3NldGFybW9yfGdudXBnX3NldGVycm9ybW9kZXxnbnVwZ19zZXRzaWdubW9kZXxnbnVwZ19zaWdufGdudXBnX3ZlcmlmeXxnb3BoZXJfcGFyc2VkaXJ8Z3JhcGhlbWVfZXh0cmFjdHxncmFwaGVtZV9zdHJpcG9zfCcgKw0KICAgICAgICAnZ3JhcGhlbWVfc3RyaXN0cnxncmFwaGVtZV9zdHJsZW58Z3JhcGhlbWVfc3RycG9zfGdyYXBoZW1lX3N0cnJpcG9zfGdyYXBoZW1lX3N0cnJwb3N8Z3JhcGhlbWVfc3Ryc3RyfGdyYXBoZW1lX3N1YnN0cnxncmVnb3JpYW50b2pkfCcgKw0KICAgICAgICAnZ3VwbnBfY29udGV4dF9nZXRfaG9zdF9pcHxndXBucF9jb250ZXh0X2dldF9wb3J0fGd1cG5wX2NvbnRleHRfZ2V0X3N1YnNjcmlwdGlvbl90aW1lb3V0fGd1cG5wX2NvbnRleHRfaG9zdF9wYXRofGd1cG5wX2NvbnRleHRfbmV3fCcgKw0KICAgICAgICAnZ3VwbnBfY29udGV4dF9zZXRfc3Vic2NyaXB0aW9uX3RpbWVvdXR8Z3VwbnBfY29udGV4dF90aW1lb3V0X2FkZHxndXBucF9jb250ZXh0X3VuaG9zdF9wYXRofGd1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0YXJ0fCcgKw0KICAgICAgICAnZ3VwbnBfY29udHJvbF9wb2ludF9icm93c2Vfc3RvcHxndXBucF9jb250cm9sX3BvaW50X2NhbGxiYWNrX3NldHxndXBucF9jb250cm9sX3BvaW50X25ld3xndXBucF9kZXZpY2VfYWN0aW9uX2NhbGxiYWNrX3NldHwnICsNCiAgICAgICAgJ2d1cG5wX2RldmljZV9pbmZvX2dldHxndXBucF9kZXZpY2VfaW5mb19nZXRfc2VydmljZXxndXBucF9yb290X2RldmljZV9nZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX2dldF9yZWxhdGl2ZV9sb2NhdGlvbnwnICsNCiAgICAgICAgJ2d1cG5wX3Jvb3RfZGV2aWNlX25ld3xndXBucF9yb290X2RldmljZV9zZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX3N0YXJ0fGd1cG5wX3Jvb3RfZGV2aWNlX3N0b3B8Z3VwbnBfc2VydmljZV9hY3Rpb25fZ2V0fCcgKw0KICAgICAgICAnZ3VwbnBfc2VydmljZV9hY3Rpb25fcmV0dXJufGd1cG5wX3NlcnZpY2VfYWN0aW9uX3JldHVybl9lcnJvcnxndXBucF9zZXJ2aWNlX2FjdGlvbl9zZXR8Z3VwbnBfc2VydmljZV9mcmVlemVfbm90aWZ5fGd1cG5wX3NlcnZpY2VfaW5mb19nZXR8JyArDQogICAgICAgICdndXBucF9zZXJ2aWNlX2luZm9fZ2V0X2ludHJvc3BlY3Rpb258Z3VwbnBfc2VydmljZV9pbnRyb3NwZWN0aW9uX2dldF9zdGF0ZV92YXJpYWJsZXxndXBucF9zZXJ2aWNlX25vdGlmeXxndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9nZXR8JyArDQogICAgICAgICdndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9zZXR8Z3VwbnBfc2VydmljZV9wcm94eV9hZGRfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfY2FsbGJhY2tfc2V0fGd1cG5wX3NlcnZpY2VfcHJveHlfZ2V0X3N1YnNjcmliZWR8JyArDQogICAgICAgICdndXBucF9zZXJ2aWNlX3Byb3h5X3JlbW92ZV9ub3RpZnl8Z3VwbnBfc2VydmljZV9wcm94eV9zZXRfc3Vic2NyaWJlZHxndXBucF9zZXJ2aWNlX3RoYXdfbm90aWZ5fGd6Y2xvc2V8Z3pjb21wcmVzc3xnemRlY29kZXxnemRlZmxhdGV8JyArDQogICAgICAgICdnemVuY29kZXxnemVvZnxnemZpbGV8Z3pnZXRjfGd6Z2V0c3xnemdldHNzfGd6aW5mbGF0ZXxnem9wZW58Z3pwYXNzdGhydXxnenB1dHN8Z3pyZWFkfGd6cmV3aW5kfGd6c2Vla3xnenRlbGx8Z3p1bmNvbXByZXNzfGd6d3JpdGV8JyArDQogICAgICAgICdoYWx0X2NvbXBpbGVyfGhhcnVhbm5vdGF0aW9ufGhhcnVhbm5vdGF0aW9uX3NldGJvcmRlcnN0eWxlfGhhcnVhbm5vdGF0aW9uX3NldGhpZ2hsaWdodG1vZGV8aGFydWFubm90YXRpb25fc2V0aWNvbnwnICsNCiAgICAgICAgJ2hhcnVhbm5vdGF0aW9uX3NldG9wZW5lZHxoYXJ1ZGVzdGluYXRpb258aGFydWRlc3RpbmF0aW9uX3NldGZpdHxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0YnxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0Ymh8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJ2fCcgKw0KICAgICAgICAnaGFydWRlc3RpbmF0aW9uX3NldGZpdGh8aGFydWRlc3RpbmF0aW9uX3NldGZpdHJ8aGFydWRlc3RpbmF0aW9uX3NldGZpdHZ8aGFydWRlc3RpbmF0aW9uX3NldHh5enxoYXJ1ZG9jfGhhcnVkb2NfYWRkcGFnZXwnICsNCiAgICAgICAgJ2hhcnVkb2NfYWRkcGFnZWxhYmVsfGhhcnVkb2NfY29uc3RydWN0fGhhcnVkb2NfY3JlYXRlb3V0bGluZXxoYXJ1ZG9jX2dldGN1cnJlbnRlbmNvZGVyfGhhcnVkb2NfZ2V0Y3VycmVudHBhZ2V8aGFydWRvY19nZXRlbmNvZGVyfCcgKw0KICAgICAgICAnaGFydWRvY19nZXRmb250fGhhcnVkb2NfZ2V0aW5mb2F0dHJ8aGFydWRvY19nZXRwYWdlbGF5b3V0fGhhcnVkb2NfZ2V0cGFnZW1vZGV8aGFydWRvY19nZXRzdHJlYW1zaXplfGhhcnVkb2NfaW5zZXJ0cGFnZXxoYXJ1ZG9jX2xvYWRqcGVnfCcgKw0KICAgICAgICAnaGFydWRvY19sb2FkcG5nfGhhcnVkb2NfbG9hZHJhd3xoYXJ1ZG9jX2xvYWR0dGN8aGFydWRvY19sb2FkdHRmfGhhcnVkb2NfbG9hZHR5cGUxfGhhcnVkb2Nfb3V0cHV0fGhhcnVkb2NfcmVhZGZyb21zdHJlYW18JyArDQogICAgICAgICdoYXJ1ZG9jX3Jlc2V0ZXJyb3J8aGFydWRvY19yZXNldHN0cmVhbXxoYXJ1ZG9jX3NhdmV8aGFydWRvY19zYXZldG9zdHJlYW18aGFydWRvY19zZXRjb21wcmVzc2lvbm1vZGV8aGFydWRvY19zZXRjdXJyZW50ZW5jb2RlcnwnICsNCiAgICAgICAgJ2hhcnVkb2Nfc2V0ZW5jcnlwdGlvbm1vZGV8aGFydWRvY19zZXRpbmZvYXR0cnxoYXJ1ZG9jX3NldGluZm9kYXRlYXR0cnxoYXJ1ZG9jX3NldG9wZW5hY3Rpb258aGFydWRvY19zZXRwYWdlbGF5b3V0fGhhcnVkb2Nfc2V0cGFnZW1vZGV8JyArDQogICAgICAgICdoYXJ1ZG9jX3NldHBhZ2VzY29uZmlndXJhdGlvbnxoYXJ1ZG9jX3NldHBhc3N3b3JkfGhhcnVkb2Nfc2V0cGVybWlzc2lvbnxoYXJ1ZG9jX3VzZWNuc2VuY29kaW5nc3xoYXJ1ZG9jX3VzZWNuc2ZvbnRzfCcgKw0KICAgICAgICAnaGFydWRvY191c2VjbnRlbmNvZGluZ3N8aGFydWRvY191c2VjbnRmb250c3xoYXJ1ZG9jX3VzZWpwZW5jb2RpbmdzfGhhcnVkb2NfdXNlanBmb250c3xoYXJ1ZG9jX3VzZWtyZW5jb2RpbmdzfGhhcnVkb2NfdXNla3Jmb250c3wnICsNCiAgICAgICAgJ2hhcnVlbmNvZGVyfGhhcnVlbmNvZGVyX2dldGJ5dGV0eXBlfGhhcnVlbmNvZGVyX2dldHR5cGV8aGFydWVuY29kZXJfZ2V0dW5pY29kZXxoYXJ1ZW5jb2Rlcl9nZXR3cml0aW5nbW9kZXxoYXJ1ZXhjZXB0aW9ufGhhcnVmb250fCcgKw0KICAgICAgICAnaGFydWZvbnRfZ2V0YXNjZW50fGhhcnVmb250X2dldGNhcGhlaWdodHxoYXJ1Zm9udF9nZXRkZXNjZW50fGhhcnVmb250X2dldGVuY29kaW5nbmFtZXxoYXJ1Zm9udF9nZXRmb250bmFtZXxoYXJ1Zm9udF9nZXR0ZXh0d2lkdGh8JyArDQogICAgICAgICdoYXJ1Zm9udF9nZXR1bmljb2Rld2lkdGh8aGFydWZvbnRfZ2V0eGhlaWdodHxoYXJ1Zm9udF9tZWFzdXJldGV4dHxoYXJ1aW1hZ2V8aGFydWltYWdlX2dldGJpdHNwZXJjb21wb25lbnR8aGFydWltYWdlX2dldGNvbG9yc3BhY2V8JyArDQogICAgICAgICdoYXJ1aW1hZ2VfZ2V0aGVpZ2h0fGhhcnVpbWFnZV9nZXRzaXplfGhhcnVpbWFnZV9nZXR3aWR0aHxoYXJ1aW1hZ2Vfc2V0Y29sb3JtYXNrfGhhcnVpbWFnZV9zZXRtYXNraW1hZ2V8aGFydW91dGxpbmV8JyArDQogICAgICAgICdoYXJ1b3V0bGluZV9zZXRkZXN0aW5hdGlvbnxoYXJ1b3V0bGluZV9zZXRvcGVuZWR8aGFydXBhZ2V8aGFydXBhZ2VfYXJjfGhhcnVwYWdlX2JlZ2ludGV4dHxoYXJ1cGFnZV9jaXJjbGV8aGFydXBhZ2VfY2xvc2VwYXRofCcgKw0KICAgICAgICAnaGFydXBhZ2VfY29uY2F0fGhhcnVwYWdlX2NyZWF0ZWRlc3RpbmF0aW9ufGhhcnVwYWdlX2NyZWF0ZWxpbmthbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXRleHRhbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXVybGFubm90YXRpb258JyArDQogICAgICAgICdoYXJ1cGFnZV9jdXJ2ZXRvfGhhcnVwYWdlX2N1cnZldG8yfGhhcnVwYWdlX2N1cnZldG8zfGhhcnVwYWdlX2RyYXdpbWFnZXxoYXJ1cGFnZV9lbGxpcHNlfGhhcnVwYWdlX2VuZHBhdGh8aGFydXBhZ2VfZW5kdGV4dHwnICsNCiAgICAgICAgJ2hhcnVwYWdlX2VvZmlsbHxoYXJ1cGFnZV9lb2ZpbGxzdHJva2V8aGFydXBhZ2VfZmlsbHxoYXJ1cGFnZV9maWxsc3Ryb2tlfGhhcnVwYWdlX2dldGNoYXJzcGFjZXxoYXJ1cGFnZV9nZXRjbXlrZmlsbHxoYXJ1cGFnZV9nZXRjbXlrc3Ryb2tlfCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0Y3VycmVudGZvbnR8aGFydXBhZ2VfZ2V0Y3VycmVudGZvbnRzaXplfGhhcnVwYWdlX2dldGN1cnJlbnRwb3N8aGFydXBhZ2VfZ2V0Y3VycmVudHRleHRwb3N8aGFydXBhZ2VfZ2V0ZGFzaHwnICsNCiAgICAgICAgJ2hhcnVwYWdlX2dldGZpbGxpbmdjb2xvcnNwYWNlfGhhcnVwYWdlX2dldGZsYXRuZXNzfGhhcnVwYWdlX2dldGdtb2RlfGhhcnVwYWdlX2dldGdyYXlmaWxsfGhhcnVwYWdlX2dldGdyYXlzdHJva2V8aGFydXBhZ2VfZ2V0aGVpZ2h0fCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0aG9yaXpvbnRhbHNjYWxpbmd8aGFydXBhZ2VfZ2V0bGluZWNhcHxoYXJ1cGFnZV9nZXRsaW5lam9pbnxoYXJ1cGFnZV9nZXRsaW5ld2lkdGh8aGFydXBhZ2VfZ2V0bWl0ZXJsaW1pdHxoYXJ1cGFnZV9nZXRyZ2JmaWxsfCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0cmdic3Ryb2tlfGhhcnVwYWdlX2dldHN0cm9raW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9nZXR0ZXh0bWF0cml4fGhhcnVwYWdlX2dldHRleHRyZW5kZXJpbmdtb2RlfCcgKw0KICAgICAgICAnaGFydXBhZ2VfZ2V0dGV4dHJpc2V8aGFydXBhZ2VfZ2V0dGV4dHdpZHRofGhhcnVwYWdlX2dldHRyYW5zbWF0cml4fGhhcnVwYWdlX2dldHdpZHRofGhhcnVwYWdlX2dldHdvcmRzcGFjZXxoYXJ1cGFnZV9saW5ldG98JyArDQogICAgICAgICdoYXJ1cGFnZV9tZWFzdXJldGV4dHxoYXJ1cGFnZV9tb3ZldGV4dHBvc3xoYXJ1cGFnZV9tb3ZldG98aGFydXBhZ2VfbW92ZXRvbmV4dGxpbmV8aGFydXBhZ2VfcmVjdGFuZ2xlfGhhcnVwYWdlX3NldGNoYXJzcGFjZXwnICsNCiAgICAgICAgJ2hhcnVwYWdlX3NldGNteWtmaWxsfGhhcnVwYWdlX3NldGNteWtzdHJva2V8aGFydXBhZ2Vfc2V0ZGFzaHxoYXJ1cGFnZV9zZXRmbGF0bmVzc3xoYXJ1cGFnZV9zZXRmb250YW5kc2l6ZXxoYXJ1cGFnZV9zZXRncmF5ZmlsbHwnICsNCiAgICAgICAgJ2hhcnVwYWdlX3NldGdyYXlzdHJva2V8aGFydXBhZ2Vfc2V0aGVpZ2h0fGhhcnVwYWdlX3NldGhvcml6b250YWxzY2FsaW5nfGhhcnVwYWdlX3NldGxpbmVjYXB8aGFydXBhZ2Vfc2V0bGluZWpvaW58aGFydXBhZ2Vfc2V0bGluZXdpZHRofCcgKw0KICAgICAgICAnaGFydXBhZ2Vfc2V0bWl0ZXJsaW1pdHxoYXJ1cGFnZV9zZXRyZ2JmaWxsfGhhcnVwYWdlX3NldHJnYnN0cm9rZXxoYXJ1cGFnZV9zZXRyb3RhdGV8aGFydXBhZ2Vfc2V0c2l6ZXxoYXJ1cGFnZV9zZXRzbGlkZXNob3d8JyArDQogICAgICAgICdoYXJ1cGFnZV9zZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9zZXR0ZXh0bWF0cml4fGhhcnVwYWdlX3NldHRleHRyZW5kZXJpbmdtb2RlfGhhcnVwYWdlX3NldHRleHRyaXNlfGhhcnVwYWdlX3NldHdpZHRofGhhcnVwYWdlX3NldHdvcmRzcGFjZXwnICsNCiAgICAgICAgJ2hhcnVwYWdlX3Nob3d0ZXh0fGhhcnVwYWdlX3Nob3d0ZXh0bmV4dGxpbmV8aGFydXBhZ2Vfc3Ryb2tlfGhhcnVwYWdlX3RleHRvdXR8aGFydXBhZ2VfdGV4dHJlY3R8aGFzY29uc3RhbnR8aGFzaHxoYXNoX2FsZ29zfGhhc2hfY29weXwnICsNCiAgICAgICAgJ2hhc2hfZmlsZXxoYXNoX2ZpbmFsfGhhc2hfaG1hY3xoYXNoX2htYWNfZmlsZXxoYXNoX2luaXR8aGFzaF91cGRhdGV8aGFzaF91cGRhdGVfZmlsZXxoYXNoX3VwZGF0ZV9zdHJlYW18aGFzbWV0aG9kfGhhc3Byb3BlcnR5fGhlYWRlcnwnICsNCiAgICAgICAgJ2hlYWRlcl9yZWdpc3Rlcl9jYWxsYmFja3xoZWFkZXJfcmVtb3ZlfGhlYWRlcnNfbGlzdHxoZWFkZXJzX3NlbnR8aGVicmV2fGhlYnJldmN8aGV4MmJpbnxoZXhkZWN8aGlnaGxpZ2h0X2ZpbGV8aGlnaGxpZ2h0X3N0cmluZ3wnICsNCiAgICAgICAgJ2h0bWxfZW50aXR5X2RlY29kZXxodG1sZW50aXRpZXN8aHRtbHNwZWNpYWxjaGFyc3xodG1sc3BlY2lhbGNoYXJzX2RlY29kZXxodHRwX2J1aWxkX2Nvb2tpZXxodHRwX2J1aWxkX3F1ZXJ5fGh0dHBfYnVpbGRfc3RyfGh0dHBfYnVpbGRfdXJsfCcgKw0KICAgICAgICAnaHR0cF9jYWNoZV9ldGFnfGh0dHBfY2FjaGVfbGFzdF9tb2RpZmllZHxodHRwX2NodW5rZWRfZGVjb2RlfGh0dHBfZGF0ZXxodHRwX2RlZmxhdGV8aHR0cF9nZXR8aHR0cF9nZXRfcmVxdWVzdF9ib2R5fCcgKw0KICAgICAgICAnaHR0cF9nZXRfcmVxdWVzdF9ib2R5X3N0cmVhbXxodHRwX2dldF9yZXF1ZXN0X2hlYWRlcnN8aHR0cF9oZWFkfGh0dHBfaW5mbGF0ZXxodHRwX21hdGNoX2V0YWd8aHR0cF9tYXRjaF9tb2RpZmllZHwnICsNCiAgICAgICAgJ2h0dHBfbWF0Y2hfcmVxdWVzdF9oZWFkZXJ8aHR0cF9uZWdvdGlhdGVfY2hhcnNldHxodHRwX25lZ290aWF0ZV9jb250ZW50X3R5cGV8aHR0cF9uZWdvdGlhdGVfbGFuZ3VhZ2V8aHR0cF9wYXJzZV9jb29raWV8aHR0cF9wYXJzZV9oZWFkZXJzfCcgKw0KICAgICAgICAnaHR0cF9wYXJzZV9tZXNzYWdlfGh0dHBfcGFyc2VfcGFyYW1zfGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NsZWFufGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NvdW50fGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2lkZW50fCcgKw0KICAgICAgICAnaHR0cF9wb3N0X2RhdGF8aHR0cF9wb3N0X2ZpZWxkc3xodHRwX3B1dF9kYXRhfGh0dHBfcHV0X2ZpbGV8aHR0cF9wdXRfc3RyZWFtfGh0dHBfcmVkaXJlY3R8aHR0cF9yZXF1ZXN0fGh0dHBfcmVxdWVzdF9ib2R5X2VuY29kZXwnICsNCiAgICAgICAgJ2h0dHBfcmVxdWVzdF9tZXRob2RfZXhpc3RzfGh0dHBfcmVxdWVzdF9tZXRob2RfbmFtZXxodHRwX3JlcXVlc3RfbWV0aG9kX3JlZ2lzdGVyfGh0dHBfcmVxdWVzdF9tZXRob2RfdW5yZWdpc3RlcnxodHRwX3Jlc3BvbnNlX2NvZGV8JyArDQogICAgICAgICdodHRwX3NlbmRfY29udGVudF9kaXNwb3NpdGlvbnxodHRwX3NlbmRfY29udGVudF90eXBlfGh0dHBfc2VuZF9kYXRhfGh0dHBfc2VuZF9maWxlfGh0dHBfc2VuZF9sYXN0X21vZGlmaWVkfGh0dHBfc2VuZF9zdGF0dXN8JyArDQogICAgICAgICdodHRwX3NlbmRfc3RyZWFtfGh0dHBfc3VwcG9ydHxodHRwX3Rocm90dGxlfGh0dHBkZWZsYXRlc3RyZWFtfGh0dHBkZWZsYXRlc3RyZWFtX2NvbnN0cnVjdHxodHRwZGVmbGF0ZXN0cmVhbV9mYWN0b3J5fCcgKw0KICAgICAgICAnaHR0cGRlZmxhdGVzdHJlYW1fZmluaXNofGh0dHBkZWZsYXRlc3RyZWFtX2ZsdXNofGh0dHBkZWZsYXRlc3RyZWFtX3VwZGF0ZXxodHRwaW5mbGF0ZXN0cmVhbXxodHRwaW5mbGF0ZXN0cmVhbV9jb25zdHJ1Y3R8JyArDQogICAgICAgICdodHRwaW5mbGF0ZXN0cmVhbV9mYWN0b3J5fGh0dHBpbmZsYXRlc3RyZWFtX2ZpbmlzaHxodHRwaW5mbGF0ZXN0cmVhbV9mbHVzaHxodHRwaW5mbGF0ZXN0cmVhbV91cGRhdGV8aHR0cG1lc3NhZ2V8aHR0cG1lc3NhZ2VfYWRkaGVhZGVyc3wnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX2NvbnN0cnVjdHxodHRwbWVzc2FnZV9kZXRhY2h8aHR0cG1lc3NhZ2VfZmFjdG9yeXxodHRwbWVzc2FnZV9mcm9tZW52fGh0dHBtZXNzYWdlX2Zyb21zdHJpbmd8aHR0cG1lc3NhZ2VfZ2V0Ym9keXwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX2dldGhlYWRlcnxodHRwbWVzc2FnZV9nZXRoZWFkZXJzfGh0dHBtZXNzYWdlX2dldGh0dHB2ZXJzaW9ufGh0dHBtZXNzYWdlX2dldHBhcmVudG1lc3NhZ2V8aHR0cG1lc3NhZ2VfZ2V0cmVxdWVzdG1ldGhvZHwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX2dldHJlcXVlc3R1cmx8aHR0cG1lc3NhZ2VfZ2V0cmVzcG9uc2Vjb2RlfGh0dHBtZXNzYWdlX2dldHJlc3BvbnNlc3RhdHVzfGh0dHBtZXNzYWdlX2dldHR5cGV8aHR0cG1lc3NhZ2VfZ3Vlc3Njb250ZW50dHlwZXwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX3ByZXBlbmR8aHR0cG1lc3NhZ2VfcmV2ZXJzZXxodHRwbWVzc2FnZV9zZW5kfGh0dHBtZXNzYWdlX3NldGJvZHl8aHR0cG1lc3NhZ2Vfc2V0aGVhZGVyc3xodHRwbWVzc2FnZV9zZXRodHRwdmVyc2lvbnwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX3NldHJlcXVlc3RtZXRob2R8aHR0cG1lc3NhZ2Vfc2V0cmVxdWVzdHVybHxodHRwbWVzc2FnZV9zZXRyZXNwb25zZWNvZGV8aHR0cG1lc3NhZ2Vfc2V0cmVzcG9uc2VzdGF0dXN8aHR0cG1lc3NhZ2Vfc2V0dHlwZXwnICsNCiAgICAgICAgJ2h0dHBtZXNzYWdlX3RvbWVzc2FnZXR5cGVvYmplY3R8aHR0cG1lc3NhZ2VfdG9zdHJpbmd8aHR0cHF1ZXJ5c3RyaW5nfGh0dHBxdWVyeXN0cmluZ19jb25zdHJ1Y3R8aHR0cHF1ZXJ5c3RyaW5nX2dldHxodHRwcXVlcnlzdHJpbmdfbW9kfCcgKw0KICAgICAgICAnaHR0cHF1ZXJ5c3RyaW5nX3NldHxodHRwcXVlcnlzdHJpbmdfc2luZ2xldG9ufGh0dHBxdWVyeXN0cmluZ190b2FycmF5fGh0dHBxdWVyeXN0cmluZ190b3N0cmluZ3xodHRwcXVlcnlzdHJpbmdfeGxhdGV8aHR0cHJlcXVlc3R8JyArDQogICAgICAgICdodHRwcmVxdWVzdF9hZGRjb29raWVzfGh0dHByZXF1ZXN0X2FkZGhlYWRlcnN8aHR0cHJlcXVlc3RfYWRkcG9zdGZpZWxkc3xodHRwcmVxdWVzdF9hZGRwb3N0ZmlsZXxodHRwcmVxdWVzdF9hZGRwdXRkYXRhfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3RfYWRkcXVlcnlkYXRhfGh0dHByZXF1ZXN0X2FkZHJhd3Bvc3RkYXRhfGh0dHByZXF1ZXN0X2FkZHNzbG9wdGlvbnN8aHR0cHJlcXVlc3RfY2xlYXJoaXN0b3J5fGh0dHByZXF1ZXN0X2NvbnN0cnVjdHwnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X2VuYWJsZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3RfZ2V0Y29va2llc3xodHRwcmVxdWVzdF9nZXRoZWFkZXJzfGh0dHByZXF1ZXN0X2dldGhpc3Rvcnl8JyArDQogICAgICAgICdodHRwcmVxdWVzdF9nZXRtZXRob2R8aHR0cHJlcXVlc3RfZ2V0b3B0aW9uc3xodHRwcmVxdWVzdF9nZXRwb3N0ZmllbGRzfGh0dHByZXF1ZXN0X2dldHBvc3RmaWxlc3xodHRwcmVxdWVzdF9nZXRwdXRkYXRhfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0cHV0ZmlsZXxodHRwcmVxdWVzdF9nZXRxdWVyeWRhdGF8aHR0cHJlcXVlc3RfZ2V0cmF3cG9zdGRhdGF8aHR0cHJlcXVlc3RfZ2V0cmF3cmVxdWVzdG1lc3NhZ2V8JyArDQogICAgICAgICdodHRwcmVxdWVzdF9nZXRyYXdyZXNwb25zZW1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVxdWVzdG1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2Vib2R5fGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlY29kZXwnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X2dldHJlc3BvbnNlY29va2llc3xodHRwcmVxdWVzdF9nZXRyZXNwb25zZWRhdGF8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VoZWFkZXJ8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VpbmZvfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VtZXNzYWdlfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlc3RhdHVzfGh0dHByZXF1ZXN0X2dldHNzbG9wdGlvbnN8aHR0cHJlcXVlc3RfZ2V0dXJsfGh0dHByZXF1ZXN0X3Jlc2V0Y29va2llc3wnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X3NlbmR8aHR0cHJlcXVlc3Rfc2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3Rfc2V0Y29va2llc3xodHRwcmVxdWVzdF9zZXRoZWFkZXJzfGh0dHByZXF1ZXN0X3NldG1ldGhvZHxodHRwcmVxdWVzdF9zZXRvcHRpb25zfCcgKw0KICAgICAgICAnaHR0cHJlcXVlc3Rfc2V0cG9zdGZpZWxkc3xodHRwcmVxdWVzdF9zZXRwb3N0ZmlsZXN8aHR0cHJlcXVlc3Rfc2V0cHV0ZGF0YXxodHRwcmVxdWVzdF9zZXRwdXRmaWxlfGh0dHByZXF1ZXN0X3NldHF1ZXJ5ZGF0YXwnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0X3NldHJhd3Bvc3RkYXRhfGh0dHByZXF1ZXN0X3NldHNzbG9wdGlvbnN8aHR0cHJlcXVlc3Rfc2V0dXJsfGh0dHByZXF1ZXN0cG9vbHxodHRwcmVxdWVzdHBvb2xfYXR0YWNofGh0dHByZXF1ZXN0cG9vbF9jb25zdHJ1Y3R8JyArDQogICAgICAgICdodHRwcmVxdWVzdHBvb2xfZGVzdHJ1Y3R8aHR0cHJlcXVlc3Rwb29sX2RldGFjaHxodHRwcmVxdWVzdHBvb2xfZ2V0YXR0YWNoZWRyZXF1ZXN0c3xodHRwcmVxdWVzdHBvb2xfZ2V0ZmluaXNoZWRyZXF1ZXN0c3wnICsNCiAgICAgICAgJ2h0dHByZXF1ZXN0cG9vbF9yZXNldHxodHRwcmVxdWVzdHBvb2xfc2VuZHxodHRwcmVxdWVzdHBvb2xfc29ja2V0cGVyZm9ybXxodHRwcmVxdWVzdHBvb2xfc29ja2V0c2VsZWN0fGh0dHByZXNwb25zZXxodHRwcmVzcG9uc2VfY2FwdHVyZXwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9nZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9nZXRjYWNoZXxodHRwcmVzcG9uc2VfZ2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9nZXRjb250ZW50ZGlzcG9zaXRpb258JyArDQogICAgICAgICdodHRwcmVzcG9uc2VfZ2V0Y29udGVudHR5cGV8aHR0cHJlc3BvbnNlX2dldGRhdGF8aHR0cHJlc3BvbnNlX2dldGV0YWd8aHR0cHJlc3BvbnNlX2dldGZpbGV8aHR0cHJlc3BvbnNlX2dldGd6aXB8aHR0cHJlc3BvbnNlX2dldGhlYWRlcnwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9nZXRsYXN0bW9kaWZpZWR8aHR0cHJlc3BvbnNlX2dldHJlcXVlc3Rib2R5fGh0dHByZXNwb25zZV9nZXRyZXF1ZXN0Ym9keXN0cmVhbXxodHRwcmVzcG9uc2VfZ2V0cmVxdWVzdGhlYWRlcnN8JyArDQogICAgICAgICdodHRwcmVzcG9uc2VfZ2V0c3RyZWFtfGh0dHByZXNwb25zZV9nZXR0aHJvdHRsZWRlbGF5fGh0dHByZXNwb25zZV9ndWVzc2NvbnRlbnR0eXBlfGh0dHByZXNwb25zZV9yZWRpcmVjdHxodHRwcmVzcG9uc2Vfc2VuZHwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9zZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9zZXRjYWNoZXxodHRwcmVzcG9uc2Vfc2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9zZXRjb250ZW50ZGlzcG9zaXRpb258JyArDQogICAgICAgICdodHRwcmVzcG9uc2Vfc2V0Y29udGVudHR5cGV8aHR0cHJlc3BvbnNlX3NldGRhdGF8aHR0cHJlc3BvbnNlX3NldGV0YWd8aHR0cHJlc3BvbnNlX3NldGZpbGV8aHR0cHJlc3BvbnNlX3NldGd6aXB8aHR0cHJlc3BvbnNlX3NldGhlYWRlcnwnICsNCiAgICAgICAgJ2h0dHByZXNwb25zZV9zZXRsYXN0bW9kaWZpZWR8aHR0cHJlc3BvbnNlX3NldHN0cmVhbXxodHRwcmVzcG9uc2Vfc2V0dGhyb3R0bGVkZWxheXxodHRwcmVzcG9uc2Vfc3RhdHVzfGh3X2FycmF5Mm9ianJlY3xod19jaGFuZ2VvYmplY3R8JyArDQogICAgICAgICdod19jaGlsZHJlbnxod19jaGlsZHJlbm9ianxod19jbG9zZXxod19jb25uZWN0fGh3X2Nvbm5lY3Rpb25faW5mb3xod19jcHxod19kZWxldGVvYmplY3R8aHdfZG9jYnlhbmNob3J8aHdfZG9jYnlhbmNob3JvYmp8JyArDQogICAgICAgICdod19kb2N1bWVudF9hdHRyaWJ1dGVzfGh3X2RvY3VtZW50X2JvZHl0YWd8aHdfZG9jdW1lbnRfY29udGVudHxod19kb2N1bWVudF9zZXRjb250ZW50fGh3X2RvY3VtZW50X3NpemV8aHdfZHVtbXl8aHdfZWRpdHRleHR8aHdfZXJyb3J8JyArDQogICAgICAgICdod19lcnJvcm1zZ3xod19mcmVlX2RvY3VtZW50fGh3X2dldGFuY2hvcnN8aHdfZ2V0YW5jaG9yc29ianxod19nZXRhbmRsb2NrfGh3X2dldGNoaWxkY29sbHxod19nZXRjaGlsZGNvbGxvYmp8aHdfZ2V0Y2hpbGRkb2Njb2xsfCcgKw0KICAgICAgICAnaHdfZ2V0Y2hpbGRkb2Njb2xsb2JqfGh3X2dldG9iamVjdHxod19nZXRvYmplY3RieXF1ZXJ5fGh3X2dldG9iamVjdGJ5cXVlcnljb2xsfGh3X2dldG9iamVjdGJ5cXVlcnljb2xsb2JqfGh3X2dldG9iamVjdGJ5cXVlcnlvYmp8JyArDQogICAgICAgICdod19nZXRwYXJlbnRzfGh3X2dldHBhcmVudHNvYmp8aHdfZ2V0cmVsbGlua3xod19nZXRyZW1vdGV8aHdfZ2V0cmVtb3RlY2hpbGRyZW58aHdfZ2V0c3JjYnlkZXN0b2JqfGh3X2dldHRleHR8aHdfZ2V0dXNlcm5hbWV8aHdfaWRlbnRpZnl8JyArDQogICAgICAgICdod19pbmNvbGxlY3Rpb25zfGh3X2luZm98aHdfaW5zY29sbHxod19pbnNkb2N8aHdfaW5zZXJ0YW5jaG9yc3xod19pbnNlcnRkb2N1bWVudHxod19pbnNlcnRvYmplY3R8aHdfbWFwaWR8aHdfbW9kaWZ5b2JqZWN0fGh3X212fCcgKw0KICAgICAgICAnaHdfbmV3X2RvY3VtZW50fGh3X29ianJlYzJhcnJheXxod19vdXRwdXRfZG9jdW1lbnR8aHdfcGNvbm5lY3R8aHdfcGlwZWRvY3VtZW50fGh3X3Jvb3R8aHdfc2V0bGlua3Jvb3R8aHdfc3RhdHxod191bmxvY2t8aHdfd2hvfCcgKw0KICAgICAgICAnaHdhcGlfYXR0cmlidXRlfGh3YXBpX2F0dHJpYnV0ZV9rZXl8aHdhcGlfYXR0cmlidXRlX2xhbmdkZXB2YWx1ZXxod2FwaV9hdHRyaWJ1dGVfdmFsdWV8aHdhcGlfYXR0cmlidXRlX3ZhbHVlc3xod2FwaV9jaGVja2lufCcgKw0KICAgICAgICAnaHdhcGlfY2hlY2tvdXR8aHdhcGlfY2hpbGRyZW58aHdhcGlfY29udGVudHxod2FwaV9jb250ZW50X21pbWV0eXBlfGh3YXBpX2NvbnRlbnRfcmVhZHxod2FwaV9jb3B5fGh3YXBpX2Ric3RhdHxod2FwaV9kY3N0YXR8JyArDQogICAgICAgICdod2FwaV9kc3RhbmNob3JzfGh3YXBpX2RzdG9mc3JjYW5jaG9yfGh3YXBpX2Vycm9yX2NvdW50fGh3YXBpX2Vycm9yX3JlYXNvbnxod2FwaV9maW5kfGh3YXBpX2Z0c3RhdHxod2FwaV9oZ2NzcHxod2FwaV9od3N0YXR8JyArDQogICAgICAgICdod2FwaV9pZGVudGlmeXxod2FwaV9pbmZvfGh3YXBpX2luc2VydHxod2FwaV9pbnNlcnRhbmNob3J8aHdhcGlfaW5zZXJ0Y29sbGVjdGlvbnxod2FwaV9pbnNlcnRkb2N1bWVudHxod2FwaV9saW5rfGh3YXBpX2xvY2t8aHdhcGlfbW92ZXwnICsNCiAgICAgICAgJ2h3YXBpX25ld19jb250ZW50fGh3YXBpX29iamVjdHxod2FwaV9vYmplY3RfYXNzaWdufGh3YXBpX29iamVjdF9hdHRyZWRpdGFibGV8aHdhcGlfb2JqZWN0X2NvdW50fGh3YXBpX29iamVjdF9pbnNlcnR8aHdhcGlfb2JqZWN0X25ld3wnICsNCiAgICAgICAgJ2h3YXBpX29iamVjdF9yZW1vdmV8aHdhcGlfb2JqZWN0X3RpdGxlfGh3YXBpX29iamVjdF92YWx1ZXxod2FwaV9vYmplY3RieWFuY2hvcnxod2FwaV9wYXJlbnRzfGh3YXBpX3JlYXNvbl9kZXNjcmlwdGlvbnxod2FwaV9yZWFzb25fdHlwZXwnICsNCiAgICAgICAgJ2h3YXBpX3JlbW92ZXxod2FwaV9yZXBsYWNlfGh3YXBpX3NldGNvbW1pdHRlZHZlcnNpb258aHdhcGlfc3JjYW5jaG9yc3xod2FwaV9zcmNzb2Zkc3R8aHdhcGlfdW5sb2NrfGh3YXBpX3VzZXJ8aHdhcGlfdXNlcmxpc3R8aHlwb3R8JyArDQogICAgICAgICdpYmFzZV9hZGRfdXNlcnxpYmFzZV9hZmZlY3RlZF9yb3dzfGliYXNlX2JhY2t1cHxpYmFzZV9ibG9iX2FkZHxpYmFzZV9ibG9iX2NhbmNlbHxpYmFzZV9ibG9iX2Nsb3NlfGliYXNlX2Jsb2JfY3JlYXRlfGliYXNlX2Jsb2JfZWNob3wnICsNCiAgICAgICAgJ2liYXNlX2Jsb2JfZ2V0fGliYXNlX2Jsb2JfaW1wb3J0fGliYXNlX2Jsb2JfaW5mb3xpYmFzZV9ibG9iX29wZW58aWJhc2VfY2xvc2V8aWJhc2VfY29tbWl0fGliYXNlX2NvbW1pdF9yZXR8aWJhc2VfY29ubmVjdHxpYmFzZV9kYl9pbmZvfCcgKw0KICAgICAgICAnaWJhc2VfZGVsZXRlX3VzZXJ8aWJhc2VfZHJvcF9kYnxpYmFzZV9lcnJjb2RlfGliYXNlX2Vycm1zZ3xpYmFzZV9leGVjdXRlfGliYXNlX2ZldGNoX2Fzc29jfGliYXNlX2ZldGNoX29iamVjdHxpYmFzZV9mZXRjaF9yb3d8JyArDQogICAgICAgICdpYmFzZV9maWVsZF9pbmZvfGliYXNlX2ZyZWVfZXZlbnRfaGFuZGxlcnxpYmFzZV9mcmVlX3F1ZXJ5fGliYXNlX2ZyZWVfcmVzdWx0fGliYXNlX2dlbl9pZHxpYmFzZV9tYWludGFpbl9kYnxpYmFzZV9tb2RpZnlfdXNlcnwnICsNCiAgICAgICAgJ2liYXNlX25hbWVfcmVzdWx0fGliYXNlX251bV9maWVsZHN8aWJhc2VfbnVtX3BhcmFtc3xpYmFzZV9wYXJhbV9pbmZvfGliYXNlX3Bjb25uZWN0fGliYXNlX3ByZXBhcmV8aWJhc2VfcXVlcnl8aWJhc2VfcmVzdG9yZXwnICsNCiAgICAgICAgJ2liYXNlX3JvbGxiYWNrfGliYXNlX3JvbGxiYWNrX3JldHxpYmFzZV9zZXJ2ZXJfaW5mb3xpYmFzZV9zZXJ2aWNlX2F0dGFjaHxpYmFzZV9zZXJ2aWNlX2RldGFjaHxpYmFzZV9zZXRfZXZlbnRfaGFuZGxlcnxpYmFzZV90aW1lZm10fCcgKw0KICAgICAgICAnaWJhc2VfdHJhbnN8aWJhc2Vfd2FpdF9ldmVudHxpY29udnxpY29udl9nZXRfZW5jb2Rpbmd8aWNvbnZfbWltZV9kZWNvZGV8aWNvbnZfbWltZV9kZWNvZGVfaGVhZGVyc3xpY29udl9taW1lX2VuY29kZXxpY29udl9zZXRfZW5jb2Rpbmd8JyArDQogICAgICAgICdpY29udl9zdHJsZW58aWNvbnZfc3RycG9zfGljb252X3N0cnJwb3N8aWNvbnZfc3Vic3RyfGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lfGlkM19nZXRfZnJhbWVfc2hvcnRfbmFtZXxpZDNfZ2V0X2dlbnJlX2lkfGlkM19nZXRfZ2VucmVfbGlzdHwnICsNCiAgICAgICAgJ2lkM19nZXRfZ2VucmVfbmFtZXxpZDNfZ2V0X3RhZ3xpZDNfZ2V0X3ZlcnNpb258aWQzX3JlbW92ZV90YWd8aWQzX3NldF90YWd8aWQzdjJhdHRhY2hlZHBpY3R1cmVmcmFtZXxpZDN2MmZyYW1lfGlkM3YydGFnfGlkYXRlfCcgKw0KICAgICAgICAnaWRuX3RvX2FzY2lpfGlkbl90b191bmljb2RlfGlkbl90b191dGY4fGlmeF9hZmZlY3RlZF9yb3dzfGlmeF9ibG9iaW5maWxlX21vZGV8aWZ4X2J5dGVhc3ZhcmNoYXJ8aWZ4X2Nsb3NlfGlmeF9jb25uZWN0fGlmeF9jb3B5X2Jsb2J8JyArDQogICAgICAgICdpZnhfY3JlYXRlX2Jsb2J8aWZ4X2NyZWF0ZV9jaGFyfGlmeF9kb3xpZnhfZXJyb3J8aWZ4X2Vycm9ybXNnfGlmeF9mZXRjaF9yb3d8aWZ4X2ZpZWxkcHJvcGVydGllc3xpZnhfZmllbGR0eXBlc3xpZnhfZnJlZV9ibG9ifCcgKw0KICAgICAgICAnaWZ4X2ZyZWVfY2hhcnxpZnhfZnJlZV9yZXN1bHR8aWZ4X2dldF9ibG9ifGlmeF9nZXRfY2hhcnxpZnhfZ2V0c3FsY2F8aWZ4X2h0bWx0YmxfcmVzdWx0fGlmeF9udWxsZm9ybWF0fGlmeF9udW1fZmllbGRzfGlmeF9udW1fcm93c3wnICsNCiAgICAgICAgJ2lmeF9wY29ubmVjdHxpZnhfcHJlcGFyZXxpZnhfcXVlcnl8aWZ4X3RleHRhc3ZhcmNoYXJ8aWZ4X3VwZGF0ZV9ibG9ifGlmeF91cGRhdGVfY2hhcnxpZnh1c19jbG9zZV9zbG9ifGlmeHVzX2NyZWF0ZV9zbG9ifGlmeHVzX2ZyZWVfc2xvYnwnICsNCiAgICAgICAgJ2lmeHVzX29wZW5fc2xvYnxpZnh1c19yZWFkX3Nsb2J8aWZ4dXNfc2Vla19zbG9ifGlmeHVzX3RlbGxfc2xvYnxpZnh1c193cml0ZV9zbG9ifGlnbm9yZV91c2VyX2Fib3J0fGlpc19hZGRfc2VydmVyfGlpc19nZXRfZGlyX3NlY3VyaXR5fCcgKw0KICAgICAgICAnaWlzX2dldF9zY3JpcHRfbWFwfGlpc19nZXRfc2VydmVyX2J5X2NvbW1lbnR8aWlzX2dldF9zZXJ2ZXJfYnlfcGF0aHxpaXNfZ2V0X3NlcnZlcl9yaWdodHN8aWlzX2dldF9zZXJ2aWNlX3N0YXRlfGlpc19yZW1vdmVfc2VydmVyfCcgKw0KICAgICAgICAnaWlzX3NldF9hcHBfc2V0dGluZ3N8aWlzX3NldF9kaXJfc2VjdXJpdHl8aWlzX3NldF9zY3JpcHRfbWFwfGlpc19zZXRfc2VydmVyX3JpZ2h0c3xpaXNfc3RhcnRfc2VydmVyfGlpc19zdGFydF9zZXJ2aWNlfGlpc19zdG9wX3NlcnZlcnwnICsNCiAgICAgICAgJ2lpc19zdG9wX3NlcnZpY2V8aW1hZ2Uyd2JtcHxpbWFnZV90eXBlX3RvX2V4dGVuc2lvbnxpbWFnZV90eXBlX3RvX21pbWVfdHlwZXxpbWFnZWFscGhhYmxlbmRpbmd8aW1hZ2VhbnRpYWxpYXN8aW1hZ2VhcmN8aW1hZ2VjaGFyfCcgKw0KICAgICAgICAnaW1hZ2VjaGFydXB8aW1hZ2Vjb2xvcmFsbG9jYXRlfGltYWdlY29sb3JhbGxvY2F0ZWFscGhhfGltYWdlY29sb3JhdHxpbWFnZWNvbG9yY2xvc2VzdHxpbWFnZWNvbG9yY2xvc2VzdGFscGhhfGltYWdlY29sb3JjbG9zZXN0aHdifCcgKw0KICAgICAgICAnaW1hZ2Vjb2xvcmRlYWxsb2NhdGV8aW1hZ2Vjb2xvcmV4YWN0fGltYWdlY29sb3JleGFjdGFscGhhfGltYWdlY29sb3JtYXRjaHxpbWFnZWNvbG9ycmVzb2x2ZXxpbWFnZWNvbG9ycmVzb2x2ZWFscGhhfGltYWdlY29sb3JzZXR8JyArDQogICAgICAgICdpbWFnZWNvbG9yc2ZvcmluZGV4fGltYWdlY29sb3JzdG90YWx8aW1hZ2Vjb2xvcnRyYW5zcGFyZW50fGltYWdlY29udm9sdXRpb258aW1hZ2Vjb3B5fGltYWdlY29weW1lcmdlfGltYWdlY29weW1lcmdlZ3JheXwnICsNCiAgICAgICAgJ2ltYWdlY29weXJlc2FtcGxlZHxpbWFnZWNvcHlyZXNpemVkfGltYWdlY3JlYXRlfGltYWdlY3JlYXRlZnJvbWdkfGltYWdlY3JlYXRlZnJvbWdkMnxpbWFnZWNyZWF0ZWZyb21nZDJwYXJ0fGltYWdlY3JlYXRlZnJvbWdpZnwnICsNCiAgICAgICAgJ2ltYWdlY3JlYXRlZnJvbWpwZWd8aW1hZ2VjcmVhdGVmcm9tcG5nfGltYWdlY3JlYXRlZnJvbXN0cmluZ3xpbWFnZWNyZWF0ZWZyb213Ym1wfGltYWdlY3JlYXRlZnJvbXhibXxpbWFnZWNyZWF0ZWZyb214cG18JyArDQogICAgICAgICdpbWFnZWNyZWF0ZXRydWVjb2xvcnxpbWFnZWRhc2hlZGxpbmV8aW1hZ2VkZXN0cm95fGltYWdlZWxsaXBzZXxpbWFnZWZpbGx8aW1hZ2VmaWxsZWRhcmN8aW1hZ2VmaWxsZWRlbGxpcHNlfGltYWdlZmlsbGVkcG9seWdvbnwnICsNCiAgICAgICAgJ2ltYWdlZmlsbGVkcmVjdGFuZ2xlfGltYWdlZmlsbHRvYm9yZGVyfGltYWdlZmlsdGVyfGltYWdlZm9udGhlaWdodHxpbWFnZWZvbnR3aWR0aHxpbWFnZWZ0YmJveHxpbWFnZWZ0dGV4dHxpbWFnZWdhbW1hY29ycmVjdHxpbWFnZWdkfCcgKw0KICAgICAgICAnaW1hZ2VnZDJ8aW1hZ2VnaWZ8aW1hZ2VncmFic2NyZWVufGltYWdlZ3JhYndpbmRvd3xpbWFnZWludGVybGFjZXxpbWFnZWlzdHJ1ZWNvbG9yfGltYWdlanBlZ3xpbWFnZWxheWVyZWZmZWN0fGltYWdlbGluZXxpbWFnZWxvYWRmb250fCcgKw0KICAgICAgICAnaW1hZ2VwYWxldHRlY29weXxpbWFnZXBuZ3xpbWFnZXBvbHlnb258aW1hZ2Vwc2Jib3h8aW1hZ2Vwc2VuY29kZWZvbnR8aW1hZ2Vwc2V4dGVuZGZvbnR8aW1hZ2Vwc2ZyZWVmb250fGltYWdlcHNsb2FkZm9udHxpbWFnZXBzc2xhbnRmb250fCcgKw0KICAgICAgICAnaW1hZ2Vwc3RleHR8aW1hZ2VyZWN0YW5nbGV8aW1hZ2Vyb3RhdGV8aW1hZ2VzYXZlYWxwaGF8aW1hZ2VzZXRicnVzaHxpbWFnZXNldHBpeGVsfGltYWdlc2V0c3R5bGV8aW1hZ2VzZXR0aGlja25lc3N8aW1hZ2VzZXR0aWxlfCcgKw0KICAgICAgICAnaW1hZ2VzdHJpbmd8aW1hZ2VzdHJpbmd1cHxpbWFnZXN4fGltYWdlc3l8aW1hZ2V0cnVlY29sb3J0b3BhbGV0dGV8aW1hZ2V0dGZiYm94fGltYWdldHRmdGV4dHxpbWFnZXR5cGVzfGltYWdld2JtcHxpbWFnZXhibXxpbWFnaWNrfCcgKw0KICAgICAgICAnaW1hZ2lja19hZGFwdGl2ZWJsdXJpbWFnZXxpbWFnaWNrX2FkYXB0aXZlcmVzaXplaW1hZ2V8aW1hZ2lja19hZGFwdGl2ZXNoYXJwZW5pbWFnZXxpbWFnaWNrX2FkYXB0aXZldGhyZXNob2xkaW1hZ2V8aW1hZ2lja19hZGRpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfYWRkbm9pc2VpbWFnZXxpbWFnaWNrX2FmZmluZXRyYW5zZm9ybWltYWdlfGltYWdpY2tfYW5pbWF0ZWltYWdlc3xpbWFnaWNrX2Fubm90YXRlaW1hZ2V8aW1hZ2lja19hcHBlbmRpbWFnZXN8aW1hZ2lja19hdmVyYWdlaW1hZ2VzfCcgKw0KICAgICAgICAnaW1hZ2lja19ibGFja3RocmVzaG9sZGltYWdlfGltYWdpY2tfYmx1cmltYWdlfGltYWdpY2tfYm9yZGVyaW1hZ2V8aW1hZ2lja19jaGFyY29hbGltYWdlfGltYWdpY2tfY2hvcGltYWdlfGltYWdpY2tfY2xlYXJ8aW1hZ2lja19jbGlwaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2NsaXBwYXRoaW1hZ2V8aW1hZ2lja19jbG9uZXxpbWFnaWNrX2NsdXRpbWFnZXxpbWFnaWNrX2NvYWxlc2NlaW1hZ2VzfGltYWdpY2tfY29sb3JmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX2NvbG9yaXplaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2NvbWJpbmVpbWFnZXN8aW1hZ2lja19jb21tZW50aW1hZ2V8aW1hZ2lja19jb21wYXJlaW1hZ2VjaGFubmVsc3xpbWFnaWNrX2NvbXBhcmVpbWFnZWxheWVyc3xpbWFnaWNrX2NvbXBhcmVpbWFnZXN8JyArDQogICAgICAgICdpbWFnaWNrX2NvbXBvc2l0ZWltYWdlfGltYWdpY2tfY29uc3RydWN0fGltYWdpY2tfY29udHJhc3RpbWFnZXxpbWFnaWNrX2NvbnRyYXN0c3RyZXRjaGltYWdlfGltYWdpY2tfY29udm9sdmVpbWFnZXxpbWFnaWNrX2Nyb3BpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfY3JvcHRodW1ibmFpbGltYWdlfGltYWdpY2tfY3VycmVudHxpbWFnaWNrX2N5Y2xlY29sb3JtYXBpbWFnZXxpbWFnaWNrX2RlY2lwaGVyaW1hZ2V8aW1hZ2lja19kZWNvbnN0cnVjdGltYWdlc3wnICsNCiAgICAgICAgJ2ltYWdpY2tfZGVsZXRlaW1hZ2VhcnRpZmFjdHxpbWFnaWNrX2Rlc3BlY2tsZWltYWdlfGltYWdpY2tfZGVzdHJveXxpbWFnaWNrX2Rpc3BsYXlpbWFnZXxpbWFnaWNrX2Rpc3BsYXlpbWFnZXN8aW1hZ2lja19kaXN0b3J0aW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2RyYXdpbWFnZXxpbWFnaWNrX2VkZ2VpbWFnZXxpbWFnaWNrX2VtYm9zc2ltYWdlfGltYWdpY2tfZW5jaXBoZXJpbWFnZXxpbWFnaWNrX2VuaGFuY2VpbWFnZXxpbWFnaWNrX2VxdWFsaXplaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX2V2YWx1YXRlaW1hZ2V8aW1hZ2lja19leHRlbnRpbWFnZXxpbWFnaWNrX2ZsYXR0ZW5pbWFnZXN8aW1hZ2lja19mbGlwaW1hZ2V8aW1hZ2lja19mbG9vZGZpbGxwYWludGltYWdlfGltYWdpY2tfZmxvcGltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja19mcmFtZWltYWdlfGltYWdpY2tfZnhpbWFnZXxpbWFnaWNrX2dhbW1haW1hZ2V8aW1hZ2lja19nYXVzc2lhbmJsdXJpbWFnZXxpbWFnaWNrX2dldGNvbG9yc3BhY2V8aW1hZ2lja19nZXRjb21wcmVzc2lvbnwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0Y29tcHJlc3Npb25xdWFsaXR5fGltYWdpY2tfZ2V0Y29weXJpZ2h0fGltYWdpY2tfZ2V0ZmlsZW5hbWV8aW1hZ2lja19nZXRmb250fGltYWdpY2tfZ2V0Zm9ybWF0fGltYWdpY2tfZ2V0Z3Jhdml0eXwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aG9tZXVybHxpbWFnaWNrX2dldGltYWdlfGltYWdpY2tfZ2V0aW1hZ2VhbHBoYWNoYW5uZWx8aW1hZ2lja19nZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfZ2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlYmxvYnxpbWFnaWNrX2dldGltYWdlYmx1ZXByaW1hcnl8aW1hZ2lja19nZXRpbWFnZWJvcmRlcmNvbG9yfGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsZGVwdGh8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRpc3RvcnRpb258aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxkaXN0b3J0aW9uc3xpbWFnaWNrX2dldGltYWdlY2hhbm5lbGV4dHJlbWF8aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxtZWFufCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWNoYW5uZWxyYW5nZXxpbWFnaWNrX2dldGltYWdlY2hhbm5lbHN0YXRpc3RpY3N8aW1hZ2lja19nZXRpbWFnZWNsaXBtYXNrfGltYWdpY2tfZ2V0aW1hZ2Vjb2xvcm1hcGNvbG9yfCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWNvbG9yc3xpbWFnaWNrX2dldGltYWdlY29sb3JzcGFjZXxpbWFnaWNrX2dldGltYWdlY29tcG9zZXxpbWFnaWNrX2dldGltYWdlY29tcHJlc3Npb258aW1hZ2lja19nZXRpbWFnZWNvbXByZXNzaW9ucXVhbGl0eXwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VkZWxheXxpbWFnaWNrX2dldGltYWdlZGVwdGh8aW1hZ2lja19nZXRpbWFnZWRpc3Bvc2V8aW1hZ2lja19nZXRpbWFnZWRpc3RvcnRpb258aW1hZ2lja19nZXRpbWFnZWV4dHJlbWF8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlZmlsZW5hbWV8aW1hZ2lja19nZXRpbWFnZWZvcm1hdHxpbWFnaWNrX2dldGltYWdlZ2FtbWF8aW1hZ2lja19nZXRpbWFnZWdlb21ldHJ5fGltYWdpY2tfZ2V0aW1hZ2VncmF2aXR5fCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWdyZWVucHJpbWFyeXxpbWFnaWNrX2dldGltYWdlaGVpZ2h0fGltYWdpY2tfZ2V0aW1hZ2VoaXN0b2dyYW18aW1hZ2lja19nZXRpbWFnZWluZGV4fGltYWdpY2tfZ2V0aW1hZ2VpbnRlcmxhY2VzY2hlbWV8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlaW50ZXJwb2xhdGVtZXRob2R8aW1hZ2lja19nZXRpbWFnZWl0ZXJhdGlvbnN8aW1hZ2lja19nZXRpbWFnZWxlbmd0aHxpbWFnaWNrX2dldGltYWdlbWFnaWNrbGljZW5zZXxpbWFnaWNrX2dldGltYWdlbWF0dGV8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlbWF0dGVjb2xvcnxpbWFnaWNrX2dldGltYWdlb3JpZW50YXRpb258aW1hZ2lja19nZXRpbWFnZXBhZ2V8aW1hZ2lja19nZXRpbWFnZXBpeGVsY29sb3J8aW1hZ2lja19nZXRpbWFnZXByb2ZpbGV8JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlcHJvZmlsZXN8aW1hZ2lja19nZXRpbWFnZXByb3BlcnRpZXN8aW1hZ2lja19nZXRpbWFnZXByb3BlcnR5fGltYWdpY2tfZ2V0aW1hZ2VyZWRwcmltYXJ5fGltYWdpY2tfZ2V0aW1hZ2VyZWdpb258JyArDQogICAgICAgICdpbWFnaWNrX2dldGltYWdlcmVuZGVyaW5naW50ZW50fGltYWdpY2tfZ2V0aW1hZ2VyZXNvbHV0aW9ufGltYWdpY2tfZ2V0aW1hZ2VzYmxvYnxpbWFnaWNrX2dldGltYWdlc2NlbmV8aW1hZ2lja19nZXRpbWFnZXNpZ25hdHVyZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VzaXplfGltYWdpY2tfZ2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX2dldGltYWdldG90YWxpbmtkZW5zaXR5fGltYWdpY2tfZ2V0aW1hZ2V0eXBlfGltYWdpY2tfZ2V0aW1hZ2V1bml0c3wnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2V2aXJ0dWFscGl4ZWxtZXRob2R8aW1hZ2lja19nZXRpbWFnZXdoaXRlcG9pbnR8aW1hZ2lja19nZXRpbWFnZXdpZHRofGltYWdpY2tfZ2V0aW50ZXJsYWNlc2NoZW1lfGltYWdpY2tfZ2V0aXRlcmF0b3JpbmRleHwnICsNCiAgICAgICAgJ2ltYWdpY2tfZ2V0bnVtYmVyaW1hZ2VzfGltYWdpY2tfZ2V0b3B0aW9ufGltYWdpY2tfZ2V0cGFja2FnZW5hbWV8aW1hZ2lja19nZXRwYWdlfGltYWdpY2tfZ2V0cGl4ZWxpdGVyYXRvcnxpbWFnaWNrX2dldHBpeGVscmVnaW9uaXRlcmF0b3J8JyArDQogICAgICAgICdpbWFnaWNrX2dldHBvaW50c2l6ZXxpbWFnaWNrX2dldHF1YW50dW1kZXB0aHxpbWFnaWNrX2dldHF1YW50dW1yYW5nZXxpbWFnaWNrX2dldHJlbGVhc2VkYXRlfGltYWdpY2tfZ2V0cmVzb3VyY2V8aW1hZ2lja19nZXRyZXNvdXJjZWxpbWl0fCcgKw0KICAgICAgICAnaW1hZ2lja19nZXRzYW1wbGluZ2ZhY3RvcnN8aW1hZ2lja19nZXRzaXplfGltYWdpY2tfZ2V0c2l6ZW9mZnNldHxpbWFnaWNrX2dldHZlcnNpb258aW1hZ2lja19oYXNuZXh0aW1hZ2V8aW1hZ2lja19oYXNwcmV2aW91c2ltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja19pZGVudGlmeWltYWdlfGltYWdpY2tfaW1wbG9kZWltYWdlfGltYWdpY2tfbGFiZWxpbWFnZXxpbWFnaWNrX2xldmVsaW1hZ2V8aW1hZ2lja19saW5lYXJzdHJldGNoaW1hZ2V8aW1hZ2lja19saXF1aWRyZXNjYWxlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX21hZ25pZnlpbWFnZXxpbWFnaWNrX21hcGltYWdlfGltYWdpY2tfbWF0dGVmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX21lZGlhbmZpbHRlcmltYWdlfGltYWdpY2tfbWVyZ2VpbWFnZWxheWVyc3xpbWFnaWNrX21pbmlmeWltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja19tb2R1bGF0ZWltYWdlfGltYWdpY2tfbW9udGFnZWltYWdlfGltYWdpY2tfbW9ycGhpbWFnZXN8aW1hZ2lja19tb3NhaWNpbWFnZXN8aW1hZ2lja19tb3Rpb25ibHVyaW1hZ2V8aW1hZ2lja19uZWdhdGVpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfbmV3aW1hZ2V8aW1hZ2lja19uZXdwc2V1ZG9pbWFnZXxpbWFnaWNrX25leHRpbWFnZXxpbWFnaWNrX25vcm1hbGl6ZWltYWdlfGltYWdpY2tfb2lscGFpbnRpbWFnZXxpbWFnaWNrX29wYXF1ZXBhaW50aW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX29wdGltaXplaW1hZ2VsYXllcnN8aW1hZ2lja19vcmRlcmVkcG9zdGVyaXplaW1hZ2V8aW1hZ2lja19wYWludGZsb29kZmlsbGltYWdlfGltYWdpY2tfcGFpbnRvcGFxdWVpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfcGFpbnR0cmFuc3BhcmVudGltYWdlfGltYWdpY2tfcGluZ2ltYWdlfGltYWdpY2tfcGluZ2ltYWdlYmxvYnxpbWFnaWNrX3BpbmdpbWFnZWZpbGV8aW1hZ2lja19wb2xhcm9pZGltYWdlfGltYWdpY2tfcG9zdGVyaXplaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3ByZXZpZXdpbWFnZXN8aW1hZ2lja19wcmV2aW91c2ltYWdlfGltYWdpY2tfcHJvZmlsZWltYWdlfGltYWdpY2tfcXVhbnRpemVpbWFnZXxpbWFnaWNrX3F1YW50aXplaW1hZ2VzfGltYWdpY2tfcXVlcnlmb250bWV0cmljc3wnICsNCiAgICAgICAgJ2ltYWdpY2tfcXVlcnlmb250c3xpbWFnaWNrX3F1ZXJ5Zm9ybWF0c3xpbWFnaWNrX3JhZGlhbGJsdXJpbWFnZXxpbWFnaWNrX3JhaXNlaW1hZ2V8aW1hZ2lja19yYW5kb210aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3JlYWRpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfcmVhZGltYWdlYmxvYnxpbWFnaWNrX3JlYWRpbWFnZWZpbGV8aW1hZ2lja19yZWNvbG9yaW1hZ2V8aW1hZ2lja19yZWR1Y2Vub2lzZWltYWdlfGltYWdpY2tfcmVtb3ZlaW1hZ2V8aW1hZ2lja19yZW1vdmVpbWFnZXByb2ZpbGV8JyArDQogICAgICAgICdpbWFnaWNrX3JlbmRlcnxpbWFnaWNrX3Jlc2FtcGxlaW1hZ2V8aW1hZ2lja19yZXNldGltYWdlcGFnZXxpbWFnaWNrX3Jlc2l6ZWltYWdlfGltYWdpY2tfcm9sbGltYWdlfGltYWdpY2tfcm90YXRlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3JvdW5kY29ybmVyc3xpbWFnaWNrX3NhbXBsZWltYWdlfGltYWdpY2tfc2NhbGVpbWFnZXxpbWFnaWNrX3NlcGFyYXRlaW1hZ2VjaGFubmVsfGltYWdpY2tfc2VwaWF0b25laW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3NldGJhY2tncm91bmRjb2xvcnxpbWFnaWNrX3NldGNvbG9yc3BhY2V8aW1hZ2lja19zZXRjb21wcmVzc2lvbnxpbWFnaWNrX3NldGNvbXByZXNzaW9ucXVhbGl0eXxpbWFnaWNrX3NldGZpbGVuYW1lfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRmaXJzdGl0ZXJhdG9yfGltYWdpY2tfc2V0Zm9udHxpbWFnaWNrX3NldGZvcm1hdHxpbWFnaWNrX3NldGdyYXZpdHl8aW1hZ2lja19zZXRpbWFnZXxpbWFnaWNrX3NldGltYWdlYWxwaGFjaGFubmVsfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfc2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRpbWFnZWJpYXN8aW1hZ2lja19zZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2Vib3JkZXJjb2xvcnwnICsNCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2VjaGFubmVsZGVwdGh8aW1hZ2lja19zZXRpbWFnZWNsaXBtYXNrfGltYWdpY2tfc2V0aW1hZ2Vjb2xvcm1hcGNvbG9yfGltYWdpY2tfc2V0aW1hZ2Vjb2xvcnNwYWNlfGltYWdpY2tfc2V0aW1hZ2Vjb21wb3NlfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWNvbXByZXNzaW9ufGltYWdpY2tfc2V0aW1hZ2Vjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19zZXRpbWFnZWRlbGF5fGltYWdpY2tfc2V0aW1hZ2VkZXB0aHxpbWFnaWNrX3NldGltYWdlZGlzcG9zZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2VleHRlbnR8aW1hZ2lja19zZXRpbWFnZWZpbGVuYW1lfGltYWdpY2tfc2V0aW1hZ2Vmb3JtYXR8aW1hZ2lja19zZXRpbWFnZWdhbW1hfGltYWdpY2tfc2V0aW1hZ2VncmF2aXR5fCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWdyZWVucHJpbWFyeXxpbWFnaWNrX3NldGltYWdlaW5kZXh8aW1hZ2lja19zZXRpbWFnZWludGVybGFjZXNjaGVtZXxpbWFnaWNrX3NldGltYWdlaW50ZXJwb2xhdGVtZXRob2R8JyArDQogICAgICAgICdpbWFnaWNrX3NldGltYWdlaXRlcmF0aW9uc3xpbWFnaWNrX3NldGltYWdlbWF0dGV8aW1hZ2lja19zZXRpbWFnZW1hdHRlY29sb3J8aW1hZ2lja19zZXRpbWFnZW9wYWNpdHl8aW1hZ2lja19zZXRpbWFnZW9yaWVudGF0aW9ufCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRpbWFnZXBhZ2V8aW1hZ2lja19zZXRpbWFnZXByb2ZpbGV8aW1hZ2lja19zZXRpbWFnZXByb3BlcnR5fGltYWdpY2tfc2V0aW1hZ2VyZWRwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2VyZW5kZXJpbmdpbnRlbnR8JyArDQogICAgICAgICdpbWFnaWNrX3NldGltYWdlcmVzb2x1dGlvbnxpbWFnaWNrX3NldGltYWdlc2NlbmV8aW1hZ2lja19zZXRpbWFnZXRpY2tzcGVyc2Vjb25kfGltYWdpY2tfc2V0aW1hZ2V0eXBlfGltYWdpY2tfc2V0aW1hZ2V1bml0c3wnICsNCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2V2aXJ0dWFscGl4ZWxtZXRob2R8aW1hZ2lja19zZXRpbWFnZXdoaXRlcG9pbnR8aW1hZ2lja19zZXRpbnRlcmxhY2VzY2hlbWV8aW1hZ2lja19zZXRpdGVyYXRvcmluZGV4fGltYWdpY2tfc2V0bGFzdGl0ZXJhdG9yfCcgKw0KICAgICAgICAnaW1hZ2lja19zZXRvcHRpb258aW1hZ2lja19zZXRwYWdlfGltYWdpY2tfc2V0cG9pbnRzaXplfGltYWdpY2tfc2V0cmVzb2x1dGlvbnxpbWFnaWNrX3NldHJlc291cmNlbGltaXR8aW1hZ2lja19zZXRzYW1wbGluZ2ZhY3RvcnN8JyArDQogICAgICAgICdpbWFnaWNrX3NldHNpemV8aW1hZ2lja19zZXRzaXplb2Zmc2V0fGltYWdpY2tfc2V0dHlwZXxpbWFnaWNrX3NoYWRlaW1hZ2V8aW1hZ2lja19zaGFkb3dpbWFnZXxpbWFnaWNrX3NoYXJwZW5pbWFnZXxpbWFnaWNrX3NoYXZlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3NoZWFyaW1hZ2V8aW1hZ2lja19zaWdtb2lkYWxjb250cmFzdGltYWdlfGltYWdpY2tfc2tldGNoaW1hZ2V8aW1hZ2lja19zb2xhcml6ZWltYWdlfGltYWdpY2tfc3BsaWNlaW1hZ2V8aW1hZ2lja19zcHJlYWRpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfc3RlZ2Fub2ltYWdlfGltYWdpY2tfc3RlcmVvaW1hZ2V8aW1hZ2lja19zdHJpcGltYWdlfGltYWdpY2tfc3dpcmxpbWFnZXxpbWFnaWNrX3RleHR1cmVpbWFnZXxpbWFnaWNrX3RocmVzaG9sZGltYWdlfCcgKw0KICAgICAgICAnaW1hZ2lja190aHVtYm5haWxpbWFnZXxpbWFnaWNrX3RpbnRpbWFnZXxpbWFnaWNrX3RyYW5zZm9ybWltYWdlfGltYWdpY2tfdHJhbnNwYXJlbnRwYWludGltYWdlfGltYWdpY2tfdHJhbnNwb3NlaW1hZ2V8JyArDQogICAgICAgICdpbWFnaWNrX3RyYW5zdmVyc2VpbWFnZXxpbWFnaWNrX3RyaW1pbWFnZXxpbWFnaWNrX3VuaXF1ZWltYWdlY29sb3JzfGltYWdpY2tfdW5zaGFycG1hc2tpbWFnZXxpbWFnaWNrX3ZhbGlkfGltYWdpY2tfdmlnbmV0dGVpbWFnZXwnICsNCiAgICAgICAgJ2ltYWdpY2tfd2F2ZWltYWdlfGltYWdpY2tfd2hpdGV0aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3dyaXRlaW1hZ2V8aW1hZ2lja193cml0ZWltYWdlZmlsZXxpbWFnaWNrX3dyaXRlaW1hZ2VzfGltYWdpY2tfd3JpdGVpbWFnZXNmaWxlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXd8aW1hZ2lja2RyYXdfYWZmaW5lfGltYWdpY2tkcmF3X2Fubm90YXRpb258aW1hZ2lja2RyYXdfYXJjfGltYWdpY2tkcmF3X2JlemllcnxpbWFnaWNrZHJhd19jaXJjbGV8aW1hZ2lja2RyYXdfY2xlYXJ8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19jbG9uZXxpbWFnaWNrZHJhd19jb2xvcnxpbWFnaWNrZHJhd19jb21tZW50fGltYWdpY2tkcmF3X2NvbXBvc2l0ZXxpbWFnaWNrZHJhd19jb25zdHJ1Y3R8aW1hZ2lja2RyYXdfZGVzdHJveXwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2VsbGlwc2V8aW1hZ2lja2RyYXdfZ2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfZ2V0Y2xpcHJ1bGV8aW1hZ2lja2RyYXdfZ2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X2dldGZpbGxjb2xvcnwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldGZpbGxvcGFjaXR5fGltYWdpY2tkcmF3X2dldGZpbGxydWxlfGltYWdpY2tkcmF3X2dldGZvbnR8aW1hZ2lja2RyYXdfZ2V0Zm9udGZhbWlseXxpbWFnaWNrZHJhd19nZXRmb250c2l6ZXwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19nZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X2dldGdyYXZpdHl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlYW50aWFsaWFzfGltYWdpY2tkcmF3X2dldHN0cm9rZWNvbG9yfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfZ2V0c3Ryb2tlZGFzaGFycmF5fGltYWdpY2tkcmF3X2dldHN0cm9rZWRhc2hvZmZzZXR8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlbGluZWNhcHxpbWFnaWNrZHJhd19nZXRzdHJva2VsaW5lam9pbnwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldHN0cm9rZW1pdGVybGltaXR8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlb3BhY2l0eXxpbWFnaWNrZHJhd19nZXRzdHJva2V3aWR0aHxpbWFnaWNrZHJhd19nZXR0ZXh0YWxpZ25tZW50fCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfZ2V0dGV4dGFudGlhbGlhc3xpbWFnaWNrZHJhd19nZXR0ZXh0ZGVjb3JhdGlvbnxpbWFnaWNrZHJhd19nZXR0ZXh0ZW5jb2Rpbmd8aW1hZ2lja2RyYXdfZ2V0dGV4dHVuZGVyY29sb3J8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19nZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19saW5lfGltYWdpY2tkcmF3X21hdHRlfGltYWdpY2tkcmF3X3BhdGhjbG9zZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b2Fic29sdXRlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnJlbGF0aXZlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJzbW9vdGhhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnNtb290aHJlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcmVsYXRpdmV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wYXRoY3VydmV0b3Ntb290aGFic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvc21vb3RocmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjYWJzb2x1dGV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wYXRoZWxsaXB0aWNhcmNyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoZmluaXNofGltYWdpY2tkcmF3X3BhdGhsaW5ldG9hYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvaG9yaXpvbnRhbGFic29sdXRlfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGxpbmV0b2hvcml6b250YWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGxpbmV0b3ZlcnRpY2FsYWJzb2x1dGV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wYXRobGluZXRvdmVydGljYWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobW92ZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aG1vdmV0b3JlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhzdGFydHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3BvaW50fGltYWdpY2tkcmF3X3BvbHlnb258aW1hZ2lja2RyYXdfcG9seWxpbmV8aW1hZ2lja2RyYXdfcG9wfGltYWdpY2tkcmF3X3BvcGNsaXBwYXRofGltYWdpY2tkcmF3X3BvcGRlZnN8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19wb3BwYXR0ZXJufGltYWdpY2tkcmF3X3B1c2h8aW1hZ2lja2RyYXdfcHVzaGNsaXBwYXRofGltYWdpY2tkcmF3X3B1c2hkZWZzfGltYWdpY2tkcmF3X3B1c2hwYXR0ZXJufGltYWdpY2tkcmF3X3JlY3RhbmdsZXwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3JlbmRlcnxpbWFnaWNrZHJhd19yb3RhdGV8aW1hZ2lja2RyYXdfcm91bmRyZWN0YW5nbGV8aW1hZ2lja2RyYXdfc2NhbGV8aW1hZ2lja2RyYXdfc2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfc2V0Y2xpcHJ1bGV8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19zZXRjbGlwdW5pdHN8aW1hZ2lja2RyYXdfc2V0ZmlsbGFscGhhfGltYWdpY2tkcmF3X3NldGZpbGxjb2xvcnxpbWFnaWNrZHJhd19zZXRmaWxsb3BhY2l0eXxpbWFnaWNrZHJhd19zZXRmaWxscGF0dGVybnVybHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldGZpbGxydWxlfGltYWdpY2tkcmF3X3NldGZvbnR8aW1hZ2lja2RyYXdfc2V0Zm9udGZhbWlseXxpbWFnaWNrZHJhd19zZXRmb250c2l6ZXxpbWFnaWNrZHJhd19zZXRmb250c3RyZXRjaHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19zZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X3NldGdyYXZpdHl8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYWxwaGF8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYW50aWFsaWFzfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfc2V0c3Ryb2tlY29sb3J8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlZGFzaGFycmF5fGltYWdpY2tkcmF3X3NldHN0cm9rZWRhc2hvZmZzZXR8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlbGluZWNhcHwnICsNCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldHN0cm9rZWxpbmVqb2lufGltYWdpY2tkcmF3X3NldHN0cm9rZW1pdGVybGltaXR8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlb3BhY2l0eXxpbWFnaWNrZHJhd19zZXRzdHJva2VwYXR0ZXJudXJsfCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfc2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfc2V0dGV4dGFsaWdubWVudHxpbWFnaWNrZHJhd19zZXR0ZXh0YW50aWFsaWFzfGltYWdpY2tkcmF3X3NldHRleHRkZWNvcmF0aW9ufCcgKw0KICAgICAgICAnaW1hZ2lja2RyYXdfc2V0dGV4dGVuY29kaW5nfGltYWdpY2tkcmF3X3NldHRleHR1bmRlcmNvbG9yfGltYWdpY2tkcmF3X3NldHZlY3RvcmdyYXBoaWNzfGltYWdpY2tkcmF3X3NldHZpZXdib3h8aW1hZ2lja2RyYXdfc2tld3h8JyArDQogICAgICAgICdpbWFnaWNrZHJhd19za2V3eXxpbWFnaWNrZHJhd190cmFuc2xhdGV8aW1hZ2lja3BpeGVsfGltYWdpY2twaXhlbF9jbGVhcnxpbWFnaWNrcGl4ZWxfY29uc3RydWN0fGltYWdpY2twaXhlbF9kZXN0cm95fGltYWdpY2twaXhlbF9nZXRjb2xvcnwnICsNCiAgICAgICAgJ2ltYWdpY2twaXhlbF9nZXRjb2xvcmFzc3RyaW5nfGltYWdpY2twaXhlbF9nZXRjb2xvcmNvdW50fGltYWdpY2twaXhlbF9nZXRjb2xvcnZhbHVlfGltYWdpY2twaXhlbF9nZXRoc2x8aW1hZ2lja3BpeGVsX2lzc2ltaWxhcnwnICsNCiAgICAgICAgJ2ltYWdpY2twaXhlbF9zZXRjb2xvcnxpbWFnaWNrcGl4ZWxfc2V0Y29sb3J2YWx1ZXxpbWFnaWNrcGl4ZWxfc2V0aHNsfGltYWdpY2twaXhlbGl0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX2NsZWFyfCcgKw0KICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3JfY29uc3RydWN0fGltYWdpY2twaXhlbGl0ZXJhdG9yX2Rlc3Ryb3l8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0Y3VycmVudGl0ZXJhdG9ycm93fCcgKw0KICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0bmV4dGl0ZXJhdG9ycm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX2dldHByZXZpb3VzaXRlcmF0b3Jyb3d8JyArDQogICAgICAgICdpbWFnaWNrcGl4ZWxpdGVyYXRvcl9uZXdwaXhlbGl0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX25ld3BpeGVscmVnaW9uaXRlcmF0b3J8aW1hZ2lja3BpeGVsaXRlcmF0b3JfcmVzZXRpdGVyYXRvcnwnICsNCiAgICAgICAgJ2ltYWdpY2twaXhlbGl0ZXJhdG9yX3NldGl0ZXJhdG9yZmlyc3Ryb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3JsYXN0cm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX3NldGl0ZXJhdG9ycm93fCcgKw0KICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3Jfc3luY2l0ZXJhdG9yfGltYXBfOGJpdHxpbWFwX2FsZXJ0c3xpbWFwX2FwcGVuZHxpbWFwX2Jhc2U2NHxpbWFwX2JpbmFyeXxpbWFwX2JvZHl8aW1hcF9ib2R5c3RydWN0fGltYXBfY2hlY2t8JyArDQogICAgICAgICdpbWFwX2NsZWFyZmxhZ19mdWxsfGltYXBfY2xvc2V8aW1hcF9jcmVhdGV8aW1hcF9jcmVhdGVtYWlsYm94fGltYXBfZGVsZXRlfGltYXBfZGVsZXRlbWFpbGJveHxpbWFwX2Vycm9yc3xpbWFwX2V4cHVuZ2V8aW1hcF9mZXRjaF9vdmVydmlld3wnICsNCiAgICAgICAgJ2ltYXBfZmV0Y2hib2R5fGltYXBfZmV0Y2hoZWFkZXJ8aW1hcF9mZXRjaG1pbWV8aW1hcF9mZXRjaHN0cnVjdHVyZXxpbWFwX2ZldGNodGV4dHxpbWFwX2djfGltYXBfZ2V0X3F1b3RhfGltYXBfZ2V0X3F1b3Rhcm9vdHxpbWFwX2dldGFjbHwnICsNCiAgICAgICAgJ2ltYXBfZ2V0bWFpbGJveGVzfGltYXBfZ2V0c3Vic2NyaWJlZHxpbWFwX2hlYWRlcnxpbWFwX2hlYWRlcmluZm98aW1hcF9oZWFkZXJzfGltYXBfbGFzdF9lcnJvcnxpbWFwX2xpc3R8aW1hcF9saXN0bWFpbGJveHxpbWFwX2xpc3RzY2FufCcgKw0KICAgICAgICAnaW1hcF9saXN0c3Vic2NyaWJlZHxpbWFwX2xzdWJ8aW1hcF9tYWlsfGltYXBfbWFpbF9jb21wb3NlfGltYXBfbWFpbF9jb3B5fGltYXBfbWFpbF9tb3ZlfGltYXBfbWFpbGJveG1zZ2luZm98aW1hcF9taW1lX2hlYWRlcl9kZWNvZGV8JyArDQogICAgICAgICdpbWFwX21zZ25vfGltYXBfbnVtX21zZ3xpbWFwX251bV9yZWNlbnR8aW1hcF9vcGVufGltYXBfcGluZ3xpbWFwX3FwcmludHxpbWFwX3JlbmFtZXxpbWFwX3JlbmFtZW1haWxib3h8aW1hcF9yZW9wZW58JyArDQogICAgICAgICdpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0fGltYXBfcmZjODIyX3BhcnNlX2hlYWRlcnN8aW1hcF9yZmM4MjJfd3JpdGVfYWRkcmVzc3xpbWFwX3NhdmVib2R5fGltYXBfc2NhbnxpbWFwX3NjYW5tYWlsYm94fGltYXBfc2VhcmNofCcgKw0KICAgICAgICAnaW1hcF9zZXRfcXVvdGF8aW1hcF9zZXRhY2x8aW1hcF9zZXRmbGFnX2Z1bGx8aW1hcF9zb3J0fGltYXBfc3RhdHVzfGltYXBfc3Vic2NyaWJlfGltYXBfdGhyZWFkfGltYXBfdGltZW91dHxpbWFwX3VpZHxpbWFwX3VuZGVsZXRlfCcgKw0KICAgICAgICAnaW1hcF91bnN1YnNjcmliZXxpbWFwX3V0ZjdfZGVjb2RlfGltYXBfdXRmN19lbmNvZGV8aW1hcF91dGY4fGltcGxlbWVudHNpbnRlcmZhY2V8aW1wbG9kZXxpbXBvcnRfcmVxdWVzdF92YXJpYWJsZXN8aW5fYXJyYXl8aW5jbHVkZXwnICsNCiAgICAgICAgJ2luY2x1ZGVfb25jZXxpbmNsdWVkX2dldF9kYXRhfGluZXRfbnRvcHxpbmV0X3B0b258aW5maW5pdGVpdGVyYXRvcnxpbmdyZXNfYXV0b2NvbW1pdHxpbmdyZXNfYXV0b2NvbW1pdF9zdGF0ZXxpbmdyZXNfY2hhcnNldHxpbmdyZXNfY2xvc2V8JyArDQogICAgICAgICdpbmdyZXNfY29tbWl0fGluZ3Jlc19jb25uZWN0fGluZ3Jlc19jdXJzb3J8aW5ncmVzX2Vycm5vfGluZ3Jlc19lcnJvcnxpbmdyZXNfZXJyc3Fsc3RhdGV8aW5ncmVzX2VzY2FwZV9zdHJpbmd8aW5ncmVzX2V4ZWN1dGV8JyArDQogICAgICAgICdpbmdyZXNfZmV0Y2hfYXJyYXl8aW5ncmVzX2ZldGNoX2Fzc29jfGluZ3Jlc19mZXRjaF9vYmplY3R8aW5ncmVzX2ZldGNoX3Byb2NfcmV0dXJufGluZ3Jlc19mZXRjaF9yb3d8aW5ncmVzX2ZpZWxkX2xlbmd0aHxpbmdyZXNfZmllbGRfbmFtZXwnICsNCiAgICAgICAgJ2luZ3Jlc19maWVsZF9udWxsYWJsZXxpbmdyZXNfZmllbGRfcHJlY2lzaW9ufGluZ3Jlc19maWVsZF9zY2FsZXxpbmdyZXNfZmllbGRfdHlwZXxpbmdyZXNfZnJlZV9yZXN1bHR8aW5ncmVzX25leHRfZXJyb3J8aW5ncmVzX251bV9maWVsZHN8JyArDQogICAgICAgICdpbmdyZXNfbnVtX3Jvd3N8aW5ncmVzX3Bjb25uZWN0fGluZ3Jlc19wcmVwYXJlfGluZ3Jlc19xdWVyeXxpbmdyZXNfcmVzdWx0X3NlZWt8aW5ncmVzX3JvbGxiYWNrfGluZ3Jlc19zZXRfZW52aXJvbm1lbnR8JyArDQogICAgICAgICdpbmdyZXNfdW5idWZmZXJlZF9xdWVyeXxpbmlfYWx0ZXJ8aW5pX2dldHxpbmlfZ2V0X2FsbHxpbmlfcmVzdG9yZXxpbmlfc2V0fGlubmFtZXNwYWNlfGlub3RpZnlfYWRkX3dhdGNofGlub3RpZnlfaW5pdHxpbm90aWZ5X3F1ZXVlX2xlbnwnICsNCiAgICAgICAgJ2lub3RpZnlfcmVhZHxpbm90aWZ5X3JtX3dhdGNofGludGVyZmFjZV9leGlzdHN8aW50bF9lcnJvcl9uYW1lfGludGxfZ2V0X2Vycm9yX2NvZGV8aW50bF9nZXRfZXJyb3JfbWVzc2FnZXxpbnRsX2lzX2ZhaWx1cmV8JyArDQogICAgICAgICdpbnRsZGF0ZWZvcm1hdHRlcnxpbnR2YWx8aW52YWxpZGFyZ3VtZW50ZXhjZXB0aW9ufGludm9rZXxpbnZva2VhcmdzfGlwMmxvbmd8aXB0Y2VtYmVkfGlwdGNwYXJzZXxpc19hfGlzX2FycmF5fGlzX2Jvb2x8aXNfY2FsbGFibGV8aXNfZGlyfCcgKw0KICAgICAgICAnaXNfZG91YmxlfGlzX2V4ZWN1dGFibGV8aXNfZmlsZXxpc19maW5pdGV8aXNfZmxvYXR8aXNfaW5maW5pdGV8aXNfaW50fGlzX2ludGVnZXJ8aXNfbGlua3xpc19sb25nfGlzX25hbnxpc19udWxsfGlzX251bWVyaWN8aXNfb2JqZWN0fCcgKw0KICAgICAgICAnaXNfcmVhZGFibGV8aXNfcmVhbHxpc19yZXNvdXJjZXxpc19zY2FsYXJ8aXNfc29hcF9mYXVsdHxpc19zdHJpbmd8aXNfc3ViY2xhc3Nfb2Z8aXNfdXBsb2FkZWRfZmlsZXxpc193cml0YWJsZXxpc193cml0ZWFibGV8aXNhYnN0cmFjdHwnICsNCiAgICAgICAgJ2lzY2xvbmVhYmxlfGlzZGlzYWJsZWR8aXNmaW5hbHxpc2luc3RhbmNlfGlzaW5zdGFudGlhYmxlfGlzaW50ZXJmYWNlfGlzaW50ZXJuYWx8aXNpdGVyYXRlYWJsZXxpc3NldHxpc3N1YmNsYXNzb2Z8aXN1c2VyZGVmaW5lZHxpdGVyYXRvcnwnICsNCiAgICAgICAgJ2l0ZXJhdG9yX2FwcGx5fGl0ZXJhdG9yX2NvdW50fGl0ZXJhdG9yX3RvX2FycmF5fGl0ZXJhdG9yYWdncmVnYXRlfGl0ZXJhdG9yaXRlcmF0b3J8amF2YV9sYXN0X2V4Y2VwdGlvbl9jbGVhcnxqYXZhX2xhc3RfZXhjZXB0aW9uX2dldHwnICsNCiAgICAgICAgJ2pkZGF5b2Z3ZWVrfGpkbW9udGhuYW1lfGpkdG9mcmVuY2h8amR0b2dyZWdvcmlhbnxqZHRvamV3aXNofGpkdG9qdWxpYW58amR0b3VuaXh8amV3aXNodG9qZHxqb2lufGpwZWcyd2JtcHxqc29uX2RlY29kZXxqc29uX2VuY29kZXwnICsNCiAgICAgICAgJ2pzb25fbGFzdF9lcnJvcnxqc29uc2VyaWFsaXphYmxlfGp1ZHl8anVkeV90eXBlfGp1ZHlfdmVyc2lvbnxqdWxpYW50b2pkfGthZG01X2NocGFzc19wcmluY2lwYWx8a2FkbTVfY3JlYXRlX3ByaW5jaXBhbHwnICsNCiAgICAgICAgJ2thZG01X2RlbGV0ZV9wcmluY2lwYWx8a2FkbTVfZGVzdHJveXxrYWRtNV9mbHVzaHxrYWRtNV9nZXRfcG9saWNpZXN8a2FkbTVfZ2V0X3ByaW5jaXBhbHxrYWRtNV9nZXRfcHJpbmNpcGFsc3xrYWRtNV9pbml0X3dpdGhfcGFzc3dvcmR8JyArDQogICAgICAgICdrYWRtNV9tb2RpZnlfcHJpbmNpcGFsfGtleXxrcnNvcnR8a3NvcnR8bGNmaXJzdHxsY2dfdmFsdWV8bGNoZ3JwfGxjaG93bnxsZGFwXzg4NTlfdG9fdDYxfGxkYXBfYWRkfGxkYXBfYmluZHxsZGFwX2Nsb3NlfGxkYXBfY29tcGFyZXwnICsNCiAgICAgICAgJ2xkYXBfY29ubmVjdHxsZGFwX2NvdW50X2VudHJpZXN8bGRhcF9kZWxldGV8bGRhcF9kbjJ1Zm58bGRhcF9lcnIyc3RyfGxkYXBfZXJybm98bGRhcF9lcnJvcnxsZGFwX2V4cGxvZGVfZG58bGRhcF9maXJzdF9hdHRyaWJ1dGV8JyArDQogICAgICAgICdsZGFwX2ZpcnN0X2VudHJ5fGxkYXBfZmlyc3RfcmVmZXJlbmNlfGxkYXBfZnJlZV9yZXN1bHR8bGRhcF9nZXRfYXR0cmlidXRlc3xsZGFwX2dldF9kbnxsZGFwX2dldF9lbnRyaWVzfGxkYXBfZ2V0X29wdGlvbnxsZGFwX2dldF92YWx1ZXN8JyArDQogICAgICAgICdsZGFwX2dldF92YWx1ZXNfbGVufGxkYXBfbGlzdHxsZGFwX21vZF9hZGR8bGRhcF9tb2RfZGVsfGxkYXBfbW9kX3JlcGxhY2V8bGRhcF9tb2RpZnl8bGRhcF9uZXh0X2F0dHJpYnV0ZXxsZGFwX25leHRfZW50cnl8JyArDQogICAgICAgICdsZGFwX25leHRfcmVmZXJlbmNlfGxkYXBfcGFyc2VfcmVmZXJlbmNlfGxkYXBfcGFyc2VfcmVzdWx0fGxkYXBfcmVhZHxsZGFwX3JlbmFtZXxsZGFwX3Nhc2xfYmluZHxsZGFwX3NlYXJjaHxsZGFwX3NldF9vcHRpb258JyArDQogICAgICAgICdsZGFwX3NldF9yZWJpbmRfcHJvY3xsZGFwX3NvcnR8bGRhcF9zdGFydF90bHN8bGRhcF90NjFfdG9fODg1OXxsZGFwX3VuYmluZHxsZW5ndGhleGNlcHRpb258bGV2ZW5zaHRlaW58bGlieG1sX2NsZWFyX2Vycm9yc3wnICsNCiAgICAgICAgJ2xpYnhtbF9kaXNhYmxlX2VudGl0eV9sb2FkZXJ8bGlieG1sX2dldF9lcnJvcnN8bGlieG1sX2dldF9sYXN0X2Vycm9yfGxpYnhtbF9zZXRfc3RyZWFtc19jb250ZXh0fGxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzfGxpYnhtbGVycm9yfCcgKw0KICAgICAgICAnbGltaXRpdGVyYXRvcnxsaW5rfGxpbmtpbmZvfGxpc3R8bG9jYWxlfGxvY2FsZWNvbnZ8bG9jYWx0aW1lfGxvZ3xsb2cxMHxsb2cxcHxsb2dpY2V4Y2VwdGlvbnxsb25nMmlwfGxzdGF0fGx0cmltfGx6Zl9jb21wcmVzc3wnICsNCiAgICAgICAgJ2x6Zl9kZWNvbXByZXNzfGx6Zl9vcHRpbWl6ZWRfZm9yfG1fY2hlY2tzdGF0dXN8bV9jb21wbGV0ZWF1dGhvcml6YXRpb25zfG1fY29ubmVjdHxtX2Nvbm5lY3Rpb25lcnJvcnxtX2RlbGV0ZXRyYW5zfG1fZGVzdHJveWNvbm58JyArDQogICAgICAgICdtX2Rlc3Ryb3llbmdpbmV8bV9nZXRjZWxsfG1fZ2V0Y2VsbGJ5bnVtfG1fZ2V0Y29tbWFkZWxpbWl0ZWR8bV9nZXRoZWFkZXJ8bV9pbml0Y29ubnxtX2luaXRlbmdpbmV8bV9pc2NvbW1hZGVsaW1pdGVkfG1fbWF4Y29ubnRpbWVvdXR8JyArDQogICAgICAgICdtX21vbml0b3J8bV9udW1jb2x1bW5zfG1fbnVtcm93c3xtX3BhcnNlY29tbWFkZWxpbWl0ZWR8bV9yZXNwb25zZWtleXN8bV9yZXNwb25zZXBhcmFtfG1fcmV0dXJuc3RhdHVzfG1fc2V0YmxvY2tpbmd8bV9zZXRkcm9wZmlsZXxtX3NldGlwfCcgKw0KICAgICAgICAnbV9zZXRzc2x8bV9zZXRzc2xfY2FmaWxlfG1fc2V0c3NsX2ZpbGVzfG1fc2V0dGltZW91dHxtX3NzbGNlcnRfZ2VuX2hhc2h8bV90cmFuc2FjdGlvbnNzZW50fG1fdHJhbnNpbnF1ZXVlfG1fdHJhbnNrZXl2YWx8bV90cmFuc25ld3wnICsNCiAgICAgICAgJ21fdHJhbnNzZW5kfG1fdXdhaXR8bV92YWxpZGF0ZWlkZW50aWZpZXJ8bV92ZXJpZnljb25uZWN0aW9ufG1fdmVyaWZ5c3NsY2VydHxtYWdpY19xdW90ZXNfcnVudGltZXxtYWlsfCcgKw0KICAgICAgICAnbWFpbHBhcnNlX2RldGVybWluZV9iZXN0X3hmZXJfZW5jb2Rpbmd8bWFpbHBhcnNlX21zZ19jcmVhdGV8bWFpbHBhcnNlX21zZ19leHRyYWN0X3BhcnR8bWFpbHBhcnNlX21zZ19leHRyYWN0X3BhcnRfZmlsZXwnICsNCiAgICAgICAgJ21haWxwYXJzZV9tc2dfZXh0cmFjdF93aG9sZV9wYXJ0X2ZpbGV8bWFpbHBhcnNlX21zZ19mcmVlfG1haWxwYXJzZV9tc2dfZ2V0X3BhcnR8bWFpbHBhcnNlX21zZ19nZXRfcGFydF9kYXRhfG1haWxwYXJzZV9tc2dfZ2V0X3N0cnVjdHVyZXwnICsNCiAgICAgICAgJ21haWxwYXJzZV9tc2dfcGFyc2V8bWFpbHBhcnNlX21zZ19wYXJzZV9maWxlfG1haWxwYXJzZV9yZmM4MjJfcGFyc2VfYWRkcmVzc2VzfG1haWxwYXJzZV9zdHJlYW1fZW5jb2RlfG1haWxwYXJzZV91dWRlY29kZV9hbGx8bWFpbnxtYXh8JyArDQogICAgICAgICdtYXhkYl9hZmZlY3RlZF9yb3dzfG1heGRiX2F1dG9jb21taXR8bWF4ZGJfYmluZF9wYXJhbXxtYXhkYl9iaW5kX3Jlc3VsdHxtYXhkYl9jaGFuZ2VfdXNlcnxtYXhkYl9jaGFyYWN0ZXJfc2V0X25hbWV8bWF4ZGJfY2xpZW50X2VuY29kaW5nfCcgKw0KICAgICAgICAnbWF4ZGJfY2xvc2V8bWF4ZGJfY2xvc2VfbG9uZ19kYXRhfG1heGRiX2NvbW1pdHxtYXhkYl9jb25uZWN0fG1heGRiX2Nvbm5lY3RfZXJybm98bWF4ZGJfY29ubmVjdF9lcnJvcnxtYXhkYl9kYXRhX3NlZWt8bWF4ZGJfZGVidWd8JyArDQogICAgICAgICdtYXhkYl9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyfG1heGRiX2Rpc2FibGVfcnBsX3BhcnNlfG1heGRiX2R1bXBfZGVidWdfaW5mb3xtYXhkYl9lbWJlZGRlZF9jb25uZWN0fG1heGRiX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnwnICsNCiAgICAgICAgJ21heGRiX2VuYWJsZV9ycGxfcGFyc2V8bWF4ZGJfZXJybm98bWF4ZGJfZXJyb3J8bWF4ZGJfZXNjYXBlX3N0cmluZ3xtYXhkYl9leGVjdXRlfG1heGRiX2ZldGNofG1heGRiX2ZldGNoX2FycmF5fG1heGRiX2ZldGNoX2Fzc29jfCcgKw0KICAgICAgICAnbWF4ZGJfZmV0Y2hfZmllbGR8bWF4ZGJfZmV0Y2hfZmllbGRfZGlyZWN0fG1heGRiX2ZldGNoX2ZpZWxkc3xtYXhkYl9mZXRjaF9sZW5ndGhzfG1heGRiX2ZldGNoX29iamVjdHxtYXhkYl9mZXRjaF9yb3d8bWF4ZGJfZmllbGRfY291bnR8JyArDQogICAgICAgICdtYXhkYl9maWVsZF9zZWVrfG1heGRiX2ZpZWxkX3RlbGx8bWF4ZGJfZnJlZV9yZXN1bHR8bWF4ZGJfZ2V0X2NsaWVudF9pbmZvfG1heGRiX2dldF9jbGllbnRfdmVyc2lvbnxtYXhkYl9nZXRfaG9zdF9pbmZvfG1heGRiX2dldF9tZXRhZGF0YXwnICsNCiAgICAgICAgJ21heGRiX2dldF9wcm90b19pbmZvfG1heGRiX2dldF9zZXJ2ZXJfaW5mb3xtYXhkYl9nZXRfc2VydmVyX3ZlcnNpb258bWF4ZGJfaW5mb3xtYXhkYl9pbml0fG1heGRiX2luc2VydF9pZHxtYXhkYl9raWxsfG1heGRiX21hc3Rlcl9xdWVyeXwnICsNCiAgICAgICAgJ21heGRiX21vcmVfcmVzdWx0c3xtYXhkYl9tdWx0aV9xdWVyeXxtYXhkYl9uZXh0X3Jlc3VsdHxtYXhkYl9udW1fZmllbGRzfG1heGRiX251bV9yb3dzfG1heGRiX29wdGlvbnN8bWF4ZGJfcGFyYW1fY291bnR8bWF4ZGJfcGluZ3wnICsNCiAgICAgICAgJ21heGRiX3ByZXBhcmV8bWF4ZGJfcXVlcnl8bWF4ZGJfcmVhbF9jb25uZWN0fG1heGRiX3JlYWxfZXNjYXBlX3N0cmluZ3xtYXhkYl9yZWFsX3F1ZXJ5fG1heGRiX3JlcG9ydHxtYXhkYl9yb2xsYmFja3wnICsNCiAgICAgICAgJ21heGRiX3JwbF9wYXJzZV9lbmFibGVkfG1heGRiX3JwbF9wcm9iZXxtYXhkYl9ycGxfcXVlcnlfdHlwZXxtYXhkYl9zZWxlY3RfZGJ8bWF4ZGJfc2VuZF9sb25nX2RhdGF8bWF4ZGJfc2VuZF9xdWVyeXxtYXhkYl9zZXJ2ZXJfZW5kfCcgKw0KICAgICAgICAnbWF4ZGJfc2VydmVyX2luaXR8bWF4ZGJfc2V0X29wdHxtYXhkYl9zcWxzdGF0ZXxtYXhkYl9zc2xfc2V0fG1heGRiX3N0YXR8bWF4ZGJfc3RtdF9hZmZlY3RlZF9yb3dzfG1heGRiX3N0bXRfYmluZF9wYXJhbXwnICsNCiAgICAgICAgJ21heGRiX3N0bXRfYmluZF9yZXN1bHR8bWF4ZGJfc3RtdF9jbG9zZXxtYXhkYl9zdG10X2Nsb3NlX2xvbmdfZGF0YXxtYXhkYl9zdG10X2RhdGFfc2Vla3xtYXhkYl9zdG10X2Vycm5vfG1heGRiX3N0bXRfZXJyb3J8JyArDQogICAgICAgICdtYXhkYl9zdG10X2V4ZWN1dGV8bWF4ZGJfc3RtdF9mZXRjaHxtYXhkYl9zdG10X2ZyZWVfcmVzdWx0fG1heGRiX3N0bXRfaW5pdHxtYXhkYl9zdG10X251bV9yb3dzfG1heGRiX3N0bXRfcGFyYW1fY291bnR8bWF4ZGJfc3RtdF9wcmVwYXJlfCcgKw0KICAgICAgICAnbWF4ZGJfc3RtdF9yZXNldHxtYXhkYl9zdG10X3Jlc3VsdF9tZXRhZGF0YXxtYXhkYl9zdG10X3NlbmRfbG9uZ19kYXRhfG1heGRiX3N0bXRfc3Fsc3RhdGV8bWF4ZGJfc3RtdF9zdG9yZV9yZXN1bHR8bWF4ZGJfc3RvcmVfcmVzdWx0fCcgKw0KICAgICAgICAnbWF4ZGJfdGhyZWFkX2lkfG1heGRiX3RocmVhZF9zYWZlfG1heGRiX3VzZV9yZXN1bHR8bWF4ZGJfd2FybmluZ19jb3VudHxtYl9jaGVja19lbmNvZGluZ3xtYl9jb252ZXJ0X2Nhc2V8bWJfY29udmVydF9lbmNvZGluZ3wnICsNCiAgICAgICAgJ21iX2NvbnZlcnRfa2FuYXxtYl9jb252ZXJ0X3ZhcmlhYmxlc3xtYl9kZWNvZGVfbWltZWhlYWRlcnxtYl9kZWNvZGVfbnVtZXJpY2VudGl0eXxtYl9kZXRlY3RfZW5jb2Rpbmd8bWJfZGV0ZWN0X29yZGVyfG1iX2VuY29kZV9taW1laGVhZGVyfCcgKw0KICAgICAgICAnbWJfZW5jb2RlX251bWVyaWNlbnRpdHl8bWJfZW5jb2RpbmdfYWxpYXNlc3xtYl9lcmVnfG1iX2VyZWdfbWF0Y2h8bWJfZXJlZ19yZXBsYWNlfG1iX2VyZWdfc2VhcmNofG1iX2VyZWdfc2VhcmNoX2dldHBvc3wnICsNCiAgICAgICAgJ21iX2VyZWdfc2VhcmNoX2dldHJlZ3N8bWJfZXJlZ19zZWFyY2hfaW5pdHxtYl9lcmVnX3NlYXJjaF9wb3N8bWJfZXJlZ19zZWFyY2hfcmVnc3xtYl9lcmVnX3NlYXJjaF9zZXRwb3N8bWJfZXJlZ2l8bWJfZXJlZ2lfcmVwbGFjZXwnICsNCiAgICAgICAgJ21iX2dldF9pbmZvfG1iX2h0dHBfaW5wdXR8bWJfaHR0cF9vdXRwdXR8bWJfaW50ZXJuYWxfZW5jb2Rpbmd8bWJfbGFuZ3VhZ2V8bWJfbGlzdF9lbmNvZGluZ3N8bWJfb3V0cHV0X2hhbmRsZXJ8bWJfcGFyc2Vfc3RyfCcgKw0KICAgICAgICAnbWJfcHJlZmVycmVkX21pbWVfbmFtZXxtYl9yZWdleF9lbmNvZGluZ3xtYl9yZWdleF9zZXRfb3B0aW9uc3xtYl9zZW5kX21haWx8bWJfc3BsaXR8bWJfc3RyY3V0fG1iX3N0cmltd2lkdGh8bWJfc3RyaXBvc3xtYl9zdHJpc3RyfCcgKw0KICAgICAgICAnbWJfc3RybGVufG1iX3N0cnBvc3xtYl9zdHJyY2hyfG1iX3N0cnJpY2hyfG1iX3N0cnJpcG9zfG1iX3N0cnJwb3N8bWJfc3Ryc3RyfG1iX3N0cnRvbG93ZXJ8bWJfc3RydG91cHBlcnxtYl9zdHJ3aWR0aHwnICsNCiAgICAgICAgJ21iX3N1YnN0aXR1dGVfY2hhcmFjdGVyfG1iX3N1YnN0cnxtYl9zdWJzdHJfY291bnR8bWNyeXB0X2NiY3xtY3J5cHRfY2ZifG1jcnlwdF9jcmVhdGVfaXZ8bWNyeXB0X2RlY3J5cHR8bWNyeXB0X2VjYnwnICsNCiAgICAgICAgJ21jcnlwdF9lbmNfZ2V0X2FsZ29yaXRobXNfbmFtZXxtY3J5cHRfZW5jX2dldF9ibG9ja19zaXplfG1jcnlwdF9lbmNfZ2V0X2l2X3NpemV8bWNyeXB0X2VuY19nZXRfa2V5X3NpemV8bWNyeXB0X2VuY19nZXRfbW9kZXNfbmFtZXwnICsNCiAgICAgICAgJ21jcnlwdF9lbmNfZ2V0X3N1cHBvcnRlZF9rZXlfc2l6ZXN8bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG18bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG1fbW9kZXxtY3J5cHRfZW5jX2lzX2Jsb2NrX21vZGV8JyArDQogICAgICAgICdtY3J5cHRfZW5jX3NlbGZfdGVzdHxtY3J5cHRfZW5jcnlwdHxtY3J5cHRfZ2VuZXJpY3xtY3J5cHRfZ2VuZXJpY19kZWluaXR8bWNyeXB0X2dlbmVyaWNfZW5kfG1jcnlwdF9nZW5lcmljX2luaXR8bWNyeXB0X2dldF9ibG9ja19zaXplfCcgKw0KICAgICAgICAnbWNyeXB0X2dldF9jaXBoZXJfbmFtZXxtY3J5cHRfZ2V0X2l2X3NpemV8bWNyeXB0X2dldF9rZXlfc2l6ZXxtY3J5cHRfbGlzdF9hbGdvcml0aG1zfG1jcnlwdF9saXN0X21vZGVzfG1jcnlwdF9tb2R1bGVfY2xvc2V8JyArDQogICAgICAgICdtY3J5cHRfbW9kdWxlX2dldF9hbGdvX2Jsb2NrX3NpemV8bWNyeXB0X21vZHVsZV9nZXRfYWxnb19rZXlfc2l6ZXxtY3J5cHRfbW9kdWxlX2dldF9zdXBwb3J0ZWRfa2V5X3NpemVzfG1jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtfCcgKw0KICAgICAgICAnbWNyeXB0X21vZHVsZV9pc19ibG9ja19hbGdvcml0aG1fbW9kZXxtY3J5cHRfbW9kdWxlX2lzX2Jsb2NrX21vZGV8bWNyeXB0X21vZHVsZV9vcGVufG1jcnlwdF9tb2R1bGVfc2VsZl90ZXN0fG1jcnlwdF9vZmJ8bWQ1fG1kNV9maWxlfCcgKw0KICAgICAgICAnbWRlY3J5cHRfZ2VuZXJpY3xtZW1jYWNoZXxtZW1jYWNoZV9kZWJ1Z3xtZW1jYWNoZWR8bWVtb3J5X2dldF9wZWFrX3VzYWdlfG1lbW9yeV9nZXRfdXNhZ2V8bWVzc2FnZWZvcm1hdHRlcnxtZXRhcGhvbmV8bWV0aG9kX2V4aXN0c3xtaGFzaHwnICsNCiAgICAgICAgJ21oYXNoX2NvdW50fG1oYXNoX2dldF9ibG9ja19zaXplfG1oYXNoX2dldF9oYXNoX25hbWV8bWhhc2hfa2V5Z2VuX3Mya3xtaWNyb3RpbWV8bWltZV9jb250ZW50X3R5cGV8bWlufG1pbmdfa2V5cHJlc3N8JyArDQogICAgICAgICdtaW5nX3NldGN1YmljdGhyZXNob2xkfG1pbmdfc2V0c2NhbGV8bWluZ19zZXRzd2Zjb21wcmVzc2lvbnxtaW5nX3VzZWNvbnN0YW50c3xtaW5nX3VzZXN3ZnZlcnNpb258bWtkaXJ8bWt0aW1lfG1vbmV5X2Zvcm1hdHxtb25nb3wnICsNCiAgICAgICAgJ21vbmdvYmluZGF0YXxtb25nb2NvZGV8bW9uZ29jb2xsZWN0aW9ufG1vbmdvY29ubmVjdGlvbmV4Y2VwdGlvbnxtb25nb2N1cnNvcnxtb25nb2N1cnNvcmV4Y2VwdGlvbnxtb25nb2N1cnNvcnRpbWVvdXRleGNlcHRpb258bW9uZ29kYXRlfCcgKw0KICAgICAgICAnbW9uZ29kYnxtb25nb2RicmVmfG1vbmdvZXhjZXB0aW9ufG1vbmdvZ3JpZGZzfG1vbmdvZ3JpZGZzY3Vyc29yfG1vbmdvZ3JpZGZzZXhjZXB0aW9ufG1vbmdvZ3JpZGZzZmlsZXxtb25nb2lkfG1vbmdvaW50MzJ8bW9uZ29pbnQ2NHwnICsNCiAgICAgICAgJ21vbmdvbWF4a2V5fG1vbmdvbWlua2V5fG1vbmdvcmVnZXh8bW9uZ290aW1lc3RhbXB8bW92ZV91cGxvYWRlZF9maWxlfG1wZWdmaWxlfG1xc2VyaWVzX2JhY2t8bXFzZXJpZXNfYmVnaW58bXFzZXJpZXNfY2xvc2V8bXFzZXJpZXNfY21pdHwnICsNCiAgICAgICAgJ21xc2VyaWVzX2Nvbm58bXFzZXJpZXNfY29ubnh8bXFzZXJpZXNfZGlzY3xtcXNlcmllc19nZXR8bXFzZXJpZXNfaW5xfG1xc2VyaWVzX29wZW58bXFzZXJpZXNfcHV0fG1xc2VyaWVzX3B1dDF8bXFzZXJpZXNfc2V0fCcgKw0KICAgICAgICAnbXFzZXJpZXNfc3RyZXJyb3J8bXNlc3Npb25fY29ubmVjdHxtc2Vzc2lvbl9jb3VudHxtc2Vzc2lvbl9jcmVhdGV8bXNlc3Npb25fZGVzdHJveXxtc2Vzc2lvbl9kaXNjb25uZWN0fG1zZXNzaW9uX2ZpbmR8bXNlc3Npb25fZ2V0fCcgKw0KICAgICAgICAnbXNlc3Npb25fZ2V0X2FycmF5fG1zZXNzaW9uX2dldF9kYXRhfG1zZXNzaW9uX2luY3xtc2Vzc2lvbl9saXN0fG1zZXNzaW9uX2xpc3R2YXJ8bXNlc3Npb25fbG9ja3xtc2Vzc2lvbl9wbHVnaW58bXNlc3Npb25fcmFuZHN0cnwnICsNCiAgICAgICAgJ21zZXNzaW9uX3NldHxtc2Vzc2lvbl9zZXRfYXJyYXl8bXNlc3Npb25fc2V0X2RhdGF8bXNlc3Npb25fdGltZW91dHxtc2Vzc2lvbl91bmlxfG1zZXNzaW9uX3VubG9ja3xtc2dfZ2V0X3F1ZXVlfG1zZ19xdWV1ZV9leGlzdHN8JyArDQogICAgICAgICdtc2dfcmVjZWl2ZXxtc2dfcmVtb3ZlX3F1ZXVlfG1zZ19zZW5kfG1zZ19zZXRfcXVldWV8bXNnX3N0YXRfcXVldWV8bXNxbHxtc3FsX2FmZmVjdGVkX3Jvd3N8bXNxbF9jbG9zZXxtc3FsX2Nvbm5lY3R8bXNxbF9jcmVhdGVfZGJ8JyArDQogICAgICAgICdtc3FsX2NyZWF0ZWRifG1zcWxfZGF0YV9zZWVrfG1zcWxfZGJfcXVlcnl8bXNxbF9kYm5hbWV8bXNxbF9kcm9wX2RifG1zcWxfZXJyb3J8bXNxbF9mZXRjaF9hcnJheXxtc3FsX2ZldGNoX2ZpZWxkfG1zcWxfZmV0Y2hfb2JqZWN0fCcgKw0KICAgICAgICAnbXNxbF9mZXRjaF9yb3d8bXNxbF9maWVsZF9mbGFnc3xtc3FsX2ZpZWxkX2xlbnxtc3FsX2ZpZWxkX25hbWV8bXNxbF9maWVsZF9zZWVrfG1zcWxfZmllbGRfdGFibGV8bXNxbF9maWVsZF90eXBlfG1zcWxfZmllbGRmbGFnc3wnICsNCiAgICAgICAgJ21zcWxfZmllbGRsZW58bXNxbF9maWVsZG5hbWV8bXNxbF9maWVsZHRhYmxlfG1zcWxfZmllbGR0eXBlfG1zcWxfZnJlZV9yZXN1bHR8bXNxbF9saXN0X2Ric3xtc3FsX2xpc3RfZmllbGRzfG1zcWxfbGlzdF90YWJsZXN8JyArDQogICAgICAgICdtc3FsX251bV9maWVsZHN8bXNxbF9udW1fcm93c3xtc3FsX251bWZpZWxkc3xtc3FsX251bXJvd3N8bXNxbF9wY29ubmVjdHxtc3FsX3F1ZXJ5fG1zcWxfcmVnY2FzZXxtc3FsX3Jlc3VsdHxtc3FsX3NlbGVjdF9kYnxtc3FsX3RhYmxlbmFtZXwnICsNCiAgICAgICAgJ21zc3FsX2JpbmR8bXNzcWxfY2xvc2V8bXNzcWxfY29ubmVjdHxtc3NxbF9kYXRhX3NlZWt8bXNzcWxfZXhlY3V0ZXxtc3NxbF9mZXRjaF9hcnJheXxtc3NxbF9mZXRjaF9hc3NvY3xtc3NxbF9mZXRjaF9iYXRjaHwnICsNCiAgICAgICAgJ21zc3FsX2ZldGNoX2ZpZWxkfG1zc3FsX2ZldGNoX29iamVjdHxtc3NxbF9mZXRjaF9yb3d8bXNzcWxfZmllbGRfbGVuZ3RofG1zc3FsX2ZpZWxkX25hbWV8bXNzcWxfZmllbGRfc2Vla3xtc3NxbF9maWVsZF90eXBlfCcgKw0KICAgICAgICAnbXNzcWxfZnJlZV9yZXN1bHR8bXNzcWxfZnJlZV9zdGF0ZW1lbnR8bXNzcWxfZ2V0X2xhc3RfbWVzc2FnZXxtc3NxbF9ndWlkX3N0cmluZ3xtc3NxbF9pbml0fG1zc3FsX21pbl9lcnJvcl9zZXZlcml0eXwnICsNCiAgICAgICAgJ21zc3FsX21pbl9tZXNzYWdlX3NldmVyaXR5fG1zc3FsX25leHRfcmVzdWx0fG1zc3FsX251bV9maWVsZHN8bXNzcWxfbnVtX3Jvd3N8bXNzcWxfcGNvbm5lY3R8bXNzcWxfcXVlcnl8bXNzcWxfcmVzdWx0fG1zc3FsX3Jvd3NfYWZmZWN0ZWR8JyArDQogICAgICAgICdtc3NxbF9zZWxlY3RfZGJ8bXRfZ2V0cmFuZG1heHxtdF9yYW5kfG10X3NyYW5kfG11bHRpcGxlaXRlcmF0b3J8bXlzcWxfYWZmZWN0ZWRfcm93c3xteXNxbF9jbGllbnRfZW5jb2Rpbmd8bXlzcWxfY2xvc2V8bXlzcWxfY29ubmVjdHwnICsNCiAgICAgICAgJ215c3FsX2NyZWF0ZV9kYnxteXNxbF9kYXRhX3NlZWt8bXlzcWxfZGJfbmFtZXxteXNxbF9kYl9xdWVyeXxteXNxbF9kcm9wX2RifG15c3FsX2Vycm5vfG15c3FsX2Vycm9yfG15c3FsX2VzY2FwZV9zdHJpbmd8bXlzcWxfZmV0Y2hfYXJyYXl8JyArDQogICAgICAgICdteXNxbF9mZXRjaF9hc3NvY3xteXNxbF9mZXRjaF9maWVsZHxteXNxbF9mZXRjaF9sZW5ndGhzfG15c3FsX2ZldGNoX29iamVjdHxteXNxbF9mZXRjaF9yb3d8bXlzcWxfZmllbGRfZmxhZ3N8bXlzcWxfZmllbGRfbGVufCcgKw0KICAgICAgICAnbXlzcWxfZmllbGRfbmFtZXxteXNxbF9maWVsZF9zZWVrfG15c3FsX2ZpZWxkX3RhYmxlfG15c3FsX2ZpZWxkX3R5cGV8bXlzcWxfZnJlZV9yZXN1bHR8bXlzcWxfZ2V0X2NsaWVudF9pbmZvfG15c3FsX2dldF9ob3N0X2luZm98JyArDQogICAgICAgICdteXNxbF9nZXRfcHJvdG9faW5mb3xteXNxbF9nZXRfc2VydmVyX2luZm98bXlzcWxfaW5mb3xteXNxbF9pbnNlcnRfaWR8bXlzcWxfbGlzdF9kYnN8bXlzcWxfbGlzdF9maWVsZHN8bXlzcWxfbGlzdF9wcm9jZXNzZXN8JyArDQogICAgICAgICdteXNxbF9saXN0X3RhYmxlc3xteXNxbF9udW1fZmllbGRzfG15c3FsX251bV9yb3dzfG15c3FsX3Bjb25uZWN0fG15c3FsX3Bpbmd8bXlzcWxfcXVlcnl8bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nfG15c3FsX3Jlc3VsdHwnICsNCiAgICAgICAgJ215c3FsX3NlbGVjdF9kYnxteXNxbF9zZXRfY2hhcnNldHxteXNxbF9zdGF0fG15c3FsX3RhYmxlbmFtZXxteXNxbF90aHJlYWRfaWR8bXlzcWxfdW5idWZmZXJlZF9xdWVyeXxteXNxbGl8bXlzcWxpX2JpbmRfcGFyYW18JyArDQogICAgICAgICdteXNxbGlfYmluZF9yZXN1bHR8bXlzcWxpX2NsaWVudF9lbmNvZGluZ3xteXNxbGlfY29ubmVjdHxteXNxbGlfZGlzYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZGlzYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2RyaXZlcnwnICsNCiAgICAgICAgJ215c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2VuYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2VzY2FwZV9zdHJpbmd8bXlzcWxpX2V4ZWN1dGV8bXlzcWxpX2ZldGNofG15c3FsaV9nZXRfbWV0YWRhdGF8JyArDQogICAgICAgICdteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcmVwb3J0fG15c3FsaV9yZXN1bHR8bXlzcWxpX3JwbF9wYXJzZV9lbmFibGVkfG15c3FsaV9ycGxfcHJvYmV8bXlzcWxpX3JwbF9xdWVyeV90eXBlfCcgKw0KICAgICAgICAnbXlzcWxpX3NlbmRfbG9uZ19kYXRhfG15c3FsaV9zZW5kX3F1ZXJ5fG15c3FsaV9zZXRfb3B0fG15c3FsaV9zbGF2ZV9xdWVyeXxteXNxbGlfc3RtdHxteXNxbGlfd2FybmluZ3xteXNxbG5kX21zX2dldF9zdGF0c3wnICsNCiAgICAgICAgJ215c3FsbmRfbXNfcXVlcnlfaXNfc2VsZWN0fG15c3FsbmRfbXNfc2V0X3VzZXJfcGlja19zZXJ2ZXJ8bXlzcWxuZF9xY19jaGFuZ2VfaGFuZGxlcnxteXNxbG5kX3FjX2NsZWFyX2NhY2hlfG15c3FsbmRfcWNfZ2V0X2NhY2hlX2luZm98JyArDQogICAgICAgICdteXNxbG5kX3FjX2dldF9jb3JlX3N0YXRzfG15c3FsbmRfcWNfZ2V0X2hhbmRsZXJ8bXlzcWxuZF9xY19nZXRfcXVlcnlfdHJhY2VfbG9nfG15c3FsbmRfcWNfc2V0X3VzZXJfaGFuZGxlcnN8bmF0Y2FzZXNvcnR8bmF0c29ydHwnICsNCiAgICAgICAgJ25jdXJzZXNfYWRkY2h8bmN1cnNlc19hZGRjaG5zdHJ8bmN1cnNlc19hZGRjaHN0cnxuY3Vyc2VzX2FkZG5zdHJ8bmN1cnNlc19hZGRzdHJ8bmN1cnNlc19hc3N1bWVfZGVmYXVsdF9jb2xvcnN8bmN1cnNlc19hdHRyb2ZmfCcgKw0KICAgICAgICAnbmN1cnNlc19hdHRyb258bmN1cnNlc19hdHRyc2V0fG5jdXJzZXNfYmF1ZHJhdGV8bmN1cnNlc19iZWVwfG5jdXJzZXNfYmtnZHxuY3Vyc2VzX2JrZ2RzZXR8bmN1cnNlc19ib3JkZXJ8bmN1cnNlc19ib3R0b21fcGFuZWx8JyArDQogICAgICAgICduY3Vyc2VzX2Nhbl9jaGFuZ2VfY29sb3J8bmN1cnNlc19jYnJlYWt8bmN1cnNlc19jbGVhcnxuY3Vyc2VzX2NscnRvYm90fG5jdXJzZXNfY2xydG9lb2x8bmN1cnNlc19jb2xvcl9jb250ZW50fG5jdXJzZXNfY29sb3Jfc2V0fCcgKw0KICAgICAgICAnbmN1cnNlc19jdXJzX3NldHxuY3Vyc2VzX2RlZl9wcm9nX21vZGV8bmN1cnNlc19kZWZfc2hlbGxfbW9kZXxuY3Vyc2VzX2RlZmluZV9rZXl8bmN1cnNlc19kZWxfcGFuZWx8bmN1cnNlc19kZWxheV9vdXRwdXR8bmN1cnNlc19kZWxjaHwnICsNCiAgICAgICAgJ25jdXJzZXNfZGVsZXRlbG58bmN1cnNlc19kZWx3aW58bmN1cnNlc19kb3VwZGF0ZXxuY3Vyc2VzX2VjaG98bmN1cnNlc19lY2hvY2hhcnxuY3Vyc2VzX2VuZHxuY3Vyc2VzX2VyYXNlfG5jdXJzZXNfZXJhc2VjaGFyfG5jdXJzZXNfZmlsdGVyfCcgKw0KICAgICAgICAnbmN1cnNlc19mbGFzaHxuY3Vyc2VzX2ZsdXNoaW5wfG5jdXJzZXNfZ2V0Y2h8bmN1cnNlc19nZXRtYXh5eHxuY3Vyc2VzX2dldG1vdXNlfG5jdXJzZXNfZ2V0eXh8bmN1cnNlc19oYWxmZGVsYXl8bmN1cnNlc19oYXNfY29sb3JzfCcgKw0KICAgICAgICAnbmN1cnNlc19oYXNfaWN8bmN1cnNlc19oYXNfaWx8bmN1cnNlc19oYXNfa2V5fG5jdXJzZXNfaGlkZV9wYW5lbHxuY3Vyc2VzX2hsaW5lfG5jdXJzZXNfaW5jaHxuY3Vyc2VzX2luaXR8bmN1cnNlc19pbml0X2NvbG9yfCcgKw0KICAgICAgICAnbmN1cnNlc19pbml0X3BhaXJ8bmN1cnNlc19pbnNjaHxuY3Vyc2VzX2luc2RlbGxufG5jdXJzZXNfaW5zZXJ0bG58bmN1cnNlc19pbnNzdHJ8bmN1cnNlc19pbnN0cnxuY3Vyc2VzX2lzZW5kd2lufG5jdXJzZXNfa2V5b2t8JyArDQogICAgICAgICduY3Vyc2VzX2tleXBhZHxuY3Vyc2VzX2tpbGxjaGFyfG5jdXJzZXNfbG9uZ25hbWV8bmN1cnNlc19tZXRhfG5jdXJzZXNfbW91c2VfdHJhZm98bmN1cnNlc19tb3VzZWludGVydmFsfG5jdXJzZXNfbW91c2VtYXNrfG5jdXJzZXNfbW92ZXwnICsNCiAgICAgICAgJ25jdXJzZXNfbW92ZV9wYW5lbHxuY3Vyc2VzX212YWRkY2h8bmN1cnNlc19tdmFkZGNobnN0cnxuY3Vyc2VzX212YWRkY2hzdHJ8bmN1cnNlc19tdmFkZG5zdHJ8bmN1cnNlc19tdmFkZHN0cnxuY3Vyc2VzX212Y3VyfCcgKw0KICAgICAgICAnbmN1cnNlc19tdmRlbGNofG5jdXJzZXNfbXZnZXRjaHxuY3Vyc2VzX212aGxpbmV8bmN1cnNlc19tdmluY2h8bmN1cnNlc19tdnZsaW5lfG5jdXJzZXNfbXZ3YWRkc3RyfG5jdXJzZXNfbmFwbXN8bmN1cnNlc19uZXdfcGFuZWx8JyArDQogICAgICAgICduY3Vyc2VzX25ld3BhZHxuY3Vyc2VzX25ld3dpbnxuY3Vyc2VzX25sfG5jdXJzZXNfbm9jYnJlYWt8bmN1cnNlc19ub2VjaG98bmN1cnNlc19ub25sfG5jdXJzZXNfbm9xaWZsdXNofG5jdXJzZXNfbm9yYXd8JyArDQogICAgICAgICduY3Vyc2VzX3BhaXJfY29udGVudHxuY3Vyc2VzX3BhbmVsX2Fib3ZlfG5jdXJzZXNfcGFuZWxfYmVsb3d8bmN1cnNlc19wYW5lbF93aW5kb3d8bmN1cnNlc19wbm91dHJlZnJlc2h8bmN1cnNlc19wcmVmcmVzaHxuY3Vyc2VzX3B1dHB8JyArDQogICAgICAgICduY3Vyc2VzX3FpZmx1c2h8bmN1cnNlc19yYXd8bmN1cnNlc19yZWZyZXNofG5jdXJzZXNfcmVwbGFjZV9wYW5lbHxuY3Vyc2VzX3Jlc2V0X3Byb2dfbW9kZXxuY3Vyc2VzX3Jlc2V0X3NoZWxsX21vZGV8bmN1cnNlc19yZXNldHR5fCcgKw0KICAgICAgICAnbmN1cnNlc19zYXZldHR5fG5jdXJzZXNfc2NyX2R1bXB8bmN1cnNlc19zY3JfaW5pdHxuY3Vyc2VzX3Njcl9yZXN0b3JlfG5jdXJzZXNfc2NyX3NldHxuY3Vyc2VzX3Njcmx8bmN1cnNlc19zaG93X3BhbmVsfG5jdXJzZXNfc2xrX2F0dHJ8JyArDQogICAgICAgICduY3Vyc2VzX3Nsa19hdHRyb2ZmfG5jdXJzZXNfc2xrX2F0dHJvbnxuY3Vyc2VzX3Nsa19hdHRyc2V0fG5jdXJzZXNfc2xrX2NsZWFyfG5jdXJzZXNfc2xrX2NvbG9yfG5jdXJzZXNfc2xrX2luaXR8bmN1cnNlc19zbGtfbm91dHJlZnJlc2h8JyArDQogICAgICAgICduY3Vyc2VzX3Nsa19yZWZyZXNofG5jdXJzZXNfc2xrX3Jlc3RvcmV8bmN1cnNlc19zbGtfc2V0fG5jdXJzZXNfc2xrX3RvdWNofG5jdXJzZXNfc3RhbmRlbmR8bmN1cnNlc19zdGFuZG91dHxuY3Vyc2VzX3N0YXJ0X2NvbG9yfCcgKw0KICAgICAgICAnbmN1cnNlc190ZXJtYXR0cnN8bmN1cnNlc190ZXJtbmFtZXxuY3Vyc2VzX3RpbWVvdXR8bmN1cnNlc190b3BfcGFuZWx8bmN1cnNlc190eXBlYWhlYWR8bmN1cnNlc191bmdldGNofG5jdXJzZXNfdW5nZXRtb3VzZXwnICsNCiAgICAgICAgJ25jdXJzZXNfdXBkYXRlX3BhbmVsc3xuY3Vyc2VzX3VzZV9kZWZhdWx0X2NvbG9yc3xuY3Vyc2VzX3VzZV9lbnZ8bmN1cnNlc191c2VfZXh0ZW5kZWRfbmFtZXN8bmN1cnNlc192aWRhdHRyfG5jdXJzZXNfdmxpbmV8bmN1cnNlc193YWRkY2h8JyArDQogICAgICAgICduY3Vyc2VzX3dhZGRzdHJ8bmN1cnNlc193YXR0cm9mZnxuY3Vyc2VzX3dhdHRyb258bmN1cnNlc193YXR0cnNldHxuY3Vyc2VzX3dib3JkZXJ8bmN1cnNlc193Y2xlYXJ8bmN1cnNlc193Y29sb3Jfc2V0fG5jdXJzZXNfd2VyYXNlfCcgKw0KICAgICAgICAnbmN1cnNlc193Z2V0Y2h8bmN1cnNlc193aGxpbmV8bmN1cnNlc193bW91c2VfdHJhZm98bmN1cnNlc193bW92ZXxuY3Vyc2VzX3dub3V0cmVmcmVzaHxuY3Vyc2VzX3dyZWZyZXNofG5jdXJzZXNfd3N0YW5kZW5kfCcgKw0KICAgICAgICAnbmN1cnNlc193c3RhbmRvdXR8bmN1cnNlc193dmxpbmV8bmV3aW5zdGFuY2V8bmV3aW5zdGFuY2VhcmdzfG5ld3RfYmVsbHxuZXd0X2J1dHRvbnxuZXd0X2J1dHRvbl9iYXJ8bmV3dF9jZW50ZXJlZF93aW5kb3d8bmV3dF9jaGVja2JveHwnICsNCiAgICAgICAgJ25ld3RfY2hlY2tib3hfZ2V0X3ZhbHVlfG5ld3RfY2hlY2tib3hfc2V0X2ZsYWdzfG5ld3RfY2hlY2tib3hfc2V0X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZXxuZXd0X2NoZWNrYm94X3RyZWVfYWRkX2l0ZW18JyArDQogICAgICAgICduZXd0X2NoZWNrYm94X3RyZWVfZmluZF9pdGVtfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfY3VycmVudHxuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X2VudHJ5X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfbXVsdGlfc2VsZWN0aW9ufCcgKw0KICAgICAgICAnbmV3dF9jaGVja2JveF90cmVlX2dldF9zZWxlY3Rpb258bmV3dF9jaGVja2JveF90cmVlX211bHRpfG5ld3RfY2hlY2tib3hfdHJlZV9zZXRfY3VycmVudHxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2VudHJ5fCcgKw0KICAgICAgICAnbmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeV92YWx1ZXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X3dpZHRofG5ld3RfY2xlYXJfa2V5X2J1ZmZlcnxuZXd0X2Nsc3xuZXd0X2NvbXBhY3RfYnV0dG9ufCcgKw0KICAgICAgICAnbmV3dF9jb21wb25lbnRfYWRkX2NhbGxiYWNrfG5ld3RfY29tcG9uZW50X3Rha2VzX2ZvY3VzfG5ld3RfY3JlYXRlX2dyaWR8bmV3dF9jdXJzb3Jfb2ZmfG5ld3RfY3Vyc29yX29ufG5ld3RfZGVsYXl8bmV3dF9kcmF3X2Zvcm18JyArDQogICAgICAgICduZXd0X2RyYXdfcm9vdF90ZXh0fG5ld3RfZW50cnl8bmV3dF9lbnRyeV9nZXRfdmFsdWV8bmV3dF9lbnRyeV9zZXR8bmV3dF9lbnRyeV9zZXRfZmlsdGVyfG5ld3RfZW50cnlfc2V0X2ZsYWdzfG5ld3RfZmluaXNoZWR8bmV3dF9mb3JtfCcgKw0KICAgICAgICAnbmV3dF9mb3JtX2FkZF9jb21wb25lbnR8bmV3dF9mb3JtX2FkZF9jb21wb25lbnRzfG5ld3RfZm9ybV9hZGRfaG90X2tleXxuZXd0X2Zvcm1fZGVzdHJveXxuZXd0X2Zvcm1fZ2V0X2N1cnJlbnR8bmV3dF9mb3JtX3J1bnwnICsNCiAgICAgICAgJ25ld3RfZm9ybV9zZXRfYmFja2dyb3VuZHxuZXd0X2Zvcm1fc2V0X2hlaWdodHxuZXd0X2Zvcm1fc2V0X3NpemV8bmV3dF9mb3JtX3NldF90aW1lcnxuZXd0X2Zvcm1fc2V0X3dpZHRofG5ld3RfZm9ybV93YXRjaF9mZHwnICsNCiAgICAgICAgJ25ld3RfZ2V0X3NjcmVlbl9zaXplfG5ld3RfZ3JpZF9hZGRfY29tcG9uZW50c190b19mb3JtfG5ld3RfZ3JpZF9iYXNpY193aW5kb3d8bmV3dF9ncmlkX2ZyZWV8bmV3dF9ncmlkX2dldF9zaXplfG5ld3RfZ3JpZF9oX2Nsb3NlX3N0YWNrZWR8JyArDQogICAgICAgICduZXd0X2dyaWRfaF9zdGFja2VkfG5ld3RfZ3JpZF9wbGFjZXxuZXd0X2dyaWRfc2V0X2ZpZWxkfG5ld3RfZ3JpZF9zaW1wbGVfd2luZG93fG5ld3RfZ3JpZF92X2Nsb3NlX3N0YWNrZWR8bmV3dF9ncmlkX3Zfc3RhY2tlZHwnICsNCiAgICAgICAgJ25ld3RfZ3JpZF93cmFwcGVkX3dpbmRvd3xuZXd0X2dyaWRfd3JhcHBlZF93aW5kb3dfYXR8bmV3dF9pbml0fG5ld3RfbGFiZWx8bmV3dF9sYWJlbF9zZXRfdGV4dHxuZXd0X2xpc3Rib3h8bmV3dF9saXN0Ym94X2FwcGVuZF9lbnRyeXwnICsNCiAgICAgICAgJ25ld3RfbGlzdGJveF9jbGVhcnxuZXd0X2xpc3Rib3hfY2xlYXJfc2VsZWN0aW9ufG5ld3RfbGlzdGJveF9kZWxldGVfZW50cnl8bmV3dF9saXN0Ym94X2dldF9jdXJyZW50fG5ld3RfbGlzdGJveF9nZXRfc2VsZWN0aW9ufCcgKw0KICAgICAgICAnbmV3dF9saXN0Ym94X2luc2VydF9lbnRyeXxuZXd0X2xpc3Rib3hfaXRlbV9jb3VudHxuZXd0X2xpc3Rib3hfc2VsZWN0X2l0ZW18bmV3dF9saXN0Ym94X3NldF9jdXJyZW50fG5ld3RfbGlzdGJveF9zZXRfY3VycmVudF9ieV9rZXl8JyArDQogICAgICAgICduZXd0X2xpc3Rib3hfc2V0X2RhdGF8bmV3dF9saXN0Ym94X3NldF9lbnRyeXxuZXd0X2xpc3Rib3hfc2V0X3dpZHRofG5ld3RfbGlzdGl0ZW18bmV3dF9saXN0aXRlbV9nZXRfZGF0YXxuZXd0X2xpc3RpdGVtX3NldHwnICsNCiAgICAgICAgJ25ld3Rfb3Blbl93aW5kb3d8bmV3dF9wb3BfaGVscF9saW5lfG5ld3RfcG9wX3dpbmRvd3xuZXd0X3B1c2hfaGVscF9saW5lfG5ld3RfcmFkaW9fZ2V0X2N1cnJlbnR8bmV3dF9yYWRpb2J1dHRvbnxuZXd0X3JlZHJhd19oZWxwX2xpbmV8JyArDQogICAgICAgICduZXd0X3JlZmxvd190ZXh0fG5ld3RfcmVmcmVzaHxuZXd0X3Jlc2l6ZV9zY3JlZW58bmV3dF9yZXN1bWV8bmV3dF9ydW5fZm9ybXxuZXd0X3NjYWxlfG5ld3Rfc2NhbGVfc2V0fG5ld3Rfc2Nyb2xsYmFyX3NldHwnICsNCiAgICAgICAgJ25ld3Rfc2V0X2hlbHBfY2FsbGJhY2t8bmV3dF9zZXRfc3VzcGVuZF9jYWxsYmFja3xuZXd0X3N1c3BlbmR8bmV3dF90ZXh0Ym94fG5ld3RfdGV4dGJveF9nZXRfbnVtX2xpbmVzfG5ld3RfdGV4dGJveF9yZWZsb3dlZHwnICsNCiAgICAgICAgJ25ld3RfdGV4dGJveF9zZXRfaGVpZ2h0fG5ld3RfdGV4dGJveF9zZXRfdGV4dHxuZXd0X3ZlcnRpY2FsX3Njcm9sbGJhcnxuZXd0X3dhaXRfZm9yX2tleXxuZXd0X3dpbl9jaG9pY2V8bmV3dF93aW5fZW50cmllc3xuZXd0X3dpbl9tZW51fCcgKw0KICAgICAgICAnbmV3dF93aW5fbWVzc2FnZXxuZXd0X3dpbl9tZXNzYWdldnxuZXd0X3dpbl90ZXJuYXJ5fG5leHR8bmdldHRleHR8bmwyYnJ8bmxfbGFuZ2luZm98bm9yZXdpbmRpdGVyYXRvcnxub3JtYWxpemVyfG5vdGVzX2JvZHl8bm90ZXNfY29weV9kYnwnICsNCiAgICAgICAgJ25vdGVzX2NyZWF0ZV9kYnxub3Rlc19jcmVhdGVfbm90ZXxub3Rlc19kcm9wX2RifG5vdGVzX2ZpbmRfbm90ZXxub3Rlc19oZWFkZXJfaW5mb3xub3Rlc19saXN0X21zZ3N8bm90ZXNfbWFya19yZWFkfG5vdGVzX21hcmtfdW5yZWFkfCcgKw0KICAgICAgICAnbm90ZXNfbmF2X2NyZWF0ZXxub3Rlc19zZWFyY2h8bm90ZXNfdW5yZWFkfG5vdGVzX3ZlcnNpb258bnNhcGlfcmVxdWVzdF9oZWFkZXJzfG5zYXBpX3Jlc3BvbnNlX2hlYWRlcnN8bnNhcGlfdmlydHVhbHxudGhtYWN8bnVtYmVyX2Zvcm1hdHwnICsNCiAgICAgICAgJ251bWJlcmZvcm1hdHRlcnxvYXV0aHxvYXV0aF9nZXRfc2JzfG9hdXRoX3VybGVuY29kZXxvYXV0aGV4Y2VwdGlvbnxvYXV0aHByb3ZpZGVyfG9iX2NsZWFufG9iX2RlZmxhdGVoYW5kbGVyfG9iX2VuZF9jbGVhbnxvYl9lbmRfZmx1c2h8JyArDQogICAgICAgICdvYl9ldGFnaGFuZGxlcnxvYl9mbHVzaHxvYl9nZXRfY2xlYW58b2JfZ2V0X2NvbnRlbnRzfG9iX2dldF9mbHVzaHxvYl9nZXRfbGVuZ3RofG9iX2dldF9sZXZlbHxvYl9nZXRfc3RhdHVzfG9iX2d6aGFuZGxlcnxvYl9pY29udl9oYW5kbGVyfCcgKw0KICAgICAgICAnb2JfaW1wbGljaXRfZmx1c2h8b2JfaW5mbGF0ZWhhbmRsZXJ8b2JfbGlzdF9oYW5kbGVyc3xvYl9zdGFydHxvYl90aWR5aGFuZGxlcnxvY2lfYmluZF9hcnJheV9ieV9uYW1lfG9jaV9iaW5kX2J5X25hbWV8b2NpX2NhbmNlbHwnICsNCiAgICAgICAgJ29jaV9jbGllbnRfdmVyc2lvbnxvY2lfY2xvc2V8b2NpX2NvbGxlY3Rpb25fYXBwZW5kfG9jaV9jb2xsZWN0aW9uX2Fzc2lnbnxvY2lfY29sbGVjdGlvbl9lbGVtZW50X2Fzc2lnbnxvY2lfY29sbGVjdGlvbl9lbGVtZW50X2dldHwnICsNCiAgICAgICAgJ29jaV9jb2xsZWN0aW9uX2ZyZWV8b2NpX2NvbGxlY3Rpb25fbWF4fG9jaV9jb2xsZWN0aW9uX3NpemV8b2NpX2NvbGxlY3Rpb25fdHJpbXxvY2lfY29tbWl0fG9jaV9jb25uZWN0fG9jaV9kZWZpbmVfYnlfbmFtZXxvY2lfZXJyb3J8JyArDQogICAgICAgICdvY2lfZXhlY3V0ZXxvY2lfZmV0Y2h8b2NpX2ZldGNoX2FsbHxvY2lfZmV0Y2hfYXJyYXl8b2NpX2ZldGNoX2Fzc29jfG9jaV9mZXRjaF9vYmplY3R8b2NpX2ZldGNoX3Jvd3xvY2lfZmllbGRfaXNfbnVsbHxvY2lfZmllbGRfbmFtZXwnICsNCiAgICAgICAgJ29jaV9maWVsZF9wcmVjaXNpb258b2NpX2ZpZWxkX3NjYWxlfG9jaV9maWVsZF9zaXplfG9jaV9maWVsZF90eXBlfG9jaV9maWVsZF90eXBlX3Jhd3xvY2lfZnJlZV9zdGF0ZW1lbnR8b2NpX2ludGVybmFsX2RlYnVnfG9jaV9sb2JfYXBwZW5kfCcgKw0KICAgICAgICAnb2NpX2xvYl9jbG9zZXxvY2lfbG9iX2NvcHl8b2NpX2xvYl9lb2Z8b2NpX2xvYl9lcmFzZXxvY2lfbG9iX2V4cG9ydHxvY2lfbG9iX2ZsdXNofG9jaV9sb2JfZnJlZXxvY2lfbG9iX2dldGJ1ZmZlcmluZ3xvY2lfbG9iX2ltcG9ydHwnICsNCiAgICAgICAgJ29jaV9sb2JfaXNfZXF1YWx8b2NpX2xvYl9sb2FkfG9jaV9sb2JfcmVhZHxvY2lfbG9iX3Jld2luZHxvY2lfbG9iX3NhdmV8b2NpX2xvYl9zYXZlZmlsZXxvY2lfbG9iX3NlZWt8b2NpX2xvYl9zZXRidWZmZXJpbmd8b2NpX2xvYl9zaXplfCcgKw0KICAgICAgICAnb2NpX2xvYl90ZWxsfG9jaV9sb2JfdHJ1bmNhdGV8b2NpX2xvYl93cml0ZXxvY2lfbG9iX3dyaXRldGVtcG9yYXJ5fG9jaV9sb2Jfd3JpdGV0b2ZpbGV8b2NpX25ld19jb2xsZWN0aW9ufG9jaV9uZXdfY29ubmVjdHxvY2lfbmV3X2N1cnNvcnwnICsNCiAgICAgICAgJ29jaV9uZXdfZGVzY3JpcHRvcnxvY2lfbnVtX2ZpZWxkc3xvY2lfbnVtX3Jvd3N8b2NpX3BhcnNlfG9jaV9wYXNzd29yZF9jaGFuZ2V8b2NpX3Bjb25uZWN0fG9jaV9yZXN1bHR8b2NpX3JvbGxiYWNrfG9jaV9zZXJ2ZXJfdmVyc2lvbnwnICsNCiAgICAgICAgJ29jaV9zZXRfYWN0aW9ufG9jaV9zZXRfY2xpZW50X2lkZW50aWZpZXJ8b2NpX3NldF9jbGllbnRfaW5mb3xvY2lfc2V0X2VkaXRpb258b2NpX3NldF9tb2R1bGVfbmFtZXxvY2lfc2V0X3ByZWZldGNofG9jaV9zdGF0ZW1lbnRfdHlwZXwnICsNCiAgICAgICAgJ29jaWJpbmRieW5hbWV8b2NpY2FuY2VsfG9jaWNsb3NlbG9ifG9jaWNvbGxhcHBlbmR8b2NpY29sbGFzc2lnbnxvY2ljb2xsYXNzaWduZWxlbXxvY2ljb2xsZ2V0ZWxlbXxvY2ljb2xsbWF4fG9jaWNvbGxzaXplfG9jaWNvbGx0cmltfCcgKw0KICAgICAgICAnb2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfG9jaWNvbHVtbnNpemV8b2NpY29sdW1udHlwZXxvY2ljb2x1bW50eXBlcmF3fG9jaWNvbW1pdHxvY2lkZWZpbmVieW5hbWV8JyArDQogICAgICAgICdvY2llcnJvcnxvY2lleGVjdXRlfG9jaWZldGNofG9jaWZldGNoaW50b3xvY2lmZXRjaHN0YXRlbWVudHxvY2lmcmVlY29sbGVjdGlvbnxvY2lmcmVlY3Vyc29yfG9jaWZyZWVkZXNjfG9jaWZyZWVzdGF0ZW1lbnR8b2NpaW50ZXJuYWxkZWJ1Z3wnICsNCiAgICAgICAgJ29jaWxvYWRsb2J8b2NpbG9nb2ZmfG9jaWxvZ29ufG9jaW5ld2NvbGxlY3Rpb258b2NpbmV3Y3Vyc29yfG9jaW5ld2Rlc2NyaXB0b3J8b2NpbmxvZ29ufG9jaW51bWNvbHN8b2NpcGFyc2V8b2NpcGxvZ29ufG9jaXJlc3VsdHwnICsNCiAgICAgICAgJ29jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8b2Npc2VydmVydmVyc2lvbnxvY2lzZXRwcmVmZXRjaHxvY2lzdGF0ZW1lbnR0eXBlfG9jaXdyaXRlbG9idG9maWxlfG9jaXdyaXRldGVtcG9yYXJ5bG9ifCcgKw0KICAgICAgICAnb2N0ZGVjfG9kYmNfYXV0b2NvbW1pdHxvZGJjX2Jpbm1vZGV8b2RiY19jbG9zZXxvZGJjX2Nsb3NlX2FsbHxvZGJjX2NvbHVtbnByaXZpbGVnZXN8b2RiY19jb2x1bW5zfG9kYmNfY29tbWl0fG9kYmNfY29ubmVjdHxvZGJjX2N1cnNvcnwnICsNCiAgICAgICAgJ29kYmNfZGF0YV9zb3VyY2V8b2RiY19kb3xvZGJjX2Vycm9yfG9kYmNfZXJyb3Jtc2d8b2RiY19leGVjfG9kYmNfZXhlY3V0ZXxvZGJjX2ZldGNoX2FycmF5fG9kYmNfZmV0Y2hfaW50b3xvZGJjX2ZldGNoX29iamVjdHwnICsNCiAgICAgICAgJ29kYmNfZmV0Y2hfcm93fG9kYmNfZmllbGRfbGVufG9kYmNfZmllbGRfbmFtZXxvZGJjX2ZpZWxkX251bXxvZGJjX2ZpZWxkX3ByZWNpc2lvbnxvZGJjX2ZpZWxkX3NjYWxlfG9kYmNfZmllbGRfdHlwZXxvZGJjX2ZvcmVpZ25rZXlzfCcgKw0KICAgICAgICAnb2RiY19mcmVlX3Jlc3VsdHxvZGJjX2dldHR5cGVpbmZvfG9kYmNfbG9uZ3JlYWRsZW58b2RiY19uZXh0X3Jlc3VsdHxvZGJjX251bV9maWVsZHN8b2RiY19udW1fcm93c3xvZGJjX3Bjb25uZWN0fG9kYmNfcHJlcGFyZXwnICsNCiAgICAgICAgJ29kYmNfcHJpbWFyeWtleXN8b2RiY19wcm9jZWR1cmVjb2x1bW5zfG9kYmNfcHJvY2VkdXJlc3xvZGJjX3Jlc3VsdHxvZGJjX3Jlc3VsdF9hbGx8b2RiY19yb2xsYmFja3xvZGJjX3NldG9wdGlvbnxvZGJjX3NwZWNpYWxjb2x1bW5zfCcgKw0KICAgICAgICAnb2RiY19zdGF0aXN0aWNzfG9kYmNfdGFibGVwcml2aWxlZ2VzfG9kYmNfdGFibGVzfG9wZW5hbF9idWZmZXJfY3JlYXRlfG9wZW5hbF9idWZmZXJfZGF0YXxvcGVuYWxfYnVmZmVyX2Rlc3Ryb3l8b3BlbmFsX2J1ZmZlcl9nZXR8JyArDQogICAgICAgICdvcGVuYWxfYnVmZmVyX2xvYWR3YXZ8b3BlbmFsX2NvbnRleHRfY3JlYXRlfG9wZW5hbF9jb250ZXh0X2N1cnJlbnR8b3BlbmFsX2NvbnRleHRfZGVzdHJveXxvcGVuYWxfY29udGV4dF9wcm9jZXNzfG9wZW5hbF9jb250ZXh0X3N1c3BlbmR8JyArDQogICAgICAgICdvcGVuYWxfZGV2aWNlX2Nsb3NlfG9wZW5hbF9kZXZpY2Vfb3BlbnxvcGVuYWxfbGlzdGVuZXJfZ2V0fG9wZW5hbF9saXN0ZW5lcl9zZXR8b3BlbmFsX3NvdXJjZV9jcmVhdGV8b3BlbmFsX3NvdXJjZV9kZXN0cm95fCcgKw0KICAgICAgICAnb3BlbmFsX3NvdXJjZV9nZXR8b3BlbmFsX3NvdXJjZV9wYXVzZXxvcGVuYWxfc291cmNlX3BsYXl8b3BlbmFsX3NvdXJjZV9yZXdpbmR8b3BlbmFsX3NvdXJjZV9zZXR8b3BlbmFsX3NvdXJjZV9zdG9wfG9wZW5hbF9zdHJlYW18b3BlbmRpcnwnICsNCiAgICAgICAgJ29wZW5sb2d8b3BlbnNzbF9jaXBoZXJfaXZfbGVuZ3RofG9wZW5zc2xfY3NyX2V4cG9ydHxvcGVuc3NsX2Nzcl9leHBvcnRfdG9fZmlsZXxvcGVuc3NsX2Nzcl9nZXRfcHVibGljX2tleXxvcGVuc3NsX2Nzcl9nZXRfc3ViamVjdHwnICsNCiAgICAgICAgJ29wZW5zc2xfY3NyX25ld3xvcGVuc3NsX2Nzcl9zaWdufG9wZW5zc2xfZGVjcnlwdHxvcGVuc3NsX2RoX2NvbXB1dGVfa2V5fG9wZW5zc2xfZGlnZXN0fG9wZW5zc2xfZW5jcnlwdHxvcGVuc3NsX2Vycm9yX3N0cmluZ3wnICsNCiAgICAgICAgJ29wZW5zc2xfZnJlZV9rZXl8b3BlbnNzbF9nZXRfY2lwaGVyX21ldGhvZHN8b3BlbnNzbF9nZXRfbWRfbWV0aG9kc3xvcGVuc3NsX2dldF9wcml2YXRla2V5fG9wZW5zc2xfZ2V0X3B1YmxpY2tleXxvcGVuc3NsX29wZW58JyArDQogICAgICAgICdvcGVuc3NsX3BrY3MxMl9leHBvcnR8b3BlbnNzbF9wa2NzMTJfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9wa2NzMTJfcmVhZHxvcGVuc3NsX3BrY3M3X2RlY3J5cHR8b3BlbnNzbF9wa2NzN19lbmNyeXB0fG9wZW5zc2xfcGtjczdfc2lnbnwnICsNCiAgICAgICAgJ29wZW5zc2xfcGtjczdfdmVyaWZ5fG9wZW5zc2xfcGtleV9leHBvcnR8b3BlbnNzbF9wa2V5X2V4cG9ydF90b19maWxlfG9wZW5zc2xfcGtleV9mcmVlfG9wZW5zc2xfcGtleV9nZXRfZGV0YWlsc3xvcGVuc3NsX3BrZXlfZ2V0X3ByaXZhdGV8JyArDQogICAgICAgICdvcGVuc3NsX3BrZXlfZ2V0X3B1YmxpY3xvcGVuc3NsX3BrZXlfbmV3fG9wZW5zc2xfcHJpdmF0ZV9kZWNyeXB0fG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0fG9wZW5zc2xfcHVibGljX2RlY3J5cHR8b3BlbnNzbF9wdWJsaWNfZW5jcnlwdHwnICsNCiAgICAgICAgJ29wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlc3xvcGVuc3NsX3NlYWx8b3BlbnNzbF9zaWdufG9wZW5zc2xfdmVyaWZ5fG9wZW5zc2xfeDUwOV9jaGVja19wcml2YXRlX2tleXxvcGVuc3NsX3g1MDlfY2hlY2twdXJwb3NlfCcgKw0KICAgICAgICAnb3BlbnNzbF94NTA5X2V4cG9ydHxvcGVuc3NsX3g1MDlfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF94NTA5X2ZyZWV8b3BlbnNzbF94NTA5X3BhcnNlfG9wZW5zc2xfeDUwOV9yZWFkfG9yZHxvdXRlcml0ZXJhdG9yfCcgKw0KICAgICAgICAnb3V0b2Zib3VuZHNleGNlcHRpb258b3V0b2ZyYW5nZWV4Y2VwdGlvbnxvdXRwdXRfYWRkX3Jld3JpdGVfdmFyfG91dHB1dF9yZXNldF9yZXdyaXRlX3ZhcnN8b3ZlcmZsb3dleGNlcHRpb258b3ZlcmxvYWR8b3ZlcnJpZGVfZnVuY3Rpb258JyArDQogICAgICAgICdvdnJpbW9zX2Nsb3NlfG92cmltb3NfY29tbWl0fG92cmltb3NfY29ubmVjdHxvdnJpbW9zX2N1cnNvcnxvdnJpbW9zX2V4ZWN8b3ZyaW1vc19leGVjdXRlfG92cmltb3NfZmV0Y2hfaW50b3xvdnJpbW9zX2ZldGNoX3Jvd3wnICsNCiAgICAgICAgJ292cmltb3NfZmllbGRfbGVufG92cmltb3NfZmllbGRfbmFtZXxvdnJpbW9zX2ZpZWxkX251bXxvdnJpbW9zX2ZpZWxkX3R5cGV8b3ZyaW1vc19mcmVlX3Jlc3VsdHxvdnJpbW9zX2xvbmdyZWFkbGVufG92cmltb3NfbnVtX2ZpZWxkc3wnICsNCiAgICAgICAgJ292cmltb3NfbnVtX3Jvd3N8b3ZyaW1vc19wcmVwYXJlfG92cmltb3NfcmVzdWx0fG92cmltb3NfcmVzdWx0X2FsbHxvdnJpbW9zX3JvbGxiYWNrfHBhY2t8cGFyZW50aXRlcmF0b3J8cGFyc2VfaW5pX2ZpbGV8cGFyc2VfaW5pX3N0cmluZ3wnICsNCiAgICAgICAgJ3BhcnNlX3N0cnxwYXJzZV91cmx8cGFyc2VraXRfY29tcGlsZV9maWxlfHBhcnNla2l0X2NvbXBpbGVfc3RyaW5nfHBhcnNla2l0X2Z1bmNfYXJnaW5mb3xwYXNzdGhydXxwYXRoaW5mb3xwY2xvc2V8cGNudGxfYWxhcm18cGNudGxfZXhlY3wnICsNCiAgICAgICAgJ3BjbnRsX2Zvcmt8cGNudGxfZ2V0cHJpb3JpdHl8cGNudGxfc2V0cHJpb3JpdHl8cGNudGxfc2lnbmFsfHBjbnRsX3NpZ25hbF9kaXNwYXRjaHxwY250bF9zaWdwcm9jbWFza3xwY250bF9zaWd0aW1lZHdhaXR8cGNudGxfc2lnd2FpdGluZm98JyArDQogICAgICAgICdwY250bF93YWl0fHBjbnRsX3dhaXRwaWR8cGNudGxfd2V4aXRzdGF0dXN8cGNudGxfd2lmZXhpdGVkfHBjbnRsX3dpZnNpZ25hbGVkfHBjbnRsX3dpZnN0b3BwZWR8cGNudGxfd3N0b3BzaWd8cGNudGxfd3Rlcm1zaWd8JyArDQogICAgICAgICdwZGZfYWN0aXZhdGVfaXRlbXxwZGZfYWRkX2Fubm90YXRpb258cGRmX2FkZF9ib29rbWFya3xwZGZfYWRkX2xhdW5jaGxpbmt8cGRmX2FkZF9sb2NhbGxpbmt8cGRmX2FkZF9uYW1lZGRlc3R8cGRmX2FkZF9ub3RlfHBkZl9hZGRfb3V0bGluZXwnICsNCiAgICAgICAgJ3BkZl9hZGRfcGRmbGlua3xwZGZfYWRkX3RhYmxlX2NlbGx8cGRmX2FkZF90ZXh0Zmxvd3xwZGZfYWRkX3RodW1ibmFpbHxwZGZfYWRkX3dlYmxpbmt8cGRmX2FyY3xwZGZfYXJjbnxwZGZfYXR0YWNoX2ZpbGV8cGRmX2JlZ2luX2RvY3VtZW50fCcgKw0KICAgICAgICAncGRmX2JlZ2luX2ZvbnR8cGRmX2JlZ2luX2dseXBofHBkZl9iZWdpbl9pdGVtfHBkZl9iZWdpbl9sYXllcnxwZGZfYmVnaW5fcGFnZXxwZGZfYmVnaW5fcGFnZV9leHR8cGRmX2JlZ2luX3BhdHRlcm58cGRmX2JlZ2luX3RlbXBsYXRlfCcgKw0KICAgICAgICAncGRmX2JlZ2luX3RlbXBsYXRlX2V4dHxwZGZfY2lyY2xlfHBkZl9jbGlwfHBkZl9jbG9zZXxwZGZfY2xvc2VfaW1hZ2V8cGRmX2Nsb3NlX3BkaXxwZGZfY2xvc2VfcGRpX3BhZ2V8cGRmX2Nsb3NlcGF0aHwnICsNCiAgICAgICAgJ3BkZl9jbG9zZXBhdGhfZmlsbF9zdHJva2V8cGRmX2Nsb3NlcGF0aF9zdHJva2V8cGRmX2NvbmNhdHxwZGZfY29udGludWVfdGV4dHxwZGZfY3JlYXRlXzNkdmlld3xwZGZfY3JlYXRlX2FjdGlvbnxwZGZfY3JlYXRlX2Fubm90YXRpb258JyArDQogICAgICAgICdwZGZfY3JlYXRlX2Jvb2ttYXJrfHBkZl9jcmVhdGVfZmllbGR8cGRmX2NyZWF0ZV9maWVsZGdyb3VwfHBkZl9jcmVhdGVfZ3N0YXRlfHBkZl9jcmVhdGVfcHZmfHBkZl9jcmVhdGVfdGV4dGZsb3d8cGRmX2N1cnZldG98JyArDQogICAgICAgICdwZGZfZGVmaW5lX2xheWVyfHBkZl9kZWxldGV8cGRmX2RlbGV0ZV9wdmZ8cGRmX2RlbGV0ZV90YWJsZXxwZGZfZGVsZXRlX3RleHRmbG93fHBkZl9lbmNvZGluZ19zZXRfY2hhcnxwZGZfZW5kX2RvY3VtZW50fHBkZl9lbmRfZm9udHwnICsNCiAgICAgICAgJ3BkZl9lbmRfZ2x5cGh8cGRmX2VuZF9pdGVtfHBkZl9lbmRfbGF5ZXJ8cGRmX2VuZF9wYWdlfHBkZl9lbmRfcGFnZV9leHR8cGRmX2VuZF9wYXR0ZXJufHBkZl9lbmRfdGVtcGxhdGV8cGRmX2VuZHBhdGh8cGRmX2ZpbGx8JyArDQogICAgICAgICdwZGZfZmlsbF9pbWFnZWJsb2NrfHBkZl9maWxsX3BkZmJsb2NrfHBkZl9maWxsX3N0cm9rZXxwZGZfZmlsbF90ZXh0YmxvY2t8cGRmX2ZpbmRmb250fHBkZl9maXRfaW1hZ2V8cGRmX2ZpdF9wZGlfcGFnZXxwZGZfZml0X3RhYmxlfCcgKw0KICAgICAgICAncGRmX2ZpdF90ZXh0Zmxvd3xwZGZfZml0X3RleHRsaW5lfHBkZl9nZXRfYXBpbmFtZXxwZGZfZ2V0X2J1ZmZlcnxwZGZfZ2V0X2Vycm1zZ3xwZGZfZ2V0X2Vycm51bXxwZGZfZ2V0X2ZvbnR8cGRmX2dldF9mb250bmFtZXwnICsNCiAgICAgICAgJ3BkZl9nZXRfZm9udHNpemV8cGRmX2dldF9pbWFnZV9oZWlnaHR8cGRmX2dldF9pbWFnZV93aWR0aHxwZGZfZ2V0X21ham9ydmVyc2lvbnxwZGZfZ2V0X21pbm9ydmVyc2lvbnxwZGZfZ2V0X3BhcmFtZXRlcnwnICsNCiAgICAgICAgJ3BkZl9nZXRfcGRpX3BhcmFtZXRlcnxwZGZfZ2V0X3BkaV92YWx1ZXxwZGZfZ2V0X3ZhbHVlfHBkZl9pbmZvX2ZvbnR8cGRmX2luZm9fbWF0Y2hib3h8cGRmX2luZm9fdGFibGV8cGRmX2luZm9fdGV4dGZsb3d8cGRmX2luZm9fdGV4dGxpbmV8JyArDQogICAgICAgICdwZGZfaW5pdGdyYXBoaWNzfHBkZl9saW5ldG98cGRmX2xvYWRfM2RkYXRhfHBkZl9sb2FkX2ZvbnR8cGRmX2xvYWRfaWNjcHJvZmlsZXxwZGZfbG9hZF9pbWFnZXxwZGZfbWFrZXNwb3Rjb2xvcnxwZGZfbW92ZXRvfHBkZl9uZXd8JyArDQogICAgICAgICdwZGZfb3Blbl9jY2l0dHxwZGZfb3Blbl9maWxlfHBkZl9vcGVuX2dpZnxwZGZfb3Blbl9pbWFnZXxwZGZfb3Blbl9pbWFnZV9maWxlfHBkZl9vcGVuX2pwZWd8cGRmX29wZW5fbWVtb3J5X2ltYWdlfHBkZl9vcGVuX3BkaXwnICsNCiAgICAgICAgJ3BkZl9vcGVuX3BkaV9kb2N1bWVudHxwZGZfb3Blbl9wZGlfcGFnZXxwZGZfb3Blbl90aWZmfHBkZl9wY29zX2dldF9udW1iZXJ8cGRmX3Bjb3NfZ2V0X3N0cmVhbXxwZGZfcGNvc19nZXRfc3RyaW5nfHBkZl9wbGFjZV9pbWFnZXwnICsNCiAgICAgICAgJ3BkZl9wbGFjZV9wZGlfcGFnZXxwZGZfcHJvY2Vzc19wZGl8cGRmX3JlY3R8cGRmX3Jlc3RvcmV8cGRmX3Jlc3VtZV9wYWdlfHBkZl9yb3RhdGV8cGRmX3NhdmV8cGRmX3NjYWxlfHBkZl9zZXRfYm9yZGVyX2NvbG9yfCcgKw0KICAgICAgICAncGRmX3NldF9ib3JkZXJfZGFzaHxwZGZfc2V0X2JvcmRlcl9zdHlsZXxwZGZfc2V0X2NoYXJfc3BhY2luZ3xwZGZfc2V0X2R1cmF0aW9ufHBkZl9zZXRfZ3N0YXRlfHBkZl9zZXRfaG9yaXpfc2NhbGluZ3xwZGZfc2V0X2luZm98JyArDQogICAgICAgICdwZGZfc2V0X2luZm9fYXV0aG9yfHBkZl9zZXRfaW5mb19jcmVhdG9yfHBkZl9zZXRfaW5mb19rZXl3b3Jkc3xwZGZfc2V0X2luZm9fc3ViamVjdHxwZGZfc2V0X2luZm9fdGl0bGV8cGRmX3NldF9sYXllcl9kZXBlbmRlbmN5fCcgKw0KICAgICAgICAncGRmX3NldF9sZWFkaW5nfHBkZl9zZXRfcGFyYW1ldGVyfHBkZl9zZXRfdGV4dF9tYXRyaXh8cGRmX3NldF90ZXh0X3Bvc3xwZGZfc2V0X3RleHRfcmVuZGVyaW5nfHBkZl9zZXRfdGV4dF9yaXNlfHBkZl9zZXRfdmFsdWV8JyArDQogICAgICAgICdwZGZfc2V0X3dvcmRfc3BhY2luZ3xwZGZfc2V0Y29sb3J8cGRmX3NldGRhc2h8cGRmX3NldGRhc2hwYXR0ZXJufHBkZl9zZXRmbGF0fHBkZl9zZXRmb250fHBkZl9zZXRncmF5fHBkZl9zZXRncmF5X2ZpbGx8cGRmX3NldGdyYXlfc3Ryb2tlfCcgKw0KICAgICAgICAncGRmX3NldGxpbmVjYXB8cGRmX3NldGxpbmVqb2lufHBkZl9zZXRsaW5ld2lkdGh8cGRmX3NldG1hdHJpeHxwZGZfc2V0bWl0ZXJsaW1pdHxwZGZfc2V0cG9seWRhc2h8cGRmX3NldHJnYmNvbG9yfHBkZl9zZXRyZ2Jjb2xvcl9maWxsfCcgKw0KICAgICAgICAncGRmX3NldHJnYmNvbG9yX3N0cm9rZXxwZGZfc2hhZGluZ3xwZGZfc2hhZGluZ19wYXR0ZXJufHBkZl9zaGZpbGx8cGRmX3Nob3d8cGRmX3Nob3dfYm94ZWR8cGRmX3Nob3dfeHl8cGRmX3NrZXd8cGRmX3N0cmluZ3dpZHRofHBkZl9zdHJva2V8JyArDQogICAgICAgICdwZGZfc3VzcGVuZF9wYWdlfHBkZl90cmFuc2xhdGV8cGRmX3V0ZjE2X3RvX3V0Zjh8cGRmX3V0ZjMyX3RvX3V0ZjE2fHBkZl91dGY4X3RvX3V0ZjE2fHBkb3xwZG9fY3VicmlkX3NjaGVtYXxwZG9fcGdzcWxsb2JjcmVhdGV8JyArDQogICAgICAgICdwZG9fcGdzcWxsb2JvcGVufHBkb19wZ3NxbGxvYnVubGlua3xwZG9fc3FsaXRlY3JlYXRlYWdncmVnYXRlfHBkb19zcWxpdGVjcmVhdGVmdW5jdGlvbnxwZG9leGNlcHRpb258cGRvc3RhdGVtZW50fHBmc29ja29wZW58JyArDQogICAgICAgICdwZ19hZmZlY3RlZF9yb3dzfHBnX2NhbmNlbF9xdWVyeXxwZ19jbGllbnRfZW5jb2Rpbmd8cGdfY2xvc2V8cGdfY29ubmVjdHxwZ19jb25uZWN0aW9uX2J1c3l8cGdfY29ubmVjdGlvbl9yZXNldHxwZ19jb25uZWN0aW9uX3N0YXR1c3wnICsNCiAgICAgICAgJ3BnX2NvbnZlcnR8cGdfY29weV9mcm9tfHBnX2NvcHlfdG98cGdfZGJuYW1lfHBnX2RlbGV0ZXxwZ19lbmRfY29weXxwZ19lc2NhcGVfYnl0ZWF8cGdfZXNjYXBlX3N0cmluZ3xwZ19leGVjdXRlfHBnX2ZldGNoX2FsbHwnICsNCiAgICAgICAgJ3BnX2ZldGNoX2FsbF9jb2x1bW5zfHBnX2ZldGNoX2FycmF5fHBnX2ZldGNoX2Fzc29jfHBnX2ZldGNoX29iamVjdHxwZ19mZXRjaF9yZXN1bHR8cGdfZmV0Y2hfcm93fHBnX2ZpZWxkX2lzX251bGx8cGdfZmllbGRfbmFtZXwnICsNCiAgICAgICAgJ3BnX2ZpZWxkX251bXxwZ19maWVsZF9wcnRsZW58cGdfZmllbGRfc2l6ZXxwZ19maWVsZF90YWJsZXxwZ19maWVsZF90eXBlfHBnX2ZpZWxkX3R5cGVfb2lkfHBnX2ZyZWVfcmVzdWx0fHBnX2dldF9ub3RpZnl8cGdfZ2V0X3BpZHwnICsNCiAgICAgICAgJ3BnX2dldF9yZXN1bHR8cGdfaG9zdHxwZ19pbnNlcnR8cGdfbGFzdF9lcnJvcnxwZ19sYXN0X25vdGljZXxwZ19sYXN0X29pZHxwZ19sb19jbG9zZXxwZ19sb19jcmVhdGV8cGdfbG9fZXhwb3J0fHBnX2xvX2ltcG9ydHxwZ19sb19vcGVufCcgKw0KICAgICAgICAncGdfbG9fcmVhZHxwZ19sb19yZWFkX2FsbHxwZ19sb19zZWVrfHBnX2xvX3RlbGx8cGdfbG9fdW5saW5rfHBnX2xvX3dyaXRlfHBnX21ldGFfZGF0YXxwZ19udW1fZmllbGRzfHBnX251bV9yb3dzfHBnX29wdGlvbnN8JyArDQogICAgICAgICdwZ19wYXJhbWV0ZXJfc3RhdHVzfHBnX3Bjb25uZWN0fHBnX3Bpbmd8cGdfcG9ydHxwZ19wcmVwYXJlfHBnX3B1dF9saW5lfHBnX3F1ZXJ5fHBnX3F1ZXJ5X3BhcmFtc3xwZ19yZXN1bHRfZXJyb3J8cGdfcmVzdWx0X2Vycm9yX2ZpZWxkfCcgKw0KICAgICAgICAncGdfcmVzdWx0X3NlZWt8cGdfcmVzdWx0X3N0YXR1c3xwZ19zZWxlY3R8cGdfc2VuZF9leGVjdXRlfHBnX3NlbmRfcHJlcGFyZXxwZ19zZW5kX3F1ZXJ5fHBnX3NlbmRfcXVlcnlfcGFyYW1zfHBnX3NldF9jbGllbnRfZW5jb2Rpbmd8JyArDQogICAgICAgICdwZ19zZXRfZXJyb3JfdmVyYm9zaXR5fHBnX3RyYWNlfHBnX3RyYW5zYWN0aW9uX3N0YXR1c3xwZ190dHl8cGdfdW5lc2NhcGVfYnl0ZWF8cGdfdW50cmFjZXxwZ191cGRhdGV8cGdfdmVyc2lvbnxwaHBfY2hlY2tfc3ludGF4fCcgKw0KICAgICAgICAncGhwX2luaV9sb2FkZWRfZmlsZXxwaHBfaW5pX3NjYW5uZWRfZmlsZXN8cGhwX2xvZ29fZ3VpZHxwaHBfc2FwaV9uYW1lfHBocF9zdHJpcF93aGl0ZXNwYWNlfHBocF91bmFtZXxwaHBjcmVkaXRzfHBocGluZm98cGhwdmVyc2lvbnxwaXwnICsNCiAgICAgICAgJ3BuZzJ3Ym1wfHBvcGVufHBvc3xwb3NpeF9hY2Nlc3N8cG9zaXhfY3Rlcm1pZHxwb3NpeF9lcnJub3xwb3NpeF9nZXRfbGFzdF9lcnJvcnxwb3NpeF9nZXRjd2R8cG9zaXhfZ2V0ZWdpZHxwb3NpeF9nZXRldWlkfHBvc2l4X2dldGdpZHwnICsNCiAgICAgICAgJ3Bvc2l4X2dldGdyZ2lkfHBvc2l4X2dldGdybmFtfHBvc2l4X2dldGdyb3Vwc3xwb3NpeF9nZXRsb2dpbnxwb3NpeF9nZXRwZ2lkfHBvc2l4X2dldHBncnB8cG9zaXhfZ2V0cGlkfHBvc2l4X2dldHBwaWR8cG9zaXhfZ2V0cHduYW18JyArDQogICAgICAgICdwb3NpeF9nZXRwd3VpZHxwb3NpeF9nZXRybGltaXR8cG9zaXhfZ2V0c2lkfHBvc2l4X2dldHVpZHxwb3NpeF9pbml0Z3JvdXBzfHBvc2l4X2lzYXR0eXxwb3NpeF9raWxsfHBvc2l4X21rZmlmb3xwb3NpeF9ta25vZHxwb3NpeF9zZXRlZ2lkfCcgKw0KICAgICAgICAncG9zaXhfc2V0ZXVpZHxwb3NpeF9zZXRnaWR8cG9zaXhfc2V0cGdpZHxwb3NpeF9zZXRzaWR8cG9zaXhfc2V0dWlkfHBvc2l4X3N0cmVycm9yfHBvc2l4X3RpbWVzfHBvc2l4X3R0eW5hbWV8cG9zaXhfdW5hbWV8cG93fHByZWdfZmlsdGVyfCcgKw0KICAgICAgICAncHJlZ19ncmVwfHByZWdfbGFzdF9lcnJvcnxwcmVnX21hdGNofHByZWdfbWF0Y2hfYWxsfHByZWdfcXVvdGV8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xwcmVnX3NwbGl0fHByZXZ8cHJpbnR8cHJpbnRfcnwnICsNCiAgICAgICAgJ3ByaW50ZXJfYWJvcnR8cHJpbnRlcl9jbG9zZXxwcmludGVyX2NyZWF0ZV9icnVzaHxwcmludGVyX2NyZWF0ZV9kY3xwcmludGVyX2NyZWF0ZV9mb250fHByaW50ZXJfY3JlYXRlX3BlbnxwcmludGVyX2RlbGV0ZV9icnVzaHwnICsNCiAgICAgICAgJ3ByaW50ZXJfZGVsZXRlX2RjfHByaW50ZXJfZGVsZXRlX2ZvbnR8cHJpbnRlcl9kZWxldGVfcGVufHByaW50ZXJfZHJhd19ibXB8cHJpbnRlcl9kcmF3X2Nob3JkfHByaW50ZXJfZHJhd19lbGlwc2V8cHJpbnRlcl9kcmF3X2xpbmV8JyArDQogICAgICAgICdwcmludGVyX2RyYXdfcGllfHByaW50ZXJfZHJhd19yZWN0YW5nbGV8cHJpbnRlcl9kcmF3X3JvdW5kcmVjdHxwcmludGVyX2RyYXdfdGV4dHxwcmludGVyX2VuZF9kb2N8cHJpbnRlcl9lbmRfcGFnZXxwcmludGVyX2dldF9vcHRpb258JyArDQogICAgICAgICdwcmludGVyX2xpc3R8cHJpbnRlcl9sb2dpY2FsX2ZvbnRoZWlnaHR8cHJpbnRlcl9vcGVufHByaW50ZXJfc2VsZWN0X2JydXNofHByaW50ZXJfc2VsZWN0X2ZvbnR8cHJpbnRlcl9zZWxlY3RfcGVufHByaW50ZXJfc2V0X29wdGlvbnwnICsNCiAgICAgICAgJ3ByaW50ZXJfc3RhcnRfZG9jfHByaW50ZXJfc3RhcnRfcGFnZXxwcmludGVyX3dyaXRlfHByaW50Znxwcm9jX2Nsb3NlfHByb2NfZ2V0X3N0YXR1c3xwcm9jX25pY2V8cHJvY19vcGVufHByb2NfdGVybWluYXRlfHByb3BlcnR5X2V4aXN0c3wnICsNCiAgICAgICAgJ3BzX2FkZF9ib29rbWFya3xwc19hZGRfbGF1bmNobGlua3xwc19hZGRfbG9jYWxsaW5rfHBzX2FkZF9ub3RlfHBzX2FkZF9wZGZsaW5rfHBzX2FkZF93ZWJsaW5rfHBzX2FyY3xwc19hcmNufHBzX2JlZ2luX3BhZ2V8JyArDQogICAgICAgICdwc19iZWdpbl9wYXR0ZXJufHBzX2JlZ2luX3RlbXBsYXRlfHBzX2NpcmNsZXxwc19jbGlwfHBzX2Nsb3NlfHBzX2Nsb3NlX2ltYWdlfHBzX2Nsb3NlcGF0aHxwc19jbG9zZXBhdGhfc3Ryb2tlfHBzX2NvbnRpbnVlX3RleHR8cHNfY3VydmV0b3wnICsNCiAgICAgICAgJ3BzX2RlbGV0ZXxwc19lbmRfcGFnZXxwc19lbmRfcGF0dGVybnxwc19lbmRfdGVtcGxhdGV8cHNfZmlsbHxwc19maWxsX3N0cm9rZXxwc19maW5kZm9udHxwc19nZXRfYnVmZmVyfHBzX2dldF9wYXJhbWV0ZXJ8cHNfZ2V0X3ZhbHVlfCcgKw0KICAgICAgICAncHNfaHlwaGVuYXRlfHBzX2luY2x1ZGVfZmlsZXxwc19saW5ldG98cHNfbWFrZXNwb3Rjb2xvcnxwc19tb3ZldG98cHNfbmV3fHBzX29wZW5fZmlsZXxwc19vcGVuX2ltYWdlfHBzX29wZW5faW1hZ2VfZmlsZXwnICsNCiAgICAgICAgJ3BzX29wZW5fbWVtb3J5X2ltYWdlfHBzX3BsYWNlX2ltYWdlfHBzX3JlY3R8cHNfcmVzdG9yZXxwc19yb3RhdGV8cHNfc2F2ZXxwc19zY2FsZXxwc19zZXRfYm9yZGVyX2NvbG9yfHBzX3NldF9ib3JkZXJfZGFzaHwnICsNCiAgICAgICAgJ3BzX3NldF9ib3JkZXJfc3R5bGV8cHNfc2V0X2luZm98cHNfc2V0X3BhcmFtZXRlcnxwc19zZXRfdGV4dF9wb3N8cHNfc2V0X3ZhbHVlfHBzX3NldGNvbG9yfHBzX3NldGRhc2h8cHNfc2V0ZmxhdHxwc19zZXRmb250fHBzX3NldGdyYXl8JyArDQogICAgICAgICdwc19zZXRsaW5lY2FwfHBzX3NldGxpbmVqb2lufHBzX3NldGxpbmV3aWR0aHxwc19zZXRtaXRlcmxpbWl0fHBzX3NldG92ZXJwcmludG1vZGV8cHNfc2V0cG9seWRhc2h8cHNfc2hhZGluZ3xwc19zaGFkaW5nX3BhdHRlcm58cHNfc2hmaWxsfCcgKw0KICAgICAgICAncHNfc2hvd3xwc19zaG93Mnxwc19zaG93X2JveGVkfHBzX3Nob3dfeHl8cHNfc2hvd194eTJ8cHNfc3RyaW5nX2dlb21ldHJ5fHBzX3N0cmluZ3dpZHRofHBzX3N0cm9rZXxwc19zeW1ib2x8cHNfc3ltYm9sX25hbWV8JyArDQogICAgICAgICdwc19zeW1ib2xfd2lkdGh8cHNfdHJhbnNsYXRlfHBzcGVsbF9hZGRfdG9fcGVyc29uYWx8cHNwZWxsX2FkZF90b19zZXNzaW9ufHBzcGVsbF9jaGVja3xwc3BlbGxfY2xlYXJfc2Vzc2lvbnxwc3BlbGxfY29uZmlnX2NyZWF0ZXwnICsNCiAgICAgICAgJ3BzcGVsbF9jb25maWdfZGF0YV9kaXJ8cHNwZWxsX2NvbmZpZ19kaWN0X2Rpcnxwc3BlbGxfY29uZmlnX2lnbm9yZXxwc3BlbGxfY29uZmlnX21vZGV8cHNwZWxsX2NvbmZpZ19wZXJzb25hbHxwc3BlbGxfY29uZmlnX3JlcGx8JyArDQogICAgICAgICdwc3BlbGxfY29uZmlnX3J1bnRvZ2V0aGVyfHBzcGVsbF9jb25maWdfc2F2ZV9yZXBsfHBzcGVsbF9uZXd8cHNwZWxsX25ld19jb25maWd8cHNwZWxsX25ld19wZXJzb25hbHxwc3BlbGxfc2F2ZV93b3JkbGlzdHwnICsNCiAgICAgICAgJ3BzcGVsbF9zdG9yZV9yZXBsYWNlbWVudHxwc3BlbGxfc3VnZ2VzdHxwdXRlbnZ8cHhfY2xvc2V8cHhfY3JlYXRlX2ZwfHB4X2RhdGUyc3RyaW5nfHB4X2RlbGV0ZXxweF9kZWxldGVfcmVjb3JkfHB4X2dldF9maWVsZHxweF9nZXRfaW5mb3wnICsNCiAgICAgICAgJ3B4X2dldF9wYXJhbWV0ZXJ8cHhfZ2V0X3JlY29yZHxweF9nZXRfc2NoZW1hfHB4X2dldF92YWx1ZXxweF9pbnNlcnRfcmVjb3JkfHB4X25ld3xweF9udW1maWVsZHN8cHhfbnVtcmVjb3Jkc3xweF9vcGVuX2ZwfHB4X3B1dF9yZWNvcmR8JyArDQogICAgICAgICdweF9yZXRyaWV2ZV9yZWNvcmR8cHhfc2V0X2Jsb2JfZmlsZXxweF9zZXRfcGFyYW1ldGVyfHB4X3NldF90YWJsZW5hbWV8cHhfc2V0X3RhcmdldGVuY29kaW5nfHB4X3NldF92YWx1ZXxweF90aW1lc3RhbXAyc3RyaW5nfCcgKw0KICAgICAgICAncHhfdXBkYXRlX3JlY29yZHxxZG9tX2Vycm9yfHFkb21fdHJlZXxxdW90ZWRfcHJpbnRhYmxlX2RlY29kZXxxdW90ZWRfcHJpbnRhYmxlX2VuY29kZXxxdW90ZW1ldGF8cmFkMmRlZ3xyYWRpdXNfYWNjdF9vcGVufCcgKw0KICAgICAgICAncmFkaXVzX2FkZF9zZXJ2ZXJ8cmFkaXVzX2F1dGhfb3BlbnxyYWRpdXNfY2xvc2V8cmFkaXVzX2NvbmZpZ3xyYWRpdXNfY3JlYXRlX3JlcXVlc3R8cmFkaXVzX2N2dF9hZGRyfHJhZGl1c19jdnRfaW50fHJhZGl1c19jdnRfc3RyaW5nfCcgKw0KICAgICAgICAncmFkaXVzX2RlbWFuZ2xlfHJhZGl1c19kZW1hbmdsZV9tcHBlX2tleXxyYWRpdXNfZ2V0X2F0dHJ8cmFkaXVzX2dldF92ZW5kb3JfYXR0cnxyYWRpdXNfcHV0X2FkZHJ8cmFkaXVzX3B1dF9hdHRyfHJhZGl1c19wdXRfaW50fCcgKw0KICAgICAgICAncmFkaXVzX3B1dF9zdHJpbmd8cmFkaXVzX3B1dF92ZW5kb3JfYWRkcnxyYWRpdXNfcHV0X3ZlbmRvcl9hdHRyfHJhZGl1c19wdXRfdmVuZG9yX2ludHxyYWRpdXNfcHV0X3ZlbmRvcl9zdHJpbmd8JyArDQogICAgICAgICdyYWRpdXNfcmVxdWVzdF9hdXRoZW50aWNhdG9yfHJhZGl1c19zZW5kX3JlcXVlc3R8cmFkaXVzX3NlcnZlcl9zZWNyZXR8cmFkaXVzX3N0cmVycm9yfHJhbmR8cmFuZ2V8cmFuZ2VleGNlcHRpb258cmFyX3dyYXBwZXJfY2FjaGVfc3RhdHN8JyArDQogICAgICAgICdyYXJhcmNoaXZlfHJhcmVudHJ5fHJhcmV4Y2VwdGlvbnxyYXd1cmxkZWNvZGV8cmF3dXJsZW5jb2RlfHJlYWRfZXhpZl9kYXRhfHJlYWRkaXJ8cmVhZGZpbGV8cmVhZGd6ZmlsZXxyZWFkbGluZXxyZWFkbGluZV9hZGRfaGlzdG9yeXwnICsNCiAgICAgICAgJ3JlYWRsaW5lX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbHxyZWFkbGluZV9jYWxsYmFja19oYW5kbGVyX3JlbW92ZXxyZWFkbGluZV9jYWxsYmFja19yZWFkX2NoYXJ8cmVhZGxpbmVfY2xlYXJfaGlzdG9yeXwnICsNCiAgICAgICAgJ3JlYWRsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb258cmVhZGxpbmVfaW5mb3xyZWFkbGluZV9saXN0X2hpc3Rvcnl8cmVhZGxpbmVfb25fbmV3X2xpbmV8cmVhZGxpbmVfcmVhZF9oaXN0b3J5fHJlYWRsaW5lX3JlZGlzcGxheXwnICsNCiAgICAgICAgJ3JlYWRsaW5lX3dyaXRlX2hpc3Rvcnl8cmVhZGxpbmt8cmVhbHBhdGh8cmVhbHBhdGhfY2FjaGVfZ2V0fHJlYWxwYXRoX2NhY2hlX3NpemV8cmVjb2RlfHJlY29kZV9maWxlfHJlY29kZV9zdHJpbmd8cmVjdXJzaXZlYXJyYXlpdGVyYXRvcnwnICsNCiAgICAgICAgJ3JlY3Vyc2l2ZWNhY2hpbmdpdGVyYXRvcnxyZWN1cnNpdmVjYWxsYmFja2ZpbHRlcml0ZXJhdG9yfHJlY3Vyc2l2ZWRpcmVjdG9yeWl0ZXJhdG9yfHJlY3Vyc2l2ZWZpbHRlcml0ZXJhdG9yfHJlY3Vyc2l2ZWl0ZXJhdG9yfCcgKw0KICAgICAgICAncmVjdXJzaXZlaXRlcmF0b3JpdGVyYXRvcnxyZWN1cnNpdmVyZWdleGl0ZXJhdG9yfHJlY3Vyc2l2ZXRyZWVpdGVyYXRvcnxyZWZsZWN0aW9ufHJlZmxlY3Rpb25jbGFzc3xyZWZsZWN0aW9uZXhjZXB0aW9ufHJlZmxlY3Rpb25leHRlbnNpb258JyArDQogICAgICAgICdyZWZsZWN0aW9uZnVuY3Rpb258cmVmbGVjdGlvbmZ1bmN0aW9uYWJzdHJhY3R8cmVmbGVjdGlvbm1ldGhvZHxyZWZsZWN0aW9ub2JqZWN0fHJlZmxlY3Rpb25wYXJhbWV0ZXJ8cmVmbGVjdGlvbnByb3BlcnR5fHJlZmxlY3RvcnwnICsNCiAgICAgICAgJ3JlZ2V4aXRlcmF0b3J8cmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb258cmVnaXN0ZXJfdGlja19mdW5jdGlvbnxyZW5hbWV8cmVuYW1lX2Z1bmN0aW9ufHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJlc2V0fHJlc2V0VmFsdWV8JyArDQogICAgICAgICdyZXNvdXJjZWJ1bmRsZXxyZXN0b3JlX2Vycm9yX2hhbmRsZXJ8cmVzdG9yZV9leGNlcHRpb25faGFuZGxlcnxyZXN0b3JlX2luY2x1ZGVfcGF0aHxyZXR1cm58cmV3aW5kfHJld2luZGRpcnxybWRpcnxyb3VuZHxycG1fY2xvc2V8JyArDQogICAgICAgICdycG1fZ2V0X3RhZ3xycG1faXNfdmFsaWR8cnBtX29wZW58cnBtX3ZlcnNpb258cnJkX2NyZWF0ZXxycmRfZXJyb3J8cnJkX2ZldGNofHJyZF9maXJzdHxycmRfZ3JhcGh8cnJkX2luZm98cnJkX2xhc3R8cnJkX2xhc3R1cGRhdGV8JyArDQogICAgICAgICdycmRfcmVzdG9yZXxycmRfdHVuZXxycmRfdXBkYXRlfHJyZF94cG9ydHxycmRjcmVhdG9yfHJyZGdyYXBofHJyZHVwZGF0ZXJ8cnNvcnR8cnRyaW18cnVua2l0X2NsYXNzX2Fkb3B0fHJ1bmtpdF9jbGFzc19lbWFuY2lwYXRlfCcgKw0KICAgICAgICAncnVua2l0X2NvbnN0YW50X2FkZHxydW5raXRfY29uc3RhbnRfcmVkZWZpbmV8cnVua2l0X2NvbnN0YW50X3JlbW92ZXxydW5raXRfZnVuY3Rpb25fYWRkfHJ1bmtpdF9mdW5jdGlvbl9jb3B5fHJ1bmtpdF9mdW5jdGlvbl9yZWRlZmluZXwnICsNCiAgICAgICAgJ3J1bmtpdF9mdW5jdGlvbl9yZW1vdmV8cnVua2l0X2Z1bmN0aW9uX3JlbmFtZXxydW5raXRfaW1wb3J0fHJ1bmtpdF9saW50fHJ1bmtpdF9saW50X2ZpbGV8cnVua2l0X21ldGhvZF9hZGR8cnVua2l0X21ldGhvZF9jb3B5fCcgKw0KICAgICAgICAncnVua2l0X21ldGhvZF9yZWRlZmluZXxydW5raXRfbWV0aG9kX3JlbW92ZXxydW5raXRfbWV0aG9kX3JlbmFtZXxydW5raXRfcmV0dXJuX3ZhbHVlX3VzZWR8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8JyArDQogICAgICAgICdydW5raXRfc3VwZXJnbG9iYWxzfHJ1bnRpbWVleGNlcHRpb258c2FtY29ubmVjdGlvbl9jb21taXR8c2FtY29ubmVjdGlvbl9jb25uZWN0fHNhbWNvbm5lY3Rpb25fY29uc3RydWN0b3J8c2FtY29ubmVjdGlvbl9kaXNjb25uZWN0fCcgKw0KICAgICAgICAnc2FtY29ubmVjdGlvbl9lcnJub3xzYW1jb25uZWN0aW9uX2Vycm9yfHNhbWNvbm5lY3Rpb25faXNjb25uZWN0ZWR8c2FtY29ubmVjdGlvbl9wZWVrfHNhbWNvbm5lY3Rpb25fcGVla2FsbHxzYW1jb25uZWN0aW9uX3JlY2VpdmV8JyArDQogICAgICAgICdzYW1jb25uZWN0aW9uX3JlbW92ZXxzYW1jb25uZWN0aW9uX3JvbGxiYWNrfHNhbWNvbm5lY3Rpb25fc2VuZHxzYW1jb25uZWN0aW9uX3NldERlYnVnfHNhbWNvbm5lY3Rpb25fc3Vic2NyaWJlfHNhbWNvbm5lY3Rpb25fdW5zdWJzY3JpYmV8JyArDQogICAgICAgICdzYW1tZXNzYWdlX2JvZHl8c2FtbWVzc2FnZV9jb25zdHJ1Y3RvcnxzYW1tZXNzYWdlX2hlYWRlcnxzY2FfY3JlYXRlZGF0YW9iamVjdHxzY2FfZ2V0c2VydmljZXxzY2FfbG9jYWxwcm94eV9jcmVhdGVkYXRhb2JqZWN0fCcgKw0KICAgICAgICAnc2NhX3NvYXBwcm94eV9jcmVhdGVkYXRhb2JqZWN0fHNjYW5kaXJ8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2JlZ2lubG9nZ2luZ3xzZG9fZGFzX2NoYW5nZXN1bW1hcnlfZW5kbG9nZ2luZ3wnICsNCiAgICAgICAgJ3Nkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRjaGFuZ2VkZGF0YW9iamVjdHN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldGNoYW5nZXR5cGV8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldG9sZGNvbnRhaW5lcnwnICsNCiAgICAgICAgJ3Nkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRvbGR2YWx1ZXN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2lzbG9nZ2luZ3xzZG9fZGFzX2RhdGFmYWN0b3J5X2FkZHByb3BlcnR5dG90eXBlfHNkb19kYXNfZGF0YWZhY3RvcnlfYWRkdHlwZXwnICsNCiAgICAgICAgJ3Nkb19kYXNfZGF0YWZhY3RvcnlfZ2V0ZGF0YWZhY3Rvcnl8c2RvX2Rhc19kYXRhb2JqZWN0X2dldGNoYW5nZXN1bW1hcnl8c2RvX2Rhc19yZWxhdGlvbmFsX2FwcGx5Y2hhbmdlc3xzZG9fZGFzX3JlbGF0aW9uYWxfY29uc3RydWN0fCcgKw0KICAgICAgICAnc2RvX2Rhc19yZWxhdGlvbmFsX2NyZWF0ZXJvb3RkYXRhb2JqZWN0fHNkb19kYXNfcmVsYXRpb25hbF9leGVjdXRlcHJlcGFyZWRxdWVyeXxzZG9fZGFzX3JlbGF0aW9uYWxfZXhlY3V0ZXF1ZXJ5fCcgKw0KICAgICAgICAnc2RvX2Rhc19zZXR0aW5nX2dldGxpc3RpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHlpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHluYW1lfHNkb19kYXNfc2V0dGluZ19nZXR2YWx1ZXwnICsNCiAgICAgICAgJ3Nkb19kYXNfc2V0dGluZ19pc3NldHxzZG9fZGFzX3htbF9hZGR0eXBlc3xzZG9fZGFzX3htbF9jcmVhdGV8c2RvX2Rhc194bWxfY3JlYXRlZGF0YW9iamVjdHxzZG9fZGFzX3htbF9jcmVhdGVkb2N1bWVudHwnICsNCiAgICAgICAgJ3Nkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RkYXRhb2JqZWN0fHNkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RlbGVtZW50bmFtZXxzZG9fZGFzX3htbF9kb2N1bWVudF9nZXRyb290ZWxlbWVudHVyaXwnICsNCiAgICAgICAgJ3Nkb19kYXNfeG1sX2RvY3VtZW50X3NldGVuY29kaW5nfHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbGRlY2xhcmF0aW9ufHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbHZlcnNpb258c2RvX2Rhc194bWxfbG9hZGZpbGV8JyArDQogICAgICAgICdzZG9fZGFzX3htbF9sb2Fkc3RyaW5nfHNkb19kYXNfeG1sX3NhdmVmaWxlfHNkb19kYXNfeG1sX3NhdmVzdHJpbmd8c2RvX2RhdGFmYWN0b3J5X2NyZWF0ZXxzZG9fZGF0YW9iamVjdF9jbGVhcnwnICsNCiAgICAgICAgJ3Nkb19kYXRhb2JqZWN0X2NyZWF0ZWRhdGFvYmplY3R8c2RvX2RhdGFvYmplY3RfZ2V0Y29udGFpbmVyfHNkb19kYXRhb2JqZWN0X2dldHNlcXVlbmNlfHNkb19kYXRhb2JqZWN0X2dldHR5cGVuYW1lfCcgKw0KICAgICAgICAnc2RvX2RhdGFvYmplY3RfZ2V0dHlwZW5hbWVzcGFjZXVyaXxzZG9fZXhjZXB0aW9uX2dldGNhdXNlfHNkb19saXN0X2luc2VydHxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0Y29udGFpbmluZ3R5cGV8JyArDQogICAgICAgICdzZG9fbW9kZWxfcHJvcGVydHlfZ2V0ZGVmYXVsdHxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0bmFtZXxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0dHlwZXxzZG9fbW9kZWxfcHJvcGVydHlfaXNjb250YWlubWVudHwnICsNCiAgICAgICAgJ3Nkb19tb2RlbF9wcm9wZXJ0eV9pc21hbnl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2NvbnN0cnVjdHxzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZXhwb3J0fCcgKw0KICAgICAgICAnc2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGNvbnRhaW5tZW50cHJvcGVydHl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGluc3RhbmNlcHJvcGVydGllc3wnICsNCiAgICAgICAgJ3Nkb19tb2RlbF9yZWZsZWN0aW9uZGF0YW9iamVjdF9nZXR0eXBlfHNkb19tb2RlbF90eXBlX2dldGJhc2V0eXBlfHNkb19tb2RlbF90eXBlX2dldG5hbWV8c2RvX21vZGVsX3R5cGVfZ2V0bmFtZXNwYWNldXJpfCcgKw0KICAgICAgICAnc2RvX21vZGVsX3R5cGVfZ2V0cHJvcGVydGllc3xzZG9fbW9kZWxfdHlwZV9nZXRwcm9wZXJ0eXxzZG9fbW9kZWxfdHlwZV9pc2Fic3RyYWN0dHlwZXxzZG9fbW9kZWxfdHlwZV9pc2RhdGF0eXBlfHNkb19tb2RlbF90eXBlX2lzaW5zdGFuY2V8JyArDQogICAgICAgICdzZG9fbW9kZWxfdHlwZV9pc29wZW50eXBlfHNkb19tb2RlbF90eXBlX2lzc2VxdWVuY2VkdHlwZXxzZG9fc2VxdWVuY2VfZ2V0cHJvcGVydHl8c2RvX3NlcXVlbmNlX2luc2VydHxzZG9fc2VxdWVuY2VfbW92ZXxzZWVrYWJsZWl0ZXJhdG9yfCcgKw0KICAgICAgICAnc2VtX2FjcXVpcmV8c2VtX2dldHxzZW1fcmVsZWFzZXxzZW1fcmVtb3ZlfHNlcmlhbGl6YWJsZXxzZXJpYWxpemV8c2Vzc2lvbl9jYWNoZV9leHBpcmV8c2Vzc2lvbl9jYWNoZV9saW1pdGVyfHNlc3Npb25fY29tbWl0fCcgKw0KICAgICAgICAnc2Vzc2lvbl9kZWNvZGV8c2Vzc2lvbl9kZXN0cm95fHNlc3Npb25fZW5jb2RlfHNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXN8c2Vzc2lvbl9pZHxzZXNzaW9uX2lzX3JlZ2lzdGVyZWR8c2Vzc2lvbl9tb2R1bGVfbmFtZXxzZXNzaW9uX25hbWV8JyArDQogICAgICAgICdzZXNzaW9uX3Bnc3FsX2FkZF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9maWVsZHxzZXNzaW9uX3Bnc3FsX3Jlc2V0fHNlc3Npb25fcGdzcWxfc2V0X2ZpZWxkfHNlc3Npb25fcGdzcWxfc3RhdHVzfCcgKw0KICAgICAgICAnc2Vzc2lvbl9yZWdlbmVyYXRlX2lkfHNlc3Npb25fcmVnaXN0ZXJ8c2Vzc2lvbl9zYXZlX3BhdGh8c2Vzc2lvbl9zZXRfY29va2llX3BhcmFtc3xzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXJ8c2Vzc2lvbl9zdGFydHwnICsNCiAgICAgICAgJ3Nlc3Npb25fdW5yZWdpc3RlcnxzZXNzaW9uX3Vuc2V0fHNlc3Npb25fd3JpdGVfY2xvc2V8c2V0Q291bnRlckNsYXNzfHNldF9lcnJvcl9oYW5kbGVyfHNldF9leGNlcHRpb25faGFuZGxlcnxzZXRfZmlsZV9idWZmZXJ8JyArDQogICAgICAgICdzZXRfaW5jbHVkZV9wYXRofHNldF9tYWdpY19xdW90ZXNfcnVudGltZXxzZXRfc29ja2V0X2Jsb2NraW5nfHNldF90aW1lX2xpbWl0fHNldGNvb2tpZXxzZXRsb2NhbGV8c2V0cHJvY3RpdGxlfHNldHJhd2Nvb2tpZXwnICsNCiAgICAgICAgJ3NldHN0YXRpY3Byb3BlcnR5dmFsdWV8c2V0dGhyZWFkdGl0bGV8c2V0dHlwZXxzaGExfHNoYTFfZmlsZXxzaGVsbF9leGVjfHNobV9hdHRhY2h8c2htX2RldGFjaHxzaG1fZ2V0X3ZhcnxzaG1faGFzX3ZhcnxzaG1fcHV0X3ZhcnwnICsNCiAgICAgICAgJ3NobV9yZW1vdmV8c2htX3JlbW92ZV92YXJ8c2htb3BfY2xvc2V8c2htb3BfZGVsZXRlfHNobW9wX29wZW58c2htb3BfcmVhZHxzaG1vcF9zaXplfHNobW9wX3dyaXRlfHNob3dfc291cmNlfHNodWZmbGV8c2lnbmV1cmxwYWllbWVudHwnICsNCiAgICAgICAgJ3NpbWlsYXJfdGV4dHxzaW1wbGV4bWxfaW1wb3J0X2RvbXxzaW1wbGV4bWxfbG9hZF9maWxlfHNpbXBsZXhtbF9sb2FkX3N0cmluZ3xzaW1wbGV4bWxlbGVtZW50fHNpbXBsZXhtbGl0ZXJhdG9yfHNpbnxzaW5ofHNpemVvZnxzbGVlcHxzbm1wfCcgKw0KICAgICAgICAnc25tcDJfZ2V0fHNubXAyX2dldG5leHR8c25tcDJfcmVhbF93YWxrfHNubXAyX3NldHxzbm1wMl93YWxrfHNubXAzX2dldHxzbm1wM19nZXRuZXh0fHNubXAzX3JlYWxfd2Fsa3xzbm1wM19zZXR8c25tcDNfd2Fsa3wnICsNCiAgICAgICAgJ3NubXBfZ2V0X3F1aWNrX3ByaW50fHNubXBfZ2V0X3ZhbHVlcmV0cmlldmFsfHNubXBfcmVhZF9taWJ8c25tcF9zZXRfZW51bV9wcmludHxzbm1wX3NldF9vaWRfbnVtZXJpY19wcmludHxzbm1wX3NldF9vaWRfb3V0cHV0X2Zvcm1hdHwnICsNCiAgICAgICAgJ3NubXBfc2V0X3F1aWNrX3ByaW50fHNubXBfc2V0X3ZhbHVlcmV0cmlldmFsfHNubXBnZXR8c25tcGdldG5leHR8c25tcHJlYWx3YWxrfHNubXBzZXR8c25tcHdhbGt8c25tcHdhbGtvaWR8c29hcGNsaWVudHxzb2FwZmF1bHR8JyArDQogICAgICAgICdzb2FwaGVhZGVyfHNvYXBwYXJhbXxzb2Fwc2VydmVyfHNvYXB2YXJ8c29ja2V0X2FjY2VwdHxzb2NrZXRfYmluZHxzb2NrZXRfY2xlYXJfZXJyb3J8c29ja2V0X2Nsb3NlfHNvY2tldF9jb25uZWN0fHNvY2tldF9jcmVhdGV8JyArDQogICAgICAgICdzb2NrZXRfY3JlYXRlX2xpc3Rlbnxzb2NrZXRfY3JlYXRlX3BhaXJ8c29ja2V0X2dldF9vcHRpb258c29ja2V0X2dldF9zdGF0dXN8c29ja2V0X2dldHBlZXJuYW1lfHNvY2tldF9nZXRzb2NrbmFtZXxzb2NrZXRfbGFzdF9lcnJvcnwnICsNCiAgICAgICAgJ3NvY2tldF9saXN0ZW58c29ja2V0X3JlYWR8c29ja2V0X3JlY3Z8c29ja2V0X3JlY3Zmcm9tfHNvY2tldF9zZWxlY3R8c29ja2V0X3NlbmR8c29ja2V0X3NlbmR0b3xzb2NrZXRfc2V0X2Jsb2NrfHNvY2tldF9zZXRfYmxvY2tpbmd8JyArDQogICAgICAgICdzb2NrZXRfc2V0X25vbmJsb2NrfHNvY2tldF9zZXRfb3B0aW9ufHNvY2tldF9zZXRfdGltZW91dHxzb2NrZXRfc2h1dGRvd258c29ja2V0X3N0cmVycm9yfHNvY2tldF93cml0ZXxzb2xyX2dldF92ZXJzaW9ufHNvbHJjbGllbnR8JyArDQogICAgICAgICdzb2xyY2xpZW50ZXhjZXB0aW9ufHNvbHJkb2N1bWVudHxzb2xyZG9jdW1lbnRmaWVsZHxzb2xyZXhjZXB0aW9ufHNvbHJnZW5lcmljcmVzcG9uc2V8c29scmlsbGVnYWxhcmd1bWVudGV4Y2VwdGlvbnwnICsNCiAgICAgICAgJ3NvbHJpbGxlZ2Fsb3BlcmF0aW9uZXhjZXB0aW9ufHNvbHJpbnB1dGRvY3VtZW50fHNvbHJtb2RpZmlhYmxlcGFyYW1zfHNvbHJvYmplY3R8c29scnBhcmFtc3xzb2xycGluZ3Jlc3BvbnNlfHNvbHJxdWVyeXxzb2xycXVlcnlyZXNwb25zZXwnICsNCiAgICAgICAgJ3NvbHJyZXNwb25zZXxzb2xydXBkYXRlcmVzcG9uc2V8c29scnV0aWxzfHNvcnR8c291bmRleHxzcGhpbnhjbGllbnR8c3BsX2F1dG9sb2FkfHNwbF9hdXRvbG9hZF9jYWxsfHNwbF9hdXRvbG9hZF9leHRlbnNpb25zfCcgKw0KICAgICAgICAnc3BsX2F1dG9sb2FkX2Z1bmN0aW9uc3xzcGxfYXV0b2xvYWRfcmVnaXN0ZXJ8c3BsX2F1dG9sb2FkX3VucmVnaXN0ZXJ8c3BsX2NsYXNzZXN8c3BsX29iamVjdF9oYXNofHNwbGJvb2x8c3BsZG91Ymx5bGlua2VkbGlzdHxzcGxlbnVtfCcgKw0KICAgICAgICAnc3BsZmlsZWluZm98c3BsZmlsZW9iamVjdHxzcGxmaXhlZGFycmF5fHNwbGZsb2F0fHNwbGhlYXB8c3BsaW50fHNwbGl0fHNwbGl0aXxzcGxtYXhoZWFwfHNwbG1pbmhlYXB8c3Bsb2JqZWN0c3RvcmFnZXxzcGxvYnNlcnZlcnwnICsNCiAgICAgICAgJ3NwbHByaW9yaXR5cXVldWV8c3BscXVldWV8c3Bsc3RhY2t8c3Bsc3RyaW5nfHNwbHN1YmplY3R8c3BsdGVtcGZpbGVvYmplY3R8c3Bvb2ZjaGVja2VyfHNwcmludGZ8c3FsX3JlZ2Nhc2V8c3FsaXRlM3xzcWxpdGUzcmVzdWx0fCcgKw0KICAgICAgICAnc3FsaXRlM3N0bXR8c3FsaXRlX2FycmF5X3F1ZXJ5fHNxbGl0ZV9idXN5X3RpbWVvdXR8c3FsaXRlX2NoYW5nZXN8c3FsaXRlX2Nsb3NlfHNxbGl0ZV9jb2x1bW58c3FsaXRlX2NyZWF0ZV9hZ2dyZWdhdGV8JyArDQogICAgICAgICdzcWxpdGVfY3JlYXRlX2Z1bmN0aW9ufHNxbGl0ZV9jdXJyZW50fHNxbGl0ZV9lcnJvcl9zdHJpbmd8c3FsaXRlX2VzY2FwZV9zdHJpbmd8c3FsaXRlX2V4ZWN8c3FsaXRlX2ZhY3Rvcnl8c3FsaXRlX2ZldGNoX2FsbHwnICsNCiAgICAgICAgJ3NxbGl0ZV9mZXRjaF9hcnJheXxzcWxpdGVfZmV0Y2hfY29sdW1uX3R5cGVzfHNxbGl0ZV9mZXRjaF9vYmplY3R8c3FsaXRlX2ZldGNoX3NpbmdsZXxzcWxpdGVfZmV0Y2hfc3RyaW5nfHNxbGl0ZV9maWVsZF9uYW1lfCcgKw0KICAgICAgICAnc3FsaXRlX2hhc19tb3JlfHNxbGl0ZV9oYXNfcHJldnxzcWxpdGVfa2V5fHNxbGl0ZV9sYXN0X2Vycm9yfHNxbGl0ZV9sYXN0X2luc2VydF9yb3dpZHxzcWxpdGVfbGliZW5jb2Rpbmd8c3FsaXRlX2xpYnZlcnNpb258c3FsaXRlX25leHR8JyArDQogICAgICAgICdzcWxpdGVfbnVtX2ZpZWxkc3xzcWxpdGVfbnVtX3Jvd3N8c3FsaXRlX29wZW58c3FsaXRlX3BvcGVufHNxbGl0ZV9wcmV2fHNxbGl0ZV9xdWVyeXxzcWxpdGVfcmV3aW5kfHNxbGl0ZV9zZWVrfHNxbGl0ZV9zaW5nbGVfcXVlcnl8JyArDQogICAgICAgICdzcWxpdGVfdWRmX2RlY29kZV9iaW5hcnl8c3FsaXRlX3VkZl9lbmNvZGVfYmluYXJ5fHNxbGl0ZV91bmJ1ZmZlcmVkX3F1ZXJ5fHNxbGl0ZV92YWxpZHxzcXJ0fHNyYW5kfHNzY2FuZnxzc2RlZXBfZnV6enlfY29tcGFyZXwnICsNCiAgICAgICAgJ3NzZGVlcF9mdXp6eV9oYXNofHNzZGVlcF9mdXp6eV9oYXNoX2ZpbGVuYW1lfHNzaDJfYXV0aF9ob3N0YmFzZWRfZmlsZXxzc2gyX2F1dGhfbm9uZXxzc2gyX2F1dGhfcGFzc3dvcmR8c3NoMl9hdXRoX3B1YmtleV9maWxlfCcgKw0KICAgICAgICAnc3NoMl9jb25uZWN0fHNzaDJfZXhlY3xzc2gyX2ZldGNoX3N0cmVhbXxzc2gyX2ZpbmdlcnByaW50fHNzaDJfbWV0aG9kc19uZWdvdGlhdGVkfHNzaDJfcHVibGlja2V5X2FkZHxzc2gyX3B1YmxpY2tleV9pbml0fCcgKw0KICAgICAgICAnc3NoMl9wdWJsaWNrZXlfbGlzdHxzc2gyX3B1YmxpY2tleV9yZW1vdmV8c3NoMl9zY3BfcmVjdnxzc2gyX3NjcF9zZW5kfHNzaDJfc2Z0cHxzc2gyX3NmdHBfbHN0YXR8c3NoMl9zZnRwX21rZGlyfHNzaDJfc2Z0cF9yZWFkbGlua3wnICsNCiAgICAgICAgJ3NzaDJfc2Z0cF9yZWFscGF0aHxzc2gyX3NmdHBfcmVuYW1lfHNzaDJfc2Z0cF9ybWRpcnxzc2gyX3NmdHBfc3RhdHxzc2gyX3NmdHBfc3ltbGlua3xzc2gyX3NmdHBfdW5saW5rfHNzaDJfc2hlbGx8c3NoMl90dW5uZWx8c3RhdHwnICsNCiAgICAgICAgJ3N0YXRzX2Fic29sdXRlX2RldmlhdGlvbnxzdGF0c19jZGZfYmV0YXxzdGF0c19jZGZfYmlub21pYWx8c3RhdHNfY2RmX2NhdWNoeXxzdGF0c19jZGZfY2hpc3F1YXJlfHN0YXRzX2NkZl9leHBvbmVudGlhbHxzdGF0c19jZGZfZnwnICsNCiAgICAgICAgJ3N0YXRzX2NkZl9nYW1tYXxzdGF0c19jZGZfbGFwbGFjZXxzdGF0c19jZGZfbG9naXN0aWN8c3RhdHNfY2RmX25lZ2F0aXZlX2Jpbm9taWFsfHN0YXRzX2NkZl9ub25jZW50cmFsX2NoaXNxdWFyZXxzdGF0c19jZGZfbm9uY2VudHJhbF9mfCcgKw0KICAgICAgICAnc3RhdHNfY2RmX3BvaXNzb258c3RhdHNfY2RmX3R8c3RhdHNfY2RmX3VuaWZvcm18c3RhdHNfY2RmX3dlaWJ1bGx8c3RhdHNfY292YXJpYW5jZXxzdGF0c19kZW5fdW5pZm9ybXxzdGF0c19kZW5zX2JldGF8c3RhdHNfZGVuc19jYXVjaHl8JyArDQogICAgICAgICdzdGF0c19kZW5zX2NoaXNxdWFyZXxzdGF0c19kZW5zX2V4cG9uZW50aWFsfHN0YXRzX2RlbnNfZnxzdGF0c19kZW5zX2dhbW1hfHN0YXRzX2RlbnNfbGFwbGFjZXxzdGF0c19kZW5zX2xvZ2lzdGljfCcgKw0KICAgICAgICAnc3RhdHNfZGVuc19uZWdhdGl2ZV9iaW5vbWlhbHxzdGF0c19kZW5zX25vcm1hbHxzdGF0c19kZW5zX3BtZl9iaW5vbWlhbHxzdGF0c19kZW5zX3BtZl9oeXBlcmdlb21ldHJpY3xzdGF0c19kZW5zX3BtZl9wb2lzc29ufHN0YXRzX2RlbnNfdHwnICsNCiAgICAgICAgJ3N0YXRzX2RlbnNfd2VpYnVsbHxzdGF0c19oYXJtb25pY19tZWFufHN0YXRzX2t1cnRvc2lzfHN0YXRzX3JhbmRfZ2VuX2JldGF8c3RhdHNfcmFuZF9nZW5fY2hpc3F1YXJlfHN0YXRzX3JhbmRfZ2VuX2V4cG9uZW50aWFsfCcgKw0KICAgICAgICAnc3RhdHNfcmFuZF9nZW5fZnxzdGF0c19yYW5kX2dlbl9mdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9nYW1tYXxzdGF0c19yYW5kX2dlbl9pYmlub21pYWx8c3RhdHNfcmFuZF9nZW5faWJpbm9taWFsX25lZ2F0aXZlfCcgKw0KICAgICAgICAnc3RhdHNfcmFuZF9nZW5faW50fHN0YXRzX3JhbmRfZ2VuX2lwb2lzc29ufHN0YXRzX3JhbmRfZ2VuX2l1bmlmb3JtfHN0YXRzX3JhbmRfZ2VuX25vbmNlbnJhbF9jaGlzcXVhcmV8c3RhdHNfcmFuZF9nZW5fbm9uY2VudHJhbF9mfCcgKw0KICAgICAgICAnc3RhdHNfcmFuZF9nZW5fbm9uY2VudHJhbF90fHN0YXRzX3JhbmRfZ2VuX25vcm1hbHxzdGF0c19yYW5kX2dlbl90fHN0YXRzX3JhbmRfZ2V0X3NlZWRzfHN0YXRzX3JhbmRfcGhyYXNlX3RvX3NlZWRzfHN0YXRzX3JhbmRfcmFuZnwnICsNCiAgICAgICAgJ3N0YXRzX3JhbmRfc2V0YWxsfHN0YXRzX3NrZXd8c3RhdHNfc3RhbmRhcmRfZGV2aWF0aW9ufHN0YXRzX3N0YXRfYmlub21pYWxfY29lZnxzdGF0c19zdGF0X2NvcnJlbGF0aW9ufHN0YXRzX3N0YXRfZ2VubmNofCcgKw0KICAgICAgICAnc3RhdHNfc3RhdF9pbmRlcGVuZGVudF90fHN0YXRzX3N0YXRfaW5uZXJwcm9kdWN0fHN0YXRzX3N0YXRfbm9uY2VudHJhbF90fHN0YXRzX3N0YXRfcGFpcmVkX3R8c3RhdHNfc3RhdF9wZXJjZW50aWxlfHN0YXRzX3N0YXRfcG93ZXJzdW18JyArDQogICAgICAgICdzdGF0c192YXJpYW5jZXxzdG9tcHxzdG9tcF9jb25uZWN0X2Vycm9yfHN0b21wX3ZlcnNpb258c3RvbXBleGNlcHRpb258c3RvbXBmcmFtZXxzdHJfZ2V0Y3N2fHN0cl9pcmVwbGFjZXxzdHJfcGFkfHN0cl9yZXBlYXR8c3RyX3JlcGxhY2V8JyArDQogICAgICAgICdzdHJfcm90MTN8c3RyX3NodWZmbGV8c3RyX3NwbGl0fHN0cl93b3JkX2NvdW50fHN0cmNhc2VjbXB8c3RyY2hyfHN0cmNtcHxzdHJjb2xsfHN0cmNzcG58c3RyZWFtX2J1Y2tldF9hcHBlbmR8c3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZXwnICsNCiAgICAgICAgJ3N0cmVhbV9idWNrZXRfbmV3fHN0cmVhbV9idWNrZXRfcHJlcGVuZHxzdHJlYW1fY29udGV4dF9jcmVhdGV8c3RyZWFtX2NvbnRleHRfZ2V0X2RlZmF1bHR8c3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnN8JyArDQogICAgICAgICdzdHJlYW1fY29udGV4dF9nZXRfcGFyYW1zfHN0cmVhbV9jb250ZXh0X3NldF9kZWZhdWx0fHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb258c3RyZWFtX2NvbnRleHRfc2V0X3BhcmFtc3xzdHJlYW1fY29weV90b19zdHJlYW18JyArDQogICAgICAgICdzdHJlYW1fZW5jb2Rpbmd8c3RyZWFtX2ZpbHRlcl9hcHBlbmR8c3RyZWFtX2ZpbHRlcl9wcmVwZW5kfHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXJ8c3RyZWFtX2ZpbHRlcl9yZW1vdmV8c3RyZWFtX2dldF9jb250ZW50c3wnICsNCiAgICAgICAgJ3N0cmVhbV9nZXRfZmlsdGVyc3xzdHJlYW1fZ2V0X2xpbmV8c3RyZWFtX2dldF9tZXRhX2RhdGF8c3RyZWFtX2dldF90cmFuc3BvcnRzfHN0cmVhbV9nZXRfd3JhcHBlcnN8c3RyZWFtX2lzX2xvY2FsfCcgKw0KICAgICAgICAnc3RyZWFtX25vdGlmaWNhdGlvbl9jYWxsYmFja3xzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlcnxzdHJlYW1fcmVzb2x2ZV9pbmNsdWRlX3BhdGh8c3RyZWFtX3NlbGVjdHxzdHJlYW1fc2V0X2Jsb2NraW5nfHN0cmVhbV9zZXRfcmVhZF9idWZmZXJ8JyArDQogICAgICAgICdzdHJlYW1fc2V0X3RpbWVvdXR8c3RyZWFtX3NldF93cml0ZV9idWZmZXJ8c3RyZWFtX3NvY2tldF9hY2NlcHR8c3RyZWFtX3NvY2tldF9jbGllbnR8c3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvfHN0cmVhbV9zb2NrZXRfZ2V0X25hbWV8JyArDQogICAgICAgICdzdHJlYW1fc29ja2V0X3BhaXJ8c3RyZWFtX3NvY2tldF9yZWN2ZnJvbXxzdHJlYW1fc29ja2V0X3NlbmR0b3xzdHJlYW1fc29ja2V0X3NlcnZlcnxzdHJlYW1fc29ja2V0X3NodXRkb3dufHN0cmVhbV9zdXBwb3J0c19sb2NrfCcgKw0KICAgICAgICAnc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXJ8c3RyZWFtX3dyYXBwZXJfcmVzdG9yZXxzdHJlYW1fd3JhcHBlcl91bnJlZ2lzdGVyfHN0cmVhbXdyYXBwZXJ8c3RyZnRpbWV8c3RyaXBfdGFnc3xzdHJpcGNzbGFzaGVzfHN0cmlwb3N8JyArDQogICAgICAgICdzdHJpcHNsYXNoZXN8c3RyaXN0cnxzdHJsZW58c3RybmF0Y2FzZWNtcHxzdHJuYXRjbXB8c3RybmNhc2VjbXB8c3RybmNtcHxzdHJwYnJrfHN0cnBvc3xzdHJwdGltZXxzdHJyY2hyfHN0cnJldnxzdHJyaXBvc3xzdHJycG9zfHN0cnNwbnwnICsNCiAgICAgICAgJ3N0cnN0cnxzdHJ0b2t8c3RydG9sb3dlcnxzdHJ0b3RpbWV8c3RydG91cHBlcnxzdHJ0cnxzdHJ2YWx8c3Vic3RyfHN1YnN0cl9jb21wYXJlfHN1YnN0cl9jb3VudHxzdWJzdHJfcmVwbGFjZXxzdm18c3ZtbW9kZWx8c3ZuX2FkZHwnICsNCiAgICAgICAgJ3N2bl9hdXRoX2dldF9wYXJhbWV0ZXJ8c3ZuX2F1dGhfc2V0X3BhcmFtZXRlcnxzdm5fYmxhbWV8c3ZuX2NhdHxzdm5fY2hlY2tvdXR8c3ZuX2NsZWFudXB8c3ZuX2NsaWVudF92ZXJzaW9ufHN2bl9jb21taXR8c3ZuX2RlbGV0ZXwnICsNCiAgICAgICAgJ3N2bl9kaWZmfHN2bl9leHBvcnR8c3ZuX2ZzX2Fib3J0X3R4bnxzdm5fZnNfYXBwbHlfdGV4dHxzdm5fZnNfYmVnaW5fdHhuMnxzdm5fZnNfY2hhbmdlX25vZGVfcHJvcHxzdm5fZnNfY2hlY2tfcGF0aHwnICsNCiAgICAgICAgJ3N2bl9mc19jb250ZW50c19jaGFuZ2VkfHN2bl9mc19jb3B5fHN2bl9mc19kZWxldGV8c3ZuX2ZzX2Rpcl9lbnRyaWVzfHN2bl9mc19maWxlX2NvbnRlbnRzfHN2bl9mc19maWxlX2xlbmd0aHxzdm5fZnNfaXNfZGlyfHN2bl9mc19pc19maWxlfCcgKw0KICAgICAgICAnc3ZuX2ZzX21ha2VfZGlyfHN2bl9mc19tYWtlX2ZpbGV8c3ZuX2ZzX25vZGVfY3JlYXRlZF9yZXZ8c3ZuX2ZzX25vZGVfcHJvcHxzdm5fZnNfcHJvcHNfY2hhbmdlZHxzdm5fZnNfcmV2aXNpb25fcHJvcHxzdm5fZnNfcmV2aXNpb25fcm9vdHwnICsNCiAgICAgICAgJ3N2bl9mc190eG5fcm9vdHxzdm5fZnNfeW91bmdlc3RfcmV2fHN2bl9pbXBvcnR8c3ZuX2xvZ3xzdm5fbHN8c3ZuX21rZGlyfHN2bl9yZXBvc19jcmVhdGV8c3ZuX3JlcG9zX2ZzfHN2bl9yZXBvc19mc19iZWdpbl90eG5fZm9yX2NvbW1pdHwnICsNCiAgICAgICAgJ3N2bl9yZXBvc19mc19jb21taXRfdHhufHN2bl9yZXBvc19ob3Rjb3B5fHN2bl9yZXBvc19vcGVufHN2bl9yZXBvc19yZWNvdmVyfHN2bl9yZXZlcnR8c3ZuX3N0YXR1c3xzdm5fdXBkYXRlfHN3Zl9hY3Rpb25nZXR1cmx8JyArDQogICAgICAgICdzd2ZfYWN0aW9uZ290b2ZyYW1lfHN3Zl9hY3Rpb25nb3RvbGFiZWx8c3dmX2FjdGlvbm5leHRmcmFtZXxzd2ZfYWN0aW9ucGxheXxzd2ZfYWN0aW9ucHJldmZyYW1lfHN3Zl9hY3Rpb25zZXR0YXJnZXR8c3dmX2FjdGlvbnN0b3B8JyArDQogICAgICAgICdzd2ZfYWN0aW9udG9nZ2xlcXVhbGl0eXxzd2ZfYWN0aW9ud2FpdGZvcmZyYW1lfHN3Zl9hZGRidXR0b25yZWNvcmR8c3dmX2FkZGNvbG9yfHN3Zl9jbG9zZWZpbGV8c3dmX2RlZmluZWJpdG1hcHxzd2ZfZGVmaW5lZm9udHwnICsNCiAgICAgICAgJ3N3Zl9kZWZpbmVsaW5lfHN3Zl9kZWZpbmVwb2x5fHN3Zl9kZWZpbmVyZWN0fHN3Zl9kZWZpbmV0ZXh0fHN3Zl9lbmRidXR0b258c3dmX2VuZGRvYWN0aW9ufHN3Zl9lbmRzaGFwZXxzd2ZfZW5kc3ltYm9sfHN3Zl9mb250c2l6ZXwnICsNCiAgICAgICAgJ3N3Zl9mb250c2xhbnR8c3dmX2ZvbnR0cmFja2luZ3xzd2ZfZ2V0Yml0bWFwaW5mb3xzd2ZfZ2V0Zm9udGluZm98c3dmX2dldGZyYW1lfHN3Zl9sYWJlbGZyYW1lfHN3Zl9sb29rYXR8c3dmX21vZGlmeW9iamVjdHxzd2ZfbXVsY29sb3J8JyArDQogICAgICAgICdzd2ZfbmV4dGlkfHN3Zl9vbmNvbmRpdGlvbnxzd2Zfb3BlbmZpbGV8c3dmX29ydGhvfHN3Zl9vcnRobzJ8c3dmX3BlcnNwZWN0aXZlfHN3Zl9wbGFjZW9iamVjdHxzd2ZfcG9sYXJ2aWV3fHN3Zl9wb3BtYXRyaXh8c3dmX3Bvc3JvdW5kfCcgKw0KICAgICAgICAnc3dmX3B1c2htYXRyaXh8c3dmX3JlbW92ZW9iamVjdHxzd2Zfcm90YXRlfHN3Zl9zY2FsZXxzd2Zfc2V0Zm9udHxzd2Zfc2V0ZnJhbWV8c3dmX3NoYXBlYXJjfHN3Zl9zaGFwZWN1cnZldG98c3dmX3NoYXBlY3VydmV0bzN8JyArDQogICAgICAgICdzd2Zfc2hhcGVmaWxsYml0bWFwY2xpcHxzd2Zfc2hhcGVmaWxsYml0bWFwdGlsZXxzd2Zfc2hhcGVmaWxsb2ZmfHN3Zl9zaGFwZWZpbGxzb2xpZHxzd2Zfc2hhcGVsaW5lc29saWR8c3dmX3NoYXBlbGluZXRvfHN3Zl9zaGFwZW1vdmV0b3wnICsNCiAgICAgICAgJ3N3Zl9zaG93ZnJhbWV8c3dmX3N0YXJ0YnV0dG9ufHN3Zl9zdGFydGRvYWN0aW9ufHN3Zl9zdGFydHNoYXBlfHN3Zl9zdGFydHN5bWJvbHxzd2ZfdGV4dHdpZHRofHN3Zl90cmFuc2xhdGV8c3dmX3ZpZXdwb3J0fHN3ZmFjdGlvbnwnICsNCiAgICAgICAgJ3N3ZmJpdG1hcHxzd2ZidXR0b258c3dmZGlzcGxheWl0ZW18c3dmZmlsbHxzd2Zmb250fHN3ZmZvbnRjaGFyfHN3ZmdyYWRpZW50fHN3Zm1vcnBofHN3Zm1vdmllfHN3ZnByZWJ1aWx0Y2xpcHxzd2ZzaGFwZXxzd2Zzb3VuZHwnICsNCiAgICAgICAgJ3N3ZnNvdW5kaW5zdGFuY2V8c3dmc3ByaXRlfHN3ZnRleHR8c3dmdGV4dGZpZWxkfHN3ZnZpZGVvc3RyZWFtfHN3aXNoX2NvbnN0cnVjdHxzd2lzaF9nZXRtZXRhbGlzdHxzd2lzaF9nZXRwcm9wZXJ0eWxpc3R8c3dpc2hfcHJlcGFyZXwnICsNCiAgICAgICAgJ3N3aXNoX3F1ZXJ5fHN3aXNocmVzdWx0X2dldG1ldGFsaXN0fHN3aXNocmVzdWx0X3N0ZW18c3dpc2hyZXN1bHRzX2dldHBhcnNlZHdvcmRzfHN3aXNocmVzdWx0c19nZXRyZW1vdmVkc3RvcHdvcmRzfHN3aXNocmVzdWx0c19uZXh0cmVzdWx0fCcgKw0KICAgICAgICAnc3dpc2hyZXN1bHRzX3NlZWtyZXN1bHR8c3dpc2hzZWFyY2hfZXhlY3V0ZXxzd2lzaHNlYXJjaF9yZXNldGxpbWl0fHN3aXNoc2VhcmNoX3NldGxpbWl0fHN3aXNoc2VhcmNoX3NldHBocmFzZWRlbGltaXRlcnwnICsNCiAgICAgICAgJ3N3aXNoc2VhcmNoX3NldHNvcnR8c3dpc2hzZWFyY2hfc2V0c3RydWN0dXJlfHN5YmFzZV9hZmZlY3RlZF9yb3dzfHN5YmFzZV9jbG9zZXxzeWJhc2VfY29ubmVjdHxzeWJhc2VfZGF0YV9zZWVrfCcgKw0KICAgICAgICAnc3liYXNlX2RlYWRsb2NrX3JldHJ5X2NvdW50fHN5YmFzZV9mZXRjaF9hcnJheXxzeWJhc2VfZmV0Y2hfYXNzb2N8c3liYXNlX2ZldGNoX2ZpZWxkfHN5YmFzZV9mZXRjaF9vYmplY3R8c3liYXNlX2ZldGNoX3Jvd3wnICsNCiAgICAgICAgJ3N5YmFzZV9maWVsZF9zZWVrfHN5YmFzZV9mcmVlX3Jlc3VsdHxzeWJhc2VfZ2V0X2xhc3RfbWVzc2FnZXxzeWJhc2VfbWluX2NsaWVudF9zZXZlcml0eXxzeWJhc2VfbWluX2Vycm9yX3NldmVyaXR5fCcgKw0KICAgICAgICAnc3liYXNlX21pbl9tZXNzYWdlX3NldmVyaXR5fHN5YmFzZV9taW5fc2VydmVyX3NldmVyaXR5fHN5YmFzZV9udW1fZmllbGRzfHN5YmFzZV9udW1fcm93c3xzeWJhc2VfcGNvbm5lY3R8c3liYXNlX3F1ZXJ5fHN5YmFzZV9yZXN1bHR8JyArDQogICAgICAgICdzeWJhc2Vfc2VsZWN0X2RifHN5YmFzZV9zZXRfbWVzc2FnZV9oYW5kbGVyfHN5YmFzZV91bmJ1ZmZlcmVkX3F1ZXJ5fHN5bWxpbmt8c3lzX2dldF90ZW1wX2RpcnxzeXNfZ2V0bG9hZGF2Z3xzeXNsb2d8c3lzdGVtfHRhZ3x0YW58dGFuaHwnICsNCiAgICAgICAgJ3RjcHdyYXBfY2hlY2t8dGVtcG5hbXx0ZXh0ZG9tYWlufHRpZHl8dGlkeV9hY2Nlc3NfY291bnR8dGlkeV9jb25maWdfY291bnR8dGlkeV9kaWFnbm9zZXx0aWR5X2Vycm9yX2NvdW50fHRpZHlfZ2V0X2Vycm9yX2J1ZmZlcnwnICsNCiAgICAgICAgJ3RpZHlfZ2V0X291dHB1dHx0aWR5X2xvYWRfY29uZmlnfHRpZHlfcmVzZXRfY29uZmlnfHRpZHlfc2F2ZV9jb25maWd8dGlkeV9zZXRfZW5jb2Rpbmd8dGlkeV9zZXRvcHR8dGlkeV93YXJuaW5nX2NvdW50fHRpZHlub2RlfHRpbWV8JyArDQogICAgICAgICd0aW1lX25hbm9zbGVlcHx0aW1lX3NsZWVwX3VudGlsfHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdHx0aW1lem9uZV9pZGVudGlmaWVyc19saXN0fHRpbWV6b25lX2xvY2F0aW9uX2dldHx0aW1lem9uZV9uYW1lX2Zyb21fYWJicnwnICsNCiAgICAgICAgJ3RpbWV6b25lX25hbWVfZ2V0fHRpbWV6b25lX29mZnNldF9nZXR8dGltZXpvbmVfb3Blbnx0aW1lem9uZV90cmFuc2l0aW9uc19nZXR8dGltZXpvbmVfdmVyc2lvbl9nZXR8dG1wZmlsZXx0b2tlbl9nZXRfYWxsfHRva2VuX25hbWV8JyArDQogICAgICAgICd0b2t5b3R5cmFudHx0b2t5b3R5cmFudHF1ZXJ5fHRva3lvdHlyYW50dGFibGV8dG9zdHJpbmd8dG9zdHJpbmd8dG91Y2h8dHJhbnNsaXRlcmF0b3J8dHJhdmVyc2FibGV8dHJpZ2dlcl9lcnJvcnx0cmltfHVhc29ydHx1Y2ZpcnN0fCcgKw0KICAgICAgICAndWN3b3Jkc3x1ZG1fYWRkX3NlYXJjaF9saW1pdHx1ZG1fYWxsb2NfYWdlbnR8dWRtX2FsbG9jX2FnZW50X2FycmF5fHVkbV9hcGlfdmVyc2lvbnx1ZG1fY2F0X2xpc3R8dWRtX2NhdF9wYXRofHVkbV9jaGVja19jaGFyc2V0fCcgKw0KICAgICAgICAndWRtX2NoZWNrX3N0b3JlZHx1ZG1fY2xlYXJfc2VhcmNoX2xpbWl0c3x1ZG1fY2xvc2Vfc3RvcmVkfHVkbV9jcmMzMnx1ZG1fZXJybm98dWRtX2Vycm9yfHVkbV9maW5kfHVkbV9mcmVlX2FnZW50fHVkbV9mcmVlX2lzcGVsbF9kYXRhfCcgKw0KICAgICAgICAndWRtX2ZyZWVfcmVzfHVkbV9nZXRfZG9jX2NvdW50fHVkbV9nZXRfcmVzX2ZpZWxkfHVkbV9nZXRfcmVzX3BhcmFtfHVkbV9oYXNoMzJ8dWRtX2xvYWRfaXNwZWxsX2RhdGF8dWRtX29wZW5fc3RvcmVkfHVkbV9zZXRfYWdlbnRfcGFyYW18JyArDQogICAgICAgICd1a3NvcnR8dW1hc2t8dW5kZXJmbG93ZXhjZXB0aW9ufHVuZXhwZWN0ZWR2YWx1ZWV4Y2VwdGlvbnx1bmlxaWR8dW5peHRvamR8dW5saW5rfHVucGFja3x1bnJlZ2lzdGVyX3RpY2tfZnVuY3Rpb258dW5zZXJpYWxpemV8dW5zZXR8JyArDQogICAgICAgICd1cmxkZWNvZGV8dXJsZW5jb2RlfHVzZV9zb2FwX2Vycm9yX2hhbmRsZXJ8dXNlcl9lcnJvcnx1c2xlZXB8dXNvcnR8dXRmOF9kZWNvZGV8dXRmOF9lbmNvZGV8djhqc3x2OGpzZXhjZXB0aW9ufHZhcl9kdW1wfHZhcl9leHBvcnR8dmFyaWFudHwnICsNCiAgICAgICAgJ3ZhcmlhbnRfYWJzfHZhcmlhbnRfYWRkfHZhcmlhbnRfYW5kfHZhcmlhbnRfY2FzdHx2YXJpYW50X2NhdHx2YXJpYW50X2NtcHx2YXJpYW50X2RhdGVfZnJvbV90aW1lc3RhbXB8dmFyaWFudF9kYXRlX3RvX3RpbWVzdGFtcHwnICsNCiAgICAgICAgJ3ZhcmlhbnRfZGl2fHZhcmlhbnRfZXF2fHZhcmlhbnRfZml4fHZhcmlhbnRfZ2V0X3R5cGV8dmFyaWFudF9pZGl2fHZhcmlhbnRfaW1wfHZhcmlhbnRfaW50fHZhcmlhbnRfbW9kfHZhcmlhbnRfbXVsfHZhcmlhbnRfbmVnfHZhcmlhbnRfbm90fCcgKw0KICAgICAgICAndmFyaWFudF9vcnx2YXJpYW50X3Bvd3x2YXJpYW50X3JvdW5kfHZhcmlhbnRfc2V0fHZhcmlhbnRfc2V0X3R5cGV8dmFyaWFudF9zdWJ8dmFyaWFudF94b3J8dmVyc2lvbl9jb21wYXJlfHZmcHJpbnRmfHZpcnR1YWx8JyArDQogICAgICAgICd2cG9wbWFpbF9hZGRfYWxpYXNfZG9tYWlufHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW5fZXh8dnBvcG1haWxfYWRkX2RvbWFpbnx2cG9wbWFpbF9hZGRfZG9tYWluX2V4fHZwb3BtYWlsX2FkZF91c2VyfHZwb3BtYWlsX2FsaWFzX2FkZHwnICsNCiAgICAgICAgJ3Zwb3BtYWlsX2FsaWFzX2RlbHx2cG9wbWFpbF9hbGlhc19kZWxfZG9tYWlufHZwb3BtYWlsX2FsaWFzX2dldHx2cG9wbWFpbF9hbGlhc19nZXRfYWxsfHZwb3BtYWlsX2F1dGhfdXNlcnx2cG9wbWFpbF9kZWxfZG9tYWlufCcgKw0KICAgICAgICAndnBvcG1haWxfZGVsX2RvbWFpbl9leHx2cG9wbWFpbF9kZWxfdXNlcnx2cG9wbWFpbF9lcnJvcnx2cG9wbWFpbF9wYXNzd2R8dnBvcG1haWxfc2V0X3VzZXJfcXVvdGF8dnByaW50Znx2c3ByaW50Znx3MzJhcGlfZGVmdHlwZXwnICsNCiAgICAgICAgJ3czMmFwaV9pbml0X2R0eXBlfHczMmFwaV9pbnZva2VfZnVuY3Rpb258dzMyYXBpX3JlZ2lzdGVyX2Z1bmN0aW9ufHczMmFwaV9zZXRfY2FsbF9tZXRob2R8d2RkeF9hZGRfdmFyc3x3ZGR4X2Rlc2VyaWFsaXplfHdkZHhfcGFja2V0X2VuZHwnICsNCiAgICAgICAgJ3dkZHhfcGFja2V0X3N0YXJ0fHdkZHhfc2VyaWFsaXplX3ZhbHVlfHdkZHhfc2VyaWFsaXplX3ZhcnN8d2luMzJfY29udGludWVfc2VydmljZXx3aW4zMl9jcmVhdGVfc2VydmljZXx3aW4zMl9kZWxldGVfc2VydmljZXwnICsNCiAgICAgICAgJ3dpbjMyX2dldF9sYXN0X2NvbnRyb2xfbWVzc2FnZXx3aW4zMl9wYXVzZV9zZXJ2aWNlfHdpbjMyX3BzX2xpc3RfcHJvY3N8d2luMzJfcHNfc3RhdF9tZW18d2luMzJfcHNfc3RhdF9wcm9jfHdpbjMyX3F1ZXJ5X3NlcnZpY2Vfc3RhdHVzfCcgKw0KICAgICAgICAnd2luMzJfc2V0X3NlcnZpY2Vfc3RhdHVzfHdpbjMyX3N0YXJ0X3NlcnZpY2V8d2luMzJfc3RhcnRfc2VydmljZV9jdHJsX2Rpc3BhdGNoZXJ8d2luMzJfc3RvcF9zZXJ2aWNlfHdpbmNhY2hlX2ZjYWNoZV9maWxlaW5mb3wnICsNCiAgICAgICAgJ3dpbmNhY2hlX2ZjYWNoZV9tZW1pbmZvfHdpbmNhY2hlX2xvY2t8d2luY2FjaGVfb2NhY2hlX2ZpbGVpbmZvfHdpbmNhY2hlX29jYWNoZV9tZW1pbmZvfHdpbmNhY2hlX3JlZnJlc2hfaWZfY2hhbmdlZHwnICsNCiAgICAgICAgJ3dpbmNhY2hlX3JwbGlzdF9maWxlaW5mb3x3aW5jYWNoZV9ycGxpc3RfbWVtaW5mb3x3aW5jYWNoZV9zY2FjaGVfaW5mb3x3aW5jYWNoZV9zY2FjaGVfbWVtaW5mb3x3aW5jYWNoZV91Y2FjaGVfYWRkfHdpbmNhY2hlX3VjYWNoZV9jYXN8JyArDQogICAgICAgICd3aW5jYWNoZV91Y2FjaGVfY2xlYXJ8d2luY2FjaGVfdWNhY2hlX2RlY3x3aW5jYWNoZV91Y2FjaGVfZGVsZXRlfHdpbmNhY2hlX3VjYWNoZV9leGlzdHN8d2luY2FjaGVfdWNhY2hlX2dldHx3aW5jYWNoZV91Y2FjaGVfaW5jfCcgKw0KICAgICAgICAnd2luY2FjaGVfdWNhY2hlX2luZm98d2luY2FjaGVfdWNhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX3NldHx3aW5jYWNoZV91bmxvY2t8d29yZHdyYXB8eGF0dHJfZ2V0fHhhdHRyX2xpc3R8eGF0dHJfcmVtb3ZlfHhhdHRyX3NldHwnICsNCiAgICAgICAgJ3hhdHRyX3N1cHBvcnRlZHx4ZGlmZl9maWxlX2JkaWZmfHhkaWZmX2ZpbGVfYmRpZmZfc2l6ZXx4ZGlmZl9maWxlX2JwYXRjaHx4ZGlmZl9maWxlX2RpZmZ8eGRpZmZfZmlsZV9kaWZmX2JpbmFyeXx4ZGlmZl9maWxlX21lcmdlM3wnICsNCiAgICAgICAgJ3hkaWZmX2ZpbGVfcGF0Y2h8eGRpZmZfZmlsZV9wYXRjaF9iaW5hcnl8eGRpZmZfZmlsZV9yYWJkaWZmfHhkaWZmX3N0cmluZ19iZGlmZnx4ZGlmZl9zdHJpbmdfYmRpZmZfc2l6ZXx4ZGlmZl9zdHJpbmdfYnBhdGNofCcgKw0KICAgICAgICAneGRpZmZfc3RyaW5nX2RpZmZ8eGRpZmZfc3RyaW5nX2RpZmZfYmluYXJ5fHhkaWZmX3N0cmluZ19tZXJnZTN8eGRpZmZfc3RyaW5nX3BhdGNofHhkaWZmX3N0cmluZ19wYXRjaF9iaW5hcnl8eGRpZmZfc3RyaW5nX3JhYmRpZmZ8JyArDQogICAgICAgICd4aHByb2ZfZGlzYWJsZXx4aHByb2ZfZW5hYmxlfHhocHJvZl9zYW1wbGVfZGlzYWJsZXx4aHByb2Zfc2FtcGxlX2VuYWJsZXx4bWxfZXJyb3Jfc3RyaW5nfHhtbF9nZXRfY3VycmVudF9ieXRlX2luZGV4fCcgKw0KICAgICAgICAneG1sX2dldF9jdXJyZW50X2NvbHVtbl9udW1iZXJ8eG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyfHhtbF9nZXRfZXJyb3JfY29kZXx4bWxfcGFyc2V8eG1sX3BhcnNlX2ludG9fc3RydWN0fHhtbF9wYXJzZXJfY3JlYXRlfCcgKw0KICAgICAgICAneG1sX3BhcnNlcl9jcmVhdGVfbnN8eG1sX3BhcnNlcl9mcmVlfHhtbF9wYXJzZXJfZ2V0X29wdGlvbnx4bWxfcGFyc2VyX3NldF9vcHRpb258eG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyfHhtbF9zZXRfZGVmYXVsdF9oYW5kbGVyfCcgKw0KICAgICAgICAneG1sX3NldF9lbGVtZW50X2hhbmRsZXJ8eG1sX3NldF9lbmRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlcnx4bWxfc2V0X2V4dGVybmFsX2VudGl0eV9yZWZfaGFuZGxlcnx4bWxfc2V0X25vdGF0aW9uX2RlY2xfaGFuZGxlcnwnICsNCiAgICAgICAgJ3htbF9zZXRfb2JqZWN0fHhtbF9zZXRfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9oYW5kbGVyfHhtbF9zZXRfc3RhcnRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlcnx4bWxfc2V0X3VucGFyc2VkX2VudGl0eV9kZWNsX2hhbmRsZXJ8eG1scmVhZGVyfCcgKw0KICAgICAgICAneG1scnBjX2RlY29kZXx4bWxycGNfZGVjb2RlX3JlcXVlc3R8eG1scnBjX2VuY29kZXx4bWxycGNfZW5jb2RlX3JlcXVlc3R8eG1scnBjX2dldF90eXBlfHhtbHJwY19pc19mYXVsdHx4bWxycGNfcGFyc2VfbWV0aG9kX2Rlc2NyaXB0aW9uc3wnICsNCiAgICAgICAgJ3htbHJwY19zZXJ2ZXJfYWRkX2ludHJvc3BlY3Rpb25fZGF0YXx4bWxycGNfc2VydmVyX2NhbGxfbWV0aG9kfHhtbHJwY19zZXJ2ZXJfY3JlYXRlfHhtbHJwY19zZXJ2ZXJfZGVzdHJveXwnICsNCiAgICAgICAgJ3htbHJwY19zZXJ2ZXJfcmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9jYWxsYmFja3x4bWxycGNfc2VydmVyX3JlZ2lzdGVyX21ldGhvZHx4bWxycGNfc2V0X3R5cGV8eG1sd3JpdGVyX2VuZF9hdHRyaWJ1dGV8eG1sd3JpdGVyX2VuZF9jZGF0YXwnICsNCiAgICAgICAgJ3htbHdyaXRlcl9lbmRfY29tbWVudHx4bWx3cml0ZXJfZW5kX2RvY3VtZW50fHhtbHdyaXRlcl9lbmRfZHRkfHhtbHdyaXRlcl9lbmRfZHRkX2F0dGxpc3R8eG1sd3JpdGVyX2VuZF9kdGRfZWxlbWVudHwnICsNCiAgICAgICAgJ3htbHdyaXRlcl9lbmRfZHRkX2VudGl0eXx4bWx3cml0ZXJfZW5kX2VsZW1lbnR8eG1sd3JpdGVyX2VuZF9waXx4bWx3cml0ZXJfZmx1c2h8eG1sd3JpdGVyX2Z1bGxfZW5kX2VsZW1lbnR8eG1sd3JpdGVyX29wZW5fbWVtb3J5fCcgKw0KICAgICAgICAneG1sd3JpdGVyX29wZW5fdXJpfHhtbHdyaXRlcl9vdXRwdXRfbWVtb3J5fHhtbHdyaXRlcl9zZXRfaW5kZW50fHhtbHdyaXRlcl9zZXRfaW5kZW50X3N0cmluZ3x4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlfCcgKw0KICAgICAgICAneG1sd3JpdGVyX3N0YXJ0X2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfc3RhcnRfY2RhdGF8eG1sd3JpdGVyX3N0YXJ0X2NvbW1lbnR8eG1sd3JpdGVyX3N0YXJ0X2RvY3VtZW50fHhtbHdyaXRlcl9zdGFydF9kdGR8JyArDQogICAgICAgICd4bWx3cml0ZXJfc3RhcnRfZHRkX2F0dGxpc3R8eG1sd3JpdGVyX3N0YXJ0X2R0ZF9lbGVtZW50fHhtbHdyaXRlcl9zdGFydF9kdGRfZW50aXR5fHhtbHdyaXRlcl9zdGFydF9lbGVtZW50fHhtbHdyaXRlcl9zdGFydF9lbGVtZW50X25zfCcgKw0KICAgICAgICAneG1sd3JpdGVyX3N0YXJ0X3BpfHhtbHdyaXRlcl90ZXh0fHhtbHdyaXRlcl93cml0ZV9hdHRyaWJ1dGV8eG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfd3JpdGVfY2RhdGF8eG1sd3JpdGVyX3dyaXRlX2NvbW1lbnR8JyArDQogICAgICAgICd4bWx3cml0ZXJfd3JpdGVfZHRkfHhtbHdyaXRlcl93cml0ZV9kdGRfYXR0bGlzdHx4bWx3cml0ZXJfd3JpdGVfZHRkX2VsZW1lbnR8eG1sd3JpdGVyX3dyaXRlX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX3dyaXRlX2VsZW1lbnR8JyArDQogICAgICAgICd4bWx3cml0ZXJfd3JpdGVfZWxlbWVudF9uc3x4bWx3cml0ZXJfd3JpdGVfcGl8eG1sd3JpdGVyX3dyaXRlX3Jhd3x4cGF0aF9ldmFsfHhwYXRoX2V2YWxfZXhwcmVzc2lvbnx4cGF0aF9uZXdfY29udGV4dHx4cGF0aF9yZWdpc3Rlcl9uc3wnICsNCiAgICAgICAgJ3hwYXRoX3JlZ2lzdGVyX25zX2F1dG98eHB0cl9ldmFsfHhwdHJfbmV3X2NvbnRleHR8eHNsdF9iYWNrZW5kX2luZm98eHNsdF9iYWNrZW5kX25hbWV8eHNsdF9iYWNrZW5kX3ZlcnNpb258eHNsdF9jcmVhdGV8eHNsdF9lcnJub3wnICsNCiAgICAgICAgJ3hzbHRfZXJyb3J8eHNsdF9mcmVlfHhzbHRfZ2V0b3B0fHhzbHRfcHJvY2Vzc3x4c2x0X3NldF9iYXNlfHhzbHRfc2V0X2VuY29kaW5nfHhzbHRfc2V0X2Vycm9yX2hhbmRsZXJ8eHNsdF9zZXRfbG9nfHhzbHRfc2V0X29iamVjdHwnICsNCiAgICAgICAgJ3hzbHRfc2V0X3NheF9oYW5kbGVyfHhzbHRfc2V0X3NheF9oYW5kbGVyc3x4c2x0X3NldF9zY2hlbWVfaGFuZGxlcnx4c2x0X3NldF9zY2hlbWVfaGFuZGxlcnN8eHNsdF9zZXRvcHR8eHNsdHByb2Nlc3Nvcnx5YW1sX2VtaXR8JyArDQogICAgICAgICd5YW1sX2VtaXRfZmlsZXx5YW1sX3BhcnNlfHlhbWxfcGFyc2VfZmlsZXx5YW1sX3BhcnNlX3VybHx5YXpfYWRkaW5mb3x5YXpfY2NsX2NvbmZ8eWF6X2NjbF9wYXJzZXx5YXpfY2xvc2V8eWF6X2Nvbm5lY3R8eWF6X2RhdGFiYXNlfCcgKw0KICAgICAgICAneWF6X2VsZW1lbnR8eWF6X2Vycm5vfHlhel9lcnJvcnx5YXpfZXN8eWF6X2VzX3Jlc3VsdHx5YXpfZ2V0X29wdGlvbnx5YXpfaGl0c3x5YXpfaXRlbW9yZGVyfHlhel9wcmVzZW50fHlhel9yYW5nZXx5YXpfcmVjb3JkfHlhel9zY2FufCcgKw0KICAgICAgICAneWF6X3NjYW5fcmVzdWx0fHlhel9zY2hlbWF8eWF6X3NlYXJjaHx5YXpfc2V0X29wdGlvbnx5YXpfc29ydHx5YXpfc3ludGF4fHlhel93YWl0fHlwX2FsbHx5cF9jYXR8eXBfZXJyX3N0cmluZ3x5cF9lcnJub3x5cF9maXJzdHwnICsNCiAgICAgICAgJ3lwX2dldF9kZWZhdWx0X2RvbWFpbnx5cF9tYXN0ZXJ8eXBfbWF0Y2h8eXBfbmV4dHx5cF9vcmRlcnx6ZW5kX2xvZ29fZ3VpZHx6ZW5kX3RocmVhZF9pZHx6ZW5kX3ZlcnNpb258emlwX2Nsb3NlfHppcF9lbnRyeV9jbG9zZXwnICsNCiAgICAgICAgJ3ppcF9lbnRyeV9jb21wcmVzc2Vkc2l6ZXx6aXBfZW50cnlfY29tcHJlc3Npb25tZXRob2R8emlwX2VudHJ5X2ZpbGVzaXplfHppcF9lbnRyeV9uYW1lfHppcF9lbnRyeV9vcGVufHppcF9lbnRyeV9yZWFkfHppcF9vcGVufHppcF9yZWFkfCcgKw0KICAgICAgICAnemlwYXJjaGl2ZXx6aXBhcmNoaXZlX2FkZGVtcHR5ZGlyfHppcGFyY2hpdmVfYWRkZmlsZXx6aXBhcmNoaXZlX2FkZGZyb21zdHJpbmd8emlwYXJjaGl2ZV9jbG9zZXx6aXBhcmNoaXZlX2RlbGV0ZWluZGV4fCcgKw0KICAgICAgICAnemlwYXJjaGl2ZV9kZWxldGVuYW1lfHppcGFyY2hpdmVfZXh0cmFjdHRvfHppcGFyY2hpdmVfZ2V0YXJjaGl2ZWNvbW1lbnR8emlwYXJjaGl2ZV9nZXRjb21tZW50aW5kZXh8emlwYXJjaGl2ZV9nZXRjb21tZW50bmFtZXwnICsNCiAgICAgICAgJ3ppcGFyY2hpdmVfZ2V0ZnJvbWluZGV4fHppcGFyY2hpdmVfZ2V0ZnJvbW5hbWV8emlwYXJjaGl2ZV9nZXRuYW1laW5kZXh8emlwYXJjaGl2ZV9nZXRzdGF0dXNzdHJpbmd8emlwYXJjaGl2ZV9nZXRzdHJlYW18JyArDQogICAgICAgICd6aXBhcmNoaXZlX2xvY2F0ZW5hbWV8emlwYXJjaGl2ZV9vcGVufHppcGFyY2hpdmVfcmVuYW1laW5kZXh8emlwYXJjaGl2ZV9yZW5hbWVuYW1lfHppcGFyY2hpdmVfc2V0Q29tbWVudE5hbWV8emlwYXJjaGl2ZV9zZXRhcmNoaXZlY29tbWVudHwnICsNCiAgICAgICAgJ3ppcGFyY2hpdmVfc2V0Y29tbWVudGluZGV4fHppcGFyY2hpdmVfc3RhdGluZGV4fHppcGFyY2hpdmVfc3RhdG5hbWV8emlwYXJjaGl2ZV91bmNoYW5nZWFsbHx6aXBhcmNoaXZlX3VuY2hhbmdlYXJjaGl2ZXwnICsNCiAgICAgICAgJ3ppcGFyY2hpdmVfdW5jaGFuZ2VpbmRleHx6aXBhcmNoaXZlX3VuY2hhbmdlbmFtZXx6bGliX2dldF9jb2RpbmdfdHlwZScpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgLy8gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmtleXdvcmRzLnBocA0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCdhYnN0cmFjdHxhbmR8YXJyYXl8YXN8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZG98ZWxzZXxlbHNlaWZ8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnwnICsNCiAgICAgICAgJ2VuZHN3aXRjaHxlbmR3aGlsZXxleHRlbmRzfGZpbmFsfGZvcnxmb3JlYWNofGZ1bmN0aW9ufGdsb2JhbHxnb3RvfGlmfGltcGxlbWVudHN8aW50ZXJmYWNlfGluc3RhbmNlb2Z8bmFtZXNwYWNlfG5ld3xvcnxwcml2YXRlfHByb3RlY3RlZHwnICsNCiAgICAgICAgJ3B1YmxpY3xzdGF0aWN8c3dpdGNofHRocm93fHRyeXx1c2V8dmFyfHdoaWxlfHhvcicpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgLy8gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmtleXdvcmRzLnBocA0KICAgIHZhciBsYW5ndWFnZUNvbnN0cnVjdHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnZGllfGVjaG98ZW1wdHl8ZXhpdHxldmFsfGluY2x1ZGV8aW5jbHVkZV9vbmNlfGlzc2V0fGxpc3R8cmVxdWlyZXxyZXF1aXJlX29uY2V8cmV0dXJufHByaW50fHVuc2V0Jykuc3BsaXQoJ3wnKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCd0cnVlfGZhbHNlfG51bGx8X19DTEFTU19ffF9fRElSX198X19GSUxFX198X19MSU5FX198X19NRVRIT0RfX3xfX0ZVTkNUSU9OX198X19OQU1FU1BBQ0VfXycpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgdmFyIGJ1aWx0aW5WYXJpYWJsZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnJEdMT0JBTFN8JF9TRVJWRVJ8JF9HRVR8JF9QT1NUfCRfRklMRVN8JF9SRVFVRVNUfCRfU0VTU0lPTnwkX0VOVnwkX0NPT0tJRXwkcGhwX2Vycm9ybXNnfCRIVFRQX1JBV19QT1NUX0RBVEF8JyArDQogICAgICAgICckaHR0cF9yZXNwb25zZV9oZWFkZXJ8JGFyZ2N8JGFyZ3YnKS5zcGxpdCgnfCcpDQogICAgKTsNCg0KICAgIC8vIERpc2NvdmVyeSBkb25lIGJ5IGRvd25sb2FkaW5nICdNYW55IEhUTUwgZmlsZXMnIGZyb206ICBodHRwOi8vcGhwLm5ldC9kb3dubG9hZC1kb2NzLnBocA0KICAgIC8vIFRoZW4gc2VhcmNoIGZvciBmaWxlcyBjb250YWluaW5nICdkZXByZWNhdGVkJyAoY2FzZS1pbnNlbnNpdGl2ZSkgYW5kIGxvb2sgYXQgZWFjaCBmaWxlIHRoYXQgdHVybnMgdXAuDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnNEZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoJ2tleV9leGlzdHN8Y2Fpcm9fbWF0cml4X2NyZWF0ZV9zY2FsZXxjYWlyb19tYXRyaXhfY3JlYXRlX3RyYW5zbGF0ZXxjYWxsX3VzZXJfbWV0aG9kfGNhbGxfdXNlcl9tZXRob2RfYXJyYXl8Y29tX2FkZHJlZnxjb21fZ2V0fCcgKw0KICAgICAgICAnY29tX2ludm9rZXxjb21faXNlbnVtfGNvbV9sb2FkfGNvbV9yZWxlYXNlfGNvbV9zZXR8Y29ubmVjdGlvbl90aW1lb3V0fGN1YnJpZF9sb2FkX2Zyb21fZ2xvfGN1YnJpZF9uZXdfZ2xvfGN1YnJpZF9zYXZlX3RvX2dsb3wnICsNCiAgICAgICAgJ2N1YnJpZF9zZW5kX2dsb3xkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkbHxlcmVnfGVyZWdfcmVwbGFjZXxlcmVnaXxlcmVnaV9yZXBsYWNlfGh3X2RvY3VtZW50YXR0cmlidXRlc3xod19kb2N1bWVudGJvZHl0YWd8JyArDQogICAgICAgICdod19kb2N1bWVudHNpemV8aHdfb3V0cHV0ZG9jdW1lbnR8aW1hZ2VkYXNoZWRsaW5lfG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2xpZW50X2VuY29kaW5nfG1heGRiX2Nsb3NlX2xvbmdfZGF0YXwnICsNCiAgICAgICAgJ21heGRiX2V4ZWN1dGV8bWF4ZGJfZmV0Y2h8bWF4ZGJfZ2V0X21ldGFkYXRhfG1heGRiX3BhcmFtX2NvdW50fG1heGRiX3NlbmRfbG9uZ19kYXRhfG1jcnlwdF9lY2J8bWNyeXB0X2dlbmVyaWNfZW5kfG1pbWVfY29udGVudF90eXBlfCcgKw0KICAgICAgICAnbXlzcWxfY3JlYXRlZGJ8bXlzcWxfZGJuYW1lfG15c3FsX2RiX3F1ZXJ5fG15c3FsX2Ryb3BfZGJ8bXlzcWxfZHJvcGRifG15c3FsX2VzY2FwZV9zdHJpbmd8bXlzcWxfZmllbGRmbGFnc3xteXNxbF9maWVsZGZsYWdzfCcgKw0KICAgICAgICAnbXlzcWxfZmllbGRuYW1lfG15c3FsX2ZpZWxkdGFibGV8bXlzcWxfZmllbGR0eXBlfG15c3FsX2ZyZWVyZXN1bHR8bXlzcWxfbGlzdGRic3xteXNxbF9saXN0X2ZpZWxkc3xteXNxbF9saXN0ZmllbGRzfG15c3FsX2xpc3RfdGFibGVzfCcgKw0KICAgICAgICAnbXlzcWxfbGlzdHRhYmxlc3xteXNxbF9udW1maWVsZHN8bXlzcWxfbnVtcm93c3xteXNxbF9zZWxlY3RkYnxteXNxbF90YWJsZW5hbWV8bXlzcWxpX2JpbmRfcGFyYW18bXlzcWxpX2JpbmRfcmVzdWx0fCcgKw0KICAgICAgICAnbXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlfG15c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2VuYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2V4ZWN1dGV8JyArDQogICAgICAgICdteXNxbGlfZmV0Y2h8bXlzcWxpX2dldF9tZXRhZGF0YXxteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcnBsX3BhcnNlX2VuYWJsZWR8bXlzcWxpX3JwbF9wcm9iZXxteXNxbGlfcnBsX3F1ZXJ5X3R5cGV8JyArDQogICAgICAgICdteXNxbGlfc2VuZF9sb25nX2RhdGF8bXlzcWxpX3NlbmRfcXVlcnl8bXlzcWxpX3NsYXZlX3F1ZXJ5fG9jaWJpbmRieW5hbWV8b2NpY2FuY2VsfG9jaWNsb3NlbG9ifG9jaWNvbGxhcHBlbmR8b2NpY29sbGFzc2lnbnwnICsNCiAgICAgICAgJ29jaWNvbGxhc3NpZ25lbGVtfG9jaWNvbGxnZXRlbGVtfG9jaWNvbGxtYXh8b2NpY29sbHNpemV8b2NpY29sbHRyaW18b2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfCcgKw0KICAgICAgICAnb2NpY29sdW1uc2l6ZXxvY2ljb2x1bW50eXBlfG9jaWNvbHVtbnR5cGVyYXd8b2NpY29tbWl0fG9jaWRlZmluZWJ5bmFtZXxvY2llcnJvcnxvY2lleGVjdXRlfG9jaWZldGNofG9jaWZldGNoaW50b3xvY2lmZXRjaHN0YXRlbWVudHwnICsNCiAgICAgICAgJ29jaWZyZWVjb2xsZWN0aW9ufG9jaWZyZWVjdXJzb3J8b2NpZnJlZWRlc2N8b2NpZnJlZXN0YXRlbWVudHxvY2lpbnRlcm5hbGRlYnVnfG9jaWxvYWRsb2J8b2NpbG9nb2ZmfG9jaWxvZ29ufG9jaW5ld2NvbGxlY3Rpb258JyArDQogICAgICAgICdvY2luZXdjdXJzb3J8b2NpbmV3ZGVzY3JpcHRvcnxvY2lubG9nb258b2NpbnVtY29sc3xvY2lwYXJzZXxvY2lwbG9nb258b2NpcmVzdWx0fG9jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8JyArDQogICAgICAgICdvY2lzZXJ2ZXJ2ZXJzaW9ufG9jaXNldHByZWZldGNofG9jaXN0YXRlbWVudHR5cGV8b2Npd3JpdGVsb2J0b2ZpbGV8b2Npd3JpdGV0ZW1wb3Jhcnlsb2J8UERGX2FkZF9hbm5vdGF0aW9ufFBERl9hZGRfYm9va21hcmt8JyArDQogICAgICAgICdQREZfYWRkX2xhdW5jaGxpbmt8UERGX2FkZF9sb2NhbGxpbmt8UERGX2FkZF9ub3RlfFBERl9hZGRfb3V0bGluZXxQREZfYWRkX3BkZmxpbmt8UERGX2FkZF93ZWJsaW5rfFBERl9hdHRhY2hfZmlsZXxQREZfYmVnaW5fcGFnZXwnICsNCiAgICAgICAgJ1BERl9iZWdpbl90ZW1wbGF0ZXxQREZfY2xvc2VfcGRpfFBERl9jbG9zZXxQREZfZmluZGZvbnR8UERGX2dldF9mb250fFBERl9nZXRfZm9udG5hbWV8UERGX2dldF9mb250c2l6ZXxQREZfZ2V0X2ltYWdlX2hlaWdodHwnICsNCiAgICAgICAgJ1BERl9nZXRfaW1hZ2Vfd2lkdGh8UERGX2dldF9tYWpvcnZlcnNpb258UERGX2dldF9taW5vcnZlcnNpb258UERGX2dldF9wZGlfcGFyYW1ldGVyfFBERl9nZXRfcGRpX3ZhbHVlfFBERl9vcGVuX2NjaXR0fFBERl9vcGVuX2ZpbGV8JyArDQogICAgICAgICdQREZfb3Blbl9naWZ8UERGX29wZW5faW1hZ2VfZmlsZXxQREZfb3Blbl9pbWFnZXxQREZfb3Blbl9qcGVnfFBERl9vcGVuX3BkaXxQREZfb3Blbl90aWZmfFBERl9wbGFjZV9pbWFnZXxQREZfcGxhY2VfcGRpX3BhZ2V8JyArDQogICAgICAgICdQREZfc2V0X2JvcmRlcl9jb2xvcnxQREZfc2V0X2JvcmRlcl9kYXNofFBERl9zZXRfYm9yZGVyX3N0eWxlfFBERl9zZXRfY2hhcl9zcGFjaW5nfFBERl9zZXRfZHVyYXRpb258UERGX3NldF9ob3Jpel9zY2FsaW5nfCcgKw0KICAgICAgICAnUERGX3NldF9pbmZvX2F1dGhvcnxQREZfc2V0X2luZm9fY3JlYXRvcnxQREZfc2V0X2luZm9fa2V5d29yZHN8UERGX3NldF9pbmZvX3N1YmplY3R8UERGX3NldF9pbmZvX3RpdGxlfFBERl9zZXRfbGVhZGluZ3wnICsNCiAgICAgICAgJ1BERl9zZXRfdGV4dF9tYXRyaXh8UERGX3NldF90ZXh0X3JlbmRlcmluZ3xQREZfc2V0X3RleHRfcmlzZXxQREZfc2V0X3dvcmRfc3BhY2luZ3xQREZfc2V0Z3JheV9maWxsfFBERl9zZXRncmF5X3N0cm9rZXxQREZfc2V0Z3JheXwnICsNCiAgICAgICAgJ1BERl9zZXRwb2x5ZGFzaHxQREZfc2V0cmdiY29sb3JfZmlsbHxQREZfc2V0cmdiY29sb3Jfc3Ryb2tlfFBERl9zZXRyZ2Jjb2xvcnxQREZfc2hvd19ib3hlZHxwaHBfY2hlY2tfc3ludGF4fHB4X3NldF90YWJsZW5hbWV8JyArDQogICAgICAgICdweF9zZXRfdGFyZ2V0ZW5jb2Rpbmd8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8c2Vzc2lvbl9pc19yZWdpc3RlcmVkfHNlc3Npb25fcmVnaXN0ZXJ8c2Vzc2lvbl91bnJlZ2lzdGVyJyArDQogICAgICAgICdzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWV8bWFnaWNfcXVvdGVzX3J1bnRpbWV8c2V0X3NvY2tldF9ibG9ja2luZ3xzb2NrZXRfc2V0X2Jsb2NraW5nfHNldF9zb2NrZXRfdGltZW91dHxzb2NrZXRfc2V0X3RpbWVvdXR8c3BsaXR8c3BsaXRpfCcgKw0KICAgICAgICAnc3FsX3JlZ2Nhc2UnKS5zcGxpdCgnfCcpDQogICAgKTsNCg0KICAgIHZhciBrZXl3b3Jkc0RlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgnY2Z1bmN0aW9ufG9sZF9mdW5jdGlvbicpLnNwbGl0KCd8JykNCiAgICApOw0KDQogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKFtdKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LnBocF90YWciLCAvLyBwaHAgb3BlbiB0YWcNCiAgICAgICAgICAgICAgICByZWdleCA6ICI8XFw/KD86cGhwfFxcPSkiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQucGhwX3RhZyIsIC8vIHBocCBjbG9zZSB0YWcNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD8+Ig0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiaHRtbGNvbW1lbnQiDQogICAgICAgICAgICB9LCANCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiPHN0eWxlIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNzcyINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/Wy1fYS16QS1aMC05Ol0rIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImh0bWx0YWciDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogJ21ldGEudGFnJywNCiAgICAgICAgICAgICAgICByZWdleCA6ICc8XCFET0NUWVBFLio/PicNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgcmVnZXggOiAiIy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBkb2NDb21tZW50LmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dW2dpbXldKlxccyooPz1bKS4sO118JCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlIiwgLy8gY29uc3RhbnRzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxiKD86REVGQVVMVF9JTkNMVURFX1BBVEh8RV8oPzpBTEx8Q08oPzpNUElMRV8oPzpFUlJPUnxXQVJOSU5HKXxSRV8oPzpFUlJPUnxXQVJOSU5HKSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiRVJST1J8Tk9USUNFfFBBUlNFfFNUUklDVHxVU0VSXyg/OkVSUk9SfE5PVElDRXxXQVJOSU5HKXxXQVJOSU5HKXxQKD86RUFSXyg/OkVYVEVOU0lPTl9ESVJ8SU5TVEFMTF9ESVIpfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIkhQXyg/OkJJTkRJUnxDT05GSUdfRklMRV8oPzpQQVRIfFNDQU5fRElSKXxEQVRBRElSfEUoPzpPTHxYVEVOU0lPTl9ESVIpfElOVF8oPzpNQVh8U0laRSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiTCg/OklCRElSfE9DQUxTVEFURURJUil8Tyg/OlN8VVRQVVRfSEFORExFUl8oPzpDT05UfEVORHxTVEFSVCkpfFBSRUZJWHxTKD86QVBJfEhMSUJfU1VGRklYfFlTQ09ORkRJUil8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTikpfF9fQ09NUElMRVJfSEFMVF9PRkZTRVRfXylcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLCAvLyBjb25zdGFudHMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXGIoPzpBKD86Qig/OkRBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxNT05fKD86MSg/OjB8MXwyfCl8MnwzfDR8NXw2fDd8OHw5KSl8TFRfRElHSVRTfE1fU1RSfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIlNTRVJUXyg/OkFDVElWRXxCQUlMfENBTExCQUNLfFFVSUVUX0VWQUx8V0FSTklORykpfEMoPzpBU0VfKD86TE9XRVJ8VVBQRVIpfEhBUl9NQVh8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiTyg/OkRFU0VUfE5ORUNUSU9OXyg/OkFCT1JURUR8Tk9STUFMfFRJTUVPVVQpfFVOVF8oPzpOT1JNQUx8UkVDVVJTSVZFKSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiUig/OkVESVRTXyg/OkFMTHxET0NTfEZVTExQQUdFfEcoPzpFTkVSQUx8Uk9VUCl8TU9EVUxFU3xRQXxTQVBJKXxOQ1lTVFJ8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiWVBUXyg/OkJMT1dGSVNIfEVYVF9ERVN8TUQ1fFMoPzpBTFRfTEVOR1RIfFREX0RFUykpKXxVUlJFTkNZX1NZTUJPTCl8RCg/OkFZXyg/OjF8MnwzfDR8NXw2fDcpfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIkVDSU1BTF9QT0lOVHxJUkVDVE9SWV9TRVBBUkFUT1J8Xyg/OkZNVHxUX0ZNVCkpfEUoPzpOVF8oPzpDT01QQVR8Tk9RVU9URVN8UVVPVEVTKXxSQSg/Ol8oPzpEXyg/OkZNVHxUX0ZNVCl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiVF9GTVR8WUVBUil8KXxYVFJfKD86SUZfRVhJU1RTfE9WRVJXUklURXxQUkVGSVhfKD86QUxMfEkoPzpGX0VYSVNUU3xOVkFMSUQpfFNBTUUpfFNLSVApKXxGUkFDX0RJR0lUU3xHUk9VUElOR3wiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJIVE1MXyg/OkVOVElUSUVTfFNQRUNJQUxDSEFSUyl8SU4oPzpGT18oPzpBTEx8Qyg/Ok9ORklHVVJBVElPTnxSRURJVFMpfEVOVklST05NRU5UfEdFTkVSQUx8TElDRU5TRXxNT0RVTEVTfFZBUklBQkxFUyl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiSV8oPzpBTEx8UEVSRElSfFNZU1RFTXxVU0VSKXxUXyg/OkNVUlJfU1lNQk9MfEZSQUNfRElHSVRTKSl8TCg/OkNfKD86QUxMfEMoPzpPTExBVEV8VFlQRSl8TSg/OkVTU0FHRVN8T05FVEFSWSl8TlVNRVJJQ3xUSU1FKXwiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJPKD86Q0tfKD86RVh8TkJ8U0h8VU4pfEdfKD86QSg/OkxFUlR8VVRIKD86UFJJVnwpKXxDKD86T05TfFIoPzpJVHxPTikpfEQoPzpBRU1PTnxFQlVHKXxFKD86TUVSR3xSUil8SU5GT3xLRVJOfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIkwoPzpPQ0FMKD86MHwxfDJ8M3w0fDV8Nnw3KXxQUil8TUFJTHxOKD86REVMQVl8RVdTfE8oPzpUSUNFfFdBSVQpKXxPREVMQVl8UCg/OkVSUk9SfElEKXxTWVNMT0d8VSg/OlNFUnxVQ1ApfFdBUk5JTkcpKSl8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiTSg/Ok9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OXxERUNJTUFMX1BPSU5UfEdST1VQSU5HfFRIT1VTQU5EU19TRVApfF8oPzoxX1BJfDJfKD86UEl8U1FSVFBJKXxFfEwoPzpOKD86MTB8Mil8IiArDQogICAgICAgICAgICAgICAgICAgICAgICAiT0coPzoxMEV8MkUpKXxQSSg/Ol8oPzoyfDQpfCl8U1FSVCg/OjFfMnwyKSkpfE4oPzpFR0FUSVZFX1NJR058Tyg/OkVYUFJ8U1RSKXxfKD86Q1NfUFJFQ0VERVN8Uyg/OkVQX0JZX1NQQUNFfElHTl9QT1NOKSkpfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIlAoPzpBVEgoPzpJTkZPXyg/OkJBU0VOQU1FfERJUk5BTUV8RVhURU5TSU9OKXxfU0VQQVJBVE9SKXxNX1NUUnxPU0lUSVZFX1NJR058Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXwiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJSQURJWENIQVJ8Uyg/OkVFS18oPzpDVVJ8RU5EfFNFVCl8T1JUXyg/OkFTQ3xERVNDfE5VTUVSSUN8UkVHVUxBUnxTVFJJTkcpfFRSX1BBRF8oPzpCT1RIfExFRlR8UklHSFQpKXwiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICJUKD86SE9VUyg/OkFORFNfU0VQfEVQKXxfRk1UKD86X0FNUE18KSl8WUVTKD86RVhQUnxTVFIpfFNURCg/OklOfE9VVHxFUlIpKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluVmFyaWFibGVzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUubWF0Y2goL14oXCRbYS16QS1aXVthLXpBLVowLTlfXSp8c2VsZnxwYXJlbnQpJC8pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUiOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJodG1sY29tbWVudCIgOiBbDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgICB9IA0KICAgICAgICAgXSwNCiAgICAgICAgICJodG1sdGFnIiA6IFsgDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIj4iLA0KICAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTpdKyINCiAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAnIi4qPyInDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICInLio/JyINCiAgICAgICAgICAgICB9IA0KICAgICAgICAgXSwNCiAgICAgICAgImNzcyIgOiBbIA0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICI8XC9zdHlsZT4iLA0KICAgICAgICAgICAgICAgICBuZXh0IDogImh0bWx0YWciDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIj4iLA0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAndGV4dCcsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Om1lZGlhfHR5cGV8aHJlZikiDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICdzdHJpbmcnLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICc9Ii4qPyInDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgICByZWdleCA6ICJceyIsDQogICAgICAgICAgICAgICAgIG5leHQgOiAiY3NzZGVjbGFyYXRpb24iLA0KICAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIiNbQS1aYS16MC05XC1cX1wuXSsiDQogICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLltBLVphLXowLTlcLVxfXC5dKyINCiAgICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiW0EtWmEtejAtOV0rIg0KICAgICAgICAgICAgIH0NCiAgICAgICAgIF0sDQogICAgICAgICAiY3NzZGVjbGFyYXRpb24iIDogWw0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC50eXBlIiwNCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiW1wtYS16QS1aXSsiLA0KICAgICAgICAgICAgICAgICBuZXh0ICA6ICJjc3N2YWx1ZSINCiAgICAgICAgICAgICB9LCANCiAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1x9JywNCiAgICAgICAgICAgICAgICAgbmV4dCA6ICJjc3MiDQogICAgICAgICAgICAgfQ0KICAgICAgICAgXSwNCiAgICAgICAgICJjc3N2YWx1ZSIgOiBbDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiXDoiDQogICAgICAgICAgICAgICB9LCANCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiI1swLTlhLXpBLVpdKyINCiAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiW1wtXF8wLTlhLXpBLVpcIicgLCVdKyINCiAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiOyIsDQogICAgICAgICAgICAgICAgICAgbmV4dCA6ICJjc3NkZWNsYXJhdGlvbiINCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgIF0sDQogICAgfTsNCg0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhQaHBIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5QaHBIaWdobGlnaHRSdWxlcyA9IFBocEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-php.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9waHAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvcGhwX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3BocF9oaWdobGlnaHRfcnVsZXMiKS5QaHBIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixrPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGosdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGt9O2QuaW5oZXJpdHMobCxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKSMvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIjIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW1w6XVxzKiQvKTtnJiYoZCs9Yyl9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3BocF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZixiPWUuYXJyYXlUb01hcCgiYWJzfGFjb3N8YWNvc2h8YWRkY3NsYXNoZXN8YWRkc2xhc2hlc3xhZ2dyZWdhdGV8YWdncmVnYXRlX2luZm98YWdncmVnYXRlX21ldGhvZHN8YWdncmVnYXRlX21ldGhvZHNfYnlfbGlzdHxhZ2dyZWdhdGVfbWV0aG9kc19ieV9yZWdleHB8YWdncmVnYXRlX3Byb3BlcnRpZXN8YWdncmVnYXRlX3Byb3BlcnRpZXNfYnlfbGlzdHxhZ2dyZWdhdGVfcHJvcGVydGllc19ieV9yZWdleHB8YWdncmVnYXRpb25faW5mb3xhbXFwY29ubmVjdGlvbnxhbXFwZXhjaGFuZ2V8YW1xcHF1ZXVlfGFwYWNoZV9jaGlsZF90ZXJtaW5hdGV8YXBhY2hlX2dldF9tb2R1bGVzfGFwYWNoZV9nZXRfdmVyc2lvbnxhcGFjaGVfZ2V0ZW52fGFwYWNoZV9sb29rdXBfdXJpfGFwYWNoZV9ub3RlfGFwYWNoZV9yZXF1ZXN0X2hlYWRlcnN8YXBhY2hlX3Jlc2V0X3RpbWVvdXR8YXBhY2hlX3Jlc3BvbnNlX2hlYWRlcnN8YXBhY2hlX3NldGVudnxhcGNfYWRkfGFwY19iaW5fZHVtcHxhcGNfYmluX2R1bXBmaWxlfGFwY19iaW5fbG9hZHxhcGNfYmluX2xvYWRmaWxlfGFwY19jYWNoZV9pbmZvfGFwY19jYXN8YXBjX2NsZWFyX2NhY2hlfGFwY19jb21waWxlX2ZpbGV8YXBjX2RlY3xhcGNfZGVmaW5lX2NvbnN0YW50c3xhcGNfZGVsZXRlfGFwY19kZWxldGVfZmlsZXxhcGNfZXhpc3RzfGFwY19mZXRjaHxhcGNfaW5jfGFwY19sb2FkX2NvbnN0YW50c3xhcGNfc21hX2luZm98YXBjX3N0b3JlfGFwY2l0ZXJhdG9yfGFwZF9icmVha3BvaW50fGFwZF9jYWxsc3RhY2t8YXBkX2NsdW5rfGFwZF9jb250aW51ZXxhcGRfY3JvYWt8YXBkX2R1bXBfZnVuY3Rpb25fdGFibGV8YXBkX2R1bXBfcGVyc2lzdGVudF9yZXNvdXJjZXN8YXBkX2R1bXBfcmVndWxhcl9yZXNvdXJjZXN8YXBkX2VjaG98YXBkX2dldF9hY3RpdmVfc3ltYm9sc3xhcGRfc2V0X3Bwcm9mX3RyYWNlfGFwZF9zZXRfc2Vzc2lvbnxhcGRfc2V0X3Nlc3Npb25fdHJhY2V8YXBkX3NldF9zZXNzaW9uX3RyYWNlX3NvY2tldHxhcHBlbmRpdGVyYXRvcnxhcnJheXxhcnJheV9jaGFuZ2Vfa2V5X2Nhc2V8YXJyYXlfY2h1bmt8YXJyYXlfY29tYmluZXxhcnJheV9jb3VudF92YWx1ZXN8YXJyYXlfZGlmZnxhcnJheV9kaWZmX2Fzc29jfGFycmF5X2RpZmZfa2V5fGFycmF5X2RpZmZfdWFzc29jfGFycmF5X2RpZmZfdWtleXxhcnJheV9maWxsfGFycmF5X2ZpbGxfa2V5c3xhcnJheV9maWx0ZXJ8YXJyYXlfZmxpcHxhcnJheV9pbnRlcnNlY3R8YXJyYXlfaW50ZXJzZWN0X2Fzc29jfGFycmF5X2ludGVyc2VjdF9rZXl8YXJyYXlfaW50ZXJzZWN0X3Vhc3NvY3xhcnJheV9pbnRlcnNlY3RfdWtleXxhcnJheV9rZXlfZXhpc3RzfGFycmF5X2tleXN8YXJyYXlfbWFwfGFycmF5X21lcmdlfGFycmF5X21lcmdlX3JlY3Vyc2l2ZXxhcnJheV9tdWx0aXNvcnR8YXJyYXlfcGFkfGFycmF5X3BvcHxhcnJheV9wcm9kdWN0fGFycmF5X3B1c2h8YXJyYXlfcmFuZHxhcnJheV9yZWR1Y2V8YXJyYXlfcmVwbGFjZXxhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZXxhcnJheV9yZXZlcnNlfGFycmF5X3NlYXJjaHxhcnJheV9zaGlmdHxhcnJheV9zbGljZXxhcnJheV9zcGxpY2V8YXJyYXlfc3VtfGFycmF5X3VkaWZmfGFycmF5X3VkaWZmX2Fzc29jfGFycmF5X3VkaWZmX3Vhc3NvY3xhcnJheV91aW50ZXJzZWN0fGFycmF5X3VpbnRlcnNlY3RfYXNzb2N8YXJyYXlfdWludGVyc2VjdF91YXNzb2N8YXJyYXlfdW5pcXVlfGFycmF5X3Vuc2hpZnR8YXJyYXlfdmFsdWVzfGFycmF5X3dhbGt8YXJyYXlfd2Fsa19yZWN1cnNpdmV8YXJyYXlhY2Nlc3N8YXJyYXlpdGVyYXRvcnxhcnJheW9iamVjdHxhcnNvcnR8YXNpbnxhc2luaHxhc29ydHxhc3NlcnR8YXNzZXJ0X29wdGlvbnN8YXRhbnxhdGFuMnxhdGFuaHxhdWRpb3Byb3BlcnRpZXN8YmFkZnVuY3Rpb25jYWxsZXhjZXB0aW9ufGJhZG1ldGhvZGNhbGxleGNlcHRpb258YmFzZTY0X2RlY29kZXxiYXNlNjRfZW5jb2RlfGJhc2VfY29udmVydHxiYXNlbmFtZXxiYmNvZGVfYWRkX2VsZW1lbnR8YmJjb2RlX2FkZF9zbWlsZXl8YmJjb2RlX2NyZWF0ZXxiYmNvZGVfZGVzdHJveXxiYmNvZGVfcGFyc2V8YmJjb2RlX3NldF9hcmdfcGFyc2VyfGJiY29kZV9zZXRfZmxhZ3N8YmNhZGR8YmNjb21wfGJjZGl2fGJjbW9kfGJjbXVsfGJjb21waWxlcl9sb2FkfGJjb21waWxlcl9sb2FkX2V4ZXxiY29tcGlsZXJfcGFyc2VfY2xhc3N8YmNvbXBpbGVyX3JlYWR8YmNvbXBpbGVyX3dyaXRlX2NsYXNzfGJjb21waWxlcl93cml0ZV9jb25zdGFudHxiY29tcGlsZXJfd3JpdGVfZXhlX2Zvb3RlcnxiY29tcGlsZXJfd3JpdGVfZmlsZXxiY29tcGlsZXJfd3JpdGVfZm9vdGVyfGJjb21waWxlcl93cml0ZV9mdW5jdGlvbnxiY29tcGlsZXJfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmlsZXxiY29tcGlsZXJfd3JpdGVfaGVhZGVyfGJjb21waWxlcl93cml0ZV9pbmNsdWRlZF9maWxlbmFtZXxiY3Bvd3xiY3Bvd21vZHxiY3NjYWxlfGJjc3FydHxiY3N1YnxiaW4yaGV4fGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0fGJpbmRlY3xiaW5kdGV4dGRvbWFpbnxic29uX2RlY29kZXxic29uX2VuY29kZXxidW1wVmFsdWV8YnpjbG9zZXxiemNvbXByZXNzfGJ6ZGVjb21wcmVzc3xiemVycm5vfGJ6ZXJyb3J8YnplcnJzdHJ8YnpmbHVzaHxiem9wZW58YnpyZWFkfGJ6d3JpdGV8Y2FjaGluZ2l0ZXJhdG9yfGNhaXJvfGNhaXJvX2NyZWF0ZXxjYWlyb19mb250X2ZhY2VfZ2V0X3R5cGV8Y2Fpcm9fZm9udF9mYWNlX3N0YXR1c3xjYWlyb19mb250X29wdGlvbnNfY3JlYXRlfGNhaXJvX2ZvbnRfb3B0aW9uc19lcXVhbHxjYWlyb19mb250X29wdGlvbnNfZ2V0X2FudGlhbGlhc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfbWV0cmljc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfc3R5bGV8Y2Fpcm9fZm9udF9vcHRpb25zX2dldF9zdWJwaXhlbF9vcmRlcnxjYWlyb19mb250X29wdGlvbnNfaGFzaHxjYWlyb19mb250X29wdGlvbnNfbWVyZ2V8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXN8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9oaW50X21ldHJpY3N8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9oaW50X3N0eWxlfGNhaXJvX2ZvbnRfb3B0aW9uc19zZXRfc3VicGl4ZWxfb3JkZXJ8Y2Fpcm9fZm9udF9vcHRpb25zX3N0YXR1c3xjYWlyb19mb3JtYXRfc3RyaWRlX2Zvcl93aWR0aHxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mcm9tX3BuZ3xjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9kYXRhfGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2Zvcm1hdHxjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHR8Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlfGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRofGNhaXJvX21hdHJpeF9jcmVhdGVfc2NhbGV8Y2Fpcm9fbWF0cml4X2NyZWF0ZV90cmFuc2xhdGV8Y2Fpcm9fbWF0cml4X2ludmVydHxjYWlyb19tYXRyaXhfbXVsdGlwbHl8Y2Fpcm9fbWF0cml4X3JvdGF0ZXxjYWlyb19tYXRyaXhfdHJhbnNmb3JtX2Rpc3RhbmNlfGNhaXJvX21hdHJpeF90cmFuc2Zvcm1fcG9pbnR8Y2Fpcm9fbWF0cml4X3RyYW5zbGF0ZXxjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYnxjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmF8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfZm9yX3N1cmZhY2V8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyfGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbHxjYWlyb19wYXR0ZXJuX2NyZWF0ZV9yZ2J8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfcmdiYXxjYWlyb19wYXR0ZXJuX2dldF9jb2xvcl9zdG9wX2NvdW50fGNhaXJvX3BhdHRlcm5fZ2V0X2NvbG9yX3N0b3BfcmdiYXxjYWlyb19wYXR0ZXJuX2dldF9leHRlbmR8Y2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fZ2V0X2xpbmVhcl9wb2ludHN8Y2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4fGNhaXJvX3BhdHRlcm5fZ2V0X3JhZGlhbF9jaXJjbGVzfGNhaXJvX3BhdHRlcm5fZ2V0X3JnYmF8Y2Fpcm9fcGF0dGVybl9nZXRfc3VyZmFjZXxjYWlyb19wYXR0ZXJuX2dldF90eXBlfGNhaXJvX3BhdHRlcm5fc2V0X2V4dGVuZHxjYWlyb19wYXR0ZXJuX3NldF9maWx0ZXJ8Y2Fpcm9fcGF0dGVybl9zZXRfbWF0cml4fGNhaXJvX3BhdHRlcm5fc3RhdHVzfGNhaXJvX3BkZl9zdXJmYWNlX2NyZWF0ZXxjYWlyb19wZGZfc3VyZmFjZV9zZXRfc2l6ZXxjYWlyb19wc19nZXRfbGV2ZWxzfGNhaXJvX3BzX2xldmVsX3RvX3N0cmluZ3xjYWlyb19wc19zdXJmYWNlX2NyZWF0ZXxjYWlyb19wc19zdXJmYWNlX2RzY19iZWdpbl9wYWdlX3NldHVwfGNhaXJvX3BzX3N1cmZhY2VfZHNjX2JlZ2luX3NldHVwfGNhaXJvX3BzX3N1cmZhY2VfZHNjX2NvbW1lbnR8Y2Fpcm9fcHNfc3VyZmFjZV9nZXRfZXBzfGNhaXJvX3BzX3N1cmZhY2VfcmVzdHJpY3RfdG9fbGV2ZWx8Y2Fpcm9fcHNfc3VyZmFjZV9zZXRfZXBzfGNhaXJvX3BzX3N1cmZhY2Vfc2V0X3NpemV8Y2Fpcm9fc2NhbGVkX2ZvbnRfY3JlYXRlfGNhaXJvX3NjYWxlZF9mb250X2V4dGVudHN8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X2N0bXxjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9mYWNlfGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X21hdHJpeHxjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3NjYWxlZF9mb250X2dldF9zY2FsZV9tYXRyaXh8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X3R5cGV8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2x5cGhfZXh0ZW50c3xjYWlyb19zY2FsZWRfZm9udF9zdGF0dXN8Y2Fpcm9fc2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRzfGNhaXJvX3N1cmZhY2VfY29weV9wYWdlfGNhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJ8Y2Fpcm9fc3VyZmFjZV9maW5pc2h8Y2Fpcm9fc3VyZmFjZV9mbHVzaHxjYWlyb19zdXJmYWNlX2dldF9jb250ZW50fGNhaXJvX3N1cmZhY2VfZ2V0X2RldmljZV9vZmZzZXR8Y2Fpcm9fc3VyZmFjZV9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGV8Y2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5fGNhaXJvX3N1cmZhY2VfbWFya19kaXJ0eV9yZWN0YW5nbGV8Y2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldHxjYWlyb19zdXJmYWNlX3NldF9mYWxsYmFja19yZXNvbHV0aW9ufGNhaXJvX3N1cmZhY2Vfc2hvd19wYWdlfGNhaXJvX3N1cmZhY2Vfc3RhdHVzfGNhaXJvX3N1cmZhY2Vfd3JpdGVfdG9fcG5nfGNhaXJvX3N2Z19zdXJmYWNlX2NyZWF0ZXxjYWlyb19zdmdfc3VyZmFjZV9yZXN0cmljdF90b192ZXJzaW9ufGNhaXJvX3N2Z192ZXJzaW9uX3RvX3N0cmluZ3xjYWlyb2FudGlhbGlhc3xjYWlyb2NvbnRlbnR8Y2Fpcm9jb250ZXh0fGNhaXJvZXhjZXB0aW9ufGNhaXJvZXh0ZW5kfGNhaXJvZmlsbHJ1bGV8Y2Fpcm9maWx0ZXJ8Y2Fpcm9mb250ZmFjZXxjYWlyb2ZvbnRvcHRpb25zfGNhaXJvZm9udHNsYW50fGNhaXJvZm9udHR5cGV8Y2Fpcm9mb250d2VpZ2h0fGNhaXJvZm9ybWF0fGNhaXJvZ3JhZGllbnRwYXR0ZXJufGNhaXJvaGludG1ldHJpY3N8Y2Fpcm9oaW50c3R5bGV8Y2Fpcm9pbWFnZXN1cmZhY2V8Y2Fpcm9saW5lYXJncmFkaWVudHxjYWlyb2xpbmVjYXB8Y2Fpcm9saW5lam9pbnxjYWlyb21hdHJpeHxjYWlyb29wZXJhdG9yfGNhaXJvcGF0aHxjYWlyb3BhdHRlcm58Y2Fpcm9wYXR0ZXJudHlwZXxjYWlyb3BkZnN1cmZhY2V8Y2Fpcm9wc2xldmVsfGNhaXJvcHNzdXJmYWNlfGNhaXJvcmFkaWFsZ3JhZGllbnR8Y2Fpcm9zY2FsZWRmb250fGNhaXJvc29saWRwYXR0ZXJufGNhaXJvc3RhdHVzfGNhaXJvc3VicGl4ZWxvcmRlcnxjYWlyb3N1cmZhY2V8Y2Fpcm9zdXJmYWNlcGF0dGVybnxjYWlyb3N1cmZhY2V0eXBlfGNhaXJvc3Znc3VyZmFjZXxjYWlyb3N2Z3ZlcnNpb258Y2Fpcm90b3lmb250ZmFjZXxjYWxfZGF5c19pbl9tb250aHxjYWxfZnJvbV9qZHxjYWxfaW5mb3xjYWxfdG9famR8Y2FsY3VsX2htYWN8Y2FsY3VsaG1hY3xjYWxsX3VzZXJfZnVuY3xjYWxsX3VzZXJfZnVuY19hcnJheXxjYWxsX3VzZXJfbWV0aG9kfGNhbGxfdXNlcl9tZXRob2RfYXJyYXl8Y2FsbGJhY2tmaWx0ZXJpdGVyYXRvcnxjZWlsfGNoZGJ8Y2hkYl9jcmVhdGV8Y2hkaXJ8Y2hlY2tkYXRlfGNoZWNrZG5zcnJ8Y2hncnB8Y2htb2R8Y2hvcHxjaG93bnxjaHJ8Y2hyb290fGNodW5rX3NwbGl0fGNsYXNzX2FsaWFzfGNsYXNzX2V4aXN0c3xjbGFzc19pbXBsZW1lbnRzfGNsYXNzX3BhcmVudHN8Y2xhc3NraXRfaW1wb3J0fGNsYXNza2l0X21ldGhvZF9hZGR8Y2xhc3NraXRfbWV0aG9kX2NvcHl8Y2xhc3NraXRfbWV0aG9kX3JlZGVmaW5lfGNsYXNza2l0X21ldGhvZF9yZW1vdmV8Y2xhc3NraXRfbWV0aG9kX3JlbmFtZXxjbGVhcnN0YXRjYWNoZXxjbG9uZXxjbG9zZWRpcnxjbG9zZWxvZ3xjb2xsYXRvcnxjb218Y29tX2FkZHJlZnxjb21fY3JlYXRlX2d1aWR8Y29tX2V2ZW50X3Npbmt8Y29tX2dldHxjb21fZ2V0X2FjdGl2ZV9vYmplY3R8Y29tX2ludm9rZXxjb21faXNlbnVtfGNvbV9sb2FkfGNvbV9sb2FkX3R5cGVsaWJ8Y29tX21lc3NhZ2VfcHVtcHxjb21fcHJpbnRfdHlwZWluZm98Y29tX3Byb3BnZXR8Y29tX3Byb3BwdXR8Y29tX3Byb3BzZXR8Y29tX3JlbGVhc2V8Y29tX3NldHxjb21wYWN0fGNvbm5lY3Rpb25fYWJvcnRlZHxjb25uZWN0aW9uX3N0YXR1c3xjb25uZWN0aW9uX3RpbWVvdXR8Y29uc3RhbnR8Y29uc3RydWN0fGNvbnN0cnVjdHxjb25zdHJ1Y3R8Y29udmVydF9jeXJfc3RyaW5nfGNvbnZlcnRfdXVkZWNvZGV8Y29udmVydF91dWVuY29kZXxjb3B5fGNvc3xjb3NofGNvdW50fGNvdW50X2NoYXJzfGNvdW50YWJsZXxjb3VudGVyX2J1bXB8Y291bnRlcl9idW1wX3ZhbHVlfGNvdW50ZXJfY3JlYXRlfGNvdW50ZXJfZ2V0fGNvdW50ZXJfZ2V0X21ldGF8Y291bnRlcl9nZXRfbmFtZWR8Y291bnRlcl9nZXRfdmFsdWV8Y291bnRlcl9yZXNldHxjb3VudGVyX3Jlc2V0X3ZhbHVlfGNyYWNrX2NoZWNrfGNyYWNrX2Nsb3NlZGljdHxjcmFja19nZXRsYXN0bWVzc2FnZXxjcmFja19vcGVuZGljdHxjcmMzMnxjcmVhdGVfZnVuY3Rpb258Y3J5cHR8Y3R5cGVfYWxudW18Y3R5cGVfYWxwaGF8Y3R5cGVfY250cmx8Y3R5cGVfZGlnaXR8Y3R5cGVfZ3JhcGh8Y3R5cGVfbG93ZXJ8Y3R5cGVfcHJpbnR8Y3R5cGVfcHVuY3R8Y3R5cGVfc3BhY2V8Y3R5cGVfdXBwZXJ8Y3R5cGVfeGRpZ2l0fGN1YnJpZF9hZmZlY3RlZF9yb3dzfGN1YnJpZF9iaW5kfGN1YnJpZF9jbGllbnRfZW5jb2Rpbmd8Y3VicmlkX2Nsb3NlfGN1YnJpZF9jbG9zZV9wcmVwYXJlfGN1YnJpZF9jbG9zZV9yZXF1ZXN0fGN1YnJpZF9jb2xfZ2V0fGN1YnJpZF9jb2xfc2l6ZXxjdWJyaWRfY29sdW1uX25hbWVzfGN1YnJpZF9jb2x1bW5fdHlwZXN8Y3VicmlkX2NvbW1pdHxjdWJyaWRfY29ubmVjdHxjdWJyaWRfY29ubmVjdF93aXRoX3VybHxjdWJyaWRfY3VycmVudF9vaWR8Y3VicmlkX2RhdGFfc2Vla3xjdWJyaWRfZGJfbmFtZXxjdWJyaWRfZGlzY29ubmVjdHxjdWJyaWRfZHJvcHxjdWJyaWRfZXJybm98Y3VicmlkX2Vycm9yfGN1YnJpZF9lcnJvcl9jb2RlfGN1YnJpZF9lcnJvcl9jb2RlX2ZhY2lsaXR5fGN1YnJpZF9lcnJvcl9tc2d8Y3VicmlkX2V4ZWN1dGV8Y3VicmlkX2ZldGNofGN1YnJpZF9mZXRjaF9hcnJheXxjdWJyaWRfZmV0Y2hfYXNzb2N8Y3VicmlkX2ZldGNoX2ZpZWxkfGN1YnJpZF9mZXRjaF9sZW5ndGhzfGN1YnJpZF9mZXRjaF9vYmplY3R8Y3VicmlkX2ZldGNoX3Jvd3xjdWJyaWRfZmllbGRfZmxhZ3N8Y3VicmlkX2ZpZWxkX2xlbnxjdWJyaWRfZmllbGRfbmFtZXxjdWJyaWRfZmllbGRfc2Vla3xjdWJyaWRfZmllbGRfdGFibGV8Y3VicmlkX2ZpZWxkX3R5cGV8Y3VicmlkX2ZyZWVfcmVzdWx0fGN1YnJpZF9nZXR8Y3VicmlkX2dldF9hdXRvY29tbWl0fGN1YnJpZF9nZXRfY2hhcnNldHxjdWJyaWRfZ2V0X2NsYXNzX25hbWV8Y3VicmlkX2dldF9jbGllbnRfaW5mb3xjdWJyaWRfZ2V0X2RiX3BhcmFtZXRlcnxjdWJyaWRfZ2V0X3NlcnZlcl9pbmZvfGN1YnJpZF9pbnNlcnRfaWR8Y3VicmlkX2lzX2luc3RhbmNlfGN1YnJpZF9saXN0X2Ric3xjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbG9iX2Nsb3NlfGN1YnJpZF9sb2JfZXhwb3J0fGN1YnJpZF9sb2JfZ2V0fGN1YnJpZF9sb2Jfc2VuZHxjdWJyaWRfbG9iX3NpemV8Y3VicmlkX2xvY2tfcmVhZHxjdWJyaWRfbG9ja193cml0ZXxjdWJyaWRfbW92ZV9jdXJzb3J8Y3VicmlkX25ld19nbG98Y3VicmlkX25leHRfcmVzdWx0fGN1YnJpZF9udW1fY29sc3xjdWJyaWRfbnVtX2ZpZWxkc3xjdWJyaWRfbnVtX3Jvd3N8Y3VicmlkX3Bpbmd8Y3VicmlkX3ByZXBhcmV8Y3VicmlkX3B1dHxjdWJyaWRfcXVlcnl8Y3VicmlkX3JlYWxfZXNjYXBlX3N0cmluZ3xjdWJyaWRfcmVzdWx0fGN1YnJpZF9yb2xsYmFja3xjdWJyaWRfc2F2ZV90b19nbG98Y3VicmlkX3NjaGVtYXxjdWJyaWRfc2VuZF9nbG98Y3VicmlkX3NlcV9kcm9wfGN1YnJpZF9zZXFfaW5zZXJ0fGN1YnJpZF9zZXFfcHV0fGN1YnJpZF9zZXRfYWRkfGN1YnJpZF9zZXRfYXV0b2NvbW1pdHxjdWJyaWRfc2V0X2RiX3BhcmFtZXRlcnxjdWJyaWRfc2V0X2Ryb3B8Y3VicmlkX3VuYnVmZmVyZWRfcXVlcnl8Y3VicmlkX3ZlcnNpb258Y3VybF9jbG9zZXxjdXJsX2NvcHlfaGFuZGxlfGN1cmxfZXJybm98Y3VybF9lcnJvcnxjdXJsX2V4ZWN8Y3VybF9nZXRpbmZvfGN1cmxfaW5pdHxjdXJsX211bHRpX2FkZF9oYW5kbGV8Y3VybF9tdWx0aV9jbG9zZXxjdXJsX211bHRpX2V4ZWN8Y3VybF9tdWx0aV9nZXRjb250ZW50fGN1cmxfbXVsdGlfaW5mb19yZWFkfGN1cmxfbXVsdGlfaW5pdHxjdXJsX211bHRpX3JlbW92ZV9oYW5kbGV8Y3VybF9tdWx0aV9zZWxlY3R8Y3VybF9zZXRvcHR8Y3VybF9zZXRvcHRfYXJyYXl8Y3VybF92ZXJzaW9ufGN1cnJlbnR8Y3lydXNfYXV0aGVudGljYXRlfGN5cnVzX2JpbmR8Y3lydXNfY2xvc2V8Y3lydXNfY29ubmVjdHxjeXJ1c19xdWVyeXxjeXJ1c191bmJpbmR8ZGF0ZXxkYXRlX2FkZHxkYXRlX2NyZWF0ZXxkYXRlX2NyZWF0ZV9mcm9tX2Zvcm1hdHxkYXRlX2RhdGVfc2V0fGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXR8ZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldHxkYXRlX2RpZmZ8ZGF0ZV9mb3JtYXR8ZGF0ZV9nZXRfbGFzdF9lcnJvcnN8ZGF0ZV9pbnRlcnZhbF9jcmVhdGVfZnJvbV9kYXRlX3N0cmluZ3xkYXRlX2ludGVydmFsX2Zvcm1hdHxkYXRlX2lzb2RhdGVfc2V0fGRhdGVfbW9kaWZ5fGRhdGVfb2Zmc2V0X2dldHxkYXRlX3BhcnNlfGRhdGVfcGFyc2VfZnJvbV9mb3JtYXR8ZGF0ZV9zdWJ8ZGF0ZV9zdW5faW5mb3xkYXRlX3N1bnJpc2V8ZGF0ZV9zdW5zZXR8ZGF0ZV90aW1lX3NldHxkYXRlX3RpbWVzdGFtcF9nZXR8ZGF0ZV90aW1lc3RhbXBfc2V0fGRhdGVfdGltZXpvbmVfZ2V0fGRhdGVfdGltZXpvbmVfc2V0fGRhdGVpbnRlcnZhbHxkYXRlcGVyaW9kfGRhdGV0aW1lfGRhdGV0aW1lem9uZXxkYjJfYXV0b2NvbW1pdHxkYjJfYmluZF9wYXJhbXxkYjJfY2xpZW50X2luZm98ZGIyX2Nsb3NlfGRiMl9jb2x1bW5fcHJpdmlsZWdlc3xkYjJfY29sdW1uc3xkYjJfY29tbWl0fGRiMl9jb25uX2Vycm9yfGRiMl9jb25uX2Vycm9ybXNnfGRiMl9jb25uZWN0fGRiMl9jdXJzb3JfdHlwZXxkYjJfZXNjYXBlX3N0cmluZ3xkYjJfZXhlY3xkYjJfZXhlY3V0ZXxkYjJfZmV0Y2hfYXJyYXl8ZGIyX2ZldGNoX2Fzc29jfGRiMl9mZXRjaF9ib3RofGRiMl9mZXRjaF9vYmplY3R8ZGIyX2ZldGNoX3Jvd3xkYjJfZmllbGRfZGlzcGxheV9zaXplfGRiMl9maWVsZF9uYW1lfGRiMl9maWVsZF9udW18ZGIyX2ZpZWxkX3ByZWNpc2lvbnxkYjJfZmllbGRfc2NhbGV8ZGIyX2ZpZWxkX3R5cGV8ZGIyX2ZpZWxkX3dpZHRofGRiMl9mb3JlaWduX2tleXN8ZGIyX2ZyZWVfcmVzdWx0fGRiMl9mcmVlX3N0bXR8ZGIyX2dldF9vcHRpb258ZGIyX2xhc3RfaW5zZXJ0X2lkfGRiMl9sb2JfcmVhZHxkYjJfbmV4dF9yZXN1bHR8ZGIyX251bV9maWVsZHN8ZGIyX251bV9yb3dzfGRiMl9wY2xvc2V8ZGIyX3Bjb25uZWN0fGRiMl9wcmVwYXJlfGRiMl9wcmltYXJ5X2tleXN8ZGIyX3Byb2NlZHVyZV9jb2x1bW5zfGRiMl9wcm9jZWR1cmVzfGRiMl9yZXN1bHR8ZGIyX3JvbGxiYWNrfGRiMl9zZXJ2ZXJfaW5mb3xkYjJfc2V0X29wdGlvbnxkYjJfc3BlY2lhbF9jb2x1bW5zfGRiMl9zdGF0aXN0aWNzfGRiMl9zdG10X2Vycm9yfGRiMl9zdG10X2Vycm9ybXNnfGRiMl90YWJsZV9wcml2aWxlZ2VzfGRiMl90YWJsZXN8ZGJhX2Nsb3NlfGRiYV9kZWxldGV8ZGJhX2V4aXN0c3xkYmFfZmV0Y2h8ZGJhX2ZpcnN0a2V5fGRiYV9oYW5kbGVyc3xkYmFfaW5zZXJ0fGRiYV9rZXlfc3BsaXR8ZGJhX2xpc3R8ZGJhX25leHRrZXl8ZGJhX29wZW58ZGJhX29wdGltaXplfGRiYV9wb3BlbnxkYmFfcmVwbGFjZXxkYmFfc3luY3xkYmFzZV9hZGRfcmVjb3JkfGRiYXNlX2Nsb3NlfGRiYXNlX2NyZWF0ZXxkYmFzZV9kZWxldGVfcmVjb3JkfGRiYXNlX2dldF9oZWFkZXJfaW5mb3xkYmFzZV9nZXRfcmVjb3JkfGRiYXNlX2dldF9yZWNvcmRfd2l0aF9uYW1lc3xkYmFzZV9udW1maWVsZHN8ZGJhc2VfbnVtcmVjb3Jkc3xkYmFzZV9vcGVufGRiYXNlX3BhY2t8ZGJhc2VfcmVwbGFjZV9yZWNvcmR8ZGJwbHVzX2FkZHxkYnBsdXNfYXFsfGRicGx1c19jaGRpcnxkYnBsdXNfY2xvc2V8ZGJwbHVzX2N1cnJ8ZGJwbHVzX2VycmNvZGV8ZGJwbHVzX2Vycm5vfGRicGx1c19maW5kfGRicGx1c19maXJzdHxkYnBsdXNfZmx1c2h8ZGJwbHVzX2ZyZWVhbGxsb2Nrc3xkYnBsdXNfZnJlZWxvY2t8ZGJwbHVzX2ZyZWVybG9ja3N8ZGJwbHVzX2dldGxvY2t8ZGJwbHVzX2dldHVuaXF1ZXxkYnBsdXNfaW5mb3xkYnBsdXNfbGFzdHxkYnBsdXNfbG9ja3JlbHxkYnBsdXNfbmV4dHxkYnBsdXNfb3BlbnxkYnBsdXNfcHJldnxkYnBsdXNfcmNocGVybXxkYnBsdXNfcmNyZWF0ZXxkYnBsdXNfcmNydGV4YWN0fGRicGx1c19yY3J0bGlrZXxkYnBsdXNfcmVzb2x2ZXxkYnBsdXNfcmVzdG9yZXBvc3xkYnBsdXNfcmtleXN8ZGJwbHVzX3JvcGVufGRicGx1c19ycXVlcnl8ZGJwbHVzX3JyZW5hbWV8ZGJwbHVzX3JzZWNpbmRleHxkYnBsdXNfcnVubGlua3xkYnBsdXNfcnphcHxkYnBsdXNfc2F2ZXBvc3xkYnBsdXNfc2V0aW5kZXh8ZGJwbHVzX3NldGluZGV4YnludW1iZXJ8ZGJwbHVzX3NxbHxkYnBsdXNfdGNsfGRicGx1c190cmVtb3ZlfGRicGx1c191bmRvfGRicGx1c191bmRvcHJlcGFyZXxkYnBsdXNfdW5sb2NrcmVsfGRicGx1c191bnNlbGVjdHxkYnBsdXNfdXBkYXRlfGRicGx1c194bG9ja3JlbHxkYnBsdXNfeHVubG9ja3JlbHxkYnhfY2xvc2V8ZGJ4X2NvbXBhcmV8ZGJ4X2Nvbm5lY3R8ZGJ4X2Vycm9yfGRieF9lc2NhcGVfc3RyaW5nfGRieF9mZXRjaF9yb3d8ZGJ4X3F1ZXJ5fGRieF9zb3J0fGRjZ2V0dGV4dHxkY25nZXR0ZXh0fGRlYWdncmVnYXRlfGRlYnVnX2JhY2t0cmFjZXxkZWJ1Z19wcmludF9iYWNrdHJhY2V8ZGVidWdfenZhbF9kdW1wfGRlY2JpbnxkZWNoZXh8ZGVjb2N0fGRlZmluZXxkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkZWZpbmVkfGRlZzJyYWR8ZGVsZXRlfGRnZXR0ZXh0fGRpZXxkaW9fY2xvc2V8ZGlvX2ZjbnRsfGRpb19vcGVufGRpb19yZWFkfGRpb19zZWVrfGRpb19zdGF0fGRpb190Y3NldGF0dHJ8ZGlvX3RydW5jYXRlfGRpb193cml0ZXxkaXJ8ZGlyZWN0b3J5aXRlcmF0b3J8ZGlybmFtZXxkaXNrX2ZyZWVfc3BhY2V8ZGlza190b3RhbF9zcGFjZXxkaXNrZnJlZXNwYWNlfGRsfGRuZ2V0dGV4dHxkbnNfY2hlY2tfcmVjb3JkfGRuc19nZXRfbXh8ZG5zX2dldF9yZWNvcmR8ZG9tX2ltcG9ydF9zaW1wbGV4bWx8ZG9tYWluZXhjZXB0aW9ufGRvbWF0dHJ8ZG9tYXR0cmlidXRlX25hbWV8ZG9tYXR0cmlidXRlX3NldF92YWx1ZXxkb21hdHRyaWJ1dGVfc3BlY2lmaWVkfGRvbWF0dHJpYnV0ZV92YWx1ZXxkb21jaGFyYWN0ZXJkYXRhfGRvbWNvbW1lbnR8ZG9tZG9jdW1lbnR8ZG9tZG9jdW1lbnRfYWRkX3Jvb3R8ZG9tZG9jdW1lbnRfY3JlYXRlX2F0dHJpYnV0ZXxkb21kb2N1bWVudF9jcmVhdGVfY2RhdGFfc2VjdGlvbnxkb21kb2N1bWVudF9jcmVhdGVfY29tbWVudHxkb21kb2N1bWVudF9jcmVhdGVfZWxlbWVudHxkb21kb2N1bWVudF9jcmVhdGVfZWxlbWVudF9uc3xkb21kb2N1bWVudF9jcmVhdGVfZW50aXR5X3JlZmVyZW5jZXxkb21kb2N1bWVudF9jcmVhdGVfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbnxkb21kb2N1bWVudF9jcmVhdGVfdGV4dF9ub2RlfGRvbWRvY3VtZW50X2RvY3R5cGV8ZG9tZG9jdW1lbnRfZG9jdW1lbnRfZWxlbWVudHxkb21kb2N1bWVudF9kdW1wX2ZpbGV8ZG9tZG9jdW1lbnRfZHVtcF9tZW18ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRfYnlfaWR8ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRzX2J5X3RhZ25hbWV8ZG9tZG9jdW1lbnRfaHRtbF9kdW1wX21lbXxkb21kb2N1bWVudF94aW5jbHVkZXxkb21kb2N1bWVudGZyYWdtZW50fGRvbWRvY3VtZW50dHlwZXxkb21kb2N1bWVudHR5cGVfZW50aXRpZXN8ZG9tZG9jdW1lbnR0eXBlX2ludGVybmFsX3N1YnNldHxkb21kb2N1bWVudHR5cGVfbmFtZXxkb21kb2N1bWVudHR5cGVfbm90YXRpb25zfGRvbWRvY3VtZW50dHlwZV9wdWJsaWNfaWR8ZG9tZG9jdW1lbnR0eXBlX3N5c3RlbV9pZHxkb21lbGVtZW50fGRvbWVsZW1lbnRfZ2V0X2F0dHJpYnV0ZXxkb21lbGVtZW50X2dldF9hdHRyaWJ1dGVfbm9kZXxkb21lbGVtZW50X2dldF9lbGVtZW50c19ieV90YWduYW1lfGRvbWVsZW1lbnRfaGFzX2F0dHJpYnV0ZXxkb21lbGVtZW50X3JlbW92ZV9hdHRyaWJ1dGV8ZG9tZWxlbWVudF9zZXRfYXR0cmlidXRlfGRvbWVsZW1lbnRfc2V0X2F0dHJpYnV0ZV9ub2RlfGRvbWVsZW1lbnRfdGFnbmFtZXxkb21lbnRpdHl8ZG9tZW50aXR5cmVmZXJlbmNlfGRvbWV4Y2VwdGlvbnxkb21pbXBsZW1lbnRhdGlvbnxkb21uYW1lZG5vZGVtYXB8ZG9tbm9kZXxkb21ub2RlX2FkZF9uYW1lc3BhY2V8ZG9tbm9kZV9hcHBlbmRfY2hpbGR8ZG9tbm9kZV9hcHBlbmRfc2libGluZ3xkb21ub2RlX2F0dHJpYnV0ZXN8ZG9tbm9kZV9jaGlsZF9ub2Rlc3xkb21ub2RlX2Nsb25lX25vZGV8ZG9tbm9kZV9kdW1wX25vZGV8ZG9tbm9kZV9maXJzdF9jaGlsZHxkb21ub2RlX2dldF9jb250ZW50fGRvbW5vZGVfaGFzX2F0dHJpYnV0ZXN8ZG9tbm9kZV9oYXNfY2hpbGRfbm9kZXN8ZG9tbm9kZV9pbnNlcnRfYmVmb3JlfGRvbW5vZGVfaXNfYmxhbmtfbm9kZXxkb21ub2RlX2xhc3RfY2hpbGR8ZG9tbm9kZV9uZXh0X3NpYmxpbmd8ZG9tbm9kZV9ub2RlX25hbWV8ZG9tbm9kZV9ub2RlX3R5cGV8ZG9tbm9kZV9ub2RlX3ZhbHVlfGRvbW5vZGVfb3duZXJfZG9jdW1lbnR8ZG9tbm9kZV9wYXJlbnRfbm9kZXxkb21ub2RlX3ByZWZpeHxkb21ub2RlX3ByZXZpb3VzX3NpYmxpbmd8ZG9tbm9kZV9yZW1vdmVfY2hpbGR8ZG9tbm9kZV9yZXBsYWNlX2NoaWxkfGRvbW5vZGVfcmVwbGFjZV9ub2RlfGRvbW5vZGVfc2V0X2NvbnRlbnR8ZG9tbm9kZV9zZXRfbmFtZXxkb21ub2RlX3NldF9uYW1lc3BhY2V8ZG9tbm9kZV91bmxpbmtfbm9kZXxkb21ub2RlbGlzdHxkb21ub3RhdGlvbnxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb258ZG9tcHJvY2Vzc2luZ2luc3RydWN0aW9uX2RhdGF8ZG9tcHJvY2Vzc2luZ2luc3RydWN0aW9uX3RhcmdldHxkb210ZXh0fGRvbXhtbF9uZXdfZG9jfGRvbXhtbF9vcGVuX2ZpbGV8ZG9teG1sX29wZW5fbWVtfGRvbXhtbF92ZXJzaW9ufGRvbXhtbF94bWx0cmVlfGRvbXhtbF94c2x0X3N0eWxlc2hlZXR8ZG9teG1sX3hzbHRfc3R5bGVzaGVldF9kb2N8ZG9teG1sX3hzbHRfc3R5bGVzaGVldF9maWxlfGRvbXhtbF94c2x0X3ZlcnNpb258ZG9teHBhdGh8ZG9teHNsdHN0eWxlc2hlZXRfcHJvY2Vzc3xkb214c2x0c3R5bGVzaGVldF9yZXN1bHRfZHVtcF9maWxlfGRvbXhzbHRzdHlsZXNoZWV0X3Jlc3VsdF9kdW1wX21lbXxkb3RuZXR8ZG90bmV0X2xvYWR8ZG91YmxldmFsfGVhY2h8ZWFzdGVyX2RhdGV8ZWFzdGVyX2RheXN8ZWNob3xlbXB0eXxlbXB0eWl0ZXJhdG9yfGVuY2hhbnRfYnJva2VyX2Rlc2NyaWJlfGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzfGVuY2hhbnRfYnJva2VyX2ZyZWV8ZW5jaGFudF9icm9rZXJfZnJlZV9kaWN0fGVuY2hhbnRfYnJva2VyX2dldF9lcnJvcnxlbmNoYW50X2Jyb2tlcl9pbml0fGVuY2hhbnRfYnJva2VyX2xpc3RfZGljdHN8ZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0fGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfcHdsX2RpY3R8ZW5jaGFudF9icm9rZXJfc2V0X29yZGVyaW5nfGVuY2hhbnRfZGljdF9hZGRfdG9fcGVyc29uYWx8ZW5jaGFudF9kaWN0X2FkZF90b19zZXNzaW9ufGVuY2hhbnRfZGljdF9jaGVja3xlbmNoYW50X2RpY3RfZGVzY3JpYmV8ZW5jaGFudF9kaWN0X2dldF9lcnJvcnxlbmNoYW50X2RpY3RfaXNfaW5fc2Vzc2lvbnxlbmNoYW50X2RpY3RfcXVpY2tfY2hlY2t8ZW5jaGFudF9kaWN0X3N0b3JlX3JlcGxhY2VtZW50fGVuY2hhbnRfZGljdF9zdWdnZXN0fGVuZHxlcmVnfGVyZWdfcmVwbGFjZXxlcmVnaXxlcmVnaV9yZXBsYWNlfGVycm9yX2dldF9sYXN0fGVycm9yX2xvZ3xlcnJvcl9yZXBvcnRpbmd8ZXJyb3JleGNlcHRpb258ZXNjYXBlc2hlbGxhcmd8ZXNjYXBlc2hlbGxjbWR8ZXZhbHxldmVudF9hZGR8ZXZlbnRfYmFzZV9mcmVlfGV2ZW50X2Jhc2VfbG9vcHxldmVudF9iYXNlX2xvb3BicmVha3xldmVudF9iYXNlX2xvb3BleGl0fGV2ZW50X2Jhc2VfbmV3fGV2ZW50X2Jhc2VfcHJpb3JpdHlfaW5pdHxldmVudF9iYXNlX3NldHxldmVudF9idWZmZXJfYmFzZV9zZXR8ZXZlbnRfYnVmZmVyX2Rpc2FibGV8ZXZlbnRfYnVmZmVyX2VuYWJsZXxldmVudF9idWZmZXJfZmRfc2V0fGV2ZW50X2J1ZmZlcl9mcmVlfGV2ZW50X2J1ZmZlcl9uZXd8ZXZlbnRfYnVmZmVyX3ByaW9yaXR5X3NldHxldmVudF9idWZmZXJfcmVhZHxldmVudF9idWZmZXJfc2V0X2NhbGxiYWNrfGV2ZW50X2J1ZmZlcl90aW1lb3V0X3NldHxldmVudF9idWZmZXJfd2F0ZXJtYXJrX3NldHxldmVudF9idWZmZXJfd3JpdGV8ZXZlbnRfZGVsfGV2ZW50X2ZyZWV8ZXZlbnRfbmV3fGV2ZW50X3NldHxleGNlcHRpb258ZXhlY3xleGlmX2ltYWdldHlwZXxleGlmX3JlYWRfZGF0YXxleGlmX3RhZ25hbWV8ZXhpZl90aHVtYm5haWx8ZXhpdHxleHB8ZXhwZWN0X2V4cGVjdGx8ZXhwZWN0X3BvcGVufGV4cGxvZGV8ZXhwbTF8ZXhwb3J0fGV4cG9ydHxleHRlbnNpb25fbG9hZGVkfGV4dHJhY3R8ZXptbG1faGFzaHxmYW1fY2FuY2VsX21vbml0b3J8ZmFtX2Nsb3NlfGZhbV9tb25pdG9yX2NvbGxlY3Rpb258ZmFtX21vbml0b3JfZGlyZWN0b3J5fGZhbV9tb25pdG9yX2ZpbGV8ZmFtX25leHRfZXZlbnR8ZmFtX29wZW58ZmFtX3BlbmRpbmd8ZmFtX3Jlc3VtZV9tb25pdG9yfGZhbV9zdXNwZW5kX21vbml0b3J8ZmJzcWxfYWZmZWN0ZWRfcm93c3xmYnNxbF9hdXRvY29tbWl0fGZic3FsX2Jsb2Jfc2l6ZXxmYnNxbF9jaGFuZ2VfdXNlcnxmYnNxbF9jbG9iX3NpemV8ZmJzcWxfY2xvc2V8ZmJzcWxfY29tbWl0fGZic3FsX2Nvbm5lY3R8ZmJzcWxfY3JlYXRlX2Jsb2J8ZmJzcWxfY3JlYXRlX2Nsb2J8ZmJzcWxfY3JlYXRlX2RifGZic3FsX2RhdGFfc2Vla3xmYnNxbF9kYXRhYmFzZXxmYnNxbF9kYXRhYmFzZV9wYXNzd29yZHxmYnNxbF9kYl9xdWVyeXxmYnNxbF9kYl9zdGF0dXN8ZmJzcWxfZHJvcF9kYnxmYnNxbF9lcnJub3xmYnNxbF9lcnJvcnxmYnNxbF9mZXRjaF9hcnJheXxmYnNxbF9mZXRjaF9hc3NvY3xmYnNxbF9mZXRjaF9maWVsZHxmYnNxbF9mZXRjaF9sZW5ndGhzfGZic3FsX2ZldGNoX29iamVjdHxmYnNxbF9mZXRjaF9yb3d8ZmJzcWxfZmllbGRfZmxhZ3N8ZmJzcWxfZmllbGRfbGVufGZic3FsX2ZpZWxkX25hbWV8ZmJzcWxfZmllbGRfc2Vla3xmYnNxbF9maWVsZF90YWJsZXxmYnNxbF9maWVsZF90eXBlfGZic3FsX2ZyZWVfcmVzdWx0fGZic3FsX2dldF9hdXRvc3RhcnRfaW5mb3xmYnNxbF9ob3N0bmFtZXxmYnNxbF9pbnNlcnRfaWR8ZmJzcWxfbGlzdF9kYnN8ZmJzcWxfbGlzdF9maWVsZHN8ZmJzcWxfbGlzdF90YWJsZXN8ZmJzcWxfbmV4dF9yZXN1bHR8ZmJzcWxfbnVtX2ZpZWxkc3xmYnNxbF9udW1fcm93c3xmYnNxbF9wYXNzd29yZHxmYnNxbF9wY29ubmVjdHxmYnNxbF9xdWVyeXxmYnNxbF9yZWFkX2Jsb2J8ZmJzcWxfcmVhZF9jbG9ifGZic3FsX3Jlc3VsdHxmYnNxbF9yb2xsYmFja3xmYnNxbF9yb3dzX2ZldGNoZWR8ZmJzcWxfc2VsZWN0X2RifGZic3FsX3NldF9jaGFyYWN0ZXJzZXR8ZmJzcWxfc2V0X2xvYl9tb2RlfGZic3FsX3NldF9wYXNzd29yZHxmYnNxbF9zZXRfdHJhbnNhY3Rpb258ZmJzcWxfc3RhcnRfZGJ8ZmJzcWxfc3RvcF9kYnxmYnNxbF90YWJsZV9uYW1lfGZic3FsX3RhYmxlbmFtZXxmYnNxbF91c2VybmFtZXxmYnNxbF93YXJuaW5nc3xmY2xvc2V8ZmRmX2FkZF9kb2NfamF2YXNjcmlwdHxmZGZfYWRkX3RlbXBsYXRlfGZkZl9jbG9zZXxmZGZfY3JlYXRlfGZkZl9lbnVtX3ZhbHVlc3xmZGZfZXJybm98ZmRmX2Vycm9yfGZkZl9nZXRfYXB8ZmRmX2dldF9hdHRhY2htZW50fGZkZl9nZXRfZW5jb2Rpbmd8ZmRmX2dldF9maWxlfGZkZl9nZXRfZmxhZ3N8ZmRmX2dldF9vcHR8ZmRmX2dldF9zdGF0dXN8ZmRmX2dldF92YWx1ZXxmZGZfZ2V0X3ZlcnNpb258ZmRmX2hlYWRlcnxmZGZfbmV4dF9maWVsZF9uYW1lfGZkZl9vcGVufGZkZl9vcGVuX3N0cmluZ3xmZGZfcmVtb3ZlX2l0ZW18ZmRmX3NhdmV8ZmRmX3NhdmVfc3RyaW5nfGZkZl9zZXRfYXB8ZmRmX3NldF9lbmNvZGluZ3xmZGZfc2V0X2ZpbGV8ZmRmX3NldF9mbGFnc3xmZGZfc2V0X2phdmFzY3JpcHRfYWN0aW9ufGZkZl9zZXRfb25faW1wb3J0X2phdmFzY3JpcHR8ZmRmX3NldF9vcHR8ZmRmX3NldF9zdGF0dXN8ZmRmX3NldF9zdWJtaXRfZm9ybV9hY3Rpb258ZmRmX3NldF90YXJnZXRfZnJhbWV8ZmRmX3NldF92YWx1ZXxmZGZfc2V0X3ZlcnNpb258ZmVvZnxmZmx1c2h8ZmdldGN8ZmdldGNzdnxmZ2V0c3xmZ2V0c3N8ZmlsZXxmaWxlX2V4aXN0c3xmaWxlX2dldF9jb250ZW50c3xmaWxlX3B1dF9jb250ZW50c3xmaWxlYXRpbWV8ZmlsZWN0aW1lfGZpbGVncm91cHxmaWxlaW5vZGV8ZmlsZW10aW1lfGZpbGVvd25lcnxmaWxlcGVybXN8ZmlsZXByb3xmaWxlcHJvX2ZpZWxkY291bnR8ZmlsZXByb19maWVsZG5hbWV8ZmlsZXByb19maWVsZHR5cGV8ZmlsZXByb19maWVsZHdpZHRofGZpbGVwcm9fcmV0cmlldmV8ZmlsZXByb19yb3djb3VudHxmaWxlc2l6ZXxmaWxlc3lzdGVtaXRlcmF0b3J8ZmlsZXR5cGV8ZmlsdGVyX2hhc192YXJ8ZmlsdGVyX2lkfGZpbHRlcl9pbnB1dHxmaWx0ZXJfaW5wdXRfYXJyYXl8ZmlsdGVyX2xpc3R8ZmlsdGVyX3ZhcnxmaWx0ZXJfdmFyX2FycmF5fGZpbHRlcml0ZXJhdG9yfGZpbmZvX2J1ZmZlcnxmaW5mb19jbG9zZXxmaW5mb19maWxlfGZpbmZvX29wZW58ZmluZm9fc2V0X2ZsYWdzfGZsb2F0dmFsfGZsb2NrfGZsb29yfGZsdXNofGZtb2R8Zm5tYXRjaHxmb3Blbnxmb3J3YXJkX3N0YXRpY19jYWxsfGZvcndhcmRfc3RhdGljX2NhbGxfYXJyYXl8ZnBhc3N0aHJ1fGZwcmludGZ8ZnB1dGNzdnxmcHV0c3xmcmVhZHxmcmVuY2h0b2pkfGZyaWJpZGlfbG9nMnZpc3xmc2NhbmZ8ZnNlZWt8ZnNvY2tvcGVufGZzdGF0fGZ0ZWxsfGZ0b2t8ZnRwX2FsbG9jfGZ0cF9jZHVwfGZ0cF9jaGRpcnxmdHBfY2htb2R8ZnRwX2Nsb3NlfGZ0cF9jb25uZWN0fGZ0cF9kZWxldGV8ZnRwX2V4ZWN8ZnRwX2ZnZXR8ZnRwX2ZwdXR8ZnRwX2dldHxmdHBfZ2V0X29wdGlvbnxmdHBfbG9naW58ZnRwX21kdG18ZnRwX21rZGlyfGZ0cF9uYl9jb250aW51ZXxmdHBfbmJfZmdldHxmdHBfbmJfZnB1dHxmdHBfbmJfZ2V0fGZ0cF9uYl9wdXR8ZnRwX25saXN0fGZ0cF9wYXN2fGZ0cF9wdXR8ZnRwX3B3ZHxmdHBfcXVpdHxmdHBfcmF3fGZ0cF9yYXdsaXN0fGZ0cF9yZW5hbWV8ZnRwX3JtZGlyfGZ0cF9zZXRfb3B0aW9ufGZ0cF9zaXRlfGZ0cF9zaXplfGZ0cF9zc2xfY29ubmVjdHxmdHBfc3lzdHlwZXxmdHJ1bmNhdGV8ZnVuY19nZXRfYXJnfGZ1bmNfZ2V0X2FyZ3N8ZnVuY19udW1fYXJnc3xmdW5jdGlvbl9leGlzdHN8ZndyaXRlfGdjX2NvbGxlY3RfY3ljbGVzfGdjX2Rpc2FibGV8Z2NfZW5hYmxlfGdjX2VuYWJsZWR8Z2RfaW5mb3xnZWFybWFuY2xpZW50fGdlYXJtYW5qb2J8Z2Vhcm1hbnRhc2t8Z2Vhcm1hbndvcmtlcnxnZW9pcF9jb250aW5lbnRfY29kZV9ieV9uYW1lfGdlb2lwX2NvdW50cnlfY29kZTNfYnlfbmFtZXxnZW9pcF9jb3VudHJ5X2NvZGVfYnlfbmFtZXxnZW9pcF9jb3VudHJ5X25hbWVfYnlfbmFtZXxnZW9pcF9kYXRhYmFzZV9pbmZvfGdlb2lwX2RiX2F2YWlsfGdlb2lwX2RiX2ZpbGVuYW1lfGdlb2lwX2RiX2dldF9hbGxfaW5mb3xnZW9pcF9pZF9ieV9uYW1lfGdlb2lwX2lzcF9ieV9uYW1lfGdlb2lwX29yZ19ieV9uYW1lfGdlb2lwX3JlY29yZF9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9uYW1lX2J5X2NvZGV8Z2VvaXBfdGltZV96b25lX2J5X2NvdW50cnlfYW5kX3JlZ2lvbnxnZXRNZXRhfGdldE5hbWVkfGdldFZhbHVlfGdldF9icm93c2VyfGdldF9jYWxsZWRfY2xhc3N8Z2V0X2NmZ192YXJ8Z2V0X2NsYXNzfGdldF9jbGFzc19tZXRob2RzfGdldF9jbGFzc192YXJzfGdldF9jdXJyZW50X3VzZXJ8Z2V0X2RlY2xhcmVkX2NsYXNzZXN8Z2V0X2RlY2xhcmVkX2ludGVyZmFjZXN8Z2V0X2RlZmluZWRfY29uc3RhbnRzfGdldF9kZWZpbmVkX2Z1bmN0aW9uc3xnZXRfZGVmaW5lZF92YXJzfGdldF9leHRlbnNpb25fZnVuY3N8Z2V0X2hlYWRlcnN8Z2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGV8Z2V0X2luY2x1ZGVfcGF0aHxnZXRfaW5jbHVkZWRfZmlsZXN8Z2V0X2xvYWRlZF9leHRlbnNpb25zfGdldF9tYWdpY19xdW90ZXNfZ3BjfGdldF9tYWdpY19xdW90ZXNfcnVudGltZXxnZXRfbWV0YV90YWdzfGdldF9vYmplY3RfdmFyc3xnZXRfcGFyZW50X2NsYXNzfGdldF9yZXF1aXJlZF9maWxlc3xnZXRfcmVzb3VyY2VfdHlwZXxnZXRhbGxoZWFkZXJzfGdldGNvbnN0YW50fGdldGNvbnN0YW50c3xnZXRjb25zdHJ1Y3RvcnxnZXRjd2R8Z2V0ZGF0ZXxnZXRkZWZhdWx0cHJvcGVydGllc3xnZXRkb2Njb21tZW50fGdldGVuZGxpbmV8Z2V0ZW52fGdldGV4dGVuc2lvbnxnZXRleHRlbnNpb25uYW1lfGdldGZpbGVuYW1lfGdldGhvc3RieWFkZHJ8Z2V0aG9zdGJ5bmFtZXxnZXRob3N0YnluYW1lbHxnZXRob3N0bmFtZXxnZXRpbWFnZXNpemV8Z2V0aW50ZXJmYWNlbmFtZXN8Z2V0aW50ZXJmYWNlc3xnZXRsYXN0bW9kfGdldG1ldGhvZHxnZXRtZXRob2RzfGdldG1vZGlmaWVyc3xnZXRteHJyfGdldG15Z2lkfGdldG15aW5vZGV8Z2V0bXlwaWR8Z2V0bXl1aWR8Z2V0bmFtZXxnZXRuYW1lc3BhY2VuYW1lfGdldG9wdHxnZXRwYXJlbnRjbGFzc3xnZXRwcm9wZXJ0aWVzfGdldHByb3BlcnR5fGdldHByb3RvYnluYW1lfGdldHByb3RvYnludW1iZXJ8Z2V0cmFuZG1heHxnZXRydXNhZ2V8Z2V0c2VydmJ5bmFtZXxnZXRzZXJ2Ynlwb3J0fGdldHNob3J0bmFtZXxnZXRzdGFydGxpbmV8Z2V0c3RhdGljcHJvcGVydGllc3xnZXRzdGF0aWNwcm9wZXJ0eXZhbHVlfGdldHRleHR8Z2V0dGltZW9mZGF5fGdldHR5cGV8Z2xvYnxnbG9iaXRlcmF0b3J8Z21hZ2lja3xnbWFnaWNrZHJhd3xnbWFnaWNrcGl4ZWx8Z21kYXRlfGdtbWt0aW1lfGdtcF9hYnN8Z21wX2FkZHxnbXBfYW5kfGdtcF9jbHJiaXR8Z21wX2NtcHxnbXBfY29tfGdtcF9kaXZ8Z21wX2Rpdl9xfGdtcF9kaXZfcXJ8Z21wX2Rpdl9yfGdtcF9kaXZleGFjdHxnbXBfZmFjdHxnbXBfZ2NkfGdtcF9nY2RleHR8Z21wX2hhbWRpc3R8Z21wX2luaXR8Z21wX2ludHZhbHxnbXBfaW52ZXJ0fGdtcF9qYWNvYml8Z21wX2xlZ2VuZHJlfGdtcF9tb2R8Z21wX211bHxnbXBfbmVnfGdtcF9uZXh0cHJpbWV8Z21wX29yfGdtcF9wZXJmZWN0X3NxdWFyZXxnbXBfcG9wY291bnR8Z21wX3Bvd3xnbXBfcG93bXxnbXBfcHJvYl9wcmltZXxnbXBfcmFuZG9tfGdtcF9zY2FuMHxnbXBfc2NhbjF8Z21wX3NldGJpdHxnbXBfc2lnbnxnbXBfc3FydHxnbXBfc3FydHJlbXxnbXBfc3RydmFsfGdtcF9zdWJ8Z21wX3Rlc3RiaXR8Z21wX3hvcnxnbXN0cmZ0aW1lfGdudXBnX2FkZGRlY3J5cHRrZXl8Z251cGdfYWRkZW5jcnlwdGtleXxnbnVwZ19hZGRzaWdua2V5fGdudXBnX2NsZWFyZGVjcnlwdGtleXN8Z251cGdfY2xlYXJlbmNyeXB0a2V5c3xnbnVwZ19jbGVhcnNpZ25rZXlzfGdudXBnX2RlY3J5cHR8Z251cGdfZGVjcnlwdHZlcmlmeXxnbnVwZ19lbmNyeXB0fGdudXBnX2VuY3J5cHRzaWdufGdudXBnX2V4cG9ydHxnbnVwZ19nZXRlcnJvcnxnbnVwZ19nZXRwcm90b2NvbHxnbnVwZ19pbXBvcnR8Z251cGdfaW5pdHxnbnVwZ19rZXlpbmZvfGdudXBnX3NldGFybW9yfGdudXBnX3NldGVycm9ybW9kZXxnbnVwZ19zZXRzaWdubW9kZXxnbnVwZ19zaWdufGdudXBnX3ZlcmlmeXxnb3BoZXJfcGFyc2VkaXJ8Z3JhcGhlbWVfZXh0cmFjdHxncmFwaGVtZV9zdHJpcG9zfGdyYXBoZW1lX3N0cmlzdHJ8Z3JhcGhlbWVfc3RybGVufGdyYXBoZW1lX3N0cnBvc3xncmFwaGVtZV9zdHJyaXBvc3xncmFwaGVtZV9zdHJycG9zfGdyYXBoZW1lX3N0cnN0cnxncmFwaGVtZV9zdWJzdHJ8Z3JlZ29yaWFudG9qZHxndXBucF9jb250ZXh0X2dldF9ob3N0X2lwfGd1cG5wX2NvbnRleHRfZ2V0X3BvcnR8Z3VwbnBfY29udGV4dF9nZXRfc3Vic2NyaXB0aW9uX3RpbWVvdXR8Z3VwbnBfY29udGV4dF9ob3N0X3BhdGh8Z3VwbnBfY29udGV4dF9uZXd8Z3VwbnBfY29udGV4dF9zZXRfc3Vic2NyaXB0aW9uX3RpbWVvdXR8Z3VwbnBfY29udGV4dF90aW1lb3V0X2FkZHxndXBucF9jb250ZXh0X3VuaG9zdF9wYXRofGd1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0YXJ0fGd1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0b3B8Z3VwbnBfY29udHJvbF9wb2ludF9jYWxsYmFja19zZXR8Z3VwbnBfY29udHJvbF9wb2ludF9uZXd8Z3VwbnBfZGV2aWNlX2FjdGlvbl9jYWxsYmFja19zZXR8Z3VwbnBfZGV2aWNlX2luZm9fZ2V0fGd1cG5wX2RldmljZV9pbmZvX2dldF9zZXJ2aWNlfGd1cG5wX3Jvb3RfZGV2aWNlX2dldF9hdmFpbGFibGV8Z3VwbnBfcm9vdF9kZXZpY2VfZ2V0X3JlbGF0aXZlX2xvY2F0aW9ufGd1cG5wX3Jvb3RfZGV2aWNlX25ld3xndXBucF9yb290X2RldmljZV9zZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX3N0YXJ0fGd1cG5wX3Jvb3RfZGV2aWNlX3N0b3B8Z3VwbnBfc2VydmljZV9hY3Rpb25fZ2V0fGd1cG5wX3NlcnZpY2VfYWN0aW9uX3JldHVybnxndXBucF9zZXJ2aWNlX2FjdGlvbl9yZXR1cm5fZXJyb3J8Z3VwbnBfc2VydmljZV9hY3Rpb25fc2V0fGd1cG5wX3NlcnZpY2VfZnJlZXplX25vdGlmeXxndXBucF9zZXJ2aWNlX2luZm9fZ2V0fGd1cG5wX3NlcnZpY2VfaW5mb19nZXRfaW50cm9zcGVjdGlvbnxndXBucF9zZXJ2aWNlX2ludHJvc3BlY3Rpb25fZ2V0X3N0YXRlX3ZhcmlhYmxlfGd1cG5wX3NlcnZpY2Vfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfYWN0aW9uX2dldHxndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9zZXR8Z3VwbnBfc2VydmljZV9wcm94eV9hZGRfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfY2FsbGJhY2tfc2V0fGd1cG5wX3NlcnZpY2VfcHJveHlfZ2V0X3N1YnNjcmliZWR8Z3VwbnBfc2VydmljZV9wcm94eV9yZW1vdmVfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfc2V0X3N1YnNjcmliZWR8Z3VwbnBfc2VydmljZV90aGF3X25vdGlmeXxnemNsb3NlfGd6Y29tcHJlc3N8Z3pkZWNvZGV8Z3pkZWZsYXRlfGd6ZW5jb2RlfGd6ZW9mfGd6ZmlsZXxnemdldGN8Z3pnZXRzfGd6Z2V0c3N8Z3ppbmZsYXRlfGd6b3BlbnxnenBhc3N0aHJ1fGd6cHV0c3xnenJlYWR8Z3pyZXdpbmR8Z3pzZWVrfGd6dGVsbHxnenVuY29tcHJlc3N8Z3p3cml0ZXxoYWx0X2NvbXBpbGVyfGhhcnVhbm5vdGF0aW9ufGhhcnVhbm5vdGF0aW9uX3NldGJvcmRlcnN0eWxlfGhhcnVhbm5vdGF0aW9uX3NldGhpZ2hsaWdodG1vZGV8aGFydWFubm90YXRpb25fc2V0aWNvbnxoYXJ1YW5ub3RhdGlvbl9zZXRvcGVuZWR8aGFydWRlc3RpbmF0aW9ufGhhcnVkZXN0aW5hdGlvbl9zZXRmaXR8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJ8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJofGhhcnVkZXN0aW5hdGlvbl9zZXRmaXRidnxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0aHxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0cnxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0dnxoYXJ1ZGVzdGluYXRpb25fc2V0eHl6fGhhcnVkb2N8aGFydWRvY19hZGRwYWdlfGhhcnVkb2NfYWRkcGFnZWxhYmVsfGhhcnVkb2NfY29uc3RydWN0fGhhcnVkb2NfY3JlYXRlb3V0bGluZXxoYXJ1ZG9jX2dldGN1cnJlbnRlbmNvZGVyfGhhcnVkb2NfZ2V0Y3VycmVudHBhZ2V8aGFydWRvY19nZXRlbmNvZGVyfGhhcnVkb2NfZ2V0Zm9udHxoYXJ1ZG9jX2dldGluZm9hdHRyfGhhcnVkb2NfZ2V0cGFnZWxheW91dHxoYXJ1ZG9jX2dldHBhZ2Vtb2RlfGhhcnVkb2NfZ2V0c3RyZWFtc2l6ZXxoYXJ1ZG9jX2luc2VydHBhZ2V8aGFydWRvY19sb2FkanBlZ3xoYXJ1ZG9jX2xvYWRwbmd8aGFydWRvY19sb2FkcmF3fGhhcnVkb2NfbG9hZHR0Y3xoYXJ1ZG9jX2xvYWR0dGZ8aGFydWRvY19sb2FkdHlwZTF8aGFydWRvY19vdXRwdXR8aGFydWRvY19yZWFkZnJvbXN0cmVhbXxoYXJ1ZG9jX3Jlc2V0ZXJyb3J8aGFydWRvY19yZXNldHN0cmVhbXxoYXJ1ZG9jX3NhdmV8aGFydWRvY19zYXZldG9zdHJlYW18aGFydWRvY19zZXRjb21wcmVzc2lvbm1vZGV8aGFydWRvY19zZXRjdXJyZW50ZW5jb2RlcnxoYXJ1ZG9jX3NldGVuY3J5cHRpb25tb2RlfGhhcnVkb2Nfc2V0aW5mb2F0dHJ8aGFydWRvY19zZXRpbmZvZGF0ZWF0dHJ8aGFydWRvY19zZXRvcGVuYWN0aW9ufGhhcnVkb2Nfc2V0cGFnZWxheW91dHxoYXJ1ZG9jX3NldHBhZ2Vtb2RlfGhhcnVkb2Nfc2V0cGFnZXNjb25maWd1cmF0aW9ufGhhcnVkb2Nfc2V0cGFzc3dvcmR8aGFydWRvY19zZXRwZXJtaXNzaW9ufGhhcnVkb2NfdXNlY25zZW5jb2RpbmdzfGhhcnVkb2NfdXNlY25zZm9udHN8aGFydWRvY191c2VjbnRlbmNvZGluZ3N8aGFydWRvY191c2VjbnRmb250c3xoYXJ1ZG9jX3VzZWpwZW5jb2RpbmdzfGhhcnVkb2NfdXNlanBmb250c3xoYXJ1ZG9jX3VzZWtyZW5jb2RpbmdzfGhhcnVkb2NfdXNla3Jmb250c3xoYXJ1ZW5jb2RlcnxoYXJ1ZW5jb2Rlcl9nZXRieXRldHlwZXxoYXJ1ZW5jb2Rlcl9nZXR0eXBlfGhhcnVlbmNvZGVyX2dldHVuaWNvZGV8aGFydWVuY29kZXJfZ2V0d3JpdGluZ21vZGV8aGFydWV4Y2VwdGlvbnxoYXJ1Zm9udHxoYXJ1Zm9udF9nZXRhc2NlbnR8aGFydWZvbnRfZ2V0Y2FwaGVpZ2h0fGhhcnVmb250X2dldGRlc2NlbnR8aGFydWZvbnRfZ2V0ZW5jb2RpbmduYW1lfGhhcnVmb250X2dldGZvbnRuYW1lfGhhcnVmb250X2dldHRleHR3aWR0aHxoYXJ1Zm9udF9nZXR1bmljb2Rld2lkdGh8aGFydWZvbnRfZ2V0eGhlaWdodHxoYXJ1Zm9udF9tZWFzdXJldGV4dHxoYXJ1aW1hZ2V8aGFydWltYWdlX2dldGJpdHNwZXJjb21wb25lbnR8aGFydWltYWdlX2dldGNvbG9yc3BhY2V8aGFydWltYWdlX2dldGhlaWdodHxoYXJ1aW1hZ2VfZ2V0c2l6ZXxoYXJ1aW1hZ2VfZ2V0d2lkdGh8aGFydWltYWdlX3NldGNvbG9ybWFza3xoYXJ1aW1hZ2Vfc2V0bWFza2ltYWdlfGhhcnVvdXRsaW5lfGhhcnVvdXRsaW5lX3NldGRlc3RpbmF0aW9ufGhhcnVvdXRsaW5lX3NldG9wZW5lZHxoYXJ1cGFnZXxoYXJ1cGFnZV9hcmN8aGFydXBhZ2VfYmVnaW50ZXh0fGhhcnVwYWdlX2NpcmNsZXxoYXJ1cGFnZV9jbG9zZXBhdGh8aGFydXBhZ2VfY29uY2F0fGhhcnVwYWdlX2NyZWF0ZWRlc3RpbmF0aW9ufGhhcnVwYWdlX2NyZWF0ZWxpbmthbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXRleHRhbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXVybGFubm90YXRpb258aGFydXBhZ2VfY3VydmV0b3xoYXJ1cGFnZV9jdXJ2ZXRvMnxoYXJ1cGFnZV9jdXJ2ZXRvM3xoYXJ1cGFnZV9kcmF3aW1hZ2V8aGFydXBhZ2VfZWxsaXBzZXxoYXJ1cGFnZV9lbmRwYXRofGhhcnVwYWdlX2VuZHRleHR8aGFydXBhZ2VfZW9maWxsfGhhcnVwYWdlX2VvZmlsbHN0cm9rZXxoYXJ1cGFnZV9maWxsfGhhcnVwYWdlX2ZpbGxzdHJva2V8aGFydXBhZ2VfZ2V0Y2hhcnNwYWNlfGhhcnVwYWdlX2dldGNteWtmaWxsfGhhcnVwYWdlX2dldGNteWtzdHJva2V8aGFydXBhZ2VfZ2V0Y3VycmVudGZvbnR8aGFydXBhZ2VfZ2V0Y3VycmVudGZvbnRzaXplfGhhcnVwYWdlX2dldGN1cnJlbnRwb3N8aGFydXBhZ2VfZ2V0Y3VycmVudHRleHRwb3N8aGFydXBhZ2VfZ2V0ZGFzaHxoYXJ1cGFnZV9nZXRmaWxsaW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXRmbGF0bmVzc3xoYXJ1cGFnZV9nZXRnbW9kZXxoYXJ1cGFnZV9nZXRncmF5ZmlsbHxoYXJ1cGFnZV9nZXRncmF5c3Ryb2tlfGhhcnVwYWdlX2dldGhlaWdodHxoYXJ1cGFnZV9nZXRob3Jpem9udGFsc2NhbGluZ3xoYXJ1cGFnZV9nZXRsaW5lY2FwfGhhcnVwYWdlX2dldGxpbmVqb2lufGhhcnVwYWdlX2dldGxpbmV3aWR0aHxoYXJ1cGFnZV9nZXRtaXRlcmxpbWl0fGhhcnVwYWdlX2dldHJnYmZpbGx8aGFydXBhZ2VfZ2V0cmdic3Ryb2tlfGhhcnVwYWdlX2dldHN0cm9raW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9nZXR0ZXh0bWF0cml4fGhhcnVwYWdlX2dldHRleHRyZW5kZXJpbmdtb2RlfGhhcnVwYWdlX2dldHRleHRyaXNlfGhhcnVwYWdlX2dldHRleHR3aWR0aHxoYXJ1cGFnZV9nZXR0cmFuc21hdHJpeHxoYXJ1cGFnZV9nZXR3aWR0aHxoYXJ1cGFnZV9nZXR3b3Jkc3BhY2V8aGFydXBhZ2VfbGluZXRvfGhhcnVwYWdlX21lYXN1cmV0ZXh0fGhhcnVwYWdlX21vdmV0ZXh0cG9zfGhhcnVwYWdlX21vdmV0b3xoYXJ1cGFnZV9tb3ZldG9uZXh0bGluZXxoYXJ1cGFnZV9yZWN0YW5nbGV8aGFydXBhZ2Vfc2V0Y2hhcnNwYWNlfGhhcnVwYWdlX3NldGNteWtmaWxsfGhhcnVwYWdlX3NldGNteWtzdHJva2V8aGFydXBhZ2Vfc2V0ZGFzaHxoYXJ1cGFnZV9zZXRmbGF0bmVzc3xoYXJ1cGFnZV9zZXRmb250YW5kc2l6ZXxoYXJ1cGFnZV9zZXRncmF5ZmlsbHxoYXJ1cGFnZV9zZXRncmF5c3Ryb2tlfGhhcnVwYWdlX3NldGhlaWdodHxoYXJ1cGFnZV9zZXRob3Jpem9udGFsc2NhbGluZ3xoYXJ1cGFnZV9zZXRsaW5lY2FwfGhhcnVwYWdlX3NldGxpbmVqb2lufGhhcnVwYWdlX3NldGxpbmV3aWR0aHxoYXJ1cGFnZV9zZXRtaXRlcmxpbWl0fGhhcnVwYWdlX3NldHJnYmZpbGx8aGFydXBhZ2Vfc2V0cmdic3Ryb2tlfGhhcnVwYWdlX3NldHJvdGF0ZXxoYXJ1cGFnZV9zZXRzaXplfGhhcnVwYWdlX3NldHNsaWRlc2hvd3xoYXJ1cGFnZV9zZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9zZXR0ZXh0bWF0cml4fGhhcnVwYWdlX3NldHRleHRyZW5kZXJpbmdtb2RlfGhhcnVwYWdlX3NldHRleHRyaXNlfGhhcnVwYWdlX3NldHdpZHRofGhhcnVwYWdlX3NldHdvcmRzcGFjZXxoYXJ1cGFnZV9zaG93dGV4dHxoYXJ1cGFnZV9zaG93dGV4dG5leHRsaW5lfGhhcnVwYWdlX3N0cm9rZXxoYXJ1cGFnZV90ZXh0b3V0fGhhcnVwYWdlX3RleHRyZWN0fGhhc2NvbnN0YW50fGhhc2h8aGFzaF9hbGdvc3xoYXNoX2NvcHl8aGFzaF9maWxlfGhhc2hfZmluYWx8aGFzaF9obWFjfGhhc2hfaG1hY19maWxlfGhhc2hfaW5pdHxoYXNoX3VwZGF0ZXxoYXNoX3VwZGF0ZV9maWxlfGhhc2hfdXBkYXRlX3N0cmVhbXxoYXNtZXRob2R8aGFzcHJvcGVydHl8aGVhZGVyfGhlYWRlcl9yZWdpc3Rlcl9jYWxsYmFja3xoZWFkZXJfcmVtb3ZlfGhlYWRlcnNfbGlzdHxoZWFkZXJzX3NlbnR8aGVicmV2fGhlYnJldmN8aGV4MmJpbnxoZXhkZWN8aGlnaGxpZ2h0X2ZpbGV8aGlnaGxpZ2h0X3N0cmluZ3xodG1sX2VudGl0eV9kZWNvZGV8aHRtbGVudGl0aWVzfGh0bWxzcGVjaWFsY2hhcnN8aHRtbHNwZWNpYWxjaGFyc19kZWNvZGV8aHR0cF9idWlsZF9jb29raWV8aHR0cF9idWlsZF9xdWVyeXxodHRwX2J1aWxkX3N0cnxodHRwX2J1aWxkX3VybHxodHRwX2NhY2hlX2V0YWd8aHR0cF9jYWNoZV9sYXN0X21vZGlmaWVkfGh0dHBfY2h1bmtlZF9kZWNvZGV8aHR0cF9kYXRlfGh0dHBfZGVmbGF0ZXxodHRwX2dldHxodHRwX2dldF9yZXF1ZXN0X2JvZHl8aHR0cF9nZXRfcmVxdWVzdF9ib2R5X3N0cmVhbXxodHRwX2dldF9yZXF1ZXN0X2hlYWRlcnN8aHR0cF9oZWFkfGh0dHBfaW5mbGF0ZXxodHRwX21hdGNoX2V0YWd8aHR0cF9tYXRjaF9tb2RpZmllZHxodHRwX21hdGNoX3JlcXVlc3RfaGVhZGVyfGh0dHBfbmVnb3RpYXRlX2NoYXJzZXR8aHR0cF9uZWdvdGlhdGVfY29udGVudF90eXBlfGh0dHBfbmVnb3RpYXRlX2xhbmd1YWdlfGh0dHBfcGFyc2VfY29va2llfGh0dHBfcGFyc2VfaGVhZGVyc3xodHRwX3BhcnNlX21lc3NhZ2V8aHR0cF9wYXJzZV9wYXJhbXN8aHR0cF9wZXJzaXN0ZW50X2hhbmRsZXNfY2xlYW58aHR0cF9wZXJzaXN0ZW50X2hhbmRsZXNfY291bnR8aHR0cF9wZXJzaXN0ZW50X2hhbmRsZXNfaWRlbnR8aHR0cF9wb3N0X2RhdGF8aHR0cF9wb3N0X2ZpZWxkc3xodHRwX3B1dF9kYXRhfGh0dHBfcHV0X2ZpbGV8aHR0cF9wdXRfc3RyZWFtfGh0dHBfcmVkaXJlY3R8aHR0cF9yZXF1ZXN0fGh0dHBfcmVxdWVzdF9ib2R5X2VuY29kZXxodHRwX3JlcXVlc3RfbWV0aG9kX2V4aXN0c3xodHRwX3JlcXVlc3RfbWV0aG9kX25hbWV8aHR0cF9yZXF1ZXN0X21ldGhvZF9yZWdpc3RlcnxodHRwX3JlcXVlc3RfbWV0aG9kX3VucmVnaXN0ZXJ8aHR0cF9yZXNwb25zZV9jb2RlfGh0dHBfc2VuZF9jb250ZW50X2Rpc3Bvc2l0aW9ufGh0dHBfc2VuZF9jb250ZW50X3R5cGV8aHR0cF9zZW5kX2RhdGF8aHR0cF9zZW5kX2ZpbGV8aHR0cF9zZW5kX2xhc3RfbW9kaWZpZWR8aHR0cF9zZW5kX3N0YXR1c3xodHRwX3NlbmRfc3RyZWFtfGh0dHBfc3VwcG9ydHxodHRwX3Rocm90dGxlfGh0dHBkZWZsYXRlc3RyZWFtfGh0dHBkZWZsYXRlc3RyZWFtX2NvbnN0cnVjdHxodHRwZGVmbGF0ZXN0cmVhbV9mYWN0b3J5fGh0dHBkZWZsYXRlc3RyZWFtX2ZpbmlzaHxodHRwZGVmbGF0ZXN0cmVhbV9mbHVzaHxodHRwZGVmbGF0ZXN0cmVhbV91cGRhdGV8aHR0cGluZmxhdGVzdHJlYW18aHR0cGluZmxhdGVzdHJlYW1fY29uc3RydWN0fGh0dHBpbmZsYXRlc3RyZWFtX2ZhY3Rvcnl8aHR0cGluZmxhdGVzdHJlYW1fZmluaXNofGh0dHBpbmZsYXRlc3RyZWFtX2ZsdXNofGh0dHBpbmZsYXRlc3RyZWFtX3VwZGF0ZXxodHRwbWVzc2FnZXxodHRwbWVzc2FnZV9hZGRoZWFkZXJzfGh0dHBtZXNzYWdlX2NvbnN0cnVjdHxodHRwbWVzc2FnZV9kZXRhY2h8aHR0cG1lc3NhZ2VfZmFjdG9yeXxodHRwbWVzc2FnZV9mcm9tZW52fGh0dHBtZXNzYWdlX2Zyb21zdHJpbmd8aHR0cG1lc3NhZ2VfZ2V0Ym9keXxodHRwbWVzc2FnZV9nZXRoZWFkZXJ8aHR0cG1lc3NhZ2VfZ2V0aGVhZGVyc3xodHRwbWVzc2FnZV9nZXRodHRwdmVyc2lvbnxodHRwbWVzc2FnZV9nZXRwYXJlbnRtZXNzYWdlfGh0dHBtZXNzYWdlX2dldHJlcXVlc3RtZXRob2R8aHR0cG1lc3NhZ2VfZ2V0cmVxdWVzdHVybHxodHRwbWVzc2FnZV9nZXRyZXNwb25zZWNvZGV8aHR0cG1lc3NhZ2VfZ2V0cmVzcG9uc2VzdGF0dXN8aHR0cG1lc3NhZ2VfZ2V0dHlwZXxodHRwbWVzc2FnZV9ndWVzc2NvbnRlbnR0eXBlfGh0dHBtZXNzYWdlX3ByZXBlbmR8aHR0cG1lc3NhZ2VfcmV2ZXJzZXxodHRwbWVzc2FnZV9zZW5kfGh0dHBtZXNzYWdlX3NldGJvZHl8aHR0cG1lc3NhZ2Vfc2V0aGVhZGVyc3xodHRwbWVzc2FnZV9zZXRodHRwdmVyc2lvbnxodHRwbWVzc2FnZV9zZXRyZXF1ZXN0bWV0aG9kfGh0dHBtZXNzYWdlX3NldHJlcXVlc3R1cmx8aHR0cG1lc3NhZ2Vfc2V0cmVzcG9uc2Vjb2RlfGh0dHBtZXNzYWdlX3NldHJlc3BvbnNlc3RhdHVzfGh0dHBtZXNzYWdlX3NldHR5cGV8aHR0cG1lc3NhZ2VfdG9tZXNzYWdldHlwZW9iamVjdHxodHRwbWVzc2FnZV90b3N0cmluZ3xodHRwcXVlcnlzdHJpbmd8aHR0cHF1ZXJ5c3RyaW5nX2NvbnN0cnVjdHxodHRwcXVlcnlzdHJpbmdfZ2V0fGh0dHBxdWVyeXN0cmluZ19tb2R8aHR0cHF1ZXJ5c3RyaW5nX3NldHxodHRwcXVlcnlzdHJpbmdfc2luZ2xldG9ufGh0dHBxdWVyeXN0cmluZ190b2FycmF5fGh0dHBxdWVyeXN0cmluZ190b3N0cmluZ3xodHRwcXVlcnlzdHJpbmdfeGxhdGV8aHR0cHJlcXVlc3R8aHR0cHJlcXVlc3RfYWRkY29va2llc3xodHRwcmVxdWVzdF9hZGRoZWFkZXJzfGh0dHByZXF1ZXN0X2FkZHBvc3RmaWVsZHN8aHR0cHJlcXVlc3RfYWRkcG9zdGZpbGV8aHR0cHJlcXVlc3RfYWRkcHV0ZGF0YXxodHRwcmVxdWVzdF9hZGRxdWVyeWRhdGF8aHR0cHJlcXVlc3RfYWRkcmF3cG9zdGRhdGF8aHR0cHJlcXVlc3RfYWRkc3Nsb3B0aW9uc3xodHRwcmVxdWVzdF9jbGVhcmhpc3Rvcnl8aHR0cHJlcXVlc3RfY29uc3RydWN0fGh0dHByZXF1ZXN0X2VuYWJsZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3RfZ2V0Y29va2llc3xodHRwcmVxdWVzdF9nZXRoZWFkZXJzfGh0dHByZXF1ZXN0X2dldGhpc3Rvcnl8aHR0cHJlcXVlc3RfZ2V0bWV0aG9kfGh0dHByZXF1ZXN0X2dldG9wdGlvbnN8aHR0cHJlcXVlc3RfZ2V0cG9zdGZpZWxkc3xodHRwcmVxdWVzdF9nZXRwb3N0ZmlsZXN8aHR0cHJlcXVlc3RfZ2V0cHV0ZGF0YXxodHRwcmVxdWVzdF9nZXRwdXRmaWxlfGh0dHByZXF1ZXN0X2dldHF1ZXJ5ZGF0YXxodHRwcmVxdWVzdF9nZXRyYXdwb3N0ZGF0YXxodHRwcmVxdWVzdF9nZXRyYXdyZXF1ZXN0bWVzc2FnZXxodHRwcmVxdWVzdF9nZXRyYXdyZXNwb25zZW1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVxdWVzdG1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2Vib2R5fGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlY29kZXxodHRwcmVxdWVzdF9nZXRyZXNwb25zZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VkYXRhfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlaGVhZGVyfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlaW5mb3xodHRwcmVxdWVzdF9nZXRyZXNwb25zZW1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VzdGF0dXN8aHR0cHJlcXVlc3RfZ2V0c3Nsb3B0aW9uc3xodHRwcmVxdWVzdF9nZXR1cmx8aHR0cHJlcXVlc3RfcmVzZXRjb29raWVzfGh0dHByZXF1ZXN0X3NlbmR8aHR0cHJlcXVlc3Rfc2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3Rfc2V0Y29va2llc3xodHRwcmVxdWVzdF9zZXRoZWFkZXJzfGh0dHByZXF1ZXN0X3NldG1ldGhvZHxodHRwcmVxdWVzdF9zZXRvcHRpb25zfGh0dHByZXF1ZXN0X3NldHBvc3RmaWVsZHN8aHR0cHJlcXVlc3Rfc2V0cG9zdGZpbGVzfGh0dHByZXF1ZXN0X3NldHB1dGRhdGF8aHR0cHJlcXVlc3Rfc2V0cHV0ZmlsZXxodHRwcmVxdWVzdF9zZXRxdWVyeWRhdGF8aHR0cHJlcXVlc3Rfc2V0cmF3cG9zdGRhdGF8aHR0cHJlcXVlc3Rfc2V0c3Nsb3B0aW9uc3xodHRwcmVxdWVzdF9zZXR1cmx8aHR0cHJlcXVlc3Rwb29sfGh0dHByZXF1ZXN0cG9vbF9hdHRhY2h8aHR0cHJlcXVlc3Rwb29sX2NvbnN0cnVjdHxodHRwcmVxdWVzdHBvb2xfZGVzdHJ1Y3R8aHR0cHJlcXVlc3Rwb29sX2RldGFjaHxodHRwcmVxdWVzdHBvb2xfZ2V0YXR0YWNoZWRyZXF1ZXN0c3xodHRwcmVxdWVzdHBvb2xfZ2V0ZmluaXNoZWRyZXF1ZXN0c3xodHRwcmVxdWVzdHBvb2xfcmVzZXR8aHR0cHJlcXVlc3Rwb29sX3NlbmR8aHR0cHJlcXVlc3Rwb29sX3NvY2tldHBlcmZvcm18aHR0cHJlcXVlc3Rwb29sX3NvY2tldHNlbGVjdHxodHRwcmVzcG9uc2V8aHR0cHJlc3BvbnNlX2NhcHR1cmV8aHR0cHJlc3BvbnNlX2dldGJ1ZmZlcnNpemV8aHR0cHJlc3BvbnNlX2dldGNhY2hlfGh0dHByZXNwb25zZV9nZXRjYWNoZWNvbnRyb2x8aHR0cHJlc3BvbnNlX2dldGNvbnRlbnRkaXNwb3NpdGlvbnxodHRwcmVzcG9uc2VfZ2V0Y29udGVudHR5cGV8aHR0cHJlc3BvbnNlX2dldGRhdGF8aHR0cHJlc3BvbnNlX2dldGV0YWd8aHR0cHJlc3BvbnNlX2dldGZpbGV8aHR0cHJlc3BvbnNlX2dldGd6aXB8aHR0cHJlc3BvbnNlX2dldGhlYWRlcnxodHRwcmVzcG9uc2VfZ2V0bGFzdG1vZGlmaWVkfGh0dHByZXNwb25zZV9nZXRyZXF1ZXN0Ym9keXxodHRwcmVzcG9uc2VfZ2V0cmVxdWVzdGJvZHlzdHJlYW18aHR0cHJlc3BvbnNlX2dldHJlcXVlc3RoZWFkZXJzfGh0dHByZXNwb25zZV9nZXRzdHJlYW18aHR0cHJlc3BvbnNlX2dldHRocm90dGxlZGVsYXl8aHR0cHJlc3BvbnNlX2d1ZXNzY29udGVudHR5cGV8aHR0cHJlc3BvbnNlX3JlZGlyZWN0fGh0dHByZXNwb25zZV9zZW5kfGh0dHByZXNwb25zZV9zZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9zZXRjYWNoZXxodHRwcmVzcG9uc2Vfc2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9zZXRjb250ZW50ZGlzcG9zaXRpb258aHR0cHJlc3BvbnNlX3NldGNvbnRlbnR0eXBlfGh0dHByZXNwb25zZV9zZXRkYXRhfGh0dHByZXNwb25zZV9zZXRldGFnfGh0dHByZXNwb25zZV9zZXRmaWxlfGh0dHByZXNwb25zZV9zZXRnemlwfGh0dHByZXNwb25zZV9zZXRoZWFkZXJ8aHR0cHJlc3BvbnNlX3NldGxhc3Rtb2RpZmllZHxodHRwcmVzcG9uc2Vfc2V0c3RyZWFtfGh0dHByZXNwb25zZV9zZXR0aHJvdHRsZWRlbGF5fGh0dHByZXNwb25zZV9zdGF0dXN8aHdfYXJyYXkyb2JqcmVjfGh3X2NoYW5nZW9iamVjdHxod19jaGlsZHJlbnxod19jaGlsZHJlbm9ianxod19jbG9zZXxod19jb25uZWN0fGh3X2Nvbm5lY3Rpb25faW5mb3xod19jcHxod19kZWxldGVvYmplY3R8aHdfZG9jYnlhbmNob3J8aHdfZG9jYnlhbmNob3JvYmp8aHdfZG9jdW1lbnRfYXR0cmlidXRlc3xod19kb2N1bWVudF9ib2R5dGFnfGh3X2RvY3VtZW50X2NvbnRlbnR8aHdfZG9jdW1lbnRfc2V0Y29udGVudHxod19kb2N1bWVudF9zaXplfGh3X2R1bW15fGh3X2VkaXR0ZXh0fGh3X2Vycm9yfGh3X2Vycm9ybXNnfGh3X2ZyZWVfZG9jdW1lbnR8aHdfZ2V0YW5jaG9yc3xod19nZXRhbmNob3Jzb2JqfGh3X2dldGFuZGxvY2t8aHdfZ2V0Y2hpbGRjb2xsfGh3X2dldGNoaWxkY29sbG9ianxod19nZXRjaGlsZGRvY2NvbGx8aHdfZ2V0Y2hpbGRkb2Njb2xsb2JqfGh3X2dldG9iamVjdHxod19nZXRvYmplY3RieXF1ZXJ5fGh3X2dldG9iamVjdGJ5cXVlcnljb2xsfGh3X2dldG9iamVjdGJ5cXVlcnljb2xsb2JqfGh3X2dldG9iamVjdGJ5cXVlcnlvYmp8aHdfZ2V0cGFyZW50c3xod19nZXRwYXJlbnRzb2JqfGh3X2dldHJlbGxpbmt8aHdfZ2V0cmVtb3RlfGh3X2dldHJlbW90ZWNoaWxkcmVufGh3X2dldHNyY2J5ZGVzdG9ianxod19nZXR0ZXh0fGh3X2dldHVzZXJuYW1lfGh3X2lkZW50aWZ5fGh3X2luY29sbGVjdGlvbnN8aHdfaW5mb3xod19pbnNjb2xsfGh3X2luc2RvY3xod19pbnNlcnRhbmNob3JzfGh3X2luc2VydGRvY3VtZW50fGh3X2luc2VydG9iamVjdHxod19tYXBpZHxod19tb2RpZnlvYmplY3R8aHdfbXZ8aHdfbmV3X2RvY3VtZW50fGh3X29ianJlYzJhcnJheXxod19vdXRwdXRfZG9jdW1lbnR8aHdfcGNvbm5lY3R8aHdfcGlwZWRvY3VtZW50fGh3X3Jvb3R8aHdfc2V0bGlua3Jvb3R8aHdfc3RhdHxod191bmxvY2t8aHdfd2hvfGh3YXBpX2F0dHJpYnV0ZXxod2FwaV9hdHRyaWJ1dGVfa2V5fGh3YXBpX2F0dHJpYnV0ZV9sYW5nZGVwdmFsdWV8aHdhcGlfYXR0cmlidXRlX3ZhbHVlfGh3YXBpX2F0dHJpYnV0ZV92YWx1ZXN8aHdhcGlfY2hlY2tpbnxod2FwaV9jaGVja291dHxod2FwaV9jaGlsZHJlbnxod2FwaV9jb250ZW50fGh3YXBpX2NvbnRlbnRfbWltZXR5cGV8aHdhcGlfY29udGVudF9yZWFkfGh3YXBpX2NvcHl8aHdhcGlfZGJzdGF0fGh3YXBpX2Rjc3RhdHxod2FwaV9kc3RhbmNob3JzfGh3YXBpX2RzdG9mc3JjYW5jaG9yfGh3YXBpX2Vycm9yX2NvdW50fGh3YXBpX2Vycm9yX3JlYXNvbnxod2FwaV9maW5kfGh3YXBpX2Z0c3RhdHxod2FwaV9oZ2NzcHxod2FwaV9od3N0YXR8aHdhcGlfaWRlbnRpZnl8aHdhcGlfaW5mb3xod2FwaV9pbnNlcnR8aHdhcGlfaW5zZXJ0YW5jaG9yfGh3YXBpX2luc2VydGNvbGxlY3Rpb258aHdhcGlfaW5zZXJ0ZG9jdW1lbnR8aHdhcGlfbGlua3xod2FwaV9sb2NrfGh3YXBpX21vdmV8aHdhcGlfbmV3X2NvbnRlbnR8aHdhcGlfb2JqZWN0fGh3YXBpX29iamVjdF9hc3NpZ258aHdhcGlfb2JqZWN0X2F0dHJlZGl0YWJsZXxod2FwaV9vYmplY3RfY291bnR8aHdhcGlfb2JqZWN0X2luc2VydHxod2FwaV9vYmplY3RfbmV3fGh3YXBpX29iamVjdF9yZW1vdmV8aHdhcGlfb2JqZWN0X3RpdGxlfGh3YXBpX29iamVjdF92YWx1ZXxod2FwaV9vYmplY3RieWFuY2hvcnxod2FwaV9wYXJlbnRzfGh3YXBpX3JlYXNvbl9kZXNjcmlwdGlvbnxod2FwaV9yZWFzb25fdHlwZXxod2FwaV9yZW1vdmV8aHdhcGlfcmVwbGFjZXxod2FwaV9zZXRjb21taXR0ZWR2ZXJzaW9ufGh3YXBpX3NyY2FuY2hvcnN8aHdhcGlfc3Jjc29mZHN0fGh3YXBpX3VubG9ja3xod2FwaV91c2VyfGh3YXBpX3VzZXJsaXN0fGh5cG90fGliYXNlX2FkZF91c2VyfGliYXNlX2FmZmVjdGVkX3Jvd3N8aWJhc2VfYmFja3VwfGliYXNlX2Jsb2JfYWRkfGliYXNlX2Jsb2JfY2FuY2VsfGliYXNlX2Jsb2JfY2xvc2V8aWJhc2VfYmxvYl9jcmVhdGV8aWJhc2VfYmxvYl9lY2hvfGliYXNlX2Jsb2JfZ2V0fGliYXNlX2Jsb2JfaW1wb3J0fGliYXNlX2Jsb2JfaW5mb3xpYmFzZV9ibG9iX29wZW58aWJhc2VfY2xvc2V8aWJhc2VfY29tbWl0fGliYXNlX2NvbW1pdF9yZXR8aWJhc2VfY29ubmVjdHxpYmFzZV9kYl9pbmZvfGliYXNlX2RlbGV0ZV91c2VyfGliYXNlX2Ryb3BfZGJ8aWJhc2VfZXJyY29kZXxpYmFzZV9lcnJtc2d8aWJhc2VfZXhlY3V0ZXxpYmFzZV9mZXRjaF9hc3NvY3xpYmFzZV9mZXRjaF9vYmplY3R8aWJhc2VfZmV0Y2hfcm93fGliYXNlX2ZpZWxkX2luZm98aWJhc2VfZnJlZV9ldmVudF9oYW5kbGVyfGliYXNlX2ZyZWVfcXVlcnl8aWJhc2VfZnJlZV9yZXN1bHR8aWJhc2VfZ2VuX2lkfGliYXNlX21haW50YWluX2RifGliYXNlX21vZGlmeV91c2VyfGliYXNlX25hbWVfcmVzdWx0fGliYXNlX251bV9maWVsZHN8aWJhc2VfbnVtX3BhcmFtc3xpYmFzZV9wYXJhbV9pbmZvfGliYXNlX3Bjb25uZWN0fGliYXNlX3ByZXBhcmV8aWJhc2VfcXVlcnl8aWJhc2VfcmVzdG9yZXxpYmFzZV9yb2xsYmFja3xpYmFzZV9yb2xsYmFja19yZXR8aWJhc2Vfc2VydmVyX2luZm98aWJhc2Vfc2VydmljZV9hdHRhY2h8aWJhc2Vfc2VydmljZV9kZXRhY2h8aWJhc2Vfc2V0X2V2ZW50X2hhbmRsZXJ8aWJhc2VfdGltZWZtdHxpYmFzZV90cmFuc3xpYmFzZV93YWl0X2V2ZW50fGljb252fGljb252X2dldF9lbmNvZGluZ3xpY29udl9taW1lX2RlY29kZXxpY29udl9taW1lX2RlY29kZV9oZWFkZXJzfGljb252X21pbWVfZW5jb2RlfGljb252X3NldF9lbmNvZGluZ3xpY29udl9zdHJsZW58aWNvbnZfc3RycG9zfGljb252X3N0cnJwb3N8aWNvbnZfc3Vic3RyfGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lfGlkM19nZXRfZnJhbWVfc2hvcnRfbmFtZXxpZDNfZ2V0X2dlbnJlX2lkfGlkM19nZXRfZ2VucmVfbGlzdHxpZDNfZ2V0X2dlbnJlX25hbWV8aWQzX2dldF90YWd8aWQzX2dldF92ZXJzaW9ufGlkM19yZW1vdmVfdGFnfGlkM19zZXRfdGFnfGlkM3YyYXR0YWNoZWRwaWN0dXJlZnJhbWV8aWQzdjJmcmFtZXxpZDN2MnRhZ3xpZGF0ZXxpZG5fdG9fYXNjaWl8aWRuX3RvX3VuaWNvZGV8aWRuX3RvX3V0Zjh8aWZ4X2FmZmVjdGVkX3Jvd3N8aWZ4X2Jsb2JpbmZpbGVfbW9kZXxpZnhfYnl0ZWFzdmFyY2hhcnxpZnhfY2xvc2V8aWZ4X2Nvbm5lY3R8aWZ4X2NvcHlfYmxvYnxpZnhfY3JlYXRlX2Jsb2J8aWZ4X2NyZWF0ZV9jaGFyfGlmeF9kb3xpZnhfZXJyb3J8aWZ4X2Vycm9ybXNnfGlmeF9mZXRjaF9yb3d8aWZ4X2ZpZWxkcHJvcGVydGllc3xpZnhfZmllbGR0eXBlc3xpZnhfZnJlZV9ibG9ifGlmeF9mcmVlX2NoYXJ8aWZ4X2ZyZWVfcmVzdWx0fGlmeF9nZXRfYmxvYnxpZnhfZ2V0X2NoYXJ8aWZ4X2dldHNxbGNhfGlmeF9odG1sdGJsX3Jlc3VsdHxpZnhfbnVsbGZvcm1hdHxpZnhfbnVtX2ZpZWxkc3xpZnhfbnVtX3Jvd3N8aWZ4X3Bjb25uZWN0fGlmeF9wcmVwYXJlfGlmeF9xdWVyeXxpZnhfdGV4dGFzdmFyY2hhcnxpZnhfdXBkYXRlX2Jsb2J8aWZ4X3VwZGF0ZV9jaGFyfGlmeHVzX2Nsb3NlX3Nsb2J8aWZ4dXNfY3JlYXRlX3Nsb2J8aWZ4dXNfZnJlZV9zbG9ifGlmeHVzX29wZW5fc2xvYnxpZnh1c19yZWFkX3Nsb2J8aWZ4dXNfc2Vla19zbG9ifGlmeHVzX3RlbGxfc2xvYnxpZnh1c193cml0ZV9zbG9ifGlnbm9yZV91c2VyX2Fib3J0fGlpc19hZGRfc2VydmVyfGlpc19nZXRfZGlyX3NlY3VyaXR5fGlpc19nZXRfc2NyaXB0X21hcHxpaXNfZ2V0X3NlcnZlcl9ieV9jb21tZW50fGlpc19nZXRfc2VydmVyX2J5X3BhdGh8aWlzX2dldF9zZXJ2ZXJfcmlnaHRzfGlpc19nZXRfc2VydmljZV9zdGF0ZXxpaXNfcmVtb3ZlX3NlcnZlcnxpaXNfc2V0X2FwcF9zZXR0aW5nc3xpaXNfc2V0X2Rpcl9zZWN1cml0eXxpaXNfc2V0X3NjcmlwdF9tYXB8aWlzX3NldF9zZXJ2ZXJfcmlnaHRzfGlpc19zdGFydF9zZXJ2ZXJ8aWlzX3N0YXJ0X3NlcnZpY2V8aWlzX3N0b3Bfc2VydmVyfGlpc19zdG9wX3NlcnZpY2V8aW1hZ2Uyd2JtcHxpbWFnZV90eXBlX3RvX2V4dGVuc2lvbnxpbWFnZV90eXBlX3RvX21pbWVfdHlwZXxpbWFnZWFscGhhYmxlbmRpbmd8aW1hZ2VhbnRpYWxpYXN8aW1hZ2VhcmN8aW1hZ2VjaGFyfGltYWdlY2hhcnVwfGltYWdlY29sb3JhbGxvY2F0ZXxpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYXxpbWFnZWNvbG9yYXR8aW1hZ2Vjb2xvcmNsb3Nlc3R8aW1hZ2Vjb2xvcmNsb3Nlc3RhbHBoYXxpbWFnZWNvbG9yY2xvc2VzdGh3YnxpbWFnZWNvbG9yZGVhbGxvY2F0ZXxpbWFnZWNvbG9yZXhhY3R8aW1hZ2Vjb2xvcmV4YWN0YWxwaGF8aW1hZ2Vjb2xvcm1hdGNofGltYWdlY29sb3JyZXNvbHZlfGltYWdlY29sb3JyZXNvbHZlYWxwaGF8aW1hZ2Vjb2xvcnNldHxpbWFnZWNvbG9yc2ZvcmluZGV4fGltYWdlY29sb3JzdG90YWx8aW1hZ2Vjb2xvcnRyYW5zcGFyZW50fGltYWdlY29udm9sdXRpb258aW1hZ2Vjb3B5fGltYWdlY29weW1lcmdlfGltYWdlY29weW1lcmdlZ3JheXxpbWFnZWNvcHlyZXNhbXBsZWR8aW1hZ2Vjb3B5cmVzaXplZHxpbWFnZWNyZWF0ZXxpbWFnZWNyZWF0ZWZyb21nZHxpbWFnZWNyZWF0ZWZyb21nZDJ8aW1hZ2VjcmVhdGVmcm9tZ2QycGFydHxpbWFnZWNyZWF0ZWZyb21naWZ8aW1hZ2VjcmVhdGVmcm9tanBlZ3xpbWFnZWNyZWF0ZWZyb21wbmd8aW1hZ2VjcmVhdGVmcm9tc3RyaW5nfGltYWdlY3JlYXRlZnJvbXdibXB8aW1hZ2VjcmVhdGVmcm9teGJtfGltYWdlY3JlYXRlZnJvbXhwbXxpbWFnZWNyZWF0ZXRydWVjb2xvcnxpbWFnZWRhc2hlZGxpbmV8aW1hZ2VkZXN0cm95fGltYWdlZWxsaXBzZXxpbWFnZWZpbGx8aW1hZ2VmaWxsZWRhcmN8aW1hZ2VmaWxsZWRlbGxpcHNlfGltYWdlZmlsbGVkcG9seWdvbnxpbWFnZWZpbGxlZHJlY3RhbmdsZXxpbWFnZWZpbGx0b2JvcmRlcnxpbWFnZWZpbHRlcnxpbWFnZWZvbnRoZWlnaHR8aW1hZ2Vmb250d2lkdGh8aW1hZ2VmdGJib3h8aW1hZ2VmdHRleHR8aW1hZ2VnYW1tYWNvcnJlY3R8aW1hZ2VnZHxpbWFnZWdkMnxpbWFnZWdpZnxpbWFnZWdyYWJzY3JlZW58aW1hZ2VncmFid2luZG93fGltYWdlaW50ZXJsYWNlfGltYWdlaXN0cnVlY29sb3J8aW1hZ2VqcGVnfGltYWdlbGF5ZXJlZmZlY3R8aW1hZ2VsaW5lfGltYWdlbG9hZGZvbnR8aW1hZ2VwYWxldHRlY29weXxpbWFnZXBuZ3xpbWFnZXBvbHlnb258aW1hZ2Vwc2Jib3h8aW1hZ2Vwc2VuY29kZWZvbnR8aW1hZ2Vwc2V4dGVuZGZvbnR8aW1hZ2Vwc2ZyZWVmb250fGltYWdlcHNsb2FkZm9udHxpbWFnZXBzc2xhbnRmb250fGltYWdlcHN0ZXh0fGltYWdlcmVjdGFuZ2xlfGltYWdlcm90YXRlfGltYWdlc2F2ZWFscGhhfGltYWdlc2V0YnJ1c2h8aW1hZ2VzZXRwaXhlbHxpbWFnZXNldHN0eWxlfGltYWdlc2V0dGhpY2tuZXNzfGltYWdlc2V0dGlsZXxpbWFnZXN0cmluZ3xpbWFnZXN0cmluZ3VwfGltYWdlc3h8aW1hZ2VzeXxpbWFnZXRydWVjb2xvcnRvcGFsZXR0ZXxpbWFnZXR0ZmJib3h8aW1hZ2V0dGZ0ZXh0fGltYWdldHlwZXN8aW1hZ2V3Ym1wfGltYWdleGJtfGltYWdpY2t8aW1hZ2lja19hZGFwdGl2ZWJsdXJpbWFnZXxpbWFnaWNrX2FkYXB0aXZlcmVzaXplaW1hZ2V8aW1hZ2lja19hZGFwdGl2ZXNoYXJwZW5pbWFnZXxpbWFnaWNrX2FkYXB0aXZldGhyZXNob2xkaW1hZ2V8aW1hZ2lja19hZGRpbWFnZXxpbWFnaWNrX2FkZG5vaXNlaW1hZ2V8aW1hZ2lja19hZmZpbmV0cmFuc2Zvcm1pbWFnZXxpbWFnaWNrX2FuaW1hdGVpbWFnZXN8aW1hZ2lja19hbm5vdGF0ZWltYWdlfGltYWdpY2tfYXBwZW5kaW1hZ2VzfGltYWdpY2tfYXZlcmFnZWltYWdlc3xpbWFnaWNrX2JsYWNrdGhyZXNob2xkaW1hZ2V8aW1hZ2lja19ibHVyaW1hZ2V8aW1hZ2lja19ib3JkZXJpbWFnZXxpbWFnaWNrX2NoYXJjb2FsaW1hZ2V8aW1hZ2lja19jaG9waW1hZ2V8aW1hZ2lja19jbGVhcnxpbWFnaWNrX2NsaXBpbWFnZXxpbWFnaWNrX2NsaXBwYXRoaW1hZ2V8aW1hZ2lja19jbG9uZXxpbWFnaWNrX2NsdXRpbWFnZXxpbWFnaWNrX2NvYWxlc2NlaW1hZ2VzfGltYWdpY2tfY29sb3JmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX2NvbG9yaXplaW1hZ2V8aW1hZ2lja19jb21iaW5laW1hZ2VzfGltYWdpY2tfY29tbWVudGltYWdlfGltYWdpY2tfY29tcGFyZWltYWdlY2hhbm5lbHN8aW1hZ2lja19jb21wYXJlaW1hZ2VsYXllcnN8aW1hZ2lja19jb21wYXJlaW1hZ2VzfGltYWdpY2tfY29tcG9zaXRlaW1hZ2V8aW1hZ2lja19jb25zdHJ1Y3R8aW1hZ2lja19jb250cmFzdGltYWdlfGltYWdpY2tfY29udHJhc3RzdHJldGNoaW1hZ2V8aW1hZ2lja19jb252b2x2ZWltYWdlfGltYWdpY2tfY3JvcGltYWdlfGltYWdpY2tfY3JvcHRodW1ibmFpbGltYWdlfGltYWdpY2tfY3VycmVudHxpbWFnaWNrX2N5Y2xlY29sb3JtYXBpbWFnZXxpbWFnaWNrX2RlY2lwaGVyaW1hZ2V8aW1hZ2lja19kZWNvbnN0cnVjdGltYWdlc3xpbWFnaWNrX2RlbGV0ZWltYWdlYXJ0aWZhY3R8aW1hZ2lja19kZXNwZWNrbGVpbWFnZXxpbWFnaWNrX2Rlc3Ryb3l8aW1hZ2lja19kaXNwbGF5aW1hZ2V8aW1hZ2lja19kaXNwbGF5aW1hZ2VzfGltYWdpY2tfZGlzdG9ydGltYWdlfGltYWdpY2tfZHJhd2ltYWdlfGltYWdpY2tfZWRnZWltYWdlfGltYWdpY2tfZW1ib3NzaW1hZ2V8aW1hZ2lja19lbmNpcGhlcmltYWdlfGltYWdpY2tfZW5oYW5jZWltYWdlfGltYWdpY2tfZXF1YWxpemVpbWFnZXxpbWFnaWNrX2V2YWx1YXRlaW1hZ2V8aW1hZ2lja19leHRlbnRpbWFnZXxpbWFnaWNrX2ZsYXR0ZW5pbWFnZXN8aW1hZ2lja19mbGlwaW1hZ2V8aW1hZ2lja19mbG9vZGZpbGxwYWludGltYWdlfGltYWdpY2tfZmxvcGltYWdlfGltYWdpY2tfZnJhbWVpbWFnZXxpbWFnaWNrX2Z4aW1hZ2V8aW1hZ2lja19nYW1tYWltYWdlfGltYWdpY2tfZ2F1c3NpYW5ibHVyaW1hZ2V8aW1hZ2lja19nZXRjb2xvcnNwYWNlfGltYWdpY2tfZ2V0Y29tcHJlc3Npb258aW1hZ2lja19nZXRjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19nZXRjb3B5cmlnaHR8aW1hZ2lja19nZXRmaWxlbmFtZXxpbWFnaWNrX2dldGZvbnR8aW1hZ2lja19nZXRmb3JtYXR8aW1hZ2lja19nZXRncmF2aXR5fGltYWdpY2tfZ2V0aG9tZXVybHxpbWFnaWNrX2dldGltYWdlfGltYWdpY2tfZ2V0aW1hZ2VhbHBoYWNoYW5uZWx8aW1hZ2lja19nZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfZ2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19nZXRpbWFnZWJsb2J8aW1hZ2lja19nZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfZ2V0aW1hZ2Vib3JkZXJjb2xvcnxpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRlcHRofGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsZGlzdG9ydGlvbnxpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRpc3RvcnRpb25zfGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsZXh0cmVtYXxpbWFnaWNrX2dldGltYWdlY2hhbm5lbG1lYW58aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxyYW5nZXxpbWFnaWNrX2dldGltYWdlY2hhbm5lbHN0YXRpc3RpY3N8aW1hZ2lja19nZXRpbWFnZWNsaXBtYXNrfGltYWdpY2tfZ2V0aW1hZ2Vjb2xvcm1hcGNvbG9yfGltYWdpY2tfZ2V0aW1hZ2Vjb2xvcnN8aW1hZ2lja19nZXRpbWFnZWNvbG9yc3BhY2V8aW1hZ2lja19nZXRpbWFnZWNvbXBvc2V8aW1hZ2lja19nZXRpbWFnZWNvbXByZXNzaW9ufGltYWdpY2tfZ2V0aW1hZ2Vjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19nZXRpbWFnZWRlbGF5fGltYWdpY2tfZ2V0aW1hZ2VkZXB0aHxpbWFnaWNrX2dldGltYWdlZGlzcG9zZXxpbWFnaWNrX2dldGltYWdlZGlzdG9ydGlvbnxpbWFnaWNrX2dldGltYWdlZXh0cmVtYXxpbWFnaWNrX2dldGltYWdlZmlsZW5hbWV8aW1hZ2lja19nZXRpbWFnZWZvcm1hdHxpbWFnaWNrX2dldGltYWdlZ2FtbWF8aW1hZ2lja19nZXRpbWFnZWdlb21ldHJ5fGltYWdpY2tfZ2V0aW1hZ2VncmF2aXR5fGltYWdpY2tfZ2V0aW1hZ2VncmVlbnByaW1hcnl8aW1hZ2lja19nZXRpbWFnZWhlaWdodHxpbWFnaWNrX2dldGltYWdlaGlzdG9ncmFtfGltYWdpY2tfZ2V0aW1hZ2VpbmRleHxpbWFnaWNrX2dldGltYWdlaW50ZXJsYWNlc2NoZW1lfGltYWdpY2tfZ2V0aW1hZ2VpbnRlcnBvbGF0ZW1ldGhvZHxpbWFnaWNrX2dldGltYWdlaXRlcmF0aW9uc3xpbWFnaWNrX2dldGltYWdlbGVuZ3RofGltYWdpY2tfZ2V0aW1hZ2VtYWdpY2tsaWNlbnNlfGltYWdpY2tfZ2V0aW1hZ2VtYXR0ZXxpbWFnaWNrX2dldGltYWdlbWF0dGVjb2xvcnxpbWFnaWNrX2dldGltYWdlb3JpZW50YXRpb258aW1hZ2lja19nZXRpbWFnZXBhZ2V8aW1hZ2lja19nZXRpbWFnZXBpeGVsY29sb3J8aW1hZ2lja19nZXRpbWFnZXByb2ZpbGV8aW1hZ2lja19nZXRpbWFnZXByb2ZpbGVzfGltYWdpY2tfZ2V0aW1hZ2Vwcm9wZXJ0aWVzfGltYWdpY2tfZ2V0aW1hZ2Vwcm9wZXJ0eXxpbWFnaWNrX2dldGltYWdlcmVkcHJpbWFyeXxpbWFnaWNrX2dldGltYWdlcmVnaW9ufGltYWdpY2tfZ2V0aW1hZ2VyZW5kZXJpbmdpbnRlbnR8aW1hZ2lja19nZXRpbWFnZXJlc29sdXRpb258aW1hZ2lja19nZXRpbWFnZXNibG9ifGltYWdpY2tfZ2V0aW1hZ2VzY2VuZXxpbWFnaWNrX2dldGltYWdlc2lnbmF0dXJlfGltYWdpY2tfZ2V0aW1hZ2VzaXplfGltYWdpY2tfZ2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX2dldGltYWdldG90YWxpbmtkZW5zaXR5fGltYWdpY2tfZ2V0aW1hZ2V0eXBlfGltYWdpY2tfZ2V0aW1hZ2V1bml0c3xpbWFnaWNrX2dldGltYWdldmlydHVhbHBpeGVsbWV0aG9kfGltYWdpY2tfZ2V0aW1hZ2V3aGl0ZXBvaW50fGltYWdpY2tfZ2V0aW1hZ2V3aWR0aHxpbWFnaWNrX2dldGludGVybGFjZXNjaGVtZXxpbWFnaWNrX2dldGl0ZXJhdG9yaW5kZXh8aW1hZ2lja19nZXRudW1iZXJpbWFnZXN8aW1hZ2lja19nZXRvcHRpb258aW1hZ2lja19nZXRwYWNrYWdlbmFtZXxpbWFnaWNrX2dldHBhZ2V8aW1hZ2lja19nZXRwaXhlbGl0ZXJhdG9yfGltYWdpY2tfZ2V0cGl4ZWxyZWdpb25pdGVyYXRvcnxpbWFnaWNrX2dldHBvaW50c2l6ZXxpbWFnaWNrX2dldHF1YW50dW1kZXB0aHxpbWFnaWNrX2dldHF1YW50dW1yYW5nZXxpbWFnaWNrX2dldHJlbGVhc2VkYXRlfGltYWdpY2tfZ2V0cmVzb3VyY2V8aW1hZ2lja19nZXRyZXNvdXJjZWxpbWl0fGltYWdpY2tfZ2V0c2FtcGxpbmdmYWN0b3JzfGltYWdpY2tfZ2V0c2l6ZXxpbWFnaWNrX2dldHNpemVvZmZzZXR8aW1hZ2lja19nZXR2ZXJzaW9ufGltYWdpY2tfaGFzbmV4dGltYWdlfGltYWdpY2tfaGFzcHJldmlvdXNpbWFnZXxpbWFnaWNrX2lkZW50aWZ5aW1hZ2V8aW1hZ2lja19pbXBsb2RlaW1hZ2V8aW1hZ2lja19sYWJlbGltYWdlfGltYWdpY2tfbGV2ZWxpbWFnZXxpbWFnaWNrX2xpbmVhcnN0cmV0Y2hpbWFnZXxpbWFnaWNrX2xpcXVpZHJlc2NhbGVpbWFnZXxpbWFnaWNrX21hZ25pZnlpbWFnZXxpbWFnaWNrX21hcGltYWdlfGltYWdpY2tfbWF0dGVmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX21lZGlhbmZpbHRlcmltYWdlfGltYWdpY2tfbWVyZ2VpbWFnZWxheWVyc3xpbWFnaWNrX21pbmlmeWltYWdlfGltYWdpY2tfbW9kdWxhdGVpbWFnZXxpbWFnaWNrX21vbnRhZ2VpbWFnZXxpbWFnaWNrX21vcnBoaW1hZ2VzfGltYWdpY2tfbW9zYWljaW1hZ2VzfGltYWdpY2tfbW90aW9uYmx1cmltYWdlfGltYWdpY2tfbmVnYXRlaW1hZ2V8aW1hZ2lja19uZXdpbWFnZXxpbWFnaWNrX25ld3BzZXVkb2ltYWdlfGltYWdpY2tfbmV4dGltYWdlfGltYWdpY2tfbm9ybWFsaXplaW1hZ2V8aW1hZ2lja19vaWxwYWludGltYWdlfGltYWdpY2tfb3BhcXVlcGFpbnRpbWFnZXxpbWFnaWNrX29wdGltaXplaW1hZ2VsYXllcnN8aW1hZ2lja19vcmRlcmVkcG9zdGVyaXplaW1hZ2V8aW1hZ2lja19wYWludGZsb29kZmlsbGltYWdlfGltYWdpY2tfcGFpbnRvcGFxdWVpbWFnZXxpbWFnaWNrX3BhaW50dHJhbnNwYXJlbnRpbWFnZXxpbWFnaWNrX3BpbmdpbWFnZXxpbWFnaWNrX3BpbmdpbWFnZWJsb2J8aW1hZ2lja19waW5naW1hZ2VmaWxlfGltYWdpY2tfcG9sYXJvaWRpbWFnZXxpbWFnaWNrX3Bvc3Rlcml6ZWltYWdlfGltYWdpY2tfcHJldmlld2ltYWdlc3xpbWFnaWNrX3ByZXZpb3VzaW1hZ2V8aW1hZ2lja19wcm9maWxlaW1hZ2V8aW1hZ2lja19xdWFudGl6ZWltYWdlfGltYWdpY2tfcXVhbnRpemVpbWFnZXN8aW1hZ2lja19xdWVyeWZvbnRtZXRyaWNzfGltYWdpY2tfcXVlcnlmb250c3xpbWFnaWNrX3F1ZXJ5Zm9ybWF0c3xpbWFnaWNrX3JhZGlhbGJsdXJpbWFnZXxpbWFnaWNrX3JhaXNlaW1hZ2V8aW1hZ2lja19yYW5kb210aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3JlYWRpbWFnZXxpbWFnaWNrX3JlYWRpbWFnZWJsb2J8aW1hZ2lja19yZWFkaW1hZ2VmaWxlfGltYWdpY2tfcmVjb2xvcmltYWdlfGltYWdpY2tfcmVkdWNlbm9pc2VpbWFnZXxpbWFnaWNrX3JlbW92ZWltYWdlfGltYWdpY2tfcmVtb3ZlaW1hZ2Vwcm9maWxlfGltYWdpY2tfcmVuZGVyfGltYWdpY2tfcmVzYW1wbGVpbWFnZXxpbWFnaWNrX3Jlc2V0aW1hZ2VwYWdlfGltYWdpY2tfcmVzaXplaW1hZ2V8aW1hZ2lja19yb2xsaW1hZ2V8aW1hZ2lja19yb3RhdGVpbWFnZXxpbWFnaWNrX3JvdW5kY29ybmVyc3xpbWFnaWNrX3NhbXBsZWltYWdlfGltYWdpY2tfc2NhbGVpbWFnZXxpbWFnaWNrX3NlcGFyYXRlaW1hZ2VjaGFubmVsfGltYWdpY2tfc2VwaWF0b25laW1hZ2V8aW1hZ2lja19zZXRiYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRjb2xvcnNwYWNlfGltYWdpY2tfc2V0Y29tcHJlc3Npb258aW1hZ2lja19zZXRjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19zZXRmaWxlbmFtZXxpbWFnaWNrX3NldGZpcnN0aXRlcmF0b3J8aW1hZ2lja19zZXRmb250fGltYWdpY2tfc2V0Zm9ybWF0fGltYWdpY2tfc2V0Z3Jhdml0eXxpbWFnaWNrX3NldGltYWdlfGltYWdpY2tfc2V0aW1hZ2VhbHBoYWNoYW5uZWx8aW1hZ2lja19zZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfc2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRpbWFnZWJpYXN8aW1hZ2lja19zZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2Vib3JkZXJjb2xvcnxpbWFnaWNrX3NldGltYWdlY2hhbm5lbGRlcHRofGltYWdpY2tfc2V0aW1hZ2VjbGlwbWFza3xpbWFnaWNrX3NldGltYWdlY29sb3JtYXBjb2xvcnxpbWFnaWNrX3NldGltYWdlY29sb3JzcGFjZXxpbWFnaWNrX3NldGltYWdlY29tcG9zZXxpbWFnaWNrX3NldGltYWdlY29tcHJlc3Npb258aW1hZ2lja19zZXRpbWFnZWNvbXByZXNzaW9ucXVhbGl0eXxpbWFnaWNrX3NldGltYWdlZGVsYXl8aW1hZ2lja19zZXRpbWFnZWRlcHRofGltYWdpY2tfc2V0aW1hZ2VkaXNwb3NlfGltYWdpY2tfc2V0aW1hZ2VleHRlbnR8aW1hZ2lja19zZXRpbWFnZWZpbGVuYW1lfGltYWdpY2tfc2V0aW1hZ2Vmb3JtYXR8aW1hZ2lja19zZXRpbWFnZWdhbW1hfGltYWdpY2tfc2V0aW1hZ2VncmF2aXR5fGltYWdpY2tfc2V0aW1hZ2VncmVlbnByaW1hcnl8aW1hZ2lja19zZXRpbWFnZWluZGV4fGltYWdpY2tfc2V0aW1hZ2VpbnRlcmxhY2VzY2hlbWV8aW1hZ2lja19zZXRpbWFnZWludGVycG9sYXRlbWV0aG9kfGltYWdpY2tfc2V0aW1hZ2VpdGVyYXRpb25zfGltYWdpY2tfc2V0aW1hZ2VtYXR0ZXxpbWFnaWNrX3NldGltYWdlbWF0dGVjb2xvcnxpbWFnaWNrX3NldGltYWdlb3BhY2l0eXxpbWFnaWNrX3NldGltYWdlb3JpZW50YXRpb258aW1hZ2lja19zZXRpbWFnZXBhZ2V8aW1hZ2lja19zZXRpbWFnZXByb2ZpbGV8aW1hZ2lja19zZXRpbWFnZXByb3BlcnR5fGltYWdpY2tfc2V0aW1hZ2VyZWRwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2VyZW5kZXJpbmdpbnRlbnR8aW1hZ2lja19zZXRpbWFnZXJlc29sdXRpb258aW1hZ2lja19zZXRpbWFnZXNjZW5lfGltYWdpY2tfc2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX3NldGltYWdldHlwZXxpbWFnaWNrX3NldGltYWdldW5pdHN8aW1hZ2lja19zZXRpbWFnZXZpcnR1YWxwaXhlbG1ldGhvZHxpbWFnaWNrX3NldGltYWdld2hpdGVwb2ludHxpbWFnaWNrX3NldGludGVybGFjZXNjaGVtZXxpbWFnaWNrX3NldGl0ZXJhdG9yaW5kZXh8aW1hZ2lja19zZXRsYXN0aXRlcmF0b3J8aW1hZ2lja19zZXRvcHRpb258aW1hZ2lja19zZXRwYWdlfGltYWdpY2tfc2V0cG9pbnRzaXplfGltYWdpY2tfc2V0cmVzb2x1dGlvbnxpbWFnaWNrX3NldHJlc291cmNlbGltaXR8aW1hZ2lja19zZXRzYW1wbGluZ2ZhY3RvcnN8aW1hZ2lja19zZXRzaXplfGltYWdpY2tfc2V0c2l6ZW9mZnNldHxpbWFnaWNrX3NldHR5cGV8aW1hZ2lja19zaGFkZWltYWdlfGltYWdpY2tfc2hhZG93aW1hZ2V8aW1hZ2lja19zaGFycGVuaW1hZ2V8aW1hZ2lja19zaGF2ZWltYWdlfGltYWdpY2tfc2hlYXJpbWFnZXxpbWFnaWNrX3NpZ21vaWRhbGNvbnRyYXN0aW1hZ2V8aW1hZ2lja19za2V0Y2hpbWFnZXxpbWFnaWNrX3NvbGFyaXplaW1hZ2V8aW1hZ2lja19zcGxpY2VpbWFnZXxpbWFnaWNrX3NwcmVhZGltYWdlfGltYWdpY2tfc3RlZ2Fub2ltYWdlfGltYWdpY2tfc3RlcmVvaW1hZ2V8aW1hZ2lja19zdHJpcGltYWdlfGltYWdpY2tfc3dpcmxpbWFnZXxpbWFnaWNrX3RleHR1cmVpbWFnZXxpbWFnaWNrX3RocmVzaG9sZGltYWdlfGltYWdpY2tfdGh1bWJuYWlsaW1hZ2V8aW1hZ2lja190aW50aW1hZ2V8aW1hZ2lja190cmFuc2Zvcm1pbWFnZXxpbWFnaWNrX3RyYW5zcGFyZW50cGFpbnRpbWFnZXxpbWFnaWNrX3RyYW5zcG9zZWltYWdlfGltYWdpY2tfdHJhbnN2ZXJzZWltYWdlfGltYWdpY2tfdHJpbWltYWdlfGltYWdpY2tfdW5pcXVlaW1hZ2Vjb2xvcnN8aW1hZ2lja191bnNoYXJwbWFza2ltYWdlfGltYWdpY2tfdmFsaWR8aW1hZ2lja192aWduZXR0ZWltYWdlfGltYWdpY2tfd2F2ZWltYWdlfGltYWdpY2tfd2hpdGV0aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3dyaXRlaW1hZ2V8aW1hZ2lja193cml0ZWltYWdlZmlsZXxpbWFnaWNrX3dyaXRlaW1hZ2VzfGltYWdpY2tfd3JpdGVpbWFnZXNmaWxlfGltYWdpY2tkcmF3fGltYWdpY2tkcmF3X2FmZmluZXxpbWFnaWNrZHJhd19hbm5vdGF0aW9ufGltYWdpY2tkcmF3X2FyY3xpbWFnaWNrZHJhd19iZXppZXJ8aW1hZ2lja2RyYXdfY2lyY2xlfGltYWdpY2tkcmF3X2NsZWFyfGltYWdpY2tkcmF3X2Nsb25lfGltYWdpY2tkcmF3X2NvbG9yfGltYWdpY2tkcmF3X2NvbW1lbnR8aW1hZ2lja2RyYXdfY29tcG9zaXRlfGltYWdpY2tkcmF3X2NvbnN0cnVjdHxpbWFnaWNrZHJhd19kZXN0cm95fGltYWdpY2tkcmF3X2VsbGlwc2V8aW1hZ2lja2RyYXdfZ2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfZ2V0Y2xpcHJ1bGV8aW1hZ2lja2RyYXdfZ2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X2dldGZpbGxjb2xvcnxpbWFnaWNrZHJhd19nZXRmaWxsb3BhY2l0eXxpbWFnaWNrZHJhd19nZXRmaWxscnVsZXxpbWFnaWNrZHJhd19nZXRmb250fGltYWdpY2tkcmF3X2dldGZvbnRmYW1pbHl8aW1hZ2lja2RyYXdfZ2V0Zm9udHNpemV8aW1hZ2lja2RyYXdfZ2V0Zm9udHN0eWxlfGltYWdpY2tkcmF3X2dldGZvbnR3ZWlnaHR8aW1hZ2lja2RyYXdfZ2V0Z3Jhdml0eXxpbWFnaWNrZHJhd19nZXRzdHJva2VhbnRpYWxpYXN8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlY29sb3J8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlZGFzaGFycmF5fGltYWdpY2tkcmF3X2dldHN0cm9rZWRhc2hvZmZzZXR8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlbGluZWNhcHxpbWFnaWNrZHJhd19nZXRzdHJva2VsaW5lam9pbnxpbWFnaWNrZHJhd19nZXRzdHJva2VtaXRlcmxpbWl0fGltYWdpY2tkcmF3X2dldHN0cm9rZW9wYWNpdHl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfZ2V0dGV4dGFsaWdubWVudHxpbWFnaWNrZHJhd19nZXR0ZXh0YW50aWFsaWFzfGltYWdpY2tkcmF3X2dldHRleHRkZWNvcmF0aW9ufGltYWdpY2tkcmF3X2dldHRleHRlbmNvZGluZ3xpbWFnaWNrZHJhd19nZXR0ZXh0dW5kZXJjb2xvcnxpbWFnaWNrZHJhd19nZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19saW5lfGltYWdpY2tkcmF3X21hdHRlfGltYWdpY2tkcmF3X3BhdGhjbG9zZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b2Fic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcXVhZHJhdGljYmV6aWVyYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnNtb290aGFic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcXVhZHJhdGljYmV6aWVyc21vb3RocmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGN1cnZldG9yZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3Ntb290aGFic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvc21vb3RocmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGZpbmlzaHxpbWFnaWNrZHJhd19wYXRobGluZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGxpbmV0b2hvcml6b250YWxhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvaG9yaXpvbnRhbHJlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhsaW5ldG9yZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvdmVydGljYWxhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvdmVydGljYWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobW92ZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aG1vdmV0b3JlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhzdGFydHxpbWFnaWNrZHJhd19wb2ludHxpbWFnaWNrZHJhd19wb2x5Z29ufGltYWdpY2tkcmF3X3BvbHlsaW5lfGltYWdpY2tkcmF3X3BvcHxpbWFnaWNrZHJhd19wb3BjbGlwcGF0aHxpbWFnaWNrZHJhd19wb3BkZWZzfGltYWdpY2tkcmF3X3BvcHBhdHRlcm58aW1hZ2lja2RyYXdfcHVzaHxpbWFnaWNrZHJhd19wdXNoY2xpcHBhdGh8aW1hZ2lja2RyYXdfcHVzaGRlZnN8aW1hZ2lja2RyYXdfcHVzaHBhdHRlcm58aW1hZ2lja2RyYXdfcmVjdGFuZ2xlfGltYWdpY2tkcmF3X3JlbmRlcnxpbWFnaWNrZHJhd19yb3RhdGV8aW1hZ2lja2RyYXdfcm91bmRyZWN0YW5nbGV8aW1hZ2lja2RyYXdfc2NhbGV8aW1hZ2lja2RyYXdfc2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfc2V0Y2xpcHJ1bGV8aW1hZ2lja2RyYXdfc2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X3NldGZpbGxhbHBoYXxpbWFnaWNrZHJhd19zZXRmaWxsY29sb3J8aW1hZ2lja2RyYXdfc2V0ZmlsbG9wYWNpdHl8aW1hZ2lja2RyYXdfc2V0ZmlsbHBhdHRlcm51cmx8aW1hZ2lja2RyYXdfc2V0ZmlsbHJ1bGV8aW1hZ2lja2RyYXdfc2V0Zm9udHxpbWFnaWNrZHJhd19zZXRmb250ZmFtaWx5fGltYWdpY2tkcmF3X3NldGZvbnRzaXplfGltYWdpY2tkcmF3X3NldGZvbnRzdHJldGNofGltYWdpY2tkcmF3X3NldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19zZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X3NldGdyYXZpdHl8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYWxwaGF8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYW50aWFsaWFzfGltYWdpY2tkcmF3X3NldHN0cm9rZWNvbG9yfGltYWdpY2tkcmF3X3NldHN0cm9rZWRhc2hhcnJheXxpbWFnaWNrZHJhd19zZXRzdHJva2VkYXNob2Zmc2V0fGltYWdpY2tkcmF3X3NldHN0cm9rZWxpbmVjYXB8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlbGluZWpvaW58aW1hZ2lja2RyYXdfc2V0c3Ryb2tlbWl0ZXJsaW1pdHxpbWFnaWNrZHJhd19zZXRzdHJva2VvcGFjaXR5fGltYWdpY2tkcmF3X3NldHN0cm9rZXBhdHRlcm51cmx8aW1hZ2lja2RyYXdfc2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfc2V0dGV4dGFsaWdubWVudHxpbWFnaWNrZHJhd19zZXR0ZXh0YW50aWFsaWFzfGltYWdpY2tkcmF3X3NldHRleHRkZWNvcmF0aW9ufGltYWdpY2tkcmF3X3NldHRleHRlbmNvZGluZ3xpbWFnaWNrZHJhd19zZXR0ZXh0dW5kZXJjb2xvcnxpbWFnaWNrZHJhd19zZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19zZXR2aWV3Ym94fGltYWdpY2tkcmF3X3NrZXd4fGltYWdpY2tkcmF3X3NrZXd5fGltYWdpY2tkcmF3X3RyYW5zbGF0ZXxpbWFnaWNrcGl4ZWx8aW1hZ2lja3BpeGVsX2NsZWFyfGltYWdpY2twaXhlbF9jb25zdHJ1Y3R8aW1hZ2lja3BpeGVsX2Rlc3Ryb3l8aW1hZ2lja3BpeGVsX2dldGNvbG9yfGltYWdpY2twaXhlbF9nZXRjb2xvcmFzc3RyaW5nfGltYWdpY2twaXhlbF9nZXRjb2xvcmNvdW50fGltYWdpY2twaXhlbF9nZXRjb2xvcnZhbHVlfGltYWdpY2twaXhlbF9nZXRoc2x8aW1hZ2lja3BpeGVsX2lzc2ltaWxhcnxpbWFnaWNrcGl4ZWxfc2V0Y29sb3J8aW1hZ2lja3BpeGVsX3NldGNvbG9ydmFsdWV8aW1hZ2lja3BpeGVsX3NldGhzbHxpbWFnaWNrcGl4ZWxpdGVyYXRvcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9jbGVhcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9jb25zdHJ1Y3R8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZGVzdHJveXxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9nZXRjdXJyZW50aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0bmV4dGl0ZXJhdG9ycm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX2dldHByZXZpb3VzaXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfbmV3cGl4ZWxpdGVyYXRvcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9uZXdwaXhlbHJlZ2lvbml0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX3Jlc2V0aXRlcmF0b3J8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3JmaXJzdHJvd3xpbWFnaWNrcGl4ZWxpdGVyYXRvcl9zZXRpdGVyYXRvcmxhc3Ryb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc3luY2l0ZXJhdG9yfGltYXBfOGJpdHxpbWFwX2FsZXJ0c3xpbWFwX2FwcGVuZHxpbWFwX2Jhc2U2NHxpbWFwX2JpbmFyeXxpbWFwX2JvZHl8aW1hcF9ib2R5c3RydWN0fGltYXBfY2hlY2t8aW1hcF9jbGVhcmZsYWdfZnVsbHxpbWFwX2Nsb3NlfGltYXBfY3JlYXRlfGltYXBfY3JlYXRlbWFpbGJveHxpbWFwX2RlbGV0ZXxpbWFwX2RlbGV0ZW1haWxib3h8aW1hcF9lcnJvcnN8aW1hcF9leHB1bmdlfGltYXBfZmV0Y2hfb3ZlcnZpZXd8aW1hcF9mZXRjaGJvZHl8aW1hcF9mZXRjaGhlYWRlcnxpbWFwX2ZldGNobWltZXxpbWFwX2ZldGNoc3RydWN0dXJlfGltYXBfZmV0Y2h0ZXh0fGltYXBfZ2N8aW1hcF9nZXRfcXVvdGF8aW1hcF9nZXRfcXVvdGFyb290fGltYXBfZ2V0YWNsfGltYXBfZ2V0bWFpbGJveGVzfGltYXBfZ2V0c3Vic2NyaWJlZHxpbWFwX2hlYWRlcnxpbWFwX2hlYWRlcmluZm98aW1hcF9oZWFkZXJzfGltYXBfbGFzdF9lcnJvcnxpbWFwX2xpc3R8aW1hcF9saXN0bWFpbGJveHxpbWFwX2xpc3RzY2FufGltYXBfbGlzdHN1YnNjcmliZWR8aW1hcF9sc3VifGltYXBfbWFpbHxpbWFwX21haWxfY29tcG9zZXxpbWFwX21haWxfY29weXxpbWFwX21haWxfbW92ZXxpbWFwX21haWxib3htc2dpbmZvfGltYXBfbWltZV9oZWFkZXJfZGVjb2RlfGltYXBfbXNnbm98aW1hcF9udW1fbXNnfGltYXBfbnVtX3JlY2VudHxpbWFwX29wZW58aW1hcF9waW5nfGltYXBfcXByaW50fGltYXBfcmVuYW1lfGltYXBfcmVuYW1lbWFpbGJveHxpbWFwX3Jlb3BlbnxpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0fGltYXBfcmZjODIyX3BhcnNlX2hlYWRlcnN8aW1hcF9yZmM4MjJfd3JpdGVfYWRkcmVzc3xpbWFwX3NhdmVib2R5fGltYXBfc2NhbnxpbWFwX3NjYW5tYWlsYm94fGltYXBfc2VhcmNofGltYXBfc2V0X3F1b3RhfGltYXBfc2V0YWNsfGltYXBfc2V0ZmxhZ19mdWxsfGltYXBfc29ydHxpbWFwX3N0YXR1c3xpbWFwX3N1YnNjcmliZXxpbWFwX3RocmVhZHxpbWFwX3RpbWVvdXR8aW1hcF91aWR8aW1hcF91bmRlbGV0ZXxpbWFwX3Vuc3Vic2NyaWJlfGltYXBfdXRmN19kZWNvZGV8aW1hcF91dGY3X2VuY29kZXxpbWFwX3V0Zjh8aW1wbGVtZW50c2ludGVyZmFjZXxpbXBsb2RlfGltcG9ydF9yZXF1ZXN0X3ZhcmlhYmxlc3xpbl9hcnJheXxpbmNsdWRlfGluY2x1ZGVfb25jZXxpbmNsdWVkX2dldF9kYXRhfGluZXRfbnRvcHxpbmV0X3B0b258aW5maW5pdGVpdGVyYXRvcnxpbmdyZXNfYXV0b2NvbW1pdHxpbmdyZXNfYXV0b2NvbW1pdF9zdGF0ZXxpbmdyZXNfY2hhcnNldHxpbmdyZXNfY2xvc2V8aW5ncmVzX2NvbW1pdHxpbmdyZXNfY29ubmVjdHxpbmdyZXNfY3Vyc29yfGluZ3Jlc19lcnJub3xpbmdyZXNfZXJyb3J8aW5ncmVzX2VycnNxbHN0YXRlfGluZ3Jlc19lc2NhcGVfc3RyaW5nfGluZ3Jlc19leGVjdXRlfGluZ3Jlc19mZXRjaF9hcnJheXxpbmdyZXNfZmV0Y2hfYXNzb2N8aW5ncmVzX2ZldGNoX29iamVjdHxpbmdyZXNfZmV0Y2hfcHJvY19yZXR1cm58aW5ncmVzX2ZldGNoX3Jvd3xpbmdyZXNfZmllbGRfbGVuZ3RofGluZ3Jlc19maWVsZF9uYW1lfGluZ3Jlc19maWVsZF9udWxsYWJsZXxpbmdyZXNfZmllbGRfcHJlY2lzaW9ufGluZ3Jlc19maWVsZF9zY2FsZXxpbmdyZXNfZmllbGRfdHlwZXxpbmdyZXNfZnJlZV9yZXN1bHR8aW5ncmVzX25leHRfZXJyb3J8aW5ncmVzX251bV9maWVsZHN8aW5ncmVzX251bV9yb3dzfGluZ3Jlc19wY29ubmVjdHxpbmdyZXNfcHJlcGFyZXxpbmdyZXNfcXVlcnl8aW5ncmVzX3Jlc3VsdF9zZWVrfGluZ3Jlc19yb2xsYmFja3xpbmdyZXNfc2V0X2Vudmlyb25tZW50fGluZ3Jlc191bmJ1ZmZlcmVkX3F1ZXJ5fGluaV9hbHRlcnxpbmlfZ2V0fGluaV9nZXRfYWxsfGluaV9yZXN0b3JlfGluaV9zZXR8aW5uYW1lc3BhY2V8aW5vdGlmeV9hZGRfd2F0Y2h8aW5vdGlmeV9pbml0fGlub3RpZnlfcXVldWVfbGVufGlub3RpZnlfcmVhZHxpbm90aWZ5X3JtX3dhdGNofGludGVyZmFjZV9leGlzdHN8aW50bF9lcnJvcl9uYW1lfGludGxfZ2V0X2Vycm9yX2NvZGV8aW50bF9nZXRfZXJyb3JfbWVzc2FnZXxpbnRsX2lzX2ZhaWx1cmV8aW50bGRhdGVmb3JtYXR0ZXJ8aW50dmFsfGludmFsaWRhcmd1bWVudGV4Y2VwdGlvbnxpbnZva2V8aW52b2tlYXJnc3xpcDJsb25nfGlwdGNlbWJlZHxpcHRjcGFyc2V8aXNfYXxpc19hcnJheXxpc19ib29sfGlzX2NhbGxhYmxlfGlzX2Rpcnxpc19kb3VibGV8aXNfZXhlY3V0YWJsZXxpc19maWxlfGlzX2Zpbml0ZXxpc19mbG9hdHxpc19pbmZpbml0ZXxpc19pbnR8aXNfaW50ZWdlcnxpc19saW5rfGlzX2xvbmd8aXNfbmFufGlzX251bGx8aXNfbnVtZXJpY3xpc19vYmplY3R8aXNfcmVhZGFibGV8aXNfcmVhbHxpc19yZXNvdXJjZXxpc19zY2FsYXJ8aXNfc29hcF9mYXVsdHxpc19zdHJpbmd8aXNfc3ViY2xhc3Nfb2Z8aXNfdXBsb2FkZWRfZmlsZXxpc193cml0YWJsZXxpc193cml0ZWFibGV8aXNhYnN0cmFjdHxpc2Nsb25lYWJsZXxpc2Rpc2FibGVkfGlzZmluYWx8aXNpbnN0YW5jZXxpc2luc3RhbnRpYWJsZXxpc2ludGVyZmFjZXxpc2ludGVybmFsfGlzaXRlcmF0ZWFibGV8aXNzZXR8aXNzdWJjbGFzc29mfGlzdXNlcmRlZmluZWR8aXRlcmF0b3J8aXRlcmF0b3JfYXBwbHl8aXRlcmF0b3JfY291bnR8aXRlcmF0b3JfdG9fYXJyYXl8aXRlcmF0b3JhZ2dyZWdhdGV8aXRlcmF0b3JpdGVyYXRvcnxqYXZhX2xhc3RfZXhjZXB0aW9uX2NsZWFyfGphdmFfbGFzdF9leGNlcHRpb25fZ2V0fGpkZGF5b2Z3ZWVrfGpkbW9udGhuYW1lfGpkdG9mcmVuY2h8amR0b2dyZWdvcmlhbnxqZHRvamV3aXNofGpkdG9qdWxpYW58amR0b3VuaXh8amV3aXNodG9qZHxqb2lufGpwZWcyd2JtcHxqc29uX2RlY29kZXxqc29uX2VuY29kZXxqc29uX2xhc3RfZXJyb3J8anNvbnNlcmlhbGl6YWJsZXxqdWR5fGp1ZHlfdHlwZXxqdWR5X3ZlcnNpb258anVsaWFudG9qZHxrYWRtNV9jaHBhc3NfcHJpbmNpcGFsfGthZG01X2NyZWF0ZV9wcmluY2lwYWx8a2FkbTVfZGVsZXRlX3ByaW5jaXBhbHxrYWRtNV9kZXN0cm95fGthZG01X2ZsdXNofGthZG01X2dldF9wb2xpY2llc3xrYWRtNV9nZXRfcHJpbmNpcGFsfGthZG01X2dldF9wcmluY2lwYWxzfGthZG01X2luaXRfd2l0aF9wYXNzd29yZHxrYWRtNV9tb2RpZnlfcHJpbmNpcGFsfGtleXxrcnNvcnR8a3NvcnR8bGNmaXJzdHxsY2dfdmFsdWV8bGNoZ3JwfGxjaG93bnxsZGFwXzg4NTlfdG9fdDYxfGxkYXBfYWRkfGxkYXBfYmluZHxsZGFwX2Nsb3NlfGxkYXBfY29tcGFyZXxsZGFwX2Nvbm5lY3R8bGRhcF9jb3VudF9lbnRyaWVzfGxkYXBfZGVsZXRlfGxkYXBfZG4ydWZufGxkYXBfZXJyMnN0cnxsZGFwX2Vycm5vfGxkYXBfZXJyb3J8bGRhcF9leHBsb2RlX2RufGxkYXBfZmlyc3RfYXR0cmlidXRlfGxkYXBfZmlyc3RfZW50cnl8bGRhcF9maXJzdF9yZWZlcmVuY2V8bGRhcF9mcmVlX3Jlc3VsdHxsZGFwX2dldF9hdHRyaWJ1dGVzfGxkYXBfZ2V0X2RufGxkYXBfZ2V0X2VudHJpZXN8bGRhcF9nZXRfb3B0aW9ufGxkYXBfZ2V0X3ZhbHVlc3xsZGFwX2dldF92YWx1ZXNfbGVufGxkYXBfbGlzdHxsZGFwX21vZF9hZGR8bGRhcF9tb2RfZGVsfGxkYXBfbW9kX3JlcGxhY2V8bGRhcF9tb2RpZnl8bGRhcF9uZXh0X2F0dHJpYnV0ZXxsZGFwX25leHRfZW50cnl8bGRhcF9uZXh0X3JlZmVyZW5jZXxsZGFwX3BhcnNlX3JlZmVyZW5jZXxsZGFwX3BhcnNlX3Jlc3VsdHxsZGFwX3JlYWR8bGRhcF9yZW5hbWV8bGRhcF9zYXNsX2JpbmR8bGRhcF9zZWFyY2h8bGRhcF9zZXRfb3B0aW9ufGxkYXBfc2V0X3JlYmluZF9wcm9jfGxkYXBfc29ydHxsZGFwX3N0YXJ0X3Rsc3xsZGFwX3Q2MV90b184ODU5fGxkYXBfdW5iaW5kfGxlbmd0aGV4Y2VwdGlvbnxsZXZlbnNodGVpbnxsaWJ4bWxfY2xlYXJfZXJyb3JzfGxpYnhtbF9kaXNhYmxlX2VudGl0eV9sb2FkZXJ8bGlieG1sX2dldF9lcnJvcnN8bGlieG1sX2dldF9sYXN0X2Vycm9yfGxpYnhtbF9zZXRfc3RyZWFtc19jb250ZXh0fGxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzfGxpYnhtbGVycm9yfGxpbWl0aXRlcmF0b3J8bGlua3xsaW5raW5mb3xsaXN0fGxvY2FsZXxsb2NhbGVjb252fGxvY2FsdGltZXxsb2d8bG9nMTB8bG9nMXB8bG9naWNleGNlcHRpb258bG9uZzJpcHxsc3RhdHxsdHJpbXxsemZfY29tcHJlc3N8bHpmX2RlY29tcHJlc3N8bHpmX29wdGltaXplZF9mb3J8bV9jaGVja3N0YXR1c3xtX2NvbXBsZXRlYXV0aG9yaXphdGlvbnN8bV9jb25uZWN0fG1fY29ubmVjdGlvbmVycm9yfG1fZGVsZXRldHJhbnN8bV9kZXN0cm95Y29ubnxtX2Rlc3Ryb3llbmdpbmV8bV9nZXRjZWxsfG1fZ2V0Y2VsbGJ5bnVtfG1fZ2V0Y29tbWFkZWxpbWl0ZWR8bV9nZXRoZWFkZXJ8bV9pbml0Y29ubnxtX2luaXRlbmdpbmV8bV9pc2NvbW1hZGVsaW1pdGVkfG1fbWF4Y29ubnRpbWVvdXR8bV9tb25pdG9yfG1fbnVtY29sdW1uc3xtX251bXJvd3N8bV9wYXJzZWNvbW1hZGVsaW1pdGVkfG1fcmVzcG9uc2VrZXlzfG1fcmVzcG9uc2VwYXJhbXxtX3JldHVybnN0YXR1c3xtX3NldGJsb2NraW5nfG1fc2V0ZHJvcGZpbGV8bV9zZXRpcHxtX3NldHNzbHxtX3NldHNzbF9jYWZpbGV8bV9zZXRzc2xfZmlsZXN8bV9zZXR0aW1lb3V0fG1fc3NsY2VydF9nZW5faGFzaHxtX3RyYW5zYWN0aW9uc3NlbnR8bV90cmFuc2lucXVldWV8bV90cmFuc2tleXZhbHxtX3RyYW5zbmV3fG1fdHJhbnNzZW5kfG1fdXdhaXR8bV92YWxpZGF0ZWlkZW50aWZpZXJ8bV92ZXJpZnljb25uZWN0aW9ufG1fdmVyaWZ5c3NsY2VydHxtYWdpY19xdW90ZXNfcnVudGltZXxtYWlsfG1haWxwYXJzZV9kZXRlcm1pbmVfYmVzdF94ZmVyX2VuY29kaW5nfG1haWxwYXJzZV9tc2dfY3JlYXRlfG1haWxwYXJzZV9tc2dfZXh0cmFjdF9wYXJ0fG1haWxwYXJzZV9tc2dfZXh0cmFjdF9wYXJ0X2ZpbGV8bWFpbHBhcnNlX21zZ19leHRyYWN0X3dob2xlX3BhcnRfZmlsZXxtYWlscGFyc2VfbXNnX2ZyZWV8bWFpbHBhcnNlX21zZ19nZXRfcGFydHxtYWlscGFyc2VfbXNnX2dldF9wYXJ0X2RhdGF8bWFpbHBhcnNlX21zZ19nZXRfc3RydWN0dXJlfG1haWxwYXJzZV9tc2dfcGFyc2V8bWFpbHBhcnNlX21zZ19wYXJzZV9maWxlfG1haWxwYXJzZV9yZmM4MjJfcGFyc2VfYWRkcmVzc2VzfG1haWxwYXJzZV9zdHJlYW1fZW5jb2RlfG1haWxwYXJzZV91dWRlY29kZV9hbGx8bWFpbnxtYXh8bWF4ZGJfYWZmZWN0ZWRfcm93c3xtYXhkYl9hdXRvY29tbWl0fG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2hhbmdlX3VzZXJ8bWF4ZGJfY2hhcmFjdGVyX3NldF9uYW1lfG1heGRiX2NsaWVudF9lbmNvZGluZ3xtYXhkYl9jbG9zZXxtYXhkYl9jbG9zZV9sb25nX2RhdGF8bWF4ZGJfY29tbWl0fG1heGRiX2Nvbm5lY3R8bWF4ZGJfY29ubmVjdF9lcnJub3xtYXhkYl9jb25uZWN0X2Vycm9yfG1heGRiX2RhdGFfc2Vla3xtYXhkYl9kZWJ1Z3xtYXhkYl9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyfG1heGRiX2Rpc2FibGVfcnBsX3BhcnNlfG1heGRiX2R1bXBfZGVidWdfaW5mb3xtYXhkYl9lbWJlZGRlZF9jb25uZWN0fG1heGRiX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnxtYXhkYl9lbmFibGVfcnBsX3BhcnNlfG1heGRiX2Vycm5vfG1heGRiX2Vycm9yfG1heGRiX2VzY2FwZV9zdHJpbmd8bWF4ZGJfZXhlY3V0ZXxtYXhkYl9mZXRjaHxtYXhkYl9mZXRjaF9hcnJheXxtYXhkYl9mZXRjaF9hc3NvY3xtYXhkYl9mZXRjaF9maWVsZHxtYXhkYl9mZXRjaF9maWVsZF9kaXJlY3R8bWF4ZGJfZmV0Y2hfZmllbGRzfG1heGRiX2ZldGNoX2xlbmd0aHN8bWF4ZGJfZmV0Y2hfb2JqZWN0fG1heGRiX2ZldGNoX3Jvd3xtYXhkYl9maWVsZF9jb3VudHxtYXhkYl9maWVsZF9zZWVrfG1heGRiX2ZpZWxkX3RlbGx8bWF4ZGJfZnJlZV9yZXN1bHR8bWF4ZGJfZ2V0X2NsaWVudF9pbmZvfG1heGRiX2dldF9jbGllbnRfdmVyc2lvbnxtYXhkYl9nZXRfaG9zdF9pbmZvfG1heGRiX2dldF9tZXRhZGF0YXxtYXhkYl9nZXRfcHJvdG9faW5mb3xtYXhkYl9nZXRfc2VydmVyX2luZm98bWF4ZGJfZ2V0X3NlcnZlcl92ZXJzaW9ufG1heGRiX2luZm98bWF4ZGJfaW5pdHxtYXhkYl9pbnNlcnRfaWR8bWF4ZGJfa2lsbHxtYXhkYl9tYXN0ZXJfcXVlcnl8bWF4ZGJfbW9yZV9yZXN1bHRzfG1heGRiX211bHRpX3F1ZXJ5fG1heGRiX25leHRfcmVzdWx0fG1heGRiX251bV9maWVsZHN8bWF4ZGJfbnVtX3Jvd3N8bWF4ZGJfb3B0aW9uc3xtYXhkYl9wYXJhbV9jb3VudHxtYXhkYl9waW5nfG1heGRiX3ByZXBhcmV8bWF4ZGJfcXVlcnl8bWF4ZGJfcmVhbF9jb25uZWN0fG1heGRiX3JlYWxfZXNjYXBlX3N0cmluZ3xtYXhkYl9yZWFsX3F1ZXJ5fG1heGRiX3JlcG9ydHxtYXhkYl9yb2xsYmFja3xtYXhkYl9ycGxfcGFyc2VfZW5hYmxlZHxtYXhkYl9ycGxfcHJvYmV8bWF4ZGJfcnBsX3F1ZXJ5X3R5cGV8bWF4ZGJfc2VsZWN0X2RifG1heGRiX3NlbmRfbG9uZ19kYXRhfG1heGRiX3NlbmRfcXVlcnl8bWF4ZGJfc2VydmVyX2VuZHxtYXhkYl9zZXJ2ZXJfaW5pdHxtYXhkYl9zZXRfb3B0fG1heGRiX3NxbHN0YXRlfG1heGRiX3NzbF9zZXR8bWF4ZGJfc3RhdHxtYXhkYl9zdG10X2FmZmVjdGVkX3Jvd3N8bWF4ZGJfc3RtdF9iaW5kX3BhcmFtfG1heGRiX3N0bXRfYmluZF9yZXN1bHR8bWF4ZGJfc3RtdF9jbG9zZXxtYXhkYl9zdG10X2Nsb3NlX2xvbmdfZGF0YXxtYXhkYl9zdG10X2RhdGFfc2Vla3xtYXhkYl9zdG10X2Vycm5vfG1heGRiX3N0bXRfZXJyb3J8bWF4ZGJfc3RtdF9leGVjdXRlfG1heGRiX3N0bXRfZmV0Y2h8bWF4ZGJfc3RtdF9mcmVlX3Jlc3VsdHxtYXhkYl9zdG10X2luaXR8bWF4ZGJfc3RtdF9udW1fcm93c3xtYXhkYl9zdG10X3BhcmFtX2NvdW50fG1heGRiX3N0bXRfcHJlcGFyZXxtYXhkYl9zdG10X3Jlc2V0fG1heGRiX3N0bXRfcmVzdWx0X21ldGFkYXRhfG1heGRiX3N0bXRfc2VuZF9sb25nX2RhdGF8bWF4ZGJfc3RtdF9zcWxzdGF0ZXxtYXhkYl9zdG10X3N0b3JlX3Jlc3VsdHxtYXhkYl9zdG9yZV9yZXN1bHR8bWF4ZGJfdGhyZWFkX2lkfG1heGRiX3RocmVhZF9zYWZlfG1heGRiX3VzZV9yZXN1bHR8bWF4ZGJfd2FybmluZ19jb3VudHxtYl9jaGVja19lbmNvZGluZ3xtYl9jb252ZXJ0X2Nhc2V8bWJfY29udmVydF9lbmNvZGluZ3xtYl9jb252ZXJ0X2thbmF8bWJfY29udmVydF92YXJpYWJsZXN8bWJfZGVjb2RlX21pbWVoZWFkZXJ8bWJfZGVjb2RlX251bWVyaWNlbnRpdHl8bWJfZGV0ZWN0X2VuY29kaW5nfG1iX2RldGVjdF9vcmRlcnxtYl9lbmNvZGVfbWltZWhlYWRlcnxtYl9lbmNvZGVfbnVtZXJpY2VudGl0eXxtYl9lbmNvZGluZ19hbGlhc2VzfG1iX2VyZWd8bWJfZXJlZ19tYXRjaHxtYl9lcmVnX3JlcGxhY2V8bWJfZXJlZ19zZWFyY2h8bWJfZXJlZ19zZWFyY2hfZ2V0cG9zfG1iX2VyZWdfc2VhcmNoX2dldHJlZ3N8bWJfZXJlZ19zZWFyY2hfaW5pdHxtYl9lcmVnX3NlYXJjaF9wb3N8bWJfZXJlZ19zZWFyY2hfcmVnc3xtYl9lcmVnX3NlYXJjaF9zZXRwb3N8bWJfZXJlZ2l8bWJfZXJlZ2lfcmVwbGFjZXxtYl9nZXRfaW5mb3xtYl9odHRwX2lucHV0fG1iX2h0dHBfb3V0cHV0fG1iX2ludGVybmFsX2VuY29kaW5nfG1iX2xhbmd1YWdlfG1iX2xpc3RfZW5jb2RpbmdzfG1iX291dHB1dF9oYW5kbGVyfG1iX3BhcnNlX3N0cnxtYl9wcmVmZXJyZWRfbWltZV9uYW1lfG1iX3JlZ2V4X2VuY29kaW5nfG1iX3JlZ2V4X3NldF9vcHRpb25zfG1iX3NlbmRfbWFpbHxtYl9zcGxpdHxtYl9zdHJjdXR8bWJfc3RyaW13aWR0aHxtYl9zdHJpcG9zfG1iX3N0cmlzdHJ8bWJfc3RybGVufG1iX3N0cnBvc3xtYl9zdHJyY2hyfG1iX3N0cnJpY2hyfG1iX3N0cnJpcG9zfG1iX3N0cnJwb3N8bWJfc3Ryc3RyfG1iX3N0cnRvbG93ZXJ8bWJfc3RydG91cHBlcnxtYl9zdHJ3aWR0aHxtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcnxtYl9zdWJzdHJ8bWJfc3Vic3RyX2NvdW50fG1jcnlwdF9jYmN8bWNyeXB0X2NmYnxtY3J5cHRfY3JlYXRlX2l2fG1jcnlwdF9kZWNyeXB0fG1jcnlwdF9lY2J8bWNyeXB0X2VuY19nZXRfYWxnb3JpdGhtc19uYW1lfG1jcnlwdF9lbmNfZ2V0X2Jsb2NrX3NpemV8bWNyeXB0X2VuY19nZXRfaXZfc2l6ZXxtY3J5cHRfZW5jX2dldF9rZXlfc2l6ZXxtY3J5cHRfZW5jX2dldF9tb2Rlc19uYW1lfG1jcnlwdF9lbmNfZ2V0X3N1cHBvcnRlZF9rZXlfc2l6ZXN8bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG18bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG1fbW9kZXxtY3J5cHRfZW5jX2lzX2Jsb2NrX21vZGV8bWNyeXB0X2VuY19zZWxmX3Rlc3R8bWNyeXB0X2VuY3J5cHR8bWNyeXB0X2dlbmVyaWN8bWNyeXB0X2dlbmVyaWNfZGVpbml0fG1jcnlwdF9nZW5lcmljX2VuZHxtY3J5cHRfZ2VuZXJpY19pbml0fG1jcnlwdF9nZXRfYmxvY2tfc2l6ZXxtY3J5cHRfZ2V0X2NpcGhlcl9uYW1lfG1jcnlwdF9nZXRfaXZfc2l6ZXxtY3J5cHRfZ2V0X2tleV9zaXplfG1jcnlwdF9saXN0X2FsZ29yaXRobXN8bWNyeXB0X2xpc3RfbW9kZXN8bWNyeXB0X21vZHVsZV9jbG9zZXxtY3J5cHRfbW9kdWxlX2dldF9hbGdvX2Jsb2NrX3NpemV8bWNyeXB0X21vZHVsZV9nZXRfYWxnb19rZXlfc2l6ZXxtY3J5cHRfbW9kdWxlX2dldF9zdXBwb3J0ZWRfa2V5X3NpemVzfG1jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtfG1jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtX21vZGV8bWNyeXB0X21vZHVsZV9pc19ibG9ja19tb2RlfG1jcnlwdF9tb2R1bGVfb3BlbnxtY3J5cHRfbW9kdWxlX3NlbGZfdGVzdHxtY3J5cHRfb2ZifG1kNXxtZDVfZmlsZXxtZGVjcnlwdF9nZW5lcmljfG1lbWNhY2hlfG1lbWNhY2hlX2RlYnVnfG1lbWNhY2hlZHxtZW1vcnlfZ2V0X3BlYWtfdXNhZ2V8bWVtb3J5X2dldF91c2FnZXxtZXNzYWdlZm9ybWF0dGVyfG1ldGFwaG9uZXxtZXRob2RfZXhpc3RzfG1oYXNofG1oYXNoX2NvdW50fG1oYXNoX2dldF9ibG9ja19zaXplfG1oYXNoX2dldF9oYXNoX25hbWV8bWhhc2hfa2V5Z2VuX3Mya3xtaWNyb3RpbWV8bWltZV9jb250ZW50X3R5cGV8bWlufG1pbmdfa2V5cHJlc3N8bWluZ19zZXRjdWJpY3RocmVzaG9sZHxtaW5nX3NldHNjYWxlfG1pbmdfc2V0c3dmY29tcHJlc3Npb258bWluZ191c2Vjb25zdGFudHN8bWluZ191c2Vzd2Z2ZXJzaW9ufG1rZGlyfG1rdGltZXxtb25leV9mb3JtYXR8bW9uZ298bW9uZ29iaW5kYXRhfG1vbmdvY29kZXxtb25nb2NvbGxlY3Rpb258bW9uZ29jb25uZWN0aW9uZXhjZXB0aW9ufG1vbmdvY3Vyc29yfG1vbmdvY3Vyc29yZXhjZXB0aW9ufG1vbmdvY3Vyc29ydGltZW91dGV4Y2VwdGlvbnxtb25nb2RhdGV8bW9uZ29kYnxtb25nb2RicmVmfG1vbmdvZXhjZXB0aW9ufG1vbmdvZ3JpZGZzfG1vbmdvZ3JpZGZzY3Vyc29yfG1vbmdvZ3JpZGZzZXhjZXB0aW9ufG1vbmdvZ3JpZGZzZmlsZXxtb25nb2lkfG1vbmdvaW50MzJ8bW9uZ29pbnQ2NHxtb25nb21heGtleXxtb25nb21pbmtleXxtb25nb3JlZ2V4fG1vbmdvdGltZXN0YW1wfG1vdmVfdXBsb2FkZWRfZmlsZXxtcGVnZmlsZXxtcXNlcmllc19iYWNrfG1xc2VyaWVzX2JlZ2lufG1xc2VyaWVzX2Nsb3NlfG1xc2VyaWVzX2NtaXR8bXFzZXJpZXNfY29ubnxtcXNlcmllc19jb25ueHxtcXNlcmllc19kaXNjfG1xc2VyaWVzX2dldHxtcXNlcmllc19pbnF8bXFzZXJpZXNfb3BlbnxtcXNlcmllc19wdXR8bXFzZXJpZXNfcHV0MXxtcXNlcmllc19zZXR8bXFzZXJpZXNfc3RyZXJyb3J8bXNlc3Npb25fY29ubmVjdHxtc2Vzc2lvbl9jb3VudHxtc2Vzc2lvbl9jcmVhdGV8bXNlc3Npb25fZGVzdHJveXxtc2Vzc2lvbl9kaXNjb25uZWN0fG1zZXNzaW9uX2ZpbmR8bXNlc3Npb25fZ2V0fG1zZXNzaW9uX2dldF9hcnJheXxtc2Vzc2lvbl9nZXRfZGF0YXxtc2Vzc2lvbl9pbmN8bXNlc3Npb25fbGlzdHxtc2Vzc2lvbl9saXN0dmFyfG1zZXNzaW9uX2xvY2t8bXNlc3Npb25fcGx1Z2lufG1zZXNzaW9uX3JhbmRzdHJ8bXNlc3Npb25fc2V0fG1zZXNzaW9uX3NldF9hcnJheXxtc2Vzc2lvbl9zZXRfZGF0YXxtc2Vzc2lvbl90aW1lb3V0fG1zZXNzaW9uX3VuaXF8bXNlc3Npb25fdW5sb2NrfG1zZ19nZXRfcXVldWV8bXNnX3F1ZXVlX2V4aXN0c3xtc2dfcmVjZWl2ZXxtc2dfcmVtb3ZlX3F1ZXVlfG1zZ19zZW5kfG1zZ19zZXRfcXVldWV8bXNnX3N0YXRfcXVldWV8bXNxbHxtc3FsX2FmZmVjdGVkX3Jvd3N8bXNxbF9jbG9zZXxtc3FsX2Nvbm5lY3R8bXNxbF9jcmVhdGVfZGJ8bXNxbF9jcmVhdGVkYnxtc3FsX2RhdGFfc2Vla3xtc3FsX2RiX3F1ZXJ5fG1zcWxfZGJuYW1lfG1zcWxfZHJvcF9kYnxtc3FsX2Vycm9yfG1zcWxfZmV0Y2hfYXJyYXl8bXNxbF9mZXRjaF9maWVsZHxtc3FsX2ZldGNoX29iamVjdHxtc3FsX2ZldGNoX3Jvd3xtc3FsX2ZpZWxkX2ZsYWdzfG1zcWxfZmllbGRfbGVufG1zcWxfZmllbGRfbmFtZXxtc3FsX2ZpZWxkX3NlZWt8bXNxbF9maWVsZF90YWJsZXxtc3FsX2ZpZWxkX3R5cGV8bXNxbF9maWVsZGZsYWdzfG1zcWxfZmllbGRsZW58bXNxbF9maWVsZG5hbWV8bXNxbF9maWVsZHRhYmxlfG1zcWxfZmllbGR0eXBlfG1zcWxfZnJlZV9yZXN1bHR8bXNxbF9saXN0X2Ric3xtc3FsX2xpc3RfZmllbGRzfG1zcWxfbGlzdF90YWJsZXN8bXNxbF9udW1fZmllbGRzfG1zcWxfbnVtX3Jvd3N8bXNxbF9udW1maWVsZHN8bXNxbF9udW1yb3dzfG1zcWxfcGNvbm5lY3R8bXNxbF9xdWVyeXxtc3FsX3JlZ2Nhc2V8bXNxbF9yZXN1bHR8bXNxbF9zZWxlY3RfZGJ8bXNxbF90YWJsZW5hbWV8bXNzcWxfYmluZHxtc3NxbF9jbG9zZXxtc3NxbF9jb25uZWN0fG1zc3FsX2RhdGFfc2Vla3xtc3NxbF9leGVjdXRlfG1zc3FsX2ZldGNoX2FycmF5fG1zc3FsX2ZldGNoX2Fzc29jfG1zc3FsX2ZldGNoX2JhdGNofG1zc3FsX2ZldGNoX2ZpZWxkfG1zc3FsX2ZldGNoX29iamVjdHxtc3NxbF9mZXRjaF9yb3d8bXNzcWxfZmllbGRfbGVuZ3RofG1zc3FsX2ZpZWxkX25hbWV8bXNzcWxfZmllbGRfc2Vla3xtc3NxbF9maWVsZF90eXBlfG1zc3FsX2ZyZWVfcmVzdWx0fG1zc3FsX2ZyZWVfc3RhdGVtZW50fG1zc3FsX2dldF9sYXN0X21lc3NhZ2V8bXNzcWxfZ3VpZF9zdHJpbmd8bXNzcWxfaW5pdHxtc3NxbF9taW5fZXJyb3Jfc2V2ZXJpdHl8bXNzcWxfbWluX21lc3NhZ2Vfc2V2ZXJpdHl8bXNzcWxfbmV4dF9yZXN1bHR8bXNzcWxfbnVtX2ZpZWxkc3xtc3NxbF9udW1fcm93c3xtc3NxbF9wY29ubmVjdHxtc3NxbF9xdWVyeXxtc3NxbF9yZXN1bHR8bXNzcWxfcm93c19hZmZlY3RlZHxtc3NxbF9zZWxlY3RfZGJ8bXRfZ2V0cmFuZG1heHxtdF9yYW5kfG10X3NyYW5kfG11bHRpcGxlaXRlcmF0b3J8bXlzcWxfYWZmZWN0ZWRfcm93c3xteXNxbF9jbGllbnRfZW5jb2Rpbmd8bXlzcWxfY2xvc2V8bXlzcWxfY29ubmVjdHxteXNxbF9jcmVhdGVfZGJ8bXlzcWxfZGF0YV9zZWVrfG15c3FsX2RiX25hbWV8bXlzcWxfZGJfcXVlcnl8bXlzcWxfZHJvcF9kYnxteXNxbF9lcnJub3xteXNxbF9lcnJvcnxteXNxbF9lc2NhcGVfc3RyaW5nfG15c3FsX2ZldGNoX2FycmF5fG15c3FsX2ZldGNoX2Fzc29jfG15c3FsX2ZldGNoX2ZpZWxkfG15c3FsX2ZldGNoX2xlbmd0aHN8bXlzcWxfZmV0Y2hfb2JqZWN0fG15c3FsX2ZldGNoX3Jvd3xteXNxbF9maWVsZF9mbGFnc3xteXNxbF9maWVsZF9sZW58bXlzcWxfZmllbGRfbmFtZXxteXNxbF9maWVsZF9zZWVrfG15c3FsX2ZpZWxkX3RhYmxlfG15c3FsX2ZpZWxkX3R5cGV8bXlzcWxfZnJlZV9yZXN1bHR8bXlzcWxfZ2V0X2NsaWVudF9pbmZvfG15c3FsX2dldF9ob3N0X2luZm98bXlzcWxfZ2V0X3Byb3RvX2luZm98bXlzcWxfZ2V0X3NlcnZlcl9pbmZvfG15c3FsX2luZm98bXlzcWxfaW5zZXJ0X2lkfG15c3FsX2xpc3RfZGJzfG15c3FsX2xpc3RfZmllbGRzfG15c3FsX2xpc3RfcHJvY2Vzc2VzfG15c3FsX2xpc3RfdGFibGVzfG15c3FsX251bV9maWVsZHN8bXlzcWxfbnVtX3Jvd3N8bXlzcWxfcGNvbm5lY3R8bXlzcWxfcGluZ3xteXNxbF9xdWVyeXxteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmd8bXlzcWxfcmVzdWx0fG15c3FsX3NlbGVjdF9kYnxteXNxbF9zZXRfY2hhcnNldHxteXNxbF9zdGF0fG15c3FsX3RhYmxlbmFtZXxteXNxbF90aHJlYWRfaWR8bXlzcWxfdW5idWZmZXJlZF9xdWVyeXxteXNxbGl8bXlzcWxpX2JpbmRfcGFyYW18bXlzcWxpX2JpbmRfcmVzdWx0fG15c3FsaV9jbGllbnRfZW5jb2Rpbmd8bXlzcWxpX2Nvbm5lY3R8bXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlfG15c3FsaV9kcml2ZXJ8bXlzcWxpX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZW5hYmxlX3JwbF9wYXJzZXxteXNxbGlfZXNjYXBlX3N0cmluZ3xteXNxbGlfZXhlY3V0ZXxteXNxbGlfZmV0Y2h8bXlzcWxpX2dldF9tZXRhZGF0YXxteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcmVwb3J0fG15c3FsaV9yZXN1bHR8bXlzcWxpX3JwbF9wYXJzZV9lbmFibGVkfG15c3FsaV9ycGxfcHJvYmV8bXlzcWxpX3JwbF9xdWVyeV90eXBlfG15c3FsaV9zZW5kX2xvbmdfZGF0YXxteXNxbGlfc2VuZF9xdWVyeXxteXNxbGlfc2V0X29wdHxteXNxbGlfc2xhdmVfcXVlcnl8bXlzcWxpX3N0bXR8bXlzcWxpX3dhcm5pbmd8bXlzcWxuZF9tc19nZXRfc3RhdHN8bXlzcWxuZF9tc19xdWVyeV9pc19zZWxlY3R8bXlzcWxuZF9tc19zZXRfdXNlcl9waWNrX3NlcnZlcnxteXNxbG5kX3FjX2NoYW5nZV9oYW5kbGVyfG15c3FsbmRfcWNfY2xlYXJfY2FjaGV8bXlzcWxuZF9xY19nZXRfY2FjaGVfaW5mb3xteXNxbG5kX3FjX2dldF9jb3JlX3N0YXRzfG15c3FsbmRfcWNfZ2V0X2hhbmRsZXJ8bXlzcWxuZF9xY19nZXRfcXVlcnlfdHJhY2VfbG9nfG15c3FsbmRfcWNfc2V0X3VzZXJfaGFuZGxlcnN8bmF0Y2FzZXNvcnR8bmF0c29ydHxuY3Vyc2VzX2FkZGNofG5jdXJzZXNfYWRkY2huc3RyfG5jdXJzZXNfYWRkY2hzdHJ8bmN1cnNlc19hZGRuc3RyfG5jdXJzZXNfYWRkc3RyfG5jdXJzZXNfYXNzdW1lX2RlZmF1bHRfY29sb3JzfG5jdXJzZXNfYXR0cm9mZnxuY3Vyc2VzX2F0dHJvbnxuY3Vyc2VzX2F0dHJzZXR8bmN1cnNlc19iYXVkcmF0ZXxuY3Vyc2VzX2JlZXB8bmN1cnNlc19ia2dkfG5jdXJzZXNfYmtnZHNldHxuY3Vyc2VzX2JvcmRlcnxuY3Vyc2VzX2JvdHRvbV9wYW5lbHxuY3Vyc2VzX2Nhbl9jaGFuZ2VfY29sb3J8bmN1cnNlc19jYnJlYWt8bmN1cnNlc19jbGVhcnxuY3Vyc2VzX2NscnRvYm90fG5jdXJzZXNfY2xydG9lb2x8bmN1cnNlc19jb2xvcl9jb250ZW50fG5jdXJzZXNfY29sb3Jfc2V0fG5jdXJzZXNfY3Vyc19zZXR8bmN1cnNlc19kZWZfcHJvZ19tb2RlfG5jdXJzZXNfZGVmX3NoZWxsX21vZGV8bmN1cnNlc19kZWZpbmVfa2V5fG5jdXJzZXNfZGVsX3BhbmVsfG5jdXJzZXNfZGVsYXlfb3V0cHV0fG5jdXJzZXNfZGVsY2h8bmN1cnNlc19kZWxldGVsbnxuY3Vyc2VzX2RlbHdpbnxuY3Vyc2VzX2RvdXBkYXRlfG5jdXJzZXNfZWNob3xuY3Vyc2VzX2VjaG9jaGFyfG5jdXJzZXNfZW5kfG5jdXJzZXNfZXJhc2V8bmN1cnNlc19lcmFzZWNoYXJ8bmN1cnNlc19maWx0ZXJ8bmN1cnNlc19mbGFzaHxuY3Vyc2VzX2ZsdXNoaW5wfG5jdXJzZXNfZ2V0Y2h8bmN1cnNlc19nZXRtYXh5eHxuY3Vyc2VzX2dldG1vdXNlfG5jdXJzZXNfZ2V0eXh8bmN1cnNlc19oYWxmZGVsYXl8bmN1cnNlc19oYXNfY29sb3JzfG5jdXJzZXNfaGFzX2ljfG5jdXJzZXNfaGFzX2lsfG5jdXJzZXNfaGFzX2tleXxuY3Vyc2VzX2hpZGVfcGFuZWx8bmN1cnNlc19obGluZXxuY3Vyc2VzX2luY2h8bmN1cnNlc19pbml0fG5jdXJzZXNfaW5pdF9jb2xvcnxuY3Vyc2VzX2luaXRfcGFpcnxuY3Vyc2VzX2luc2NofG5jdXJzZXNfaW5zZGVsbG58bmN1cnNlc19pbnNlcnRsbnxuY3Vyc2VzX2luc3N0cnxuY3Vyc2VzX2luc3RyfG5jdXJzZXNfaXNlbmR3aW58bmN1cnNlc19rZXlva3xuY3Vyc2VzX2tleXBhZHxuY3Vyc2VzX2tpbGxjaGFyfG5jdXJzZXNfbG9uZ25hbWV8bmN1cnNlc19tZXRhfG5jdXJzZXNfbW91c2VfdHJhZm98bmN1cnNlc19tb3VzZWludGVydmFsfG5jdXJzZXNfbW91c2VtYXNrfG5jdXJzZXNfbW92ZXxuY3Vyc2VzX21vdmVfcGFuZWx8bmN1cnNlc19tdmFkZGNofG5jdXJzZXNfbXZhZGRjaG5zdHJ8bmN1cnNlc19tdmFkZGNoc3RyfG5jdXJzZXNfbXZhZGRuc3RyfG5jdXJzZXNfbXZhZGRzdHJ8bmN1cnNlc19tdmN1cnxuY3Vyc2VzX212ZGVsY2h8bmN1cnNlc19tdmdldGNofG5jdXJzZXNfbXZobGluZXxuY3Vyc2VzX212aW5jaHxuY3Vyc2VzX212dmxpbmV8bmN1cnNlc19tdndhZGRzdHJ8bmN1cnNlc19uYXBtc3xuY3Vyc2VzX25ld19wYW5lbHxuY3Vyc2VzX25ld3BhZHxuY3Vyc2VzX25ld3dpbnxuY3Vyc2VzX25sfG5jdXJzZXNfbm9jYnJlYWt8bmN1cnNlc19ub2VjaG98bmN1cnNlc19ub25sfG5jdXJzZXNfbm9xaWZsdXNofG5jdXJzZXNfbm9yYXd8bmN1cnNlc19wYWlyX2NvbnRlbnR8bmN1cnNlc19wYW5lbF9hYm92ZXxuY3Vyc2VzX3BhbmVsX2JlbG93fG5jdXJzZXNfcGFuZWxfd2luZG93fG5jdXJzZXNfcG5vdXRyZWZyZXNofG5jdXJzZXNfcHJlZnJlc2h8bmN1cnNlc19wdXRwfG5jdXJzZXNfcWlmbHVzaHxuY3Vyc2VzX3Jhd3xuY3Vyc2VzX3JlZnJlc2h8bmN1cnNlc19yZXBsYWNlX3BhbmVsfG5jdXJzZXNfcmVzZXRfcHJvZ19tb2RlfG5jdXJzZXNfcmVzZXRfc2hlbGxfbW9kZXxuY3Vyc2VzX3Jlc2V0dHl8bmN1cnNlc19zYXZldHR5fG5jdXJzZXNfc2NyX2R1bXB8bmN1cnNlc19zY3JfaW5pdHxuY3Vyc2VzX3Njcl9yZXN0b3JlfG5jdXJzZXNfc2NyX3NldHxuY3Vyc2VzX3Njcmx8bmN1cnNlc19zaG93X3BhbmVsfG5jdXJzZXNfc2xrX2F0dHJ8bmN1cnNlc19zbGtfYXR0cm9mZnxuY3Vyc2VzX3Nsa19hdHRyb258bmN1cnNlc19zbGtfYXR0cnNldHxuY3Vyc2VzX3Nsa19jbGVhcnxuY3Vyc2VzX3Nsa19jb2xvcnxuY3Vyc2VzX3Nsa19pbml0fG5jdXJzZXNfc2xrX25vdXRyZWZyZXNofG5jdXJzZXNfc2xrX3JlZnJlc2h8bmN1cnNlc19zbGtfcmVzdG9yZXxuY3Vyc2VzX3Nsa19zZXR8bmN1cnNlc19zbGtfdG91Y2h8bmN1cnNlc19zdGFuZGVuZHxuY3Vyc2VzX3N0YW5kb3V0fG5jdXJzZXNfc3RhcnRfY29sb3J8bmN1cnNlc190ZXJtYXR0cnN8bmN1cnNlc190ZXJtbmFtZXxuY3Vyc2VzX3RpbWVvdXR8bmN1cnNlc190b3BfcGFuZWx8bmN1cnNlc190eXBlYWhlYWR8bmN1cnNlc191bmdldGNofG5jdXJzZXNfdW5nZXRtb3VzZXxuY3Vyc2VzX3VwZGF0ZV9wYW5lbHN8bmN1cnNlc191c2VfZGVmYXVsdF9jb2xvcnN8bmN1cnNlc191c2VfZW52fG5jdXJzZXNfdXNlX2V4dGVuZGVkX25hbWVzfG5jdXJzZXNfdmlkYXR0cnxuY3Vyc2VzX3ZsaW5lfG5jdXJzZXNfd2FkZGNofG5jdXJzZXNfd2FkZHN0cnxuY3Vyc2VzX3dhdHRyb2ZmfG5jdXJzZXNfd2F0dHJvbnxuY3Vyc2VzX3dhdHRyc2V0fG5jdXJzZXNfd2JvcmRlcnxuY3Vyc2VzX3djbGVhcnxuY3Vyc2VzX3djb2xvcl9zZXR8bmN1cnNlc193ZXJhc2V8bmN1cnNlc193Z2V0Y2h8bmN1cnNlc193aGxpbmV8bmN1cnNlc193bW91c2VfdHJhZm98bmN1cnNlc193bW92ZXxuY3Vyc2VzX3dub3V0cmVmcmVzaHxuY3Vyc2VzX3dyZWZyZXNofG5jdXJzZXNfd3N0YW5kZW5kfG5jdXJzZXNfd3N0YW5kb3V0fG5jdXJzZXNfd3ZsaW5lfG5ld2luc3RhbmNlfG5ld2luc3RhbmNlYXJnc3xuZXd0X2JlbGx8bmV3dF9idXR0b258bmV3dF9idXR0b25fYmFyfG5ld3RfY2VudGVyZWRfd2luZG93fG5ld3RfY2hlY2tib3h8bmV3dF9jaGVja2JveF9nZXRfdmFsdWV8bmV3dF9jaGVja2JveF9zZXRfZmxhZ3N8bmV3dF9jaGVja2JveF9zZXRfdmFsdWV8bmV3dF9jaGVja2JveF90cmVlfG5ld3RfY2hlY2tib3hfdHJlZV9hZGRfaXRlbXxuZXd0X2NoZWNrYm94X3RyZWVfZmluZF9pdGVtfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfY3VycmVudHxuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X2VudHJ5X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfbXVsdGlfc2VsZWN0aW9ufG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfc2VsZWN0aW9ufG5ld3RfY2hlY2tib3hfdHJlZV9tdWx0aXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2N1cnJlbnR8bmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2VudHJ5X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZV9zZXRfd2lkdGh8bmV3dF9jbGVhcl9rZXlfYnVmZmVyfG5ld3RfY2xzfG5ld3RfY29tcGFjdF9idXR0b258bmV3dF9jb21wb25lbnRfYWRkX2NhbGxiYWNrfG5ld3RfY29tcG9uZW50X3Rha2VzX2ZvY3VzfG5ld3RfY3JlYXRlX2dyaWR8bmV3dF9jdXJzb3Jfb2ZmfG5ld3RfY3Vyc29yX29ufG5ld3RfZGVsYXl8bmV3dF9kcmF3X2Zvcm18bmV3dF9kcmF3X3Jvb3RfdGV4dHxuZXd0X2VudHJ5fG5ld3RfZW50cnlfZ2V0X3ZhbHVlfG5ld3RfZW50cnlfc2V0fG5ld3RfZW50cnlfc2V0X2ZpbHRlcnxuZXd0X2VudHJ5X3NldF9mbGFnc3xuZXd0X2ZpbmlzaGVkfG5ld3RfZm9ybXxuZXd0X2Zvcm1fYWRkX2NvbXBvbmVudHxuZXd0X2Zvcm1fYWRkX2NvbXBvbmVudHN8bmV3dF9mb3JtX2FkZF9ob3Rfa2V5fG5ld3RfZm9ybV9kZXN0cm95fG5ld3RfZm9ybV9nZXRfY3VycmVudHxuZXd0X2Zvcm1fcnVufG5ld3RfZm9ybV9zZXRfYmFja2dyb3VuZHxuZXd0X2Zvcm1fc2V0X2hlaWdodHxuZXd0X2Zvcm1fc2V0X3NpemV8bmV3dF9mb3JtX3NldF90aW1lcnxuZXd0X2Zvcm1fc2V0X3dpZHRofG5ld3RfZm9ybV93YXRjaF9mZHxuZXd0X2dldF9zY3JlZW5fc2l6ZXxuZXd0X2dyaWRfYWRkX2NvbXBvbmVudHNfdG9fZm9ybXxuZXd0X2dyaWRfYmFzaWNfd2luZG93fG5ld3RfZ3JpZF9mcmVlfG5ld3RfZ3JpZF9nZXRfc2l6ZXxuZXd0X2dyaWRfaF9jbG9zZV9zdGFja2VkfG5ld3RfZ3JpZF9oX3N0YWNrZWR8bmV3dF9ncmlkX3BsYWNlfG5ld3RfZ3JpZF9zZXRfZmllbGR8bmV3dF9ncmlkX3NpbXBsZV93aW5kb3d8bmV3dF9ncmlkX3ZfY2xvc2Vfc3RhY2tlZHxuZXd0X2dyaWRfdl9zdGFja2VkfG5ld3RfZ3JpZF93cmFwcGVkX3dpbmRvd3xuZXd0X2dyaWRfd3JhcHBlZF93aW5kb3dfYXR8bmV3dF9pbml0fG5ld3RfbGFiZWx8bmV3dF9sYWJlbF9zZXRfdGV4dHxuZXd0X2xpc3Rib3h8bmV3dF9saXN0Ym94X2FwcGVuZF9lbnRyeXxuZXd0X2xpc3Rib3hfY2xlYXJ8bmV3dF9saXN0Ym94X2NsZWFyX3NlbGVjdGlvbnxuZXd0X2xpc3Rib3hfZGVsZXRlX2VudHJ5fG5ld3RfbGlzdGJveF9nZXRfY3VycmVudHxuZXd0X2xpc3Rib3hfZ2V0X3NlbGVjdGlvbnxuZXd0X2xpc3Rib3hfaW5zZXJ0X2VudHJ5fG5ld3RfbGlzdGJveF9pdGVtX2NvdW50fG5ld3RfbGlzdGJveF9zZWxlY3RfaXRlbXxuZXd0X2xpc3Rib3hfc2V0X2N1cnJlbnR8bmV3dF9saXN0Ym94X3NldF9jdXJyZW50X2J5X2tleXxuZXd0X2xpc3Rib3hfc2V0X2RhdGF8bmV3dF9saXN0Ym94X3NldF9lbnRyeXxuZXd0X2xpc3Rib3hfc2V0X3dpZHRofG5ld3RfbGlzdGl0ZW18bmV3dF9saXN0aXRlbV9nZXRfZGF0YXxuZXd0X2xpc3RpdGVtX3NldHxuZXd0X29wZW5fd2luZG93fG5ld3RfcG9wX2hlbHBfbGluZXxuZXd0X3BvcF93aW5kb3d8bmV3dF9wdXNoX2hlbHBfbGluZXxuZXd0X3JhZGlvX2dldF9jdXJyZW50fG5ld3RfcmFkaW9idXR0b258bmV3dF9yZWRyYXdfaGVscF9saW5lfG5ld3RfcmVmbG93X3RleHR8bmV3dF9yZWZyZXNofG5ld3RfcmVzaXplX3NjcmVlbnxuZXd0X3Jlc3VtZXxuZXd0X3J1bl9mb3JtfG5ld3Rfc2NhbGV8bmV3dF9zY2FsZV9zZXR8bmV3dF9zY3JvbGxiYXJfc2V0fG5ld3Rfc2V0X2hlbHBfY2FsbGJhY2t8bmV3dF9zZXRfc3VzcGVuZF9jYWxsYmFja3xuZXd0X3N1c3BlbmR8bmV3dF90ZXh0Ym94fG5ld3RfdGV4dGJveF9nZXRfbnVtX2xpbmVzfG5ld3RfdGV4dGJveF9yZWZsb3dlZHxuZXd0X3RleHRib3hfc2V0X2hlaWdodHxuZXd0X3RleHRib3hfc2V0X3RleHR8bmV3dF92ZXJ0aWNhbF9zY3JvbGxiYXJ8bmV3dF93YWl0X2Zvcl9rZXl8bmV3dF93aW5fY2hvaWNlfG5ld3Rfd2luX2VudHJpZXN8bmV3dF93aW5fbWVudXxuZXd0X3dpbl9tZXNzYWdlfG5ld3Rfd2luX21lc3NhZ2V2fG5ld3Rfd2luX3Rlcm5hcnl8bmV4dHxuZ2V0dGV4dHxubDJicnxubF9sYW5naW5mb3xub3Jld2luZGl0ZXJhdG9yfG5vcm1hbGl6ZXJ8bm90ZXNfYm9keXxub3Rlc19jb3B5X2RifG5vdGVzX2NyZWF0ZV9kYnxub3Rlc19jcmVhdGVfbm90ZXxub3Rlc19kcm9wX2RifG5vdGVzX2ZpbmRfbm90ZXxub3Rlc19oZWFkZXJfaW5mb3xub3Rlc19saXN0X21zZ3N8bm90ZXNfbWFya19yZWFkfG5vdGVzX21hcmtfdW5yZWFkfG5vdGVzX25hdl9jcmVhdGV8bm90ZXNfc2VhcmNofG5vdGVzX3VucmVhZHxub3Rlc192ZXJzaW9ufG5zYXBpX3JlcXVlc3RfaGVhZGVyc3xuc2FwaV9yZXNwb25zZV9oZWFkZXJzfG5zYXBpX3ZpcnR1YWx8bnRobWFjfG51bWJlcl9mb3JtYXR8bnVtYmVyZm9ybWF0dGVyfG9hdXRofG9hdXRoX2dldF9zYnN8b2F1dGhfdXJsZW5jb2RlfG9hdXRoZXhjZXB0aW9ufG9hdXRocHJvdmlkZXJ8b2JfY2xlYW58b2JfZGVmbGF0ZWhhbmRsZXJ8b2JfZW5kX2NsZWFufG9iX2VuZF9mbHVzaHxvYl9ldGFnaGFuZGxlcnxvYl9mbHVzaHxvYl9nZXRfY2xlYW58b2JfZ2V0X2NvbnRlbnRzfG9iX2dldF9mbHVzaHxvYl9nZXRfbGVuZ3RofG9iX2dldF9sZXZlbHxvYl9nZXRfc3RhdHVzfG9iX2d6aGFuZGxlcnxvYl9pY29udl9oYW5kbGVyfG9iX2ltcGxpY2l0X2ZsdXNofG9iX2luZmxhdGVoYW5kbGVyfG9iX2xpc3RfaGFuZGxlcnN8b2Jfc3RhcnR8b2JfdGlkeWhhbmRsZXJ8b2NpX2JpbmRfYXJyYXlfYnlfbmFtZXxvY2lfYmluZF9ieV9uYW1lfG9jaV9jYW5jZWx8b2NpX2NsaWVudF92ZXJzaW9ufG9jaV9jbG9zZXxvY2lfY29sbGVjdGlvbl9hcHBlbmR8b2NpX2NvbGxlY3Rpb25fYXNzaWdufG9jaV9jb2xsZWN0aW9uX2VsZW1lbnRfYXNzaWdufG9jaV9jb2xsZWN0aW9uX2VsZW1lbnRfZ2V0fG9jaV9jb2xsZWN0aW9uX2ZyZWV8b2NpX2NvbGxlY3Rpb25fbWF4fG9jaV9jb2xsZWN0aW9uX3NpemV8b2NpX2NvbGxlY3Rpb25fdHJpbXxvY2lfY29tbWl0fG9jaV9jb25uZWN0fG9jaV9kZWZpbmVfYnlfbmFtZXxvY2lfZXJyb3J8b2NpX2V4ZWN1dGV8b2NpX2ZldGNofG9jaV9mZXRjaF9hbGx8b2NpX2ZldGNoX2FycmF5fG9jaV9mZXRjaF9hc3NvY3xvY2lfZmV0Y2hfb2JqZWN0fG9jaV9mZXRjaF9yb3d8b2NpX2ZpZWxkX2lzX251bGx8b2NpX2ZpZWxkX25hbWV8b2NpX2ZpZWxkX3ByZWNpc2lvbnxvY2lfZmllbGRfc2NhbGV8b2NpX2ZpZWxkX3NpemV8b2NpX2ZpZWxkX3R5cGV8b2NpX2ZpZWxkX3R5cGVfcmF3fG9jaV9mcmVlX3N0YXRlbWVudHxvY2lfaW50ZXJuYWxfZGVidWd8b2NpX2xvYl9hcHBlbmR8b2NpX2xvYl9jbG9zZXxvY2lfbG9iX2NvcHl8b2NpX2xvYl9lb2Z8b2NpX2xvYl9lcmFzZXxvY2lfbG9iX2V4cG9ydHxvY2lfbG9iX2ZsdXNofG9jaV9sb2JfZnJlZXxvY2lfbG9iX2dldGJ1ZmZlcmluZ3xvY2lfbG9iX2ltcG9ydHxvY2lfbG9iX2lzX2VxdWFsfG9jaV9sb2JfbG9hZHxvY2lfbG9iX3JlYWR8b2NpX2xvYl9yZXdpbmR8b2NpX2xvYl9zYXZlfG9jaV9sb2Jfc2F2ZWZpbGV8b2NpX2xvYl9zZWVrfG9jaV9sb2Jfc2V0YnVmZmVyaW5nfG9jaV9sb2Jfc2l6ZXxvY2lfbG9iX3RlbGx8b2NpX2xvYl90cnVuY2F0ZXxvY2lfbG9iX3dyaXRlfG9jaV9sb2Jfd3JpdGV0ZW1wb3Jhcnl8b2NpX2xvYl93cml0ZXRvZmlsZXxvY2lfbmV3X2NvbGxlY3Rpb258b2NpX25ld19jb25uZWN0fG9jaV9uZXdfY3Vyc29yfG9jaV9uZXdfZGVzY3JpcHRvcnxvY2lfbnVtX2ZpZWxkc3xvY2lfbnVtX3Jvd3N8b2NpX3BhcnNlfG9jaV9wYXNzd29yZF9jaGFuZ2V8b2NpX3Bjb25uZWN0fG9jaV9yZXN1bHR8b2NpX3JvbGxiYWNrfG9jaV9zZXJ2ZXJfdmVyc2lvbnxvY2lfc2V0X2FjdGlvbnxvY2lfc2V0X2NsaWVudF9pZGVudGlmaWVyfG9jaV9zZXRfY2xpZW50X2luZm98b2NpX3NldF9lZGl0aW9ufG9jaV9zZXRfbW9kdWxlX25hbWV8b2NpX3NldF9wcmVmZXRjaHxvY2lfc3RhdGVtZW50X3R5cGV8b2NpYmluZGJ5bmFtZXxvY2ljYW5jZWx8b2NpY2xvc2Vsb2J8b2NpY29sbGFwcGVuZHxvY2ljb2xsYXNzaWdufG9jaWNvbGxhc3NpZ25lbGVtfG9jaWNvbGxnZXRlbGVtfG9jaWNvbGxtYXh8b2NpY29sbHNpemV8b2NpY29sbHRyaW18b2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfG9jaWNvbHVtbnNpemV8b2NpY29sdW1udHlwZXxvY2ljb2x1bW50eXBlcmF3fG9jaWNvbW1pdHxvY2lkZWZpbmVieW5hbWV8b2NpZXJyb3J8b2NpZXhlY3V0ZXxvY2lmZXRjaHxvY2lmZXRjaGludG98b2NpZmV0Y2hzdGF0ZW1lbnR8b2NpZnJlZWNvbGxlY3Rpb258b2NpZnJlZWN1cnNvcnxvY2lmcmVlZGVzY3xvY2lmcmVlc3RhdGVtZW50fG9jaWludGVybmFsZGVidWd8b2NpbG9hZGxvYnxvY2lsb2dvZmZ8b2NpbG9nb258b2NpbmV3Y29sbGVjdGlvbnxvY2luZXdjdXJzb3J8b2NpbmV3ZGVzY3JpcHRvcnxvY2lubG9nb258b2NpbnVtY29sc3xvY2lwYXJzZXxvY2lwbG9nb258b2NpcmVzdWx0fG9jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8b2Npc2VydmVydmVyc2lvbnxvY2lzZXRwcmVmZXRjaHxvY2lzdGF0ZW1lbnR0eXBlfG9jaXdyaXRlbG9idG9maWxlfG9jaXdyaXRldGVtcG9yYXJ5bG9ifG9jdGRlY3xvZGJjX2F1dG9jb21taXR8b2RiY19iaW5tb2RlfG9kYmNfY2xvc2V8b2RiY19jbG9zZV9hbGx8b2RiY19jb2x1bW5wcml2aWxlZ2VzfG9kYmNfY29sdW1uc3xvZGJjX2NvbW1pdHxvZGJjX2Nvbm5lY3R8b2RiY19jdXJzb3J8b2RiY19kYXRhX3NvdXJjZXxvZGJjX2RvfG9kYmNfZXJyb3J8b2RiY19lcnJvcm1zZ3xvZGJjX2V4ZWN8b2RiY19leGVjdXRlfG9kYmNfZmV0Y2hfYXJyYXl8b2RiY19mZXRjaF9pbnRvfG9kYmNfZmV0Y2hfb2JqZWN0fG9kYmNfZmV0Y2hfcm93fG9kYmNfZmllbGRfbGVufG9kYmNfZmllbGRfbmFtZXxvZGJjX2ZpZWxkX251bXxvZGJjX2ZpZWxkX3ByZWNpc2lvbnxvZGJjX2ZpZWxkX3NjYWxlfG9kYmNfZmllbGRfdHlwZXxvZGJjX2ZvcmVpZ25rZXlzfG9kYmNfZnJlZV9yZXN1bHR8b2RiY19nZXR0eXBlaW5mb3xvZGJjX2xvbmdyZWFkbGVufG9kYmNfbmV4dF9yZXN1bHR8b2RiY19udW1fZmllbGRzfG9kYmNfbnVtX3Jvd3N8b2RiY19wY29ubmVjdHxvZGJjX3ByZXBhcmV8b2RiY19wcmltYXJ5a2V5c3xvZGJjX3Byb2NlZHVyZWNvbHVtbnN8b2RiY19wcm9jZWR1cmVzfG9kYmNfcmVzdWx0fG9kYmNfcmVzdWx0X2FsbHxvZGJjX3JvbGxiYWNrfG9kYmNfc2V0b3B0aW9ufG9kYmNfc3BlY2lhbGNvbHVtbnN8b2RiY19zdGF0aXN0aWNzfG9kYmNfdGFibGVwcml2aWxlZ2VzfG9kYmNfdGFibGVzfG9wZW5hbF9idWZmZXJfY3JlYXRlfG9wZW5hbF9idWZmZXJfZGF0YXxvcGVuYWxfYnVmZmVyX2Rlc3Ryb3l8b3BlbmFsX2J1ZmZlcl9nZXR8b3BlbmFsX2J1ZmZlcl9sb2Fkd2F2fG9wZW5hbF9jb250ZXh0X2NyZWF0ZXxvcGVuYWxfY29udGV4dF9jdXJyZW50fG9wZW5hbF9jb250ZXh0X2Rlc3Ryb3l8b3BlbmFsX2NvbnRleHRfcHJvY2Vzc3xvcGVuYWxfY29udGV4dF9zdXNwZW5kfG9wZW5hbF9kZXZpY2VfY2xvc2V8b3BlbmFsX2RldmljZV9vcGVufG9wZW5hbF9saXN0ZW5lcl9nZXR8b3BlbmFsX2xpc3RlbmVyX3NldHxvcGVuYWxfc291cmNlX2NyZWF0ZXxvcGVuYWxfc291cmNlX2Rlc3Ryb3l8b3BlbmFsX3NvdXJjZV9nZXR8b3BlbmFsX3NvdXJjZV9wYXVzZXxvcGVuYWxfc291cmNlX3BsYXl8b3BlbmFsX3NvdXJjZV9yZXdpbmR8b3BlbmFsX3NvdXJjZV9zZXR8b3BlbmFsX3NvdXJjZV9zdG9wfG9wZW5hbF9zdHJlYW18b3BlbmRpcnxvcGVubG9nfG9wZW5zc2xfY2lwaGVyX2l2X2xlbmd0aHxvcGVuc3NsX2Nzcl9leHBvcnR8b3BlbnNzbF9jc3JfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9jc3JfZ2V0X3B1YmxpY19rZXl8b3BlbnNzbF9jc3JfZ2V0X3N1YmplY3R8b3BlbnNzbF9jc3JfbmV3fG9wZW5zc2xfY3NyX3NpZ258b3BlbnNzbF9kZWNyeXB0fG9wZW5zc2xfZGhfY29tcHV0ZV9rZXl8b3BlbnNzbF9kaWdlc3R8b3BlbnNzbF9lbmNyeXB0fG9wZW5zc2xfZXJyb3Jfc3RyaW5nfG9wZW5zc2xfZnJlZV9rZXl8b3BlbnNzbF9nZXRfY2lwaGVyX21ldGhvZHN8b3BlbnNzbF9nZXRfbWRfbWV0aG9kc3xvcGVuc3NsX2dldF9wcml2YXRla2V5fG9wZW5zc2xfZ2V0X3B1YmxpY2tleXxvcGVuc3NsX29wZW58b3BlbnNzbF9wa2NzMTJfZXhwb3J0fG9wZW5zc2xfcGtjczEyX2V4cG9ydF90b19maWxlfG9wZW5zc2xfcGtjczEyX3JlYWR8b3BlbnNzbF9wa2NzN19kZWNyeXB0fG9wZW5zc2xfcGtjczdfZW5jcnlwdHxvcGVuc3NsX3BrY3M3X3NpZ258b3BlbnNzbF9wa2NzN192ZXJpZnl8b3BlbnNzbF9wa2V5X2V4cG9ydHxvcGVuc3NsX3BrZXlfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9wa2V5X2ZyZWV8b3BlbnNzbF9wa2V5X2dldF9kZXRhaWxzfG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZXxvcGVuc3NsX3BrZXlfZ2V0X3B1YmxpY3xvcGVuc3NsX3BrZXlfbmV3fG9wZW5zc2xfcHJpdmF0ZV9kZWNyeXB0fG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0fG9wZW5zc2xfcHVibGljX2RlY3J5cHR8b3BlbnNzbF9wdWJsaWNfZW5jcnlwdHxvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXN8b3BlbnNzbF9zZWFsfG9wZW5zc2xfc2lnbnxvcGVuc3NsX3ZlcmlmeXxvcGVuc3NsX3g1MDlfY2hlY2tfcHJpdmF0ZV9rZXl8b3BlbnNzbF94NTA5X2NoZWNrcHVycG9zZXxvcGVuc3NsX3g1MDlfZXhwb3J0fG9wZW5zc2xfeDUwOV9leHBvcnRfdG9fZmlsZXxvcGVuc3NsX3g1MDlfZnJlZXxvcGVuc3NsX3g1MDlfcGFyc2V8b3BlbnNzbF94NTA5X3JlYWR8b3JkfG91dGVyaXRlcmF0b3J8b3V0b2Zib3VuZHNleGNlcHRpb258b3V0b2ZyYW5nZWV4Y2VwdGlvbnxvdXRwdXRfYWRkX3Jld3JpdGVfdmFyfG91dHB1dF9yZXNldF9yZXdyaXRlX3ZhcnN8b3ZlcmZsb3dleGNlcHRpb258b3ZlcmxvYWR8b3ZlcnJpZGVfZnVuY3Rpb258b3ZyaW1vc19jbG9zZXxvdnJpbW9zX2NvbW1pdHxvdnJpbW9zX2Nvbm5lY3R8b3ZyaW1vc19jdXJzb3J8b3ZyaW1vc19leGVjfG92cmltb3NfZXhlY3V0ZXxvdnJpbW9zX2ZldGNoX2ludG98b3ZyaW1vc19mZXRjaF9yb3d8b3ZyaW1vc19maWVsZF9sZW58b3ZyaW1vc19maWVsZF9uYW1lfG92cmltb3NfZmllbGRfbnVtfG92cmltb3NfZmllbGRfdHlwZXxvdnJpbW9zX2ZyZWVfcmVzdWx0fG92cmltb3NfbG9uZ3JlYWRsZW58b3ZyaW1vc19udW1fZmllbGRzfG92cmltb3NfbnVtX3Jvd3N8b3ZyaW1vc19wcmVwYXJlfG92cmltb3NfcmVzdWx0fG92cmltb3NfcmVzdWx0X2FsbHxvdnJpbW9zX3JvbGxiYWNrfHBhY2t8cGFyZW50aXRlcmF0b3J8cGFyc2VfaW5pX2ZpbGV8cGFyc2VfaW5pX3N0cmluZ3xwYXJzZV9zdHJ8cGFyc2VfdXJsfHBhcnNla2l0X2NvbXBpbGVfZmlsZXxwYXJzZWtpdF9jb21waWxlX3N0cmluZ3xwYXJzZWtpdF9mdW5jX2FyZ2luZm98cGFzc3RocnV8cGF0aGluZm98cGNsb3NlfHBjbnRsX2FsYXJtfHBjbnRsX2V4ZWN8cGNudGxfZm9ya3xwY250bF9nZXRwcmlvcml0eXxwY250bF9zZXRwcmlvcml0eXxwY250bF9zaWduYWx8cGNudGxfc2lnbmFsX2Rpc3BhdGNofHBjbnRsX3NpZ3Byb2NtYXNrfHBjbnRsX3NpZ3RpbWVkd2FpdHxwY250bF9zaWd3YWl0aW5mb3xwY250bF93YWl0fHBjbnRsX3dhaXRwaWR8cGNudGxfd2V4aXRzdGF0dXN8cGNudGxfd2lmZXhpdGVkfHBjbnRsX3dpZnNpZ25hbGVkfHBjbnRsX3dpZnN0b3BwZWR8cGNudGxfd3N0b3BzaWd8cGNudGxfd3Rlcm1zaWd8cGRmX2FjdGl2YXRlX2l0ZW18cGRmX2FkZF9hbm5vdGF0aW9ufHBkZl9hZGRfYm9va21hcmt8cGRmX2FkZF9sYXVuY2hsaW5rfHBkZl9hZGRfbG9jYWxsaW5rfHBkZl9hZGRfbmFtZWRkZXN0fHBkZl9hZGRfbm90ZXxwZGZfYWRkX291dGxpbmV8cGRmX2FkZF9wZGZsaW5rfHBkZl9hZGRfdGFibGVfY2VsbHxwZGZfYWRkX3RleHRmbG93fHBkZl9hZGRfdGh1bWJuYWlsfHBkZl9hZGRfd2VibGlua3xwZGZfYXJjfHBkZl9hcmNufHBkZl9hdHRhY2hfZmlsZXxwZGZfYmVnaW5fZG9jdW1lbnR8cGRmX2JlZ2luX2ZvbnR8cGRmX2JlZ2luX2dseXBofHBkZl9iZWdpbl9pdGVtfHBkZl9iZWdpbl9sYXllcnxwZGZfYmVnaW5fcGFnZXxwZGZfYmVnaW5fcGFnZV9leHR8cGRmX2JlZ2luX3BhdHRlcm58cGRmX2JlZ2luX3RlbXBsYXRlfHBkZl9iZWdpbl90ZW1wbGF0ZV9leHR8cGRmX2NpcmNsZXxwZGZfY2xpcHxwZGZfY2xvc2V8cGRmX2Nsb3NlX2ltYWdlfHBkZl9jbG9zZV9wZGl8cGRmX2Nsb3NlX3BkaV9wYWdlfHBkZl9jbG9zZXBhdGh8cGRmX2Nsb3NlcGF0aF9maWxsX3N0cm9rZXxwZGZfY2xvc2VwYXRoX3N0cm9rZXxwZGZfY29uY2F0fHBkZl9jb250aW51ZV90ZXh0fHBkZl9jcmVhdGVfM2R2aWV3fHBkZl9jcmVhdGVfYWN0aW9ufHBkZl9jcmVhdGVfYW5ub3RhdGlvbnxwZGZfY3JlYXRlX2Jvb2ttYXJrfHBkZl9jcmVhdGVfZmllbGR8cGRmX2NyZWF0ZV9maWVsZGdyb3VwfHBkZl9jcmVhdGVfZ3N0YXRlfHBkZl9jcmVhdGVfcHZmfHBkZl9jcmVhdGVfdGV4dGZsb3d8cGRmX2N1cnZldG98cGRmX2RlZmluZV9sYXllcnxwZGZfZGVsZXRlfHBkZl9kZWxldGVfcHZmfHBkZl9kZWxldGVfdGFibGV8cGRmX2RlbGV0ZV90ZXh0Zmxvd3xwZGZfZW5jb2Rpbmdfc2V0X2NoYXJ8cGRmX2VuZF9kb2N1bWVudHxwZGZfZW5kX2ZvbnR8cGRmX2VuZF9nbHlwaHxwZGZfZW5kX2l0ZW18cGRmX2VuZF9sYXllcnxwZGZfZW5kX3BhZ2V8cGRmX2VuZF9wYWdlX2V4dHxwZGZfZW5kX3BhdHRlcm58cGRmX2VuZF90ZW1wbGF0ZXxwZGZfZW5kcGF0aHxwZGZfZmlsbHxwZGZfZmlsbF9pbWFnZWJsb2NrfHBkZl9maWxsX3BkZmJsb2NrfHBkZl9maWxsX3N0cm9rZXxwZGZfZmlsbF90ZXh0YmxvY2t8cGRmX2ZpbmRmb250fHBkZl9maXRfaW1hZ2V8cGRmX2ZpdF9wZGlfcGFnZXxwZGZfZml0X3RhYmxlfHBkZl9maXRfdGV4dGZsb3d8cGRmX2ZpdF90ZXh0bGluZXxwZGZfZ2V0X2FwaW5hbWV8cGRmX2dldF9idWZmZXJ8cGRmX2dldF9lcnJtc2d8cGRmX2dldF9lcnJudW18cGRmX2dldF9mb250fHBkZl9nZXRfZm9udG5hbWV8cGRmX2dldF9mb250c2l6ZXxwZGZfZ2V0X2ltYWdlX2hlaWdodHxwZGZfZ2V0X2ltYWdlX3dpZHRofHBkZl9nZXRfbWFqb3J2ZXJzaW9ufHBkZl9nZXRfbWlub3J2ZXJzaW9ufHBkZl9nZXRfcGFyYW1ldGVyfHBkZl9nZXRfcGRpX3BhcmFtZXRlcnxwZGZfZ2V0X3BkaV92YWx1ZXxwZGZfZ2V0X3ZhbHVlfHBkZl9pbmZvX2ZvbnR8cGRmX2luZm9fbWF0Y2hib3h8cGRmX2luZm9fdGFibGV8cGRmX2luZm9fdGV4dGZsb3d8cGRmX2luZm9fdGV4dGxpbmV8cGRmX2luaXRncmFwaGljc3xwZGZfbGluZXRvfHBkZl9sb2FkXzNkZGF0YXxwZGZfbG9hZF9mb250fHBkZl9sb2FkX2ljY3Byb2ZpbGV8cGRmX2xvYWRfaW1hZ2V8cGRmX21ha2VzcG90Y29sb3J8cGRmX21vdmV0b3xwZGZfbmV3fHBkZl9vcGVuX2NjaXR0fHBkZl9vcGVuX2ZpbGV8cGRmX29wZW5fZ2lmfHBkZl9vcGVuX2ltYWdlfHBkZl9vcGVuX2ltYWdlX2ZpbGV8cGRmX29wZW5fanBlZ3xwZGZfb3Blbl9tZW1vcnlfaW1hZ2V8cGRmX29wZW5fcGRpfHBkZl9vcGVuX3BkaV9kb2N1bWVudHxwZGZfb3Blbl9wZGlfcGFnZXxwZGZfb3Blbl90aWZmfHBkZl9wY29zX2dldF9udW1iZXJ8cGRmX3Bjb3NfZ2V0X3N0cmVhbXxwZGZfcGNvc19nZXRfc3RyaW5nfHBkZl9wbGFjZV9pbWFnZXxwZGZfcGxhY2VfcGRpX3BhZ2V8cGRmX3Byb2Nlc3NfcGRpfHBkZl9yZWN0fHBkZl9yZXN0b3JlfHBkZl9yZXN1bWVfcGFnZXxwZGZfcm90YXRlfHBkZl9zYXZlfHBkZl9zY2FsZXxwZGZfc2V0X2JvcmRlcl9jb2xvcnxwZGZfc2V0X2JvcmRlcl9kYXNofHBkZl9zZXRfYm9yZGVyX3N0eWxlfHBkZl9zZXRfY2hhcl9zcGFjaW5nfHBkZl9zZXRfZHVyYXRpb258cGRmX3NldF9nc3RhdGV8cGRmX3NldF9ob3Jpel9zY2FsaW5nfHBkZl9zZXRfaW5mb3xwZGZfc2V0X2luZm9fYXV0aG9yfHBkZl9zZXRfaW5mb19jcmVhdG9yfHBkZl9zZXRfaW5mb19rZXl3b3Jkc3xwZGZfc2V0X2luZm9fc3ViamVjdHxwZGZfc2V0X2luZm9fdGl0bGV8cGRmX3NldF9sYXllcl9kZXBlbmRlbmN5fHBkZl9zZXRfbGVhZGluZ3xwZGZfc2V0X3BhcmFtZXRlcnxwZGZfc2V0X3RleHRfbWF0cml4fHBkZl9zZXRfdGV4dF9wb3N8cGRmX3NldF90ZXh0X3JlbmRlcmluZ3xwZGZfc2V0X3RleHRfcmlzZXxwZGZfc2V0X3ZhbHVlfHBkZl9zZXRfd29yZF9zcGFjaW5nfHBkZl9zZXRjb2xvcnxwZGZfc2V0ZGFzaHxwZGZfc2V0ZGFzaHBhdHRlcm58cGRmX3NldGZsYXR8cGRmX3NldGZvbnR8cGRmX3NldGdyYXl8cGRmX3NldGdyYXlfZmlsbHxwZGZfc2V0Z3JheV9zdHJva2V8cGRmX3NldGxpbmVjYXB8cGRmX3NldGxpbmVqb2lufHBkZl9zZXRsaW5ld2lkdGh8cGRmX3NldG1hdHJpeHxwZGZfc2V0bWl0ZXJsaW1pdHxwZGZfc2V0cG9seWRhc2h8cGRmX3NldHJnYmNvbG9yfHBkZl9zZXRyZ2Jjb2xvcl9maWxsfHBkZl9zZXRyZ2Jjb2xvcl9zdHJva2V8cGRmX3NoYWRpbmd8cGRmX3NoYWRpbmdfcGF0dGVybnxwZGZfc2hmaWxsfHBkZl9zaG93fHBkZl9zaG93X2JveGVkfHBkZl9zaG93X3h5fHBkZl9za2V3fHBkZl9zdHJpbmd3aWR0aHxwZGZfc3Ryb2tlfHBkZl9zdXNwZW5kX3BhZ2V8cGRmX3RyYW5zbGF0ZXxwZGZfdXRmMTZfdG9fdXRmOHxwZGZfdXRmMzJfdG9fdXRmMTZ8cGRmX3V0ZjhfdG9fdXRmMTZ8cGRvfHBkb19jdWJyaWRfc2NoZW1hfHBkb19wZ3NxbGxvYmNyZWF0ZXxwZG9fcGdzcWxsb2JvcGVufHBkb19wZ3NxbGxvYnVubGlua3xwZG9fc3FsaXRlY3JlYXRlYWdncmVnYXRlfHBkb19zcWxpdGVjcmVhdGVmdW5jdGlvbnxwZG9leGNlcHRpb258cGRvc3RhdGVtZW50fHBmc29ja29wZW58cGdfYWZmZWN0ZWRfcm93c3xwZ19jYW5jZWxfcXVlcnl8cGdfY2xpZW50X2VuY29kaW5nfHBnX2Nsb3NlfHBnX2Nvbm5lY3R8cGdfY29ubmVjdGlvbl9idXN5fHBnX2Nvbm5lY3Rpb25fcmVzZXR8cGdfY29ubmVjdGlvbl9zdGF0dXN8cGdfY29udmVydHxwZ19jb3B5X2Zyb218cGdfY29weV90b3xwZ19kYm5hbWV8cGdfZGVsZXRlfHBnX2VuZF9jb3B5fHBnX2VzY2FwZV9ieXRlYXxwZ19lc2NhcGVfc3RyaW5nfHBnX2V4ZWN1dGV8cGdfZmV0Y2hfYWxsfHBnX2ZldGNoX2FsbF9jb2x1bW5zfHBnX2ZldGNoX2FycmF5fHBnX2ZldGNoX2Fzc29jfHBnX2ZldGNoX29iamVjdHxwZ19mZXRjaF9yZXN1bHR8cGdfZmV0Y2hfcm93fHBnX2ZpZWxkX2lzX251bGx8cGdfZmllbGRfbmFtZXxwZ19maWVsZF9udW18cGdfZmllbGRfcHJ0bGVufHBnX2ZpZWxkX3NpemV8cGdfZmllbGRfdGFibGV8cGdfZmllbGRfdHlwZXxwZ19maWVsZF90eXBlX29pZHxwZ19mcmVlX3Jlc3VsdHxwZ19nZXRfbm90aWZ5fHBnX2dldF9waWR8cGdfZ2V0X3Jlc3VsdHxwZ19ob3N0fHBnX2luc2VydHxwZ19sYXN0X2Vycm9yfHBnX2xhc3Rfbm90aWNlfHBnX2xhc3Rfb2lkfHBnX2xvX2Nsb3NlfHBnX2xvX2NyZWF0ZXxwZ19sb19leHBvcnR8cGdfbG9faW1wb3J0fHBnX2xvX29wZW58cGdfbG9fcmVhZHxwZ19sb19yZWFkX2FsbHxwZ19sb19zZWVrfHBnX2xvX3RlbGx8cGdfbG9fdW5saW5rfHBnX2xvX3dyaXRlfHBnX21ldGFfZGF0YXxwZ19udW1fZmllbGRzfHBnX251bV9yb3dzfHBnX29wdGlvbnN8cGdfcGFyYW1ldGVyX3N0YXR1c3xwZ19wY29ubmVjdHxwZ19waW5nfHBnX3BvcnR8cGdfcHJlcGFyZXxwZ19wdXRfbGluZXxwZ19xdWVyeXxwZ19xdWVyeV9wYXJhbXN8cGdfcmVzdWx0X2Vycm9yfHBnX3Jlc3VsdF9lcnJvcl9maWVsZHxwZ19yZXN1bHRfc2Vla3xwZ19yZXN1bHRfc3RhdHVzfHBnX3NlbGVjdHxwZ19zZW5kX2V4ZWN1dGV8cGdfc2VuZF9wcmVwYXJlfHBnX3NlbmRfcXVlcnl8cGdfc2VuZF9xdWVyeV9wYXJhbXN8cGdfc2V0X2NsaWVudF9lbmNvZGluZ3xwZ19zZXRfZXJyb3JfdmVyYm9zaXR5fHBnX3RyYWNlfHBnX3RyYW5zYWN0aW9uX3N0YXR1c3xwZ190dHl8cGdfdW5lc2NhcGVfYnl0ZWF8cGdfdW50cmFjZXxwZ191cGRhdGV8cGdfdmVyc2lvbnxwaHBfY2hlY2tfc3ludGF4fHBocF9pbmlfbG9hZGVkX2ZpbGV8cGhwX2luaV9zY2FubmVkX2ZpbGVzfHBocF9sb2dvX2d1aWR8cGhwX3NhcGlfbmFtZXxwaHBfc3RyaXBfd2hpdGVzcGFjZXxwaHBfdW5hbWV8cGhwY3JlZGl0c3xwaHBpbmZvfHBocHZlcnNpb258cGl8cG5nMndibXB8cG9wZW58cG9zfHBvc2l4X2FjY2Vzc3xwb3NpeF9jdGVybWlkfHBvc2l4X2Vycm5vfHBvc2l4X2dldF9sYXN0X2Vycm9yfHBvc2l4X2dldGN3ZHxwb3NpeF9nZXRlZ2lkfHBvc2l4X2dldGV1aWR8cG9zaXhfZ2V0Z2lkfHBvc2l4X2dldGdyZ2lkfHBvc2l4X2dldGdybmFtfHBvc2l4X2dldGdyb3Vwc3xwb3NpeF9nZXRsb2dpbnxwb3NpeF9nZXRwZ2lkfHBvc2l4X2dldHBncnB8cG9zaXhfZ2V0cGlkfHBvc2l4X2dldHBwaWR8cG9zaXhfZ2V0cHduYW18cG9zaXhfZ2V0cHd1aWR8cG9zaXhfZ2V0cmxpbWl0fHBvc2l4X2dldHNpZHxwb3NpeF9nZXR1aWR8cG9zaXhfaW5pdGdyb3Vwc3xwb3NpeF9pc2F0dHl8cG9zaXhfa2lsbHxwb3NpeF9ta2ZpZm98cG9zaXhfbWtub2R8cG9zaXhfc2V0ZWdpZHxwb3NpeF9zZXRldWlkfHBvc2l4X3NldGdpZHxwb3NpeF9zZXRwZ2lkfHBvc2l4X3NldHNpZHxwb3NpeF9zZXR1aWR8cG9zaXhfc3RyZXJyb3J8cG9zaXhfdGltZXN8cG9zaXhfdHR5bmFtZXxwb3NpeF91bmFtZXxwb3d8cHJlZ19maWx0ZXJ8cHJlZ19ncmVwfHByZWdfbGFzdF9lcnJvcnxwcmVnX21hdGNofHByZWdfbWF0Y2hfYWxsfHByZWdfcXVvdGV8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xwcmVnX3NwbGl0fHByZXZ8cHJpbnR8cHJpbnRfcnxwcmludGVyX2Fib3J0fHByaW50ZXJfY2xvc2V8cHJpbnRlcl9jcmVhdGVfYnJ1c2h8cHJpbnRlcl9jcmVhdGVfZGN8cHJpbnRlcl9jcmVhdGVfZm9udHxwcmludGVyX2NyZWF0ZV9wZW58cHJpbnRlcl9kZWxldGVfYnJ1c2h8cHJpbnRlcl9kZWxldGVfZGN8cHJpbnRlcl9kZWxldGVfZm9udHxwcmludGVyX2RlbGV0ZV9wZW58cHJpbnRlcl9kcmF3X2JtcHxwcmludGVyX2RyYXdfY2hvcmR8cHJpbnRlcl9kcmF3X2VsaXBzZXxwcmludGVyX2RyYXdfbGluZXxwcmludGVyX2RyYXdfcGllfHByaW50ZXJfZHJhd19yZWN0YW5nbGV8cHJpbnRlcl9kcmF3X3JvdW5kcmVjdHxwcmludGVyX2RyYXdfdGV4dHxwcmludGVyX2VuZF9kb2N8cHJpbnRlcl9lbmRfcGFnZXxwcmludGVyX2dldF9vcHRpb258cHJpbnRlcl9saXN0fHByaW50ZXJfbG9naWNhbF9mb250aGVpZ2h0fHByaW50ZXJfb3BlbnxwcmludGVyX3NlbGVjdF9icnVzaHxwcmludGVyX3NlbGVjdF9mb250fHByaW50ZXJfc2VsZWN0X3BlbnxwcmludGVyX3NldF9vcHRpb258cHJpbnRlcl9zdGFydF9kb2N8cHJpbnRlcl9zdGFydF9wYWdlfHByaW50ZXJfd3JpdGV8cHJpbnRmfHByb2NfY2xvc2V8cHJvY19nZXRfc3RhdHVzfHByb2NfbmljZXxwcm9jX29wZW58cHJvY190ZXJtaW5hdGV8cHJvcGVydHlfZXhpc3RzfHBzX2FkZF9ib29rbWFya3xwc19hZGRfbGF1bmNobGlua3xwc19hZGRfbG9jYWxsaW5rfHBzX2FkZF9ub3RlfHBzX2FkZF9wZGZsaW5rfHBzX2FkZF93ZWJsaW5rfHBzX2FyY3xwc19hcmNufHBzX2JlZ2luX3BhZ2V8cHNfYmVnaW5fcGF0dGVybnxwc19iZWdpbl90ZW1wbGF0ZXxwc19jaXJjbGV8cHNfY2xpcHxwc19jbG9zZXxwc19jbG9zZV9pbWFnZXxwc19jbG9zZXBhdGh8cHNfY2xvc2VwYXRoX3N0cm9rZXxwc19jb250aW51ZV90ZXh0fHBzX2N1cnZldG98cHNfZGVsZXRlfHBzX2VuZF9wYWdlfHBzX2VuZF9wYXR0ZXJufHBzX2VuZF90ZW1wbGF0ZXxwc19maWxsfHBzX2ZpbGxfc3Ryb2tlfHBzX2ZpbmRmb250fHBzX2dldF9idWZmZXJ8cHNfZ2V0X3BhcmFtZXRlcnxwc19nZXRfdmFsdWV8cHNfaHlwaGVuYXRlfHBzX2luY2x1ZGVfZmlsZXxwc19saW5ldG98cHNfbWFrZXNwb3Rjb2xvcnxwc19tb3ZldG98cHNfbmV3fHBzX29wZW5fZmlsZXxwc19vcGVuX2ltYWdlfHBzX29wZW5faW1hZ2VfZmlsZXxwc19vcGVuX21lbW9yeV9pbWFnZXxwc19wbGFjZV9pbWFnZXxwc19yZWN0fHBzX3Jlc3RvcmV8cHNfcm90YXRlfHBzX3NhdmV8cHNfc2NhbGV8cHNfc2V0X2JvcmRlcl9jb2xvcnxwc19zZXRfYm9yZGVyX2Rhc2h8cHNfc2V0X2JvcmRlcl9zdHlsZXxwc19zZXRfaW5mb3xwc19zZXRfcGFyYW1ldGVyfHBzX3NldF90ZXh0X3Bvc3xwc19zZXRfdmFsdWV8cHNfc2V0Y29sb3J8cHNfc2V0ZGFzaHxwc19zZXRmbGF0fHBzX3NldGZvbnR8cHNfc2V0Z3JheXxwc19zZXRsaW5lY2FwfHBzX3NldGxpbmVqb2lufHBzX3NldGxpbmV3aWR0aHxwc19zZXRtaXRlcmxpbWl0fHBzX3NldG92ZXJwcmludG1vZGV8cHNfc2V0cG9seWRhc2h8cHNfc2hhZGluZ3xwc19zaGFkaW5nX3BhdHRlcm58cHNfc2hmaWxsfHBzX3Nob3d8cHNfc2hvdzJ8cHNfc2hvd19ib3hlZHxwc19zaG93X3h5fHBzX3Nob3dfeHkyfHBzX3N0cmluZ19nZW9tZXRyeXxwc19zdHJpbmd3aWR0aHxwc19zdHJva2V8cHNfc3ltYm9sfHBzX3N5bWJvbF9uYW1lfHBzX3N5bWJvbF93aWR0aHxwc190cmFuc2xhdGV8cHNwZWxsX2FkZF90b19wZXJzb25hbHxwc3BlbGxfYWRkX3RvX3Nlc3Npb258cHNwZWxsX2NoZWNrfHBzcGVsbF9jbGVhcl9zZXNzaW9ufHBzcGVsbF9jb25maWdfY3JlYXRlfHBzcGVsbF9jb25maWdfZGF0YV9kaXJ8cHNwZWxsX2NvbmZpZ19kaWN0X2Rpcnxwc3BlbGxfY29uZmlnX2lnbm9yZXxwc3BlbGxfY29uZmlnX21vZGV8cHNwZWxsX2NvbmZpZ19wZXJzb25hbHxwc3BlbGxfY29uZmlnX3JlcGx8cHNwZWxsX2NvbmZpZ19ydW50b2dldGhlcnxwc3BlbGxfY29uZmlnX3NhdmVfcmVwbHxwc3BlbGxfbmV3fHBzcGVsbF9uZXdfY29uZmlnfHBzcGVsbF9uZXdfcGVyc29uYWx8cHNwZWxsX3NhdmVfd29yZGxpc3R8cHNwZWxsX3N0b3JlX3JlcGxhY2VtZW50fHBzcGVsbF9zdWdnZXN0fHB1dGVudnxweF9jbG9zZXxweF9jcmVhdGVfZnB8cHhfZGF0ZTJzdHJpbmd8cHhfZGVsZXRlfHB4X2RlbGV0ZV9yZWNvcmR8cHhfZ2V0X2ZpZWxkfHB4X2dldF9pbmZvfHB4X2dldF9wYXJhbWV0ZXJ8cHhfZ2V0X3JlY29yZHxweF9nZXRfc2NoZW1hfHB4X2dldF92YWx1ZXxweF9pbnNlcnRfcmVjb3JkfHB4X25ld3xweF9udW1maWVsZHN8cHhfbnVtcmVjb3Jkc3xweF9vcGVuX2ZwfHB4X3B1dF9yZWNvcmR8cHhfcmV0cmlldmVfcmVjb3JkfHB4X3NldF9ibG9iX2ZpbGV8cHhfc2V0X3BhcmFtZXRlcnxweF9zZXRfdGFibGVuYW1lfHB4X3NldF90YXJnZXRlbmNvZGluZ3xweF9zZXRfdmFsdWV8cHhfdGltZXN0YW1wMnN0cmluZ3xweF91cGRhdGVfcmVjb3JkfHFkb21fZXJyb3J8cWRvbV90cmVlfHF1b3RlZF9wcmludGFibGVfZGVjb2RlfHF1b3RlZF9wcmludGFibGVfZW5jb2RlfHF1b3RlbWV0YXxyYWQyZGVnfHJhZGl1c19hY2N0X29wZW58cmFkaXVzX2FkZF9zZXJ2ZXJ8cmFkaXVzX2F1dGhfb3BlbnxyYWRpdXNfY2xvc2V8cmFkaXVzX2NvbmZpZ3xyYWRpdXNfY3JlYXRlX3JlcXVlc3R8cmFkaXVzX2N2dF9hZGRyfHJhZGl1c19jdnRfaW50fHJhZGl1c19jdnRfc3RyaW5nfHJhZGl1c19kZW1hbmdsZXxyYWRpdXNfZGVtYW5nbGVfbXBwZV9rZXl8cmFkaXVzX2dldF9hdHRyfHJhZGl1c19nZXRfdmVuZG9yX2F0dHJ8cmFkaXVzX3B1dF9hZGRyfHJhZGl1c19wdXRfYXR0cnxyYWRpdXNfcHV0X2ludHxyYWRpdXNfcHV0X3N0cmluZ3xyYWRpdXNfcHV0X3ZlbmRvcl9hZGRyfHJhZGl1c19wdXRfdmVuZG9yX2F0dHJ8cmFkaXVzX3B1dF92ZW5kb3JfaW50fHJhZGl1c19wdXRfdmVuZG9yX3N0cmluZ3xyYWRpdXNfcmVxdWVzdF9hdXRoZW50aWNhdG9yfHJhZGl1c19zZW5kX3JlcXVlc3R8cmFkaXVzX3NlcnZlcl9zZWNyZXR8cmFkaXVzX3N0cmVycm9yfHJhbmR8cmFuZ2V8cmFuZ2VleGNlcHRpb258cmFyX3dyYXBwZXJfY2FjaGVfc3RhdHN8cmFyYXJjaGl2ZXxyYXJlbnRyeXxyYXJleGNlcHRpb258cmF3dXJsZGVjb2RlfHJhd3VybGVuY29kZXxyZWFkX2V4aWZfZGF0YXxyZWFkZGlyfHJlYWRmaWxlfHJlYWRnemZpbGV8cmVhZGxpbmV8cmVhZGxpbmVfYWRkX2hpc3Rvcnl8cmVhZGxpbmVfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsfHJlYWRsaW5lX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlfHJlYWRsaW5lX2NhbGxiYWNrX3JlYWRfY2hhcnxyZWFkbGluZV9jbGVhcl9oaXN0b3J5fHJlYWRsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb258cmVhZGxpbmVfaW5mb3xyZWFkbGluZV9saXN0X2hpc3Rvcnl8cmVhZGxpbmVfb25fbmV3X2xpbmV8cmVhZGxpbmVfcmVhZF9oaXN0b3J5fHJlYWRsaW5lX3JlZGlzcGxheXxyZWFkbGluZV93cml0ZV9oaXN0b3J5fHJlYWRsaW5rfHJlYWxwYXRofHJlYWxwYXRoX2NhY2hlX2dldHxyZWFscGF0aF9jYWNoZV9zaXplfHJlY29kZXxyZWNvZGVfZmlsZXxyZWNvZGVfc3RyaW5nfHJlY3Vyc2l2ZWFycmF5aXRlcmF0b3J8cmVjdXJzaXZlY2FjaGluZ2l0ZXJhdG9yfHJlY3Vyc2l2ZWNhbGxiYWNrZmlsdGVyaXRlcmF0b3J8cmVjdXJzaXZlZGlyZWN0b3J5aXRlcmF0b3J8cmVjdXJzaXZlZmlsdGVyaXRlcmF0b3J8cmVjdXJzaXZlaXRlcmF0b3J8cmVjdXJzaXZlaXRlcmF0b3JpdGVyYXRvcnxyZWN1cnNpdmVyZWdleGl0ZXJhdG9yfHJlY3Vyc2l2ZXRyZWVpdGVyYXRvcnxyZWZsZWN0aW9ufHJlZmxlY3Rpb25jbGFzc3xyZWZsZWN0aW9uZXhjZXB0aW9ufHJlZmxlY3Rpb25leHRlbnNpb258cmVmbGVjdGlvbmZ1bmN0aW9ufHJlZmxlY3Rpb25mdW5jdGlvbmFic3RyYWN0fHJlZmxlY3Rpb25tZXRob2R8cmVmbGVjdGlvbm9iamVjdHxyZWZsZWN0aW9ucGFyYW1ldGVyfHJlZmxlY3Rpb25wcm9wZXJ0eXxyZWZsZWN0b3J8cmVnZXhpdGVyYXRvcnxyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbnxyZWdpc3Rlcl90aWNrX2Z1bmN0aW9ufHJlbmFtZXxyZW5hbWVfZnVuY3Rpb258cmVxdWlyZXxyZXF1aXJlX29uY2V8cmVzZXR8cmVzZXRWYWx1ZXxyZXNvdXJjZWJ1bmRsZXxyZXN0b3JlX2Vycm9yX2hhbmRsZXJ8cmVzdG9yZV9leGNlcHRpb25faGFuZGxlcnxyZXN0b3JlX2luY2x1ZGVfcGF0aHxyZXR1cm58cmV3aW5kfHJld2luZGRpcnxybWRpcnxyb3VuZHxycG1fY2xvc2V8cnBtX2dldF90YWd8cnBtX2lzX3ZhbGlkfHJwbV9vcGVufHJwbV92ZXJzaW9ufHJyZF9jcmVhdGV8cnJkX2Vycm9yfHJyZF9mZXRjaHxycmRfZmlyc3R8cnJkX2dyYXBofHJyZF9pbmZvfHJyZF9sYXN0fHJyZF9sYXN0dXBkYXRlfHJyZF9yZXN0b3JlfHJyZF90dW5lfHJyZF91cGRhdGV8cnJkX3hwb3J0fHJyZGNyZWF0b3J8cnJkZ3JhcGh8cnJkdXBkYXRlcnxyc29ydHxydHJpbXxydW5raXRfY2xhc3NfYWRvcHR8cnVua2l0X2NsYXNzX2VtYW5jaXBhdGV8cnVua2l0X2NvbnN0YW50X2FkZHxydW5raXRfY29uc3RhbnRfcmVkZWZpbmV8cnVua2l0X2NvbnN0YW50X3JlbW92ZXxydW5raXRfZnVuY3Rpb25fYWRkfHJ1bmtpdF9mdW5jdGlvbl9jb3B5fHJ1bmtpdF9mdW5jdGlvbl9yZWRlZmluZXxydW5raXRfZnVuY3Rpb25fcmVtb3ZlfHJ1bmtpdF9mdW5jdGlvbl9yZW5hbWV8cnVua2l0X2ltcG9ydHxydW5raXRfbGludHxydW5raXRfbGludF9maWxlfHJ1bmtpdF9tZXRob2RfYWRkfHJ1bmtpdF9tZXRob2RfY29weXxydW5raXRfbWV0aG9kX3JlZGVmaW5lfHJ1bmtpdF9tZXRob2RfcmVtb3ZlfHJ1bmtpdF9tZXRob2RfcmVuYW1lfHJ1bmtpdF9yZXR1cm5fdmFsdWVfdXNlZHxydW5raXRfc2FuZGJveF9vdXRwdXRfaGFuZGxlcnxydW5raXRfc3VwZXJnbG9iYWxzfHJ1bnRpbWVleGNlcHRpb258c2FtY29ubmVjdGlvbl9jb21taXR8c2FtY29ubmVjdGlvbl9jb25uZWN0fHNhbWNvbm5lY3Rpb25fY29uc3RydWN0b3J8c2FtY29ubmVjdGlvbl9kaXNjb25uZWN0fHNhbWNvbm5lY3Rpb25fZXJybm98c2FtY29ubmVjdGlvbl9lcnJvcnxzYW1jb25uZWN0aW9uX2lzY29ubmVjdGVkfHNhbWNvbm5lY3Rpb25fcGVla3xzYW1jb25uZWN0aW9uX3BlZWthbGx8c2FtY29ubmVjdGlvbl9yZWNlaXZlfHNhbWNvbm5lY3Rpb25fcmVtb3ZlfHNhbWNvbm5lY3Rpb25fcm9sbGJhY2t8c2FtY29ubmVjdGlvbl9zZW5kfHNhbWNvbm5lY3Rpb25fc2V0RGVidWd8c2FtY29ubmVjdGlvbl9zdWJzY3JpYmV8c2FtY29ubmVjdGlvbl91bnN1YnNjcmliZXxzYW1tZXNzYWdlX2JvZHl8c2FtbWVzc2FnZV9jb25zdHJ1Y3RvcnxzYW1tZXNzYWdlX2hlYWRlcnxzY2FfY3JlYXRlZGF0YW9iamVjdHxzY2FfZ2V0c2VydmljZXxzY2FfbG9jYWxwcm94eV9jcmVhdGVkYXRhb2JqZWN0fHNjYV9zb2FwcHJveHlfY3JlYXRlZGF0YW9iamVjdHxzY2FuZGlyfHNkb19kYXNfY2hhbmdlc3VtbWFyeV9iZWdpbmxvZ2dpbmd8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2VuZGxvZ2dpbmd8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldGNoYW5nZWRkYXRhb2JqZWN0c3xzZG9fZGFzX2NoYW5nZXN1bW1hcnlfZ2V0Y2hhbmdldHlwZXxzZG9fZGFzX2NoYW5nZXN1bW1hcnlfZ2V0b2xkY29udGFpbmVyfHNkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRvbGR2YWx1ZXN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2lzbG9nZ2luZ3xzZG9fZGFzX2RhdGFmYWN0b3J5X2FkZHByb3BlcnR5dG90eXBlfHNkb19kYXNfZGF0YWZhY3RvcnlfYWRkdHlwZXxzZG9fZGFzX2RhdGFmYWN0b3J5X2dldGRhdGFmYWN0b3J5fHNkb19kYXNfZGF0YW9iamVjdF9nZXRjaGFuZ2VzdW1tYXJ5fHNkb19kYXNfcmVsYXRpb25hbF9hcHBseWNoYW5nZXN8c2RvX2Rhc19yZWxhdGlvbmFsX2NvbnN0cnVjdHxzZG9fZGFzX3JlbGF0aW9uYWxfY3JlYXRlcm9vdGRhdGFvYmplY3R8c2RvX2Rhc19yZWxhdGlvbmFsX2V4ZWN1dGVwcmVwYXJlZHF1ZXJ5fHNkb19kYXNfcmVsYXRpb25hbF9leGVjdXRlcXVlcnl8c2RvX2Rhc19zZXR0aW5nX2dldGxpc3RpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHlpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHluYW1lfHNkb19kYXNfc2V0dGluZ19nZXR2YWx1ZXxzZG9fZGFzX3NldHRpbmdfaXNzZXR8c2RvX2Rhc194bWxfYWRkdHlwZXN8c2RvX2Rhc194bWxfY3JlYXRlfHNkb19kYXNfeG1sX2NyZWF0ZWRhdGFvYmplY3R8c2RvX2Rhc194bWxfY3JlYXRlZG9jdW1lbnR8c2RvX2Rhc194bWxfZG9jdW1lbnRfZ2V0cm9vdGRhdGFvYmplY3R8c2RvX2Rhc194bWxfZG9jdW1lbnRfZ2V0cm9vdGVsZW1lbnRuYW1lfHNkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RlbGVtZW50dXJpfHNkb19kYXNfeG1sX2RvY3VtZW50X3NldGVuY29kaW5nfHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbGRlY2xhcmF0aW9ufHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbHZlcnNpb258c2RvX2Rhc194bWxfbG9hZGZpbGV8c2RvX2Rhc194bWxfbG9hZHN0cmluZ3xzZG9fZGFzX3htbF9zYXZlZmlsZXxzZG9fZGFzX3htbF9zYXZlc3RyaW5nfHNkb19kYXRhZmFjdG9yeV9jcmVhdGV8c2RvX2RhdGFvYmplY3RfY2xlYXJ8c2RvX2RhdGFvYmplY3RfY3JlYXRlZGF0YW9iamVjdHxzZG9fZGF0YW9iamVjdF9nZXRjb250YWluZXJ8c2RvX2RhdGFvYmplY3RfZ2V0c2VxdWVuY2V8c2RvX2RhdGFvYmplY3RfZ2V0dHlwZW5hbWV8c2RvX2RhdGFvYmplY3RfZ2V0dHlwZW5hbWVzcGFjZXVyaXxzZG9fZXhjZXB0aW9uX2dldGNhdXNlfHNkb19saXN0X2luc2VydHxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0Y29udGFpbmluZ3R5cGV8c2RvX21vZGVsX3Byb3BlcnR5X2dldGRlZmF1bHR8c2RvX21vZGVsX3Byb3BlcnR5X2dldG5hbWV8c2RvX21vZGVsX3Byb3BlcnR5X2dldHR5cGV8c2RvX21vZGVsX3Byb3BlcnR5X2lzY29udGFpbm1lbnR8c2RvX21vZGVsX3Byb3BlcnR5X2lzbWFueXxzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfY29uc3RydWN0fHNkb19tb2RlbF9yZWZsZWN0aW9uZGF0YW9iamVjdF9leHBvcnR8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGNvbnRhaW5tZW50cHJvcGVydHl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGluc3RhbmNlcHJvcGVydGllc3xzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZ2V0dHlwZXxzZG9fbW9kZWxfdHlwZV9nZXRiYXNldHlwZXxzZG9fbW9kZWxfdHlwZV9nZXRuYW1lfHNkb19tb2RlbF90eXBlX2dldG5hbWVzcGFjZXVyaXxzZG9fbW9kZWxfdHlwZV9nZXRwcm9wZXJ0aWVzfHNkb19tb2RlbF90eXBlX2dldHByb3BlcnR5fHNkb19tb2RlbF90eXBlX2lzYWJzdHJhY3R0eXBlfHNkb19tb2RlbF90eXBlX2lzZGF0YXR5cGV8c2RvX21vZGVsX3R5cGVfaXNpbnN0YW5jZXxzZG9fbW9kZWxfdHlwZV9pc29wZW50eXBlfHNkb19tb2RlbF90eXBlX2lzc2VxdWVuY2VkdHlwZXxzZG9fc2VxdWVuY2VfZ2V0cHJvcGVydHl8c2RvX3NlcXVlbmNlX2luc2VydHxzZG9fc2VxdWVuY2VfbW92ZXxzZWVrYWJsZWl0ZXJhdG9yfHNlbV9hY3F1aXJlfHNlbV9nZXR8c2VtX3JlbGVhc2V8c2VtX3JlbW92ZXxzZXJpYWxpemFibGV8c2VyaWFsaXplfHNlc3Npb25fY2FjaGVfZXhwaXJlfHNlc3Npb25fY2FjaGVfbGltaXRlcnxzZXNzaW9uX2NvbW1pdHxzZXNzaW9uX2RlY29kZXxzZXNzaW9uX2Rlc3Ryb3l8c2Vzc2lvbl9lbmNvZGV8c2Vzc2lvbl9nZXRfY29va2llX3BhcmFtc3xzZXNzaW9uX2lkfHNlc3Npb25faXNfcmVnaXN0ZXJlZHxzZXNzaW9uX21vZHVsZV9uYW1lfHNlc3Npb25fbmFtZXxzZXNzaW9uX3Bnc3FsX2FkZF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9maWVsZHxzZXNzaW9uX3Bnc3FsX3Jlc2V0fHNlc3Npb25fcGdzcWxfc2V0X2ZpZWxkfHNlc3Npb25fcGdzcWxfc3RhdHVzfHNlc3Npb25fcmVnZW5lcmF0ZV9pZHxzZXNzaW9uX3JlZ2lzdGVyfHNlc3Npb25fc2F2ZV9wYXRofHNlc3Npb25fc2V0X2Nvb2tpZV9wYXJhbXN8c2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyfHNlc3Npb25fc3RhcnR8c2Vzc2lvbl91bnJlZ2lzdGVyfHNlc3Npb25fdW5zZXR8c2Vzc2lvbl93cml0ZV9jbG9zZXxzZXRDb3VudGVyQ2xhc3N8c2V0X2Vycm9yX2hhbmRsZXJ8c2V0X2V4Y2VwdGlvbl9oYW5kbGVyfHNldF9maWxlX2J1ZmZlcnxzZXRfaW5jbHVkZV9wYXRofHNldF9tYWdpY19xdW90ZXNfcnVudGltZXxzZXRfc29ja2V0X2Jsb2NraW5nfHNldF90aW1lX2xpbWl0fHNldGNvb2tpZXxzZXRsb2NhbGV8c2V0cHJvY3RpdGxlfHNldHJhd2Nvb2tpZXxzZXRzdGF0aWNwcm9wZXJ0eXZhbHVlfHNldHRocmVhZHRpdGxlfHNldHR5cGV8c2hhMXxzaGExX2ZpbGV8c2hlbGxfZXhlY3xzaG1fYXR0YWNofHNobV9kZXRhY2h8c2htX2dldF92YXJ8c2htX2hhc192YXJ8c2htX3B1dF92YXJ8c2htX3JlbW92ZXxzaG1fcmVtb3ZlX3ZhcnxzaG1vcF9jbG9zZXxzaG1vcF9kZWxldGV8c2htb3Bfb3BlbnxzaG1vcF9yZWFkfHNobW9wX3NpemV8c2htb3Bfd3JpdGV8c2hvd19zb3VyY2V8c2h1ZmZsZXxzaWduZXVybHBhaWVtZW50fHNpbWlsYXJfdGV4dHxzaW1wbGV4bWxfaW1wb3J0X2RvbXxzaW1wbGV4bWxfbG9hZF9maWxlfHNpbXBsZXhtbF9sb2FkX3N0cmluZ3xzaW1wbGV4bWxlbGVtZW50fHNpbXBsZXhtbGl0ZXJhdG9yfHNpbnxzaW5ofHNpemVvZnxzbGVlcHxzbm1wfHNubXAyX2dldHxzbm1wMl9nZXRuZXh0fHNubXAyX3JlYWxfd2Fsa3xzbm1wMl9zZXR8c25tcDJfd2Fsa3xzbm1wM19nZXR8c25tcDNfZ2V0bmV4dHxzbm1wM19yZWFsX3dhbGt8c25tcDNfc2V0fHNubXAzX3dhbGt8c25tcF9nZXRfcXVpY2tfcHJpbnR8c25tcF9nZXRfdmFsdWVyZXRyaWV2YWx8c25tcF9yZWFkX21pYnxzbm1wX3NldF9lbnVtX3ByaW50fHNubXBfc2V0X29pZF9udW1lcmljX3ByaW50fHNubXBfc2V0X29pZF9vdXRwdXRfZm9ybWF0fHNubXBfc2V0X3F1aWNrX3ByaW50fHNubXBfc2V0X3ZhbHVlcmV0cmlldmFsfHNubXBnZXR8c25tcGdldG5leHR8c25tcHJlYWx3YWxrfHNubXBzZXR8c25tcHdhbGt8c25tcHdhbGtvaWR8c29hcGNsaWVudHxzb2FwZmF1bHR8c29hcGhlYWRlcnxzb2FwcGFyYW18c29hcHNlcnZlcnxzb2FwdmFyfHNvY2tldF9hY2NlcHR8c29ja2V0X2JpbmR8c29ja2V0X2NsZWFyX2Vycm9yfHNvY2tldF9jbG9zZXxzb2NrZXRfY29ubmVjdHxzb2NrZXRfY3JlYXRlfHNvY2tldF9jcmVhdGVfbGlzdGVufHNvY2tldF9jcmVhdGVfcGFpcnxzb2NrZXRfZ2V0X29wdGlvbnxzb2NrZXRfZ2V0X3N0YXR1c3xzb2NrZXRfZ2V0cGVlcm5hbWV8c29ja2V0X2dldHNvY2tuYW1lfHNvY2tldF9sYXN0X2Vycm9yfHNvY2tldF9saXN0ZW58c29ja2V0X3JlYWR8c29ja2V0X3JlY3Z8c29ja2V0X3JlY3Zmcm9tfHNvY2tldF9zZWxlY3R8c29ja2V0X3NlbmR8c29ja2V0X3NlbmR0b3xzb2NrZXRfc2V0X2Jsb2NrfHNvY2tldF9zZXRfYmxvY2tpbmd8c29ja2V0X3NldF9ub25ibG9ja3xzb2NrZXRfc2V0X29wdGlvbnxzb2NrZXRfc2V0X3RpbWVvdXR8c29ja2V0X3NodXRkb3dufHNvY2tldF9zdHJlcnJvcnxzb2NrZXRfd3JpdGV8c29scl9nZXRfdmVyc2lvbnxzb2xyY2xpZW50fHNvbHJjbGllbnRleGNlcHRpb258c29scmRvY3VtZW50fHNvbHJkb2N1bWVudGZpZWxkfHNvbHJleGNlcHRpb258c29scmdlbmVyaWNyZXNwb25zZXxzb2xyaWxsZWdhbGFyZ3VtZW50ZXhjZXB0aW9ufHNvbHJpbGxlZ2Fsb3BlcmF0aW9uZXhjZXB0aW9ufHNvbHJpbnB1dGRvY3VtZW50fHNvbHJtb2RpZmlhYmxlcGFyYW1zfHNvbHJvYmplY3R8c29scnBhcmFtc3xzb2xycGluZ3Jlc3BvbnNlfHNvbHJxdWVyeXxzb2xycXVlcnlyZXNwb25zZXxzb2xycmVzcG9uc2V8c29scnVwZGF0ZXJlc3BvbnNlfHNvbHJ1dGlsc3xzb3J0fHNvdW5kZXh8c3BoaW54Y2xpZW50fHNwbF9hdXRvbG9hZHxzcGxfYXV0b2xvYWRfY2FsbHxzcGxfYXV0b2xvYWRfZXh0ZW5zaW9uc3xzcGxfYXV0b2xvYWRfZnVuY3Rpb25zfHNwbF9hdXRvbG9hZF9yZWdpc3RlcnxzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcnxzcGxfY2xhc3Nlc3xzcGxfb2JqZWN0X2hhc2h8c3BsYm9vbHxzcGxkb3VibHlsaW5rZWRsaXN0fHNwbGVudW18c3BsZmlsZWluZm98c3BsZmlsZW9iamVjdHxzcGxmaXhlZGFycmF5fHNwbGZsb2F0fHNwbGhlYXB8c3BsaW50fHNwbGl0fHNwbGl0aXxzcGxtYXhoZWFwfHNwbG1pbmhlYXB8c3Bsb2JqZWN0c3RvcmFnZXxzcGxvYnNlcnZlcnxzcGxwcmlvcml0eXF1ZXVlfHNwbHF1ZXVlfHNwbHN0YWNrfHNwbHN0cmluZ3xzcGxzdWJqZWN0fHNwbHRlbXBmaWxlb2JqZWN0fHNwb29mY2hlY2tlcnxzcHJpbnRmfHNxbF9yZWdjYXNlfHNxbGl0ZTN8c3FsaXRlM3Jlc3VsdHxzcWxpdGUzc3RtdHxzcWxpdGVfYXJyYXlfcXVlcnl8c3FsaXRlX2J1c3lfdGltZW91dHxzcWxpdGVfY2hhbmdlc3xzcWxpdGVfY2xvc2V8c3FsaXRlX2NvbHVtbnxzcWxpdGVfY3JlYXRlX2FnZ3JlZ2F0ZXxzcWxpdGVfY3JlYXRlX2Z1bmN0aW9ufHNxbGl0ZV9jdXJyZW50fHNxbGl0ZV9lcnJvcl9zdHJpbmd8c3FsaXRlX2VzY2FwZV9zdHJpbmd8c3FsaXRlX2V4ZWN8c3FsaXRlX2ZhY3Rvcnl8c3FsaXRlX2ZldGNoX2FsbHxzcWxpdGVfZmV0Y2hfYXJyYXl8c3FsaXRlX2ZldGNoX2NvbHVtbl90eXBlc3xzcWxpdGVfZmV0Y2hfb2JqZWN0fHNxbGl0ZV9mZXRjaF9zaW5nbGV8c3FsaXRlX2ZldGNoX3N0cmluZ3xzcWxpdGVfZmllbGRfbmFtZXxzcWxpdGVfaGFzX21vcmV8c3FsaXRlX2hhc19wcmV2fHNxbGl0ZV9rZXl8c3FsaXRlX2xhc3RfZXJyb3J8c3FsaXRlX2xhc3RfaW5zZXJ0X3Jvd2lkfHNxbGl0ZV9saWJlbmNvZGluZ3xzcWxpdGVfbGlidmVyc2lvbnxzcWxpdGVfbmV4dHxzcWxpdGVfbnVtX2ZpZWxkc3xzcWxpdGVfbnVtX3Jvd3N8c3FsaXRlX29wZW58c3FsaXRlX3BvcGVufHNxbGl0ZV9wcmV2fHNxbGl0ZV9xdWVyeXxzcWxpdGVfcmV3aW5kfHNxbGl0ZV9zZWVrfHNxbGl0ZV9zaW5nbGVfcXVlcnl8c3FsaXRlX3VkZl9kZWNvZGVfYmluYXJ5fHNxbGl0ZV91ZGZfZW5jb2RlX2JpbmFyeXxzcWxpdGVfdW5idWZmZXJlZF9xdWVyeXxzcWxpdGVfdmFsaWR8c3FydHxzcmFuZHxzc2NhbmZ8c3NkZWVwX2Z1enp5X2NvbXBhcmV8c3NkZWVwX2Z1enp5X2hhc2h8c3NkZWVwX2Z1enp5X2hhc2hfZmlsZW5hbWV8c3NoMl9hdXRoX2hvc3RiYXNlZF9maWxlfHNzaDJfYXV0aF9ub25lfHNzaDJfYXV0aF9wYXNzd29yZHxzc2gyX2F1dGhfcHVia2V5X2ZpbGV8c3NoMl9jb25uZWN0fHNzaDJfZXhlY3xzc2gyX2ZldGNoX3N0cmVhbXxzc2gyX2ZpbmdlcnByaW50fHNzaDJfbWV0aG9kc19uZWdvdGlhdGVkfHNzaDJfcHVibGlja2V5X2FkZHxzc2gyX3B1YmxpY2tleV9pbml0fHNzaDJfcHVibGlja2V5X2xpc3R8c3NoMl9wdWJsaWNrZXlfcmVtb3ZlfHNzaDJfc2NwX3JlY3Z8c3NoMl9zY3Bfc2VuZHxzc2gyX3NmdHB8c3NoMl9zZnRwX2xzdGF0fHNzaDJfc2Z0cF9ta2Rpcnxzc2gyX3NmdHBfcmVhZGxpbmt8c3NoMl9zZnRwX3JlYWxwYXRofHNzaDJfc2Z0cF9yZW5hbWV8c3NoMl9zZnRwX3JtZGlyfHNzaDJfc2Z0cF9zdGF0fHNzaDJfc2Z0cF9zeW1saW5rfHNzaDJfc2Z0cF91bmxpbmt8c3NoMl9zaGVsbHxzc2gyX3R1bm5lbHxzdGF0fHN0YXRzX2Fic29sdXRlX2RldmlhdGlvbnxzdGF0c19jZGZfYmV0YXxzdGF0c19jZGZfYmlub21pYWx8c3RhdHNfY2RmX2NhdWNoeXxzdGF0c19jZGZfY2hpc3F1YXJlfHN0YXRzX2NkZl9leHBvbmVudGlhbHxzdGF0c19jZGZfZnxzdGF0c19jZGZfZ2FtbWF8c3RhdHNfY2RmX2xhcGxhY2V8c3RhdHNfY2RmX2xvZ2lzdGljfHN0YXRzX2NkZl9uZWdhdGl2ZV9iaW5vbWlhbHxzdGF0c19jZGZfbm9uY2VudHJhbF9jaGlzcXVhcmV8c3RhdHNfY2RmX25vbmNlbnRyYWxfZnxzdGF0c19jZGZfcG9pc3NvbnxzdGF0c19jZGZfdHxzdGF0c19jZGZfdW5pZm9ybXxzdGF0c19jZGZfd2VpYnVsbHxzdGF0c19jb3ZhcmlhbmNlfHN0YXRzX2Rlbl91bmlmb3JtfHN0YXRzX2RlbnNfYmV0YXxzdGF0c19kZW5zX2NhdWNoeXxzdGF0c19kZW5zX2NoaXNxdWFyZXxzdGF0c19kZW5zX2V4cG9uZW50aWFsfHN0YXRzX2RlbnNfZnxzdGF0c19kZW5zX2dhbW1hfHN0YXRzX2RlbnNfbGFwbGFjZXxzdGF0c19kZW5zX2xvZ2lzdGljfHN0YXRzX2RlbnNfbmVnYXRpdmVfYmlub21pYWx8c3RhdHNfZGVuc19ub3JtYWx8c3RhdHNfZGVuc19wbWZfYmlub21pYWx8c3RhdHNfZGVuc19wbWZfaHlwZXJnZW9tZXRyaWN8c3RhdHNfZGVuc19wbWZfcG9pc3NvbnxzdGF0c19kZW5zX3R8c3RhdHNfZGVuc193ZWlidWxsfHN0YXRzX2hhcm1vbmljX21lYW58c3RhdHNfa3VydG9zaXN8c3RhdHNfcmFuZF9nZW5fYmV0YXxzdGF0c19yYW5kX2dlbl9jaGlzcXVhcmV8c3RhdHNfcmFuZF9nZW5fZXhwb25lbnRpYWx8c3RhdHNfcmFuZF9nZW5fZnxzdGF0c19yYW5kX2dlbl9mdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9nYW1tYXxzdGF0c19yYW5kX2dlbl9pYmlub21pYWx8c3RhdHNfcmFuZF9nZW5faWJpbm9taWFsX25lZ2F0aXZlfHN0YXRzX3JhbmRfZ2VuX2ludHxzdGF0c19yYW5kX2dlbl9pcG9pc3NvbnxzdGF0c19yYW5kX2dlbl9pdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9ub25jZW5yYWxfY2hpc3F1YXJlfHN0YXRzX3JhbmRfZ2VuX25vbmNlbnRyYWxfZnxzdGF0c19yYW5kX2dlbl9ub25jZW50cmFsX3R8c3RhdHNfcmFuZF9nZW5fbm9ybWFsfHN0YXRzX3JhbmRfZ2VuX3R8c3RhdHNfcmFuZF9nZXRfc2VlZHN8c3RhdHNfcmFuZF9waHJhc2VfdG9fc2VlZHN8c3RhdHNfcmFuZF9yYW5mfHN0YXRzX3JhbmRfc2V0YWxsfHN0YXRzX3NrZXd8c3RhdHNfc3RhbmRhcmRfZGV2aWF0aW9ufHN0YXRzX3N0YXRfYmlub21pYWxfY29lZnxzdGF0c19zdGF0X2NvcnJlbGF0aW9ufHN0YXRzX3N0YXRfZ2VubmNofHN0YXRzX3N0YXRfaW5kZXBlbmRlbnRfdHxzdGF0c19zdGF0X2lubmVycHJvZHVjdHxzdGF0c19zdGF0X25vbmNlbnRyYWxfdHxzdGF0c19zdGF0X3BhaXJlZF90fHN0YXRzX3N0YXRfcGVyY2VudGlsZXxzdGF0c19zdGF0X3Bvd2Vyc3VtfHN0YXRzX3ZhcmlhbmNlfHN0b21wfHN0b21wX2Nvbm5lY3RfZXJyb3J8c3RvbXBfdmVyc2lvbnxzdG9tcGV4Y2VwdGlvbnxzdG9tcGZyYW1lfHN0cl9nZXRjc3Z8c3RyX2lyZXBsYWNlfHN0cl9wYWR8c3RyX3JlcGVhdHxzdHJfcmVwbGFjZXxzdHJfcm90MTN8c3RyX3NodWZmbGV8c3RyX3NwbGl0fHN0cl93b3JkX2NvdW50fHN0cmNhc2VjbXB8c3RyY2hyfHN0cmNtcHxzdHJjb2xsfHN0cmNzcG58c3RyZWFtX2J1Y2tldF9hcHBlbmR8c3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZXxzdHJlYW1fYnVja2V0X25ld3xzdHJlYW1fYnVja2V0X3ByZXBlbmR8c3RyZWFtX2NvbnRleHRfY3JlYXRlfHN0cmVhbV9jb250ZXh0X2dldF9kZWZhdWx0fHN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zfHN0cmVhbV9jb250ZXh0X2dldF9wYXJhbXN8c3RyZWFtX2NvbnRleHRfc2V0X2RlZmF1bHR8c3RyZWFtX2NvbnRleHRfc2V0X29wdGlvbnxzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zfHN0cmVhbV9jb3B5X3RvX3N0cmVhbXxzdHJlYW1fZW5jb2Rpbmd8c3RyZWFtX2ZpbHRlcl9hcHBlbmR8c3RyZWFtX2ZpbHRlcl9wcmVwZW5kfHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXJ8c3RyZWFtX2ZpbHRlcl9yZW1vdmV8c3RyZWFtX2dldF9jb250ZW50c3xzdHJlYW1fZ2V0X2ZpbHRlcnN8c3RyZWFtX2dldF9saW5lfHN0cmVhbV9nZXRfbWV0YV9kYXRhfHN0cmVhbV9nZXRfdHJhbnNwb3J0c3xzdHJlYW1fZ2V0X3dyYXBwZXJzfHN0cmVhbV9pc19sb2NhbHxzdHJlYW1fbm90aWZpY2F0aW9uX2NhbGxiYWNrfHN0cmVhbV9yZWdpc3Rlcl93cmFwcGVyfHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aHxzdHJlYW1fc2VsZWN0fHN0cmVhbV9zZXRfYmxvY2tpbmd8c3RyZWFtX3NldF9yZWFkX2J1ZmZlcnxzdHJlYW1fc2V0X3RpbWVvdXR8c3RyZWFtX3NldF93cml0ZV9idWZmZXJ8c3RyZWFtX3NvY2tldF9hY2NlcHR8c3RyZWFtX3NvY2tldF9jbGllbnR8c3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvfHN0cmVhbV9zb2NrZXRfZ2V0X25hbWV8c3RyZWFtX3NvY2tldF9wYWlyfHN0cmVhbV9zb2NrZXRfcmVjdmZyb218c3RyZWFtX3NvY2tldF9zZW5kdG98c3RyZWFtX3NvY2tldF9zZXJ2ZXJ8c3RyZWFtX3NvY2tldF9zaHV0ZG93bnxzdHJlYW1fc3VwcG9ydHNfbG9ja3xzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcnxzdHJlYW1fd3JhcHBlcl9yZXN0b3JlfHN0cmVhbV93cmFwcGVyX3VucmVnaXN0ZXJ8c3RyZWFtd3JhcHBlcnxzdHJmdGltZXxzdHJpcF90YWdzfHN0cmlwY3NsYXNoZXN8c3RyaXBvc3xzdHJpcHNsYXNoZXN8c3RyaXN0cnxzdHJsZW58c3RybmF0Y2FzZWNtcHxzdHJuYXRjbXB8c3RybmNhc2VjbXB8c3RybmNtcHxzdHJwYnJrfHN0cnBvc3xzdHJwdGltZXxzdHJyY2hyfHN0cnJldnxzdHJyaXBvc3xzdHJycG9zfHN0cnNwbnxzdHJzdHJ8c3RydG9rfHN0cnRvbG93ZXJ8c3RydG90aW1lfHN0cnRvdXBwZXJ8c3RydHJ8c3RydmFsfHN1YnN0cnxzdWJzdHJfY29tcGFyZXxzdWJzdHJfY291bnR8c3Vic3RyX3JlcGxhY2V8c3ZtfHN2bW1vZGVsfHN2bl9hZGR8c3ZuX2F1dGhfZ2V0X3BhcmFtZXRlcnxzdm5fYXV0aF9zZXRfcGFyYW1ldGVyfHN2bl9ibGFtZXxzdm5fY2F0fHN2bl9jaGVja291dHxzdm5fY2xlYW51cHxzdm5fY2xpZW50X3ZlcnNpb258c3ZuX2NvbW1pdHxzdm5fZGVsZXRlfHN2bl9kaWZmfHN2bl9leHBvcnR8c3ZuX2ZzX2Fib3J0X3R4bnxzdm5fZnNfYXBwbHlfdGV4dHxzdm5fZnNfYmVnaW5fdHhuMnxzdm5fZnNfY2hhbmdlX25vZGVfcHJvcHxzdm5fZnNfY2hlY2tfcGF0aHxzdm5fZnNfY29udGVudHNfY2hhbmdlZHxzdm5fZnNfY29weXxzdm5fZnNfZGVsZXRlfHN2bl9mc19kaXJfZW50cmllc3xzdm5fZnNfZmlsZV9jb250ZW50c3xzdm5fZnNfZmlsZV9sZW5ndGh8c3ZuX2ZzX2lzX2Rpcnxzdm5fZnNfaXNfZmlsZXxzdm5fZnNfbWFrZV9kaXJ8c3ZuX2ZzX21ha2VfZmlsZXxzdm5fZnNfbm9kZV9jcmVhdGVkX3Jldnxzdm5fZnNfbm9kZV9wcm9wfHN2bl9mc19wcm9wc19jaGFuZ2VkfHN2bl9mc19yZXZpc2lvbl9wcm9wfHN2bl9mc19yZXZpc2lvbl9yb290fHN2bl9mc190eG5fcm9vdHxzdm5fZnNfeW91bmdlc3RfcmV2fHN2bl9pbXBvcnR8c3ZuX2xvZ3xzdm5fbHN8c3ZuX21rZGlyfHN2bl9yZXBvc19jcmVhdGV8c3ZuX3JlcG9zX2ZzfHN2bl9yZXBvc19mc19iZWdpbl90eG5fZm9yX2NvbW1pdHxzdm5fcmVwb3NfZnNfY29tbWl0X3R4bnxzdm5fcmVwb3NfaG90Y29weXxzdm5fcmVwb3Nfb3Blbnxzdm5fcmVwb3NfcmVjb3Zlcnxzdm5fcmV2ZXJ0fHN2bl9zdGF0dXN8c3ZuX3VwZGF0ZXxzd2ZfYWN0aW9uZ2V0dXJsfHN3Zl9hY3Rpb25nb3RvZnJhbWV8c3dmX2FjdGlvbmdvdG9sYWJlbHxzd2ZfYWN0aW9ubmV4dGZyYW1lfHN3Zl9hY3Rpb25wbGF5fHN3Zl9hY3Rpb25wcmV2ZnJhbWV8c3dmX2FjdGlvbnNldHRhcmdldHxzd2ZfYWN0aW9uc3RvcHxzd2ZfYWN0aW9udG9nZ2xlcXVhbGl0eXxzd2ZfYWN0aW9ud2FpdGZvcmZyYW1lfHN3Zl9hZGRidXR0b25yZWNvcmR8c3dmX2FkZGNvbG9yfHN3Zl9jbG9zZWZpbGV8c3dmX2RlZmluZWJpdG1hcHxzd2ZfZGVmaW5lZm9udHxzd2ZfZGVmaW5lbGluZXxzd2ZfZGVmaW5lcG9seXxzd2ZfZGVmaW5lcmVjdHxzd2ZfZGVmaW5ldGV4dHxzd2ZfZW5kYnV0dG9ufHN3Zl9lbmRkb2FjdGlvbnxzd2ZfZW5kc2hhcGV8c3dmX2VuZHN5bWJvbHxzd2ZfZm9udHNpemV8c3dmX2ZvbnRzbGFudHxzd2ZfZm9udHRyYWNraW5nfHN3Zl9nZXRiaXRtYXBpbmZvfHN3Zl9nZXRmb250aW5mb3xzd2ZfZ2V0ZnJhbWV8c3dmX2xhYmVsZnJhbWV8c3dmX2xvb2thdHxzd2ZfbW9kaWZ5b2JqZWN0fHN3Zl9tdWxjb2xvcnxzd2ZfbmV4dGlkfHN3Zl9vbmNvbmRpdGlvbnxzd2Zfb3BlbmZpbGV8c3dmX29ydGhvfHN3Zl9vcnRobzJ8c3dmX3BlcnNwZWN0aXZlfHN3Zl9wbGFjZW9iamVjdHxzd2ZfcG9sYXJ2aWV3fHN3Zl9wb3BtYXRyaXh8c3dmX3Bvc3JvdW5kfHN3Zl9wdXNobWF0cml4fHN3Zl9yZW1vdmVvYmplY3R8c3dmX3JvdGF0ZXxzd2Zfc2NhbGV8c3dmX3NldGZvbnR8c3dmX3NldGZyYW1lfHN3Zl9zaGFwZWFyY3xzd2Zfc2hhcGVjdXJ2ZXRvfHN3Zl9zaGFwZWN1cnZldG8zfHN3Zl9zaGFwZWZpbGxiaXRtYXBjbGlwfHN3Zl9zaGFwZWZpbGxiaXRtYXB0aWxlfHN3Zl9zaGFwZWZpbGxvZmZ8c3dmX3NoYXBlZmlsbHNvbGlkfHN3Zl9zaGFwZWxpbmVzb2xpZHxzd2Zfc2hhcGVsaW5ldG98c3dmX3NoYXBlbW92ZXRvfHN3Zl9zaG93ZnJhbWV8c3dmX3N0YXJ0YnV0dG9ufHN3Zl9zdGFydGRvYWN0aW9ufHN3Zl9zdGFydHNoYXBlfHN3Zl9zdGFydHN5bWJvbHxzd2ZfdGV4dHdpZHRofHN3Zl90cmFuc2xhdGV8c3dmX3ZpZXdwb3J0fHN3ZmFjdGlvbnxzd2ZiaXRtYXB8c3dmYnV0dG9ufHN3ZmRpc3BsYXlpdGVtfHN3ZmZpbGx8c3dmZm9udHxzd2Zmb250Y2hhcnxzd2ZncmFkaWVudHxzd2Ztb3JwaHxzd2Ztb3ZpZXxzd2ZwcmVidWlsdGNsaXB8c3dmc2hhcGV8c3dmc291bmR8c3dmc291bmRpbnN0YW5jZXxzd2ZzcHJpdGV8c3dmdGV4dHxzd2Z0ZXh0ZmllbGR8c3dmdmlkZW9zdHJlYW18c3dpc2hfY29uc3RydWN0fHN3aXNoX2dldG1ldGFsaXN0fHN3aXNoX2dldHByb3BlcnR5bGlzdHxzd2lzaF9wcmVwYXJlfHN3aXNoX3F1ZXJ5fHN3aXNocmVzdWx0X2dldG1ldGFsaXN0fHN3aXNocmVzdWx0X3N0ZW18c3dpc2hyZXN1bHRzX2dldHBhcnNlZHdvcmRzfHN3aXNocmVzdWx0c19nZXRyZW1vdmVkc3RvcHdvcmRzfHN3aXNocmVzdWx0c19uZXh0cmVzdWx0fHN3aXNocmVzdWx0c19zZWVrcmVzdWx0fHN3aXNoc2VhcmNoX2V4ZWN1dGV8c3dpc2hzZWFyY2hfcmVzZXRsaW1pdHxzd2lzaHNlYXJjaF9zZXRsaW1pdHxzd2lzaHNlYXJjaF9zZXRwaHJhc2VkZWxpbWl0ZXJ8c3dpc2hzZWFyY2hfc2V0c29ydHxzd2lzaHNlYXJjaF9zZXRzdHJ1Y3R1cmV8c3liYXNlX2FmZmVjdGVkX3Jvd3N8c3liYXNlX2Nsb3NlfHN5YmFzZV9jb25uZWN0fHN5YmFzZV9kYXRhX3NlZWt8c3liYXNlX2RlYWRsb2NrX3JldHJ5X2NvdW50fHN5YmFzZV9mZXRjaF9hcnJheXxzeWJhc2VfZmV0Y2hfYXNzb2N8c3liYXNlX2ZldGNoX2ZpZWxkfHN5YmFzZV9mZXRjaF9vYmplY3R8c3liYXNlX2ZldGNoX3Jvd3xzeWJhc2VfZmllbGRfc2Vla3xzeWJhc2VfZnJlZV9yZXN1bHR8c3liYXNlX2dldF9sYXN0X21lc3NhZ2V8c3liYXNlX21pbl9jbGllbnRfc2V2ZXJpdHl8c3liYXNlX21pbl9lcnJvcl9zZXZlcml0eXxzeWJhc2VfbWluX21lc3NhZ2Vfc2V2ZXJpdHl8c3liYXNlX21pbl9zZXJ2ZXJfc2V2ZXJpdHl8c3liYXNlX251bV9maWVsZHN8c3liYXNlX251bV9yb3dzfHN5YmFzZV9wY29ubmVjdHxzeWJhc2VfcXVlcnl8c3liYXNlX3Jlc3VsdHxzeWJhc2Vfc2VsZWN0X2RifHN5YmFzZV9zZXRfbWVzc2FnZV9oYW5kbGVyfHN5YmFzZV91bmJ1ZmZlcmVkX3F1ZXJ5fHN5bWxpbmt8c3lzX2dldF90ZW1wX2RpcnxzeXNfZ2V0bG9hZGF2Z3xzeXNsb2d8c3lzdGVtfHRhZ3x0YW58dGFuaHx0Y3B3cmFwX2NoZWNrfHRlbXBuYW18dGV4dGRvbWFpbnx0aWR5fHRpZHlfYWNjZXNzX2NvdW50fHRpZHlfY29uZmlnX2NvdW50fHRpZHlfZGlhZ25vc2V8dGlkeV9lcnJvcl9jb3VudHx0aWR5X2dldF9lcnJvcl9idWZmZXJ8dGlkeV9nZXRfb3V0cHV0fHRpZHlfbG9hZF9jb25maWd8dGlkeV9yZXNldF9jb25maWd8dGlkeV9zYXZlX2NvbmZpZ3x0aWR5X3NldF9lbmNvZGluZ3x0aWR5X3NldG9wdHx0aWR5X3dhcm5pbmdfY291bnR8dGlkeW5vZGV8dGltZXx0aW1lX25hbm9zbGVlcHx0aW1lX3NsZWVwX3VudGlsfHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdHx0aW1lem9uZV9pZGVudGlmaWVyc19saXN0fHRpbWV6b25lX2xvY2F0aW9uX2dldHx0aW1lem9uZV9uYW1lX2Zyb21fYWJicnx0aW1lem9uZV9uYW1lX2dldHx0aW1lem9uZV9vZmZzZXRfZ2V0fHRpbWV6b25lX29wZW58dGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0fHRpbWV6b25lX3ZlcnNpb25fZ2V0fHRtcGZpbGV8dG9rZW5fZ2V0X2FsbHx0b2tlbl9uYW1lfHRva3lvdHlyYW50fHRva3lvdHlyYW50cXVlcnl8dG9reW90eXJhbnR0YWJsZXx0b3N0cmluZ3x0b3N0cmluZ3x0b3VjaHx0cmFuc2xpdGVyYXRvcnx0cmF2ZXJzYWJsZXx0cmlnZ2VyX2Vycm9yfHRyaW18dWFzb3J0fHVjZmlyc3R8dWN3b3Jkc3x1ZG1fYWRkX3NlYXJjaF9saW1pdHx1ZG1fYWxsb2NfYWdlbnR8dWRtX2FsbG9jX2FnZW50X2FycmF5fHVkbV9hcGlfdmVyc2lvbnx1ZG1fY2F0X2xpc3R8dWRtX2NhdF9wYXRofHVkbV9jaGVja19jaGFyc2V0fHVkbV9jaGVja19zdG9yZWR8dWRtX2NsZWFyX3NlYXJjaF9saW1pdHN8dWRtX2Nsb3NlX3N0b3JlZHx1ZG1fY3JjMzJ8dWRtX2Vycm5vfHVkbV9lcnJvcnx1ZG1fZmluZHx1ZG1fZnJlZV9hZ2VudHx1ZG1fZnJlZV9pc3BlbGxfZGF0YXx1ZG1fZnJlZV9yZXN8dWRtX2dldF9kb2NfY291bnR8dWRtX2dldF9yZXNfZmllbGR8dWRtX2dldF9yZXNfcGFyYW18dWRtX2hhc2gzMnx1ZG1fbG9hZF9pc3BlbGxfZGF0YXx1ZG1fb3Blbl9zdG9yZWR8dWRtX3NldF9hZ2VudF9wYXJhbXx1a3NvcnR8dW1hc2t8dW5kZXJmbG93ZXhjZXB0aW9ufHVuZXhwZWN0ZWR2YWx1ZWV4Y2VwdGlvbnx1bmlxaWR8dW5peHRvamR8dW5saW5rfHVucGFja3x1bnJlZ2lzdGVyX3RpY2tfZnVuY3Rpb258dW5zZXJpYWxpemV8dW5zZXR8dXJsZGVjb2RlfHVybGVuY29kZXx1c2Vfc29hcF9lcnJvcl9oYW5kbGVyfHVzZXJfZXJyb3J8dXNsZWVwfHVzb3J0fHV0ZjhfZGVjb2RlfHV0ZjhfZW5jb2RlfHY4anN8djhqc2V4Y2VwdGlvbnx2YXJfZHVtcHx2YXJfZXhwb3J0fHZhcmlhbnR8dmFyaWFudF9hYnN8dmFyaWFudF9hZGR8dmFyaWFudF9hbmR8dmFyaWFudF9jYXN0fHZhcmlhbnRfY2F0fHZhcmlhbnRfY21wfHZhcmlhbnRfZGF0ZV9mcm9tX3RpbWVzdGFtcHx2YXJpYW50X2RhdGVfdG9fdGltZXN0YW1wfHZhcmlhbnRfZGl2fHZhcmlhbnRfZXF2fHZhcmlhbnRfZml4fHZhcmlhbnRfZ2V0X3R5cGV8dmFyaWFudF9pZGl2fHZhcmlhbnRfaW1wfHZhcmlhbnRfaW50fHZhcmlhbnRfbW9kfHZhcmlhbnRfbXVsfHZhcmlhbnRfbmVnfHZhcmlhbnRfbm90fHZhcmlhbnRfb3J8dmFyaWFudF9wb3d8dmFyaWFudF9yb3VuZHx2YXJpYW50X3NldHx2YXJpYW50X3NldF90eXBlfHZhcmlhbnRfc3VifHZhcmlhbnRfeG9yfHZlcnNpb25fY29tcGFyZXx2ZnByaW50Znx2aXJ0dWFsfHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW58dnBvcG1haWxfYWRkX2FsaWFzX2RvbWFpbl9leHx2cG9wbWFpbF9hZGRfZG9tYWlufHZwb3BtYWlsX2FkZF9kb21haW5fZXh8dnBvcG1haWxfYWRkX3VzZXJ8dnBvcG1haWxfYWxpYXNfYWRkfHZwb3BtYWlsX2FsaWFzX2RlbHx2cG9wbWFpbF9hbGlhc19kZWxfZG9tYWlufHZwb3BtYWlsX2FsaWFzX2dldHx2cG9wbWFpbF9hbGlhc19nZXRfYWxsfHZwb3BtYWlsX2F1dGhfdXNlcnx2cG9wbWFpbF9kZWxfZG9tYWlufHZwb3BtYWlsX2RlbF9kb21haW5fZXh8dnBvcG1haWxfZGVsX3VzZXJ8dnBvcG1haWxfZXJyb3J8dnBvcG1haWxfcGFzc3dkfHZwb3BtYWlsX3NldF91c2VyX3F1b3RhfHZwcmludGZ8dnNwcmludGZ8dzMyYXBpX2RlZnR5cGV8dzMyYXBpX2luaXRfZHR5cGV8dzMyYXBpX2ludm9rZV9mdW5jdGlvbnx3MzJhcGlfcmVnaXN0ZXJfZnVuY3Rpb258dzMyYXBpX3NldF9jYWxsX21ldGhvZHx3ZGR4X2FkZF92YXJzfHdkZHhfZGVzZXJpYWxpemV8d2RkeF9wYWNrZXRfZW5kfHdkZHhfcGFja2V0X3N0YXJ0fHdkZHhfc2VyaWFsaXplX3ZhbHVlfHdkZHhfc2VyaWFsaXplX3ZhcnN8d2luMzJfY29udGludWVfc2VydmljZXx3aW4zMl9jcmVhdGVfc2VydmljZXx3aW4zMl9kZWxldGVfc2VydmljZXx3aW4zMl9nZXRfbGFzdF9jb250cm9sX21lc3NhZ2V8d2luMzJfcGF1c2Vfc2VydmljZXx3aW4zMl9wc19saXN0X3Byb2NzfHdpbjMyX3BzX3N0YXRfbWVtfHdpbjMyX3BzX3N0YXRfcHJvY3x3aW4zMl9xdWVyeV9zZXJ2aWNlX3N0YXR1c3x3aW4zMl9zZXRfc2VydmljZV9zdGF0dXN8d2luMzJfc3RhcnRfc2VydmljZXx3aW4zMl9zdGFydF9zZXJ2aWNlX2N0cmxfZGlzcGF0Y2hlcnx3aW4zMl9zdG9wX3NlcnZpY2V8d2luY2FjaGVfZmNhY2hlX2ZpbGVpbmZvfHdpbmNhY2hlX2ZjYWNoZV9tZW1pbmZvfHdpbmNhY2hlX2xvY2t8d2luY2FjaGVfb2NhY2hlX2ZpbGVpbmZvfHdpbmNhY2hlX29jYWNoZV9tZW1pbmZvfHdpbmNhY2hlX3JlZnJlc2hfaWZfY2hhbmdlZHx3aW5jYWNoZV9ycGxpc3RfZmlsZWluZm98d2luY2FjaGVfcnBsaXN0X21lbWluZm98d2luY2FjaGVfc2NhY2hlX2luZm98d2luY2FjaGVfc2NhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX2FkZHx3aW5jYWNoZV91Y2FjaGVfY2FzfHdpbmNhY2hlX3VjYWNoZV9jbGVhcnx3aW5jYWNoZV91Y2FjaGVfZGVjfHdpbmNhY2hlX3VjYWNoZV9kZWxldGV8d2luY2FjaGVfdWNhY2hlX2V4aXN0c3x3aW5jYWNoZV91Y2FjaGVfZ2V0fHdpbmNhY2hlX3VjYWNoZV9pbmN8d2luY2FjaGVfdWNhY2hlX2luZm98d2luY2FjaGVfdWNhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX3NldHx3aW5jYWNoZV91bmxvY2t8d29yZHdyYXB8eGF0dHJfZ2V0fHhhdHRyX2xpc3R8eGF0dHJfcmVtb3ZlfHhhdHRyX3NldHx4YXR0cl9zdXBwb3J0ZWR8eGRpZmZfZmlsZV9iZGlmZnx4ZGlmZl9maWxlX2JkaWZmX3NpemV8eGRpZmZfZmlsZV9icGF0Y2h8eGRpZmZfZmlsZV9kaWZmfHhkaWZmX2ZpbGVfZGlmZl9iaW5hcnl8eGRpZmZfZmlsZV9tZXJnZTN8eGRpZmZfZmlsZV9wYXRjaHx4ZGlmZl9maWxlX3BhdGNoX2JpbmFyeXx4ZGlmZl9maWxlX3JhYmRpZmZ8eGRpZmZfc3RyaW5nX2JkaWZmfHhkaWZmX3N0cmluZ19iZGlmZl9zaXplfHhkaWZmX3N0cmluZ19icGF0Y2h8eGRpZmZfc3RyaW5nX2RpZmZ8eGRpZmZfc3RyaW5nX2RpZmZfYmluYXJ5fHhkaWZmX3N0cmluZ19tZXJnZTN8eGRpZmZfc3RyaW5nX3BhdGNofHhkaWZmX3N0cmluZ19wYXRjaF9iaW5hcnl8eGRpZmZfc3RyaW5nX3JhYmRpZmZ8eGhwcm9mX2Rpc2FibGV8eGhwcm9mX2VuYWJsZXx4aHByb2Zfc2FtcGxlX2Rpc2FibGV8eGhwcm9mX3NhbXBsZV9lbmFibGV8eG1sX2Vycm9yX3N0cmluZ3x4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleHx4bWxfZ2V0X2N1cnJlbnRfY29sdW1uX251bWJlcnx4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXJ8eG1sX2dldF9lcnJvcl9jb2RlfHhtbF9wYXJzZXx4bWxfcGFyc2VfaW50b19zdHJ1Y3R8eG1sX3BhcnNlcl9jcmVhdGV8eG1sX3BhcnNlcl9jcmVhdGVfbnN8eG1sX3BhcnNlcl9mcmVlfHhtbF9wYXJzZXJfZ2V0X29wdGlvbnx4bWxfcGFyc2VyX3NldF9vcHRpb258eG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyfHhtbF9zZXRfZGVmYXVsdF9oYW5kbGVyfHhtbF9zZXRfZWxlbWVudF9oYW5kbGVyfHhtbF9zZXRfZW5kX25hbWVzcGFjZV9kZWNsX2hhbmRsZXJ8eG1sX3NldF9leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXJ8eG1sX3NldF9ub3RhdGlvbl9kZWNsX2hhbmRsZXJ8eG1sX3NldF9vYmplY3R8eG1sX3NldF9wcm9jZXNzaW5nX2luc3RydWN0aW9uX2hhbmRsZXJ8eG1sX3NldF9zdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyfHhtbF9zZXRfdW5wYXJzZWRfZW50aXR5X2RlY2xfaGFuZGxlcnx4bWxyZWFkZXJ8eG1scnBjX2RlY29kZXx4bWxycGNfZGVjb2RlX3JlcXVlc3R8eG1scnBjX2VuY29kZXx4bWxycGNfZW5jb2RlX3JlcXVlc3R8eG1scnBjX2dldF90eXBlfHhtbHJwY19pc19mYXVsdHx4bWxycGNfcGFyc2VfbWV0aG9kX2Rlc2NyaXB0aW9uc3x4bWxycGNfc2VydmVyX2FkZF9pbnRyb3NwZWN0aW9uX2RhdGF8eG1scnBjX3NlcnZlcl9jYWxsX21ldGhvZHx4bWxycGNfc2VydmVyX2NyZWF0ZXx4bWxycGNfc2VydmVyX2Rlc3Ryb3l8eG1scnBjX3NlcnZlcl9yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2NhbGxiYWNrfHhtbHJwY19zZXJ2ZXJfcmVnaXN0ZXJfbWV0aG9kfHhtbHJwY19zZXRfdHlwZXx4bWx3cml0ZXJfZW5kX2F0dHJpYnV0ZXx4bWx3cml0ZXJfZW5kX2NkYXRhfHhtbHdyaXRlcl9lbmRfY29tbWVudHx4bWx3cml0ZXJfZW5kX2RvY3VtZW50fHhtbHdyaXRlcl9lbmRfZHRkfHhtbHdyaXRlcl9lbmRfZHRkX2F0dGxpc3R8eG1sd3JpdGVyX2VuZF9kdGRfZWxlbWVudHx4bWx3cml0ZXJfZW5kX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX2VuZF9lbGVtZW50fHhtbHdyaXRlcl9lbmRfcGl8eG1sd3JpdGVyX2ZsdXNofHhtbHdyaXRlcl9mdWxsX2VuZF9lbGVtZW50fHhtbHdyaXRlcl9vcGVuX21lbW9yeXx4bWx3cml0ZXJfb3Blbl91cml8eG1sd3JpdGVyX291dHB1dF9tZW1vcnl8eG1sd3JpdGVyX3NldF9pbmRlbnR8eG1sd3JpdGVyX3NldF9pbmRlbnRfc3RyaW5nfHhtbHdyaXRlcl9zdGFydF9hdHRyaWJ1dGV8eG1sd3JpdGVyX3N0YXJ0X2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfc3RhcnRfY2RhdGF8eG1sd3JpdGVyX3N0YXJ0X2NvbW1lbnR8eG1sd3JpdGVyX3N0YXJ0X2RvY3VtZW50fHhtbHdyaXRlcl9zdGFydF9kdGR8eG1sd3JpdGVyX3N0YXJ0X2R0ZF9hdHRsaXN0fHhtbHdyaXRlcl9zdGFydF9kdGRfZWxlbWVudHx4bWx3cml0ZXJfc3RhcnRfZHRkX2VudGl0eXx4bWx3cml0ZXJfc3RhcnRfZWxlbWVudHx4bWx3cml0ZXJfc3RhcnRfZWxlbWVudF9uc3x4bWx3cml0ZXJfc3RhcnRfcGl8eG1sd3JpdGVyX3RleHR8eG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZXx4bWx3cml0ZXJfd3JpdGVfYXR0cmlidXRlX25zfHhtbHdyaXRlcl93cml0ZV9jZGF0YXx4bWx3cml0ZXJfd3JpdGVfY29tbWVudHx4bWx3cml0ZXJfd3JpdGVfZHRkfHhtbHdyaXRlcl93cml0ZV9kdGRfYXR0bGlzdHx4bWx3cml0ZXJfd3JpdGVfZHRkX2VsZW1lbnR8eG1sd3JpdGVyX3dyaXRlX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX3dyaXRlX2VsZW1lbnR8eG1sd3JpdGVyX3dyaXRlX2VsZW1lbnRfbnN8eG1sd3JpdGVyX3dyaXRlX3BpfHhtbHdyaXRlcl93cml0ZV9yYXd8eHBhdGhfZXZhbHx4cGF0aF9ldmFsX2V4cHJlc3Npb258eHBhdGhfbmV3X2NvbnRleHR8eHBhdGhfcmVnaXN0ZXJfbnN8eHBhdGhfcmVnaXN0ZXJfbnNfYXV0b3x4cHRyX2V2YWx8eHB0cl9uZXdfY29udGV4dHx4c2x0X2JhY2tlbmRfaW5mb3x4c2x0X2JhY2tlbmRfbmFtZXx4c2x0X2JhY2tlbmRfdmVyc2lvbnx4c2x0X2NyZWF0ZXx4c2x0X2Vycm5vfHhzbHRfZXJyb3J8eHNsdF9mcmVlfHhzbHRfZ2V0b3B0fHhzbHRfcHJvY2Vzc3x4c2x0X3NldF9iYXNlfHhzbHRfc2V0X2VuY29kaW5nfHhzbHRfc2V0X2Vycm9yX2hhbmRsZXJ8eHNsdF9zZXRfbG9nfHhzbHRfc2V0X29iamVjdHx4c2x0X3NldF9zYXhfaGFuZGxlcnx4c2x0X3NldF9zYXhfaGFuZGxlcnN8eHNsdF9zZXRfc2NoZW1lX2hhbmRsZXJ8eHNsdF9zZXRfc2NoZW1lX2hhbmRsZXJzfHhzbHRfc2V0b3B0fHhzbHRwcm9jZXNzb3J8eWFtbF9lbWl0fHlhbWxfZW1pdF9maWxlfHlhbWxfcGFyc2V8eWFtbF9wYXJzZV9maWxlfHlhbWxfcGFyc2VfdXJsfHlhel9hZGRpbmZvfHlhel9jY2xfY29uZnx5YXpfY2NsX3BhcnNlfHlhel9jbG9zZXx5YXpfY29ubmVjdHx5YXpfZGF0YWJhc2V8eWF6X2VsZW1lbnR8eWF6X2Vycm5vfHlhel9lcnJvcnx5YXpfZXN8eWF6X2VzX3Jlc3VsdHx5YXpfZ2V0X29wdGlvbnx5YXpfaGl0c3x5YXpfaXRlbW9yZGVyfHlhel9wcmVzZW50fHlhel9yYW5nZXx5YXpfcmVjb3JkfHlhel9zY2FufHlhel9zY2FuX3Jlc3VsdHx5YXpfc2NoZW1hfHlhel9zZWFyY2h8eWF6X3NldF9vcHRpb258eWF6X3NvcnR8eWF6X3N5bnRheHx5YXpfd2FpdHx5cF9hbGx8eXBfY2F0fHlwX2Vycl9zdHJpbmd8eXBfZXJybm98eXBfZmlyc3R8eXBfZ2V0X2RlZmF1bHRfZG9tYWlufHlwX21hc3Rlcnx5cF9tYXRjaHx5cF9uZXh0fHlwX29yZGVyfHplbmRfbG9nb19ndWlkfHplbmRfdGhyZWFkX2lkfHplbmRfdmVyc2lvbnx6aXBfY2xvc2V8emlwX2VudHJ5X2Nsb3NlfHppcF9lbnRyeV9jb21wcmVzc2Vkc2l6ZXx6aXBfZW50cnlfY29tcHJlc3Npb25tZXRob2R8emlwX2VudHJ5X2ZpbGVzaXplfHppcF9lbnRyeV9uYW1lfHppcF9lbnRyeV9vcGVufHppcF9lbnRyeV9yZWFkfHppcF9vcGVufHppcF9yZWFkfHppcGFyY2hpdmV8emlwYXJjaGl2ZV9hZGRlbXB0eWRpcnx6aXBhcmNoaXZlX2FkZGZpbGV8emlwYXJjaGl2ZV9hZGRmcm9tc3RyaW5nfHppcGFyY2hpdmVfY2xvc2V8emlwYXJjaGl2ZV9kZWxldGVpbmRleHx6aXBhcmNoaXZlX2RlbGV0ZW5hbWV8emlwYXJjaGl2ZV9leHRyYWN0dG98emlwYXJjaGl2ZV9nZXRhcmNoaXZlY29tbWVudHx6aXBhcmNoaXZlX2dldGNvbW1lbnRpbmRleHx6aXBhcmNoaXZlX2dldGNvbW1lbnRuYW1lfHppcGFyY2hpdmVfZ2V0ZnJvbWluZGV4fHppcGFyY2hpdmVfZ2V0ZnJvbW5hbWV8emlwYXJjaGl2ZV9nZXRuYW1laW5kZXh8emlwYXJjaGl2ZV9nZXRzdGF0dXNzdHJpbmd8emlwYXJjaGl2ZV9nZXRzdHJlYW18emlwYXJjaGl2ZV9sb2NhdGVuYW1lfHppcGFyY2hpdmVfb3Blbnx6aXBhcmNoaXZlX3JlbmFtZWluZGV4fHppcGFyY2hpdmVfcmVuYW1lbmFtZXx6aXBhcmNoaXZlX3NldENvbW1lbnROYW1lfHppcGFyY2hpdmVfc2V0YXJjaGl2ZWNvbW1lbnR8emlwYXJjaGl2ZV9zZXRjb21tZW50aW5kZXh8emlwYXJjaGl2ZV9zdGF0aW5kZXh8emlwYXJjaGl2ZV9zdGF0bmFtZXx6aXBhcmNoaXZlX3VuY2hhbmdlYWxsfHppcGFyY2hpdmVfdW5jaGFuZ2VhcmNoaXZlfHppcGFyY2hpdmVfdW5jaGFuZ2VpbmRleHx6aXBhcmNoaXZlX3VuY2hhbmdlbmFtZXx6bGliX2dldF9jb2RpbmdfdHlwZSIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoImFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNsYXNzfGNsb25lfGNvbnN0fGNvbnRpbnVlfGRlY2xhcmV8ZGVmYXVsdHxkb3xlbHNlfGVsc2VpZnxlbmRkZWNsYXJlfGVuZGZvcnxlbmRmb3JlYWNofGVuZGlmfGVuZHN3aXRjaHxlbmR3aGlsZXxleHRlbmRzfGZpbmFsfGZvcnxmb3JlYWNofGZ1bmN0aW9ufGdsb2JhbHxnb3RvfGlmfGltcGxlbWVudHN8aW50ZXJmYWNlfGluc3RhbmNlb2Z8bmFtZXNwYWNlfG5ld3xvcnxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8c3RhdGljfHN3aXRjaHx0aHJvd3x0cnl8dXNlfHZhcnx3aGlsZXx4b3IiLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCJkaWV8ZWNob3xlbXB0eXxleGl0fGV2YWx8aW5jbHVkZXxpbmNsdWRlX29uY2V8aXNzZXR8bGlzdHxyZXF1aXJlfHJlcXVpcmVfb25jZXxyZXR1cm58cHJpbnR8dW5zZXQiLnNwbGl0KCJ8IikpLGc9ZS5hcnJheVRvTWFwKCJ0cnVlfGZhbHNlfG51bGx8X19DTEFTU19ffF9fRElSX198X19GSUxFX198X19MSU5FX198X19NRVRIT0RfX3xfX0ZVTkNUSU9OX198X19OQU1FU1BBQ0VfXyIuc3BsaXQoInwiKSksaD1lLmFycmF5VG9NYXAoIiRHTE9CQUxTfCRfU0VSVkVSfCRfR0VUfCRfUE9TVHwkX0ZJTEVTfCRfUkVRVUVTVHwkX1NFU1NJT058JF9FTlZ8JF9DT09LSUV8JHBocF9lcnJvcm1zZ3wkSFRUUF9SQVdfUE9TVF9EQVRBfCRodHRwX3Jlc3BvbnNlX2hlYWRlcnwkYXJnY3wkYXJndiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoImtleV9leGlzdHN8Y2Fpcm9fbWF0cml4X2NyZWF0ZV9zY2FsZXxjYWlyb19tYXRyaXhfY3JlYXRlX3RyYW5zbGF0ZXxjYWxsX3VzZXJfbWV0aG9kfGNhbGxfdXNlcl9tZXRob2RfYXJyYXl8Y29tX2FkZHJlZnxjb21fZ2V0fGNvbV9pbnZva2V8Y29tX2lzZW51bXxjb21fbG9hZHxjb21fcmVsZWFzZXxjb21fc2V0fGNvbm5lY3Rpb25fdGltZW91dHxjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbmV3X2dsb3xjdWJyaWRfc2F2ZV90b19nbG98Y3VicmlkX3NlbmRfZ2xvfGRlZmluZV9zeXNsb2dfdmFyaWFibGVzfGRsfGVyZWd8ZXJlZ19yZXBsYWNlfGVyZWdpfGVyZWdpX3JlcGxhY2V8aHdfZG9jdW1lbnRhdHRyaWJ1dGVzfGh3X2RvY3VtZW50Ym9keXRhZ3xod19kb2N1bWVudHNpemV8aHdfb3V0cHV0ZG9jdW1lbnR8aW1hZ2VkYXNoZWRsaW5lfG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2xpZW50X2VuY29kaW5nfG1heGRiX2Nsb3NlX2xvbmdfZGF0YXxtYXhkYl9leGVjdXRlfG1heGRiX2ZldGNofG1heGRiX2dldF9tZXRhZGF0YXxtYXhkYl9wYXJhbV9jb3VudHxtYXhkYl9zZW5kX2xvbmdfZGF0YXxtY3J5cHRfZWNifG1jcnlwdF9nZW5lcmljX2VuZHxtaW1lX2NvbnRlbnRfdHlwZXxteXNxbF9jcmVhdGVkYnxteXNxbF9kYm5hbWV8bXlzcWxfZGJfcXVlcnl8bXlzcWxfZHJvcF9kYnxteXNxbF9kcm9wZGJ8bXlzcWxfZXNjYXBlX3N0cmluZ3xteXNxbF9maWVsZGZsYWdzfG15c3FsX2ZpZWxkZmxhZ3N8bXlzcWxfZmllbGRuYW1lfG15c3FsX2ZpZWxkdGFibGV8bXlzcWxfZmllbGR0eXBlfG15c3FsX2ZyZWVyZXN1bHR8bXlzcWxfbGlzdGRic3xteXNxbF9saXN0X2ZpZWxkc3xteXNxbF9saXN0ZmllbGRzfG15c3FsX2xpc3RfdGFibGVzfG15c3FsX2xpc3R0YWJsZXN8bXlzcWxfbnVtZmllbGRzfG15c3FsX251bXJvd3N8bXlzcWxfc2VsZWN0ZGJ8bXlzcWxfdGFibGVuYW1lfG15c3FsaV9iaW5kX3BhcmFtfG15c3FsaV9iaW5kX3Jlc3VsdHxteXNxbGlfZGlzYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZGlzYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZW5hYmxlX3JwbF9wYXJzZXxteXNxbGlfZXhlY3V0ZXxteXNxbGlfZmV0Y2h8bXlzcWxpX2dldF9tZXRhZGF0YXxteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcnBsX3BhcnNlX2VuYWJsZWR8bXlzcWxpX3JwbF9wcm9iZXxteXNxbGlfcnBsX3F1ZXJ5X3R5cGV8bXlzcWxpX3NlbmRfbG9uZ19kYXRhfG15c3FsaV9zZW5kX3F1ZXJ5fG15c3FsaV9zbGF2ZV9xdWVyeXxvY2liaW5kYnluYW1lfG9jaWNhbmNlbHxvY2ljbG9zZWxvYnxvY2ljb2xsYXBwZW5kfG9jaWNvbGxhc3NpZ258b2NpY29sbGFzc2lnbmVsZW18b2NpY29sbGdldGVsZW18b2NpY29sbG1heHxvY2ljb2xsc2l6ZXxvY2ljb2xsdHJpbXxvY2ljb2x1bW5pc251bGx8b2NpY29sdW1ubmFtZXxvY2ljb2x1bW5wcmVjaXNpb258b2NpY29sdW1uc2NhbGV8b2NpY29sdW1uc2l6ZXxvY2ljb2x1bW50eXBlfG9jaWNvbHVtbnR5cGVyYXd8b2NpY29tbWl0fG9jaWRlZmluZWJ5bmFtZXxvY2llcnJvcnxvY2lleGVjdXRlfG9jaWZldGNofG9jaWZldGNoaW50b3xvY2lmZXRjaHN0YXRlbWVudHxvY2lmcmVlY29sbGVjdGlvbnxvY2lmcmVlY3Vyc29yfG9jaWZyZWVkZXNjfG9jaWZyZWVzdGF0ZW1lbnR8b2NpaW50ZXJuYWxkZWJ1Z3xvY2lsb2FkbG9ifG9jaWxvZ29mZnxvY2lsb2dvbnxvY2luZXdjb2xsZWN0aW9ufG9jaW5ld2N1cnNvcnxvY2luZXdkZXNjcmlwdG9yfG9jaW5sb2dvbnxvY2ludW1jb2xzfG9jaXBhcnNlfG9jaXBsb2dvbnxvY2lyZXN1bHR8b2Npcm9sbGJhY2t8b2Npcm93Y291bnR8b2Npc2F2ZWxvYnxvY2lzYXZlbG9iZmlsZXxvY2lzZXJ2ZXJ2ZXJzaW9ufG9jaXNldHByZWZldGNofG9jaXN0YXRlbWVudHR5cGV8b2Npd3JpdGVsb2J0b2ZpbGV8b2Npd3JpdGV0ZW1wb3Jhcnlsb2J8UERGX2FkZF9hbm5vdGF0aW9ufFBERl9hZGRfYm9va21hcmt8UERGX2FkZF9sYXVuY2hsaW5rfFBERl9hZGRfbG9jYWxsaW5rfFBERl9hZGRfbm90ZXxQREZfYWRkX291dGxpbmV8UERGX2FkZF9wZGZsaW5rfFBERl9hZGRfd2VibGlua3xQREZfYXR0YWNoX2ZpbGV8UERGX2JlZ2luX3BhZ2V8UERGX2JlZ2luX3RlbXBsYXRlfFBERl9jbG9zZV9wZGl8UERGX2Nsb3NlfFBERl9maW5kZm9udHxQREZfZ2V0X2ZvbnR8UERGX2dldF9mb250bmFtZXxQREZfZ2V0X2ZvbnRzaXplfFBERl9nZXRfaW1hZ2VfaGVpZ2h0fFBERl9nZXRfaW1hZ2Vfd2lkdGh8UERGX2dldF9tYWpvcnZlcnNpb258UERGX2dldF9taW5vcnZlcnNpb258UERGX2dldF9wZGlfcGFyYW1ldGVyfFBERl9nZXRfcGRpX3ZhbHVlfFBERl9vcGVuX2NjaXR0fFBERl9vcGVuX2ZpbGV8UERGX29wZW5fZ2lmfFBERl9vcGVuX2ltYWdlX2ZpbGV8UERGX29wZW5faW1hZ2V8UERGX29wZW5fanBlZ3xQREZfb3Blbl9wZGl8UERGX29wZW5fdGlmZnxQREZfcGxhY2VfaW1hZ2V8UERGX3BsYWNlX3BkaV9wYWdlfFBERl9zZXRfYm9yZGVyX2NvbG9yfFBERl9zZXRfYm9yZGVyX2Rhc2h8UERGX3NldF9ib3JkZXJfc3R5bGV8UERGX3NldF9jaGFyX3NwYWNpbmd8UERGX3NldF9kdXJhdGlvbnxQREZfc2V0X2hvcml6X3NjYWxpbmd8UERGX3NldF9pbmZvX2F1dGhvcnxQREZfc2V0X2luZm9fY3JlYXRvcnxQREZfc2V0X2luZm9fa2V5d29yZHN8UERGX3NldF9pbmZvX3N1YmplY3R8UERGX3NldF9pbmZvX3RpdGxlfFBERl9zZXRfbGVhZGluZ3xQREZfc2V0X3RleHRfbWF0cml4fFBERl9zZXRfdGV4dF9yZW5kZXJpbmd8UERGX3NldF90ZXh0X3Jpc2V8UERGX3NldF93b3JkX3NwYWNpbmd8UERGX3NldGdyYXlfZmlsbHxQREZfc2V0Z3JheV9zdHJva2V8UERGX3NldGdyYXl8UERGX3NldHBvbHlkYXNofFBERl9zZXRyZ2Jjb2xvcl9maWxsfFBERl9zZXRyZ2Jjb2xvcl9zdHJva2V8UERGX3NldHJnYmNvbG9yfFBERl9zaG93X2JveGVkfHBocF9jaGVja19zeW50YXh8cHhfc2V0X3RhYmxlbmFtZXxweF9zZXRfdGFyZ2V0ZW5jb2Rpbmd8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8c2Vzc2lvbl9pc19yZWdpc3RlcmVkfHNlc3Npb25fcmVnaXN0ZXJ8c2Vzc2lvbl91bnJlZ2lzdGVyc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lfG1hZ2ljX3F1b3Rlc19ydW50aW1lfHNldF9zb2NrZXRfYmxvY2tpbmd8c29ja2V0X3NldF9ibG9ja2luZ3xzZXRfc29ja2V0X3RpbWVvdXR8c29ja2V0X3NldF90aW1lb3V0fHNwbGl0fHNwbGl0aXxzcWxfcmVnY2FzZSIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNmdW5jdGlvbnxvbGRfZnVuY3Rpb24iLnNwbGl0KCJ8IikpLGs9ZS5hcnJheVRvTWFwKFtdKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoic3VwcG9ydC5waHBfdGFnIixyZWdleDoiPFxcPyg/OnBocHxcXD0pIn0se3Rva2VuOiJzdXBwb3J0LnBocF90YWciLHJlZ2V4OiJcXD8+In0se3Rva2VuOiJjb21tZW50IixyZWdleDoiPFxcIS0tIixuZXh0OiJodG1sY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8c3R5bGUiLG5leHQ6ImNzcyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvP1stX2EtekEtWjAtOTpdKyIsbmV4dDoiaHRtbHRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8IURPQ1RZUEUuKj8+In0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LGEuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVtnaW15XSpcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlIixyZWdleDoiXFxiKD86REVGQVVMVF9JTkNMVURFX1BBVEh8RV8oPzpBTEx8Q08oPzpNUElMRV8oPzpFUlJPUnxXQVJOSU5HKXxSRV8oPzpFUlJPUnxXQVJOSU5HKSl8RVJST1J8Tk9USUNFfFBBUlNFfFNUUklDVHxVU0VSXyg/OkVSUk9SfE5PVElDRXxXQVJOSU5HKXxXQVJOSU5HKXxQKD86RUFSXyg/OkVYVEVOU0lPTl9ESVJ8SU5TVEFMTF9ESVIpfEhQXyg/OkJJTkRJUnxDT05GSUdfRklMRV8oPzpQQVRIfFNDQU5fRElSKXxEQVRBRElSfEUoPzpPTHxYVEVOU0lPTl9ESVIpfElOVF8oPzpNQVh8U0laRSl8TCg/OklCRElSfE9DQUxTVEFURURJUil8Tyg/OlN8VVRQVVRfSEFORExFUl8oPzpDT05UfEVORHxTVEFSVCkpfFBSRUZJWHxTKD86QVBJfEhMSUJfU1VGRklYfFlTQ09ORkRJUil8VkVSU0lPTikpfF9fQ09NUElMRVJfSEFMVF9PRkZTRVRfXylcXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlIixyZWdleDoiXFxiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKXxTVEQoPzpJTnxPVVR8RVJSKSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuaGFzT3duUHJvcGVydHkoYSk/ImtleXdvcmQiOmcuaGFzT3duUHJvcGVydHkoYSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpoLmhhc093blByb3BlcnR5KGEpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ay5oYXNPd25Qcm9wZXJ0eShhKT8iaW52YWxpZC5pbGxlZ2FsIjpiLmhhc093blByb3BlcnR5KGEpPyJzdXBwb3J0LmZ1bmN0aW9uIjphPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOmEubWF0Y2goL14oXCRbYS16QS1aXVthLXpBLVowLTlfXSp8c2VsZnxwYXJlbnQpJC8pPyJ2YXJpYWJsZSI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJscGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6Ii4rIn1dLGh0bWxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixyZWdleDoiLisifV0saHRtbHRhZzpbe3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6Ij4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn1dLGNzczpbe3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6Ijwvc3R5bGU+IixuZXh0OiJodG1sdGFnIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6Ij4ifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzptZWRpYXx0eXBlfGhyZWYpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4Oic9Ii4qPyInfSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6InsiLG5leHQ6ImNzc2RlY2xhcmF0aW9uIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiI1tBLVphLXowLTktXy5dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bQS1aYS16MC05LV8uXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW0EtWmEtejAtOV0rIn1dLGNzc2RlY2xhcmF0aW9uOlt7dG9rZW46InN1cHBvcnQudHlwZSIscmVnZXg6IlstYS16QS1aXSsiLG5leHQ6ImNzc3ZhbHVlIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJ9IixuZXh0OiJjc3MifV0sY3NzdmFsdWU6W3t0b2tlbjoidGV4dCIscmVnZXg6IjoifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiI1swLTlhLXpBLVpdKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlstXzAtOWEtekEtWlwiJyAsJV0rIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiOyIsbmV4dDoiY3NzZGVjbGFyYXRpb24ifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLlBocEhpZ2hsaWdodFJ1bGVzPWh9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-powershell-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9wb3dlcnNoZWxsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9wb3dlcnNoZWxsX2hpZ2hsaWdodF9ydWxlcyIpLlBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCg0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQpkZWZpbmUoJ2FjZS9tb2RlL3Bvd2Vyc2hlbGxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICgiZnVuY3Rpb258aWZ8ZWxzZXxlbHNlaWZ8c3dpdGNofHdoaWxlfGRlZmF1bHR8Zm9yfGRvfHVudGlsfGJyZWFrfGNvbnRpbnVlfCIgKyANCiAgICAgICAiZm9yZWFjaHxyZXR1cm58ZmlsdGVyfGlufHRyYXB8dGhyb3d8cGFyYW18YmVnaW58cHJvY2Vzc3xlbmQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgKCJHZXQtQWxpYXN8SW1wb3J0LUFsaWFzfE5ldy1BbGlhc3xTZXQtQWxpYXN8R2V0LUF1dGhlbnRpY29kZVNpZ25hdHVyZXxTZXQtQXV0aGVudGljb2RlU2lnbmF0dXJlfCIgKw0KICAgICAgICJTZXQtTG9jYXRpb258R2V0LUNoaWxkSXRlbXxDbGVhci1JdGVtfEdldC1Db21tYW5kfE1lYXN1cmUtQ29tbWFuZHxUcmFjZS1Db21tYW5kfCIgKw0KICAgICAgICJBZGQtQ29tcHV0ZXJ8Q2hlY2twb2ludC1Db21wdXRlcnxSZW1vdmUtQ29tcHV0ZXJ8UmVzdGFydC1Db21wdXRlcnxSZXN0b3JlLUNvbXB1dGVyfFN0b3AtQ29tcHV0ZXJ8IiArDQogICAgICAgIlJlc2V0LUNvbXB1dGVyTWFjaGluZVBhc3N3b3JkfFRlc3QtQ29tcHV0ZXJTZWN1cmVDaGFubmVsfEFkZC1Db250ZW50fEdldC1Db250ZW50fFNldC1Db250ZW50fENsZWFyLUNvbnRlbnR8IiArDQogICAgICAgIkdldC1Db21tYW5kfEludm9rZS1Db21tYW5kfEVuYWJsZS1Db21wdXRlclJlc3RvcmV8RGlzYWJsZS1Db21wdXRlclJlc3RvcmV8R2V0LUNvbXB1dGVyUmVzdG9yZVBvaW50fFRlc3QtQ29ubmVjdGlvbnwiICsNCiAgICAgICAiQ29udmVydEZyb20tQ1NWfENvbnZlcnRUby1DU1Z8Q29udmVydFRvLUh0bWx8Q29udmVydFRvLVhtbHxDb252ZXJ0RnJvbS1TZWN1cmVTdHJpbmd8Q29udmVydFRvLVNlY3VyZVN0cmluZ3wiICsNCiAgICAgICAiQ29weS1JdGVtfEV4cG9ydC1Db3VudGVyfEdldC1Db3VudGVyfEltcG9ydC1Db3VudGVyfEdldC1DcmVkZW50aWFsfEdldC1DdWx0dXJlfCIgKw0KICAgICAgICJHZXQtQ2hpbGRJdGVtfEdldC1EYXRlfFNldC1EYXRlfFJlbW92ZS1JdGVtfENvbXBhcmUtT2JqZWN0fEdldC1FdmVudHwiICsNCiAgICAgICAiR2V0LVdpbkV2ZW50fE5ldy1FdmVudHxSZW1vdmUtRXZlbnR8VW5yZWdpc3Rlci1FdmVudHxXYWl0LUV2ZW50fENsZWFyLUV2ZW50TG9nfCIgKw0KICAgICAgICJHZXQtRXZlbnRsb2d8TGltaXQtRXZlbnRMb2d8TmV3LUV2ZW50bG9nfFJlbW92ZS1FdmVudExvZ3xTaG93LUV2ZW50TG9nfFdyaXRlLUV2ZW50TG9nfCIgKw0KICAgICAgICJHZXQtRXZlbnRTdWJzY3JpYmVyfFJlZ2lzdGVyLUVuZ2luZUV2ZW50fFJlZ2lzdGVyLU9iamVjdEV2ZW50fFJlZ2lzdGVyLVdtaUV2ZW50fEdldC1FeGVjdXRpb25Qb2xpY3l8U2V0LUV4ZWN1dGlvblBvbGljeXwiICsNCiAgICAgICAiRXhwb3J0LUFsaWFzfEV4cG9ydC1DbGl4bWx8RXhwb3J0LUNvbnNvbGV8RXhwb3J0LUNzdnxGb3JFYWNoLU9iamVjdHxGb3JtYXQtQ3VzdG9tfCIgKw0KICAgICAgICJGb3JtYXQtTGlzdHxGb3JtYXQtVGFibGV8Rm9ybWF0LVdpZGV8RXhwb3J0LUZvcm1hdERhdGF8R2V0LUZvcm1hdERhdGF8R2V0LUl0ZW18IiArDQogICAgICAgIkdldC1DaGlsZEl0ZW18R2V0LUhlbHB8QWRkLUhpc3Rvcnl8Q2xlYXItSGlzdG9yeXxHZXQtSGlzdG9yeXxJbnZva2UtSGlzdG9yeXwiICsNCiAgICAgICAiR2V0LUhvc3R8UmVhZC1Ib3N0fFdyaXRlLUhvc3R8R2V0LUhvdEZpeHxJbXBvcnQtQ2xpeG1sfEltcG9ydC1Dc3Z8IiArDQogICAgICAgIkludm9rZS1Db21tYW5kfEludm9rZS1FeHByZXNzaW9ufEdldC1JdGVtfEludm9rZS1JdGVtfE5ldy1JdGVtfFJlbW92ZS1JdGVtfCIgKw0KICAgICAgICJTZXQtSXRlbXxDbGVhci1JdGVtUHJvcGVydHl8Q29weS1JdGVtUHJvcGVydHl8R2V0LUl0ZW1Qcm9wZXJ0eXxNb3ZlLUl0ZW1Qcm9wZXJ0eXxOZXctSXRlbVByb3BlcnR5fCIgKw0KICAgICAgICJSZW1vdmUtSXRlbVByb3BlcnR5fFJlbmFtZS1JdGVtUHJvcGVydHl8U2V0LUl0ZW1Qcm9wZXJ0eXxHZXQtSm9ifFJlY2VpdmUtSm9ifFJlbW92ZS1Kb2J8IiArDQogICAgICAgIlN0YXJ0LUpvYnxTdG9wLUpvYnxXYWl0LUpvYnxTdG9wLVByb2Nlc3N8VXBkYXRlLUxpc3R8R2V0LUxvY2F0aW9ufCIgKw0KICAgICAgICJQb3AtTG9jYXRpb258UHVzaC1Mb2NhdGlvbnxTZXQtTG9jYXRpb258U2VuZC1NYWlsTWVzc2FnZXxBZGQtTWVtYmVyfEdldC1NZW1iZXJ8IiArDQogICAgICAgIk1vdmUtSXRlbXxDb21wYXJlLU9iamVjdHxHcm91cC1PYmplY3R8TWVhc3VyZS1PYmplY3R8TmV3LU9iamVjdHxTZWxlY3QtT2JqZWN0fCIgKw0KICAgICAgICJTb3J0LU9iamVjdHxXaGVyZS1PYmplY3R8T3V0LURlZmF1bHR8T3V0LUZpbGV8T3V0LUdyaWRWaWV3fE91dC1Ib3N0fCIgKw0KICAgICAgICJPdXQtTnVsbHxPdXQtUHJpbnRlcnxPdXQtU3RyaW5nfENvbnZlcnQtUGF0aHxKb2luLVBhdGh8UmVzb2x2ZS1QYXRofCIgKw0KICAgICAgICJTcGxpdC1QYXRofFRlc3QtUGF0aHxHZXQtUGZ4Y2VydGlmaWNhdGV8UG9wLUxvY2F0aW9ufFB1c2gtTG9jYXRpb258R2V0LVByb2Nlc3N8IiArDQogICAgICAgIlN0YXJ0LVByb2Nlc3N8U3RvcC1Qcm9jZXNzfFdhaXQtUHJvY2Vzc3xFbmFibGUtUFNCcmVha3BvaW50fERpc2FibGUtUFNCcmVha3BvaW50fEdldC1QU0JyZWFrcG9pbnR8IiArDQogICAgICAgIlNldC1QU0JyZWFrcG9pbnR8UmVtb3ZlLVBTQnJlYWtwb2ludHxHZXQtUFNEcml2ZXxOZXctUFNEcml2ZXxSZW1vdmUtUFNEcml2ZXxHZXQtUFNQcm92aWRlcnwiICsNCiAgICAgICAiU2V0LVBTZGVidWd8RW50ZXItUFNTZXNzaW9ufEV4aXQtUFNTZXNzaW9ufEV4cG9ydC1QU1Nlc3Npb258R2V0LVBTU2Vzc2lvbnxJbXBvcnQtUFNTZXNzaW9ufCIgKw0KICAgICAgICJOZXctUFNTZXNzaW9ufFJlbW92ZS1QU1Nlc3Npb258RGlzYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEVuYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEdldC1QU1Nlc3Npb25Db25maWd1cmF0aW9ufFJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258IiArDQogICAgICAgIlNldC1QU1Nlc3Npb25Db25maWd1cmF0aW9ufFVucmVnaXN0ZXItUFNTZXNzaW9uQ29uZmlndXJhdGlvbnxOZXctUFNTZXNzaW9uT3B0aW9ufEFkZC1Qc1NuYXBJbnxHZXQtUHNTbmFwaW58UmVtb3ZlLVBTU25hcGlufCIgKw0KICAgICAgICJHZXQtUmFuZG9tfFJlYWQtSG9zdHxSZW1vdmUtSXRlbXxSZW5hbWUtSXRlbXxSZW5hbWUtSXRlbVByb3BlcnR5fFNlbGVjdC1PYmplY3R8IiArDQogICAgICAgIlNlbGVjdC1YTUx8U2VuZC1NYWlsTWVzc2FnZXxHZXQtU2VydmljZXxOZXctU2VydmljZXxSZXN0YXJ0LVNlcnZpY2V8UmVzdW1lLVNlcnZpY2V8IiArDQogICAgICAgIlNldC1TZXJ2aWNlfFN0YXJ0LVNlcnZpY2V8U3RvcC1TZXJ2aWNlfFN1c3BlbmQtU2VydmljZXxTb3J0LU9iamVjdHxTdGFydC1TbGVlcHwiICsNCiAgICAgICAiQ29udmVydEZyb20tU3RyaW5nRGF0YXxTZWxlY3QtU3RyaW5nfFRlZS1PYmplY3R8TmV3LVRpbWVzcGFufFRyYWNlLUNvbW1hbmR8R2V0LVRyYWNlc291cmNlfCIgKw0KICAgICAgICJTZXQtVHJhY2Vzb3VyY2V8U3RhcnQtVHJhbnNhY3Rpb258Q29tcGxldGUtVHJhbnNhY3Rpb258R2V0LVRyYW5zYWN0aW9ufFVzZS1UcmFuc2FjdGlvbnxVbmRvLVRyYW5zYWN0aW9ufCIgKw0KICAgICAgICJTdGFydC1UcmFuc2NyaXB0fFN0b3AtVHJhbnNjcmlwdHxBZGQtVHlwZXxVcGRhdGUtVHlwZURhdGF8R2V0LVVpY3VsdHVyZXxHZXQtVW5pcXVlfCIgKw0KICAgICAgICJVcGRhdGUtRm9ybWF0ZGF0YXxVcGRhdGUtVHlwZWRhdGF8Q2xlYXItVmFyaWFibGV8R2V0LVZhcmlhYmxlfE5ldy1WYXJpYWJsZXxSZW1vdmUtVmFyaWFibGV8IiArDQogICAgICAgIlNldC1WYXJpYWJsZXxOZXctV2ViU2VydmljZVByb3h5fFdoZXJlLU9iamVjdHxXcml0ZS1EZWJ1Z3xXcml0ZS1FcnJvcnxXcml0ZS1Ib3N0fCIgKw0KICAgICAgICJXcml0ZS1PdXRwdXR8V3JpdGUtUHJvZ3Jlc3N8V3JpdGUtVmVyYm9zZXxXcml0ZS1XYXJuaW5nfFNldC1XbWlJbnN0YW5jZXxJbnZva2UtV21pTWV0aG9kfCIgKw0KICAgICAgICJHZXQtV21pT2JqZWN0fFJlbW92ZS1XbWlPYmplY3R8Q29ubmVjdC1XU01hbnxEaXNjb25uZWN0LVdTTWFufFRlc3QtV1NNYW58SW52b2tlLVdTTWFuQWN0aW9ufCIgKw0KICAgICAgICJEaXNhYmxlLVdTTWFuQ3JlZFNTUHxFbmFibGUtV1NNYW5DcmVkU1NQfEdldC1XU01hbkNyZWRTU1B8TmV3LVdTTWFuSW5zdGFuY2V8R2V0LVdTTWFuSW5zdGFuY2V8U2V0LVdTTWFuSW5zdGFuY2V8IiArDQogICAgICAgIlJlbW92ZS1XU01hbkluc3RhbmNlfFNldC1XU01hblF1aWNrQ29uZmlnfE5ldy1XU01hblNlc3Npb25PcHRpb24iKS5zcGxpdCgifCIpKTsNCg0KICAgIHZhciBiaW5hcnlPcGVyYXRvcnNSZSA9ICJlcXxuZXxnZXxndHxsdHxsZXxsaWtlfG5vdGxpa2V8bWF0Y2h8bm90bWF0Y2h8cmVwbGFjZXxjb250YWluc3xub3Rjb250YWluc3wiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWVxfGluZXxpZ2V8aWd0fGlsZXxpbHR8aWxpa2V8aW5vdGxpa2V8aW1hdGNofGlub3RtYXRjaHxpcmVwbGFjZXxpY29udGFpbnN8aW5vdGNvbnRhaW5zfCIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc3xpc25vdHxhc3wiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kfG9yfGJhbmR8Ym9yfG5vdCI7IA0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyRdKD86W1R0XXJ1ZXxbRmZdYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlskXVtObl11bGxcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidmFyaWFibGUuaW5zdGFuY2UiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlskXVthLXpBLVpdW2EtekEtWjAtOV9dKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJFxcLV0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLSg/OiIgKyBiaW5hcnlPcGVyYXRvcnNSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiZ8XFwqfFxcK3xcXC18XFw9fFxcKz18XFwtPSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzID0gUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-powershell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9wb3dlcnNoZWxsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3Bvd2Vyc2hlbGxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMiKS5Qb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJmdW5jdGlvbnxpZnxlbHNlfGVsc2VpZnxzd2l0Y2h8d2hpbGV8ZGVmYXVsdHxmb3J8ZG98dW50aWx8YnJlYWt8Y29udGludWV8Zm9yZWFjaHxyZXR1cm58ZmlsdGVyfGlufHRyYXB8dGhyb3d8cGFyYW18YmVnaW58cHJvY2Vzc3xlbmQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJHZXQtQWxpYXN8SW1wb3J0LUFsaWFzfE5ldy1BbGlhc3xTZXQtQWxpYXN8R2V0LUF1dGhlbnRpY29kZVNpZ25hdHVyZXxTZXQtQXV0aGVudGljb2RlU2lnbmF0dXJlfFNldC1Mb2NhdGlvbnxHZXQtQ2hpbGRJdGVtfENsZWFyLUl0ZW18R2V0LUNvbW1hbmR8TWVhc3VyZS1Db21tYW5kfFRyYWNlLUNvbW1hbmR8QWRkLUNvbXB1dGVyfENoZWNrcG9pbnQtQ29tcHV0ZXJ8UmVtb3ZlLUNvbXB1dGVyfFJlc3RhcnQtQ29tcHV0ZXJ8UmVzdG9yZS1Db21wdXRlcnxTdG9wLUNvbXB1dGVyfFJlc2V0LUNvbXB1dGVyTWFjaGluZVBhc3N3b3JkfFRlc3QtQ29tcHV0ZXJTZWN1cmVDaGFubmVsfEFkZC1Db250ZW50fEdldC1Db250ZW50fFNldC1Db250ZW50fENsZWFyLUNvbnRlbnR8R2V0LUNvbW1hbmR8SW52b2tlLUNvbW1hbmR8RW5hYmxlLUNvbXB1dGVyUmVzdG9yZXxEaXNhYmxlLUNvbXB1dGVyUmVzdG9yZXxHZXQtQ29tcHV0ZXJSZXN0b3JlUG9pbnR8VGVzdC1Db25uZWN0aW9ufENvbnZlcnRGcm9tLUNTVnxDb252ZXJ0VG8tQ1NWfENvbnZlcnRUby1IdG1sfENvbnZlcnRUby1YbWx8Q29udmVydEZyb20tU2VjdXJlU3RyaW5nfENvbnZlcnRUby1TZWN1cmVTdHJpbmd8Q29weS1JdGVtfEV4cG9ydC1Db3VudGVyfEdldC1Db3VudGVyfEltcG9ydC1Db3VudGVyfEdldC1DcmVkZW50aWFsfEdldC1DdWx0dXJlfEdldC1DaGlsZEl0ZW18R2V0LURhdGV8U2V0LURhdGV8UmVtb3ZlLUl0ZW18Q29tcGFyZS1PYmplY3R8R2V0LUV2ZW50fEdldC1XaW5FdmVudHxOZXctRXZlbnR8UmVtb3ZlLUV2ZW50fFVucmVnaXN0ZXItRXZlbnR8V2FpdC1FdmVudHxDbGVhci1FdmVudExvZ3xHZXQtRXZlbnRsb2d8TGltaXQtRXZlbnRMb2d8TmV3LUV2ZW50bG9nfFJlbW92ZS1FdmVudExvZ3xTaG93LUV2ZW50TG9nfFdyaXRlLUV2ZW50TG9nfEdldC1FdmVudFN1YnNjcmliZXJ8UmVnaXN0ZXItRW5naW5lRXZlbnR8UmVnaXN0ZXItT2JqZWN0RXZlbnR8UmVnaXN0ZXItV21pRXZlbnR8R2V0LUV4ZWN1dGlvblBvbGljeXxTZXQtRXhlY3V0aW9uUG9saWN5fEV4cG9ydC1BbGlhc3xFeHBvcnQtQ2xpeG1sfEV4cG9ydC1Db25zb2xlfEV4cG9ydC1Dc3Z8Rm9yRWFjaC1PYmplY3R8Rm9ybWF0LUN1c3RvbXxGb3JtYXQtTGlzdHxGb3JtYXQtVGFibGV8Rm9ybWF0LVdpZGV8RXhwb3J0LUZvcm1hdERhdGF8R2V0LUZvcm1hdERhdGF8R2V0LUl0ZW18R2V0LUNoaWxkSXRlbXxHZXQtSGVscHxBZGQtSGlzdG9yeXxDbGVhci1IaXN0b3J5fEdldC1IaXN0b3J5fEludm9rZS1IaXN0b3J5fEdldC1Ib3N0fFJlYWQtSG9zdHxXcml0ZS1Ib3N0fEdldC1Ib3RGaXh8SW1wb3J0LUNsaXhtbHxJbXBvcnQtQ3N2fEludm9rZS1Db21tYW5kfEludm9rZS1FeHByZXNzaW9ufEdldC1JdGVtfEludm9rZS1JdGVtfE5ldy1JdGVtfFJlbW92ZS1JdGVtfFNldC1JdGVtfENsZWFyLUl0ZW1Qcm9wZXJ0eXxDb3B5LUl0ZW1Qcm9wZXJ0eXxHZXQtSXRlbVByb3BlcnR5fE1vdmUtSXRlbVByb3BlcnR5fE5ldy1JdGVtUHJvcGVydHl8UmVtb3ZlLUl0ZW1Qcm9wZXJ0eXxSZW5hbWUtSXRlbVByb3BlcnR5fFNldC1JdGVtUHJvcGVydHl8R2V0LUpvYnxSZWNlaXZlLUpvYnxSZW1vdmUtSm9ifFN0YXJ0LUpvYnxTdG9wLUpvYnxXYWl0LUpvYnxTdG9wLVByb2Nlc3N8VXBkYXRlLUxpc3R8R2V0LUxvY2F0aW9ufFBvcC1Mb2NhdGlvbnxQdXNoLUxvY2F0aW9ufFNldC1Mb2NhdGlvbnxTZW5kLU1haWxNZXNzYWdlfEFkZC1NZW1iZXJ8R2V0LU1lbWJlcnxNb3ZlLUl0ZW18Q29tcGFyZS1PYmplY3R8R3JvdXAtT2JqZWN0fE1lYXN1cmUtT2JqZWN0fE5ldy1PYmplY3R8U2VsZWN0LU9iamVjdHxTb3J0LU9iamVjdHxXaGVyZS1PYmplY3R8T3V0LURlZmF1bHR8T3V0LUZpbGV8T3V0LUdyaWRWaWV3fE91dC1Ib3N0fE91dC1OdWxsfE91dC1QcmludGVyfE91dC1TdHJpbmd8Q29udmVydC1QYXRofEpvaW4tUGF0aHxSZXNvbHZlLVBhdGh8U3BsaXQtUGF0aHxUZXN0LVBhdGh8R2V0LVBmeGNlcnRpZmljYXRlfFBvcC1Mb2NhdGlvbnxQdXNoLUxvY2F0aW9ufEdldC1Qcm9jZXNzfFN0YXJ0LVByb2Nlc3N8U3RvcC1Qcm9jZXNzfFdhaXQtUHJvY2Vzc3xFbmFibGUtUFNCcmVha3BvaW50fERpc2FibGUtUFNCcmVha3BvaW50fEdldC1QU0JyZWFrcG9pbnR8U2V0LVBTQnJlYWtwb2ludHxSZW1vdmUtUFNCcmVha3BvaW50fEdldC1QU0RyaXZlfE5ldy1QU0RyaXZlfFJlbW92ZS1QU0RyaXZlfEdldC1QU1Byb3ZpZGVyfFNldC1QU2RlYnVnfEVudGVyLVBTU2Vzc2lvbnxFeGl0LVBTU2Vzc2lvbnxFeHBvcnQtUFNTZXNzaW9ufEdldC1QU1Nlc3Npb258SW1wb3J0LVBTU2Vzc2lvbnxOZXctUFNTZXNzaW9ufFJlbW92ZS1QU1Nlc3Npb258RGlzYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEVuYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEdldC1QU1Nlc3Npb25Db25maWd1cmF0aW9ufFJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258U2V0LVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258VW5yZWdpc3Rlci1QU1Nlc3Npb25Db25maWd1cmF0aW9ufE5ldy1QU1Nlc3Npb25PcHRpb258QWRkLVBzU25hcElufEdldC1Qc1NuYXBpbnxSZW1vdmUtUFNTbmFwaW58R2V0LVJhbmRvbXxSZWFkLUhvc3R8UmVtb3ZlLUl0ZW18UmVuYW1lLUl0ZW18UmVuYW1lLUl0ZW1Qcm9wZXJ0eXxTZWxlY3QtT2JqZWN0fFNlbGVjdC1YTUx8U2VuZC1NYWlsTWVzc2FnZXxHZXQtU2VydmljZXxOZXctU2VydmljZXxSZXN0YXJ0LVNlcnZpY2V8UmVzdW1lLVNlcnZpY2V8U2V0LVNlcnZpY2V8U3RhcnQtU2VydmljZXxTdG9wLVNlcnZpY2V8U3VzcGVuZC1TZXJ2aWNlfFNvcnQtT2JqZWN0fFN0YXJ0LVNsZWVwfENvbnZlcnRGcm9tLVN0cmluZ0RhdGF8U2VsZWN0LVN0cmluZ3xUZWUtT2JqZWN0fE5ldy1UaW1lc3BhbnxUcmFjZS1Db21tYW5kfEdldC1UcmFjZXNvdXJjZXxTZXQtVHJhY2Vzb3VyY2V8U3RhcnQtVHJhbnNhY3Rpb258Q29tcGxldGUtVHJhbnNhY3Rpb258R2V0LVRyYW5zYWN0aW9ufFVzZS1UcmFuc2FjdGlvbnxVbmRvLVRyYW5zYWN0aW9ufFN0YXJ0LVRyYW5zY3JpcHR8U3RvcC1UcmFuc2NyaXB0fEFkZC1UeXBlfFVwZGF0ZS1UeXBlRGF0YXxHZXQtVWljdWx0dXJlfEdldC1VbmlxdWV8VXBkYXRlLUZvcm1hdGRhdGF8VXBkYXRlLVR5cGVkYXRhfENsZWFyLVZhcmlhYmxlfEdldC1WYXJpYWJsZXxOZXctVmFyaWFibGV8UmVtb3ZlLVZhcmlhYmxlfFNldC1WYXJpYWJsZXxOZXctV2ViU2VydmljZVByb3h5fFdoZXJlLU9iamVjdHxXcml0ZS1EZWJ1Z3xXcml0ZS1FcnJvcnxXcml0ZS1Ib3N0fFdyaXRlLU91dHB1dHxXcml0ZS1Qcm9ncmVzc3xXcml0ZS1WZXJib3NlfFdyaXRlLVdhcm5pbmd8U2V0LVdtaUluc3RhbmNlfEludm9rZS1XbWlNZXRob2R8R2V0LVdtaU9iamVjdHxSZW1vdmUtV21pT2JqZWN0fENvbm5lY3QtV1NNYW58RGlzY29ubmVjdC1XU01hbnxUZXN0LVdTTWFufEludm9rZS1XU01hbkFjdGlvbnxEaXNhYmxlLVdTTWFuQ3JlZFNTUHxFbmFibGUtV1NNYW5DcmVkU1NQfEdldC1XU01hbkNyZWRTU1B8TmV3LVdTTWFuSW5zdGFuY2V8R2V0LVdTTWFuSW5zdGFuY2V8U2V0LVdTTWFuSW5zdGFuY2V8UmVtb3ZlLVdTTWFuSW5zdGFuY2V8U2V0LVdTTWFuUXVpY2tDb25maWd8TmV3LVdTTWFuU2Vzc2lvbk9wdGlvbiIuc3BsaXQoInwiKSksYz0iZXF8bmV8Z2V8Z3R8bHR8bGV8bGlrZXxub3RsaWtlfG1hdGNofG5vdG1hdGNofHJlcGxhY2V8Y29udGFpbnN8bm90Y29udGFpbnN8aWVxfGluZXxpZ2V8aWd0fGlsZXxpbHR8aWxpa2V8aW5vdGxpa2V8aW1hdGNofGlub3RtYXRjaHxpcmVwbGFjZXxpY29udGFpbnN8aW5vdGNvbnRhaW5zfGlzfGlzbm90fGFzfGFuZHxvcnxiYW5kfGJvcnxub3QiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiJbJF0oPzpbVHRdcnVlfFtGZl1hbHNlKVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UiLHJlZ2V4OiJbJF1bTm5ddWxsXFxiIn0se3Rva2VuOiJ2YXJpYWJsZS5pbnN0YW5jZSIscmVnZXg6IlskXVthLXpBLVpdW2EtekEtWjAtOV9dKlxcYiJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8ic3VwcG9ydC5mdW5jdGlvbiI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJFxcLV0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwtKD86IitjKyIpIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiJnxcXCp8XFwrfFxcLXxcXD18XFwrPXxcXC09In0se3Rva2VuOiJscGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-python-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCioNCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQoqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KKg0KKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiogTGljZW5zZS4NCioNCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQoqDQoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KKiBBamF4Lm9yZyBCLlYuDQoqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKg0KKiBDb250cmlidXRvcihzKToNCiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KKiAgICAgIENvbGluIEdvdXJsYXkgPGNvbGluIERPVCBqIERPVCBnb3VybGF5IEFUIGdtYWlsIERPVCBjb20+DQoqDQoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQoqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQoqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQoqDQoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcHl0aG9uJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljJywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9weXRob25faGlnaGxpZ2h0X3J1bGVzIikuUHl0aG9uSGlnaGxpZ2h0UnVsZXM7DQp2YXIgUHl0aG9uRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvcHl0aG9uaWMiKS5Gb2xkTW9kZTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUHl0aG9uSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBQeXRob25Gb2xkTW9kZSgiXFw6Iik7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIjIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtcOl1ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdmFyIG91dGRlbnRzID0gew0KICAgICAgICAicGFzcyI6IDEsDQogICAgICAgICJyZXR1cm4iOiAxLA0KICAgICAgICAicmFpc2UiOiAxLA0KICAgICAgICAiYnJlYWsiOiAxLA0KICAgICAgICAiY29udGludWUiOiAxDQogICAgfTsNCiAgICANCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoaW5wdXQgIT09ICJcclxuIiAmJiBpbnB1dCAhPT0gIlxyIiAmJiBpbnB1dCAhPT0gIlxuIikNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZS50cmltKCksIHN0YXRlKS50b2tlbnM7DQogICAgICAgIA0KICAgICAgICBpZiAoIXRva2VucykNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgDQogICAgICAgIC8vIGlnbm9yZSB0cmFpbGluZyBjb21tZW50cw0KICAgICAgICBkbyB7DQogICAgICAgICAgICB2YXIgbGFzdCA9IHRva2Vucy5wb3AoKTsNCiAgICAgICAgfSB3aGlsZSAobGFzdCAmJiAobGFzdC50eXBlID09ICJjb21tZW50IiB8fCAobGFzdC50eXBlID09ICJ0ZXh0IiAmJiBsYXN0LnZhbHVlLm1hdGNoKC9eXHMrJC8pKSkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCFsYXN0KQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIChsYXN0LnR5cGUgPT0gImtleXdvcmQiICYmIG91dGRlbnRzW2xhc3QudmFsdWVdKTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICAvLyBvdXRkZW50aW5nIGluIHB5dGhvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYmVjYXVzZSBpdCBhbHdheXMgYXBwbGllcw0KICAgICAgICAvLyB0byB0aGUgbmV4dCBsaW5lIGFuZCBvbmx5IG9mIGEgbmV3IGxpbmUgaXMgaW5zZXJ0ZWQNCiAgICAgICAgDQogICAgICAgIHJvdyArPSAxOw0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKHJvdykpOw0KICAgICAgICB2YXIgdGFiID0gZG9jLmdldFRhYlN0cmluZygpOw0KICAgICAgICBpZiAoaW5kZW50LnNsaWNlKC10YWIubGVuZ3RoKSA9PSB0YWIpDQogICAgICAgICAgICBkb2MucmVtb3ZlKG5ldyBSYW5nZShyb3csIGluZGVudC5sZW5ndGgtdGFiLmxlbmd0aCwgcm93LCBpbmRlbnQubGVuZ3RoKSk7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgQ29saW4gR291cmxheSA8Y29saW4gRE9UIGogRE9UIGdvdXJsYXkgQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKg0KICoNCiAqIFRPRE86IHB5dGhvbiBkZWxpbWl0ZXJzDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9weXRob25faGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYW5kfGFzfGFzc2VydHxicmVha3xjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3wiICsNCiAgICAgICAgImZpbmFsbHl8Zm9yfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpc3xsYW1iZGF8bm90fG9yfHBhc3N8cHJpbnR8IiArDQogICAgICAgICJyYWlzZXxyZXR1cm58dHJ5fHdoaWxlfHdpdGh8eWllbGQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIlRydWV8RmFsc2V8Tm9uZXxOb3RJbXBsZW1lbnRlZHxFbGxpcHNpc3xfX2RlYnVnX18iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFic3xkaXZtb2R8aW5wdXR8b3BlbnxzdGF0aWNtZXRob2R8YWxsfGVudW1lcmF0ZXxpbnR8b3JkfHN0cnxhbnl8IiArDQogICAgICAgICJldmFsfGlzaW5zdGFuY2V8cG93fHN1bXxiYXNlc3RyaW5nfGV4ZWNmaWxlfGlzc3ViY2xhc3N8cHJpbnR8c3VwZXJ8IiArDQogICAgICAgICJiaW5maWxlfGl0ZXJ8cHJvcGVydHl8dHVwbGV8Ym9vbHxmaWx0ZXJ8bGVufHJhbmdlfHR5cGV8Ynl0ZWFycmF5fCIgKw0KICAgICAgICAiZmxvYXR8bGlzdHxyYXdfaW5wdXR8dW5pY2hyfGNhbGxhYmxlfGZvcm1hdHxsb2NhbHN8cmVkdWNlfHVuaWNvZGV8IiArDQogICAgICAgICJjaHJ8ZnJvemVuc2V0fGxvbmd8cmVsb2FkfHZhcnN8Y2xhc3NtZXRob2R8Z2V0YXR0cnxtYXB8cmVwcnx4cmFuZ2V8IiArDQogICAgICAgICJjbXB8Z2xvYmFsc3xtYXh8cmV2ZXJzZWR8emlwfGNvbXBpbGV8aGFzYXR0cnxtZW1vcnl2aWV3fHJvdW5kfCIgKw0KICAgICAgICAiX19pbXBvcnRfX3xjb21wbGV4fGhhc2h8bWlufHNldHxhcHBseXxkZWxhdHRyfGhlbHB8bmV4dHxzZXRhdHRyfCIgKw0KICAgICAgICAiYnVmZmVyfGRpY3R8aGV4fG9iamVjdHxzbGljZXxjb2VyY2V8ZGlyfGlkfG9jdHxzb3J0ZWR8aW50ZXJuIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgc3RyUHJlID0gIig/OnJ8dXx1cnxSfFV8VVJ8VXJ8dVIpPyI7DQoNCiAgICB2YXIgZGVjaW1hbEludGVnZXIgPSAiKD86KD86WzEtOV1cXGQqKXwoPzowKSkiOw0KICAgIHZhciBvY3RJbnRlZ2VyID0gIig/OjBbb09dP1swLTddKykiOw0KICAgIHZhciBoZXhJbnRlZ2VyID0gIig/OjBbeFhdW1xcZEEtRmEtZl0rKSI7DQogICAgdmFyIGJpbkludGVnZXIgPSAiKD86MFtiQl1bMDFdKykiOw0KICAgIHZhciBpbnRlZ2VyID0gIig/OiIgKyBkZWNpbWFsSW50ZWdlciArICJ8IiArIG9jdEludGVnZXIgKyAifCIgKyBoZXhJbnRlZ2VyICsgInwiICsgYmluSW50ZWdlciArICIpIjsNCg0KICAgIHZhciBleHBvbmVudCA9ICIoPzpbZUVdWystXT9cXGQrKSI7DQogICAgdmFyIGZyYWN0aW9uID0gIig/OlxcLlxcZCspIjsNCiAgICB2YXIgaW50UGFydCA9ICIoPzpcXGQrKSI7DQogICAgdmFyIHBvaW50RmxvYXQgPSAiKD86KD86IiArIGludFBhcnQgKyAiPyIgKyBmcmFjdGlvbiArICIpfCg/OiIgKyBpbnRQYXJ0ICsgIlxcLikpIjsNCiAgICB2YXIgZXhwb25lbnRGbG9hdCA9ICIoPzooPzoiICsgcG9pbnRGbG9hdCArICJ8IiArICBpbnRQYXJ0ICsgIikiICsgZXhwb25lbnQgKyAiKSI7DQogICAgdmFyIGZsb2F0TnVtYmVyID0gIig/OiIgKyBleHBvbmVudEZsb2F0ICsgInwiICsgcG9pbnRGbG9hdCArICIpIjsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAiIiIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciezN9KD86W15cXFxcXXxcXFxcLikqPyJ7M30nDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBtdWx0aSBsaW5lICIiIiBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJyJ7M30uKiQnLA0KICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciKD86W15cXFxcXXxcXFxcLikqPyInDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyAnJycgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6IHN0clByZSArICInezN9KD86W15cXFxcXXxcXFxcLikqPyd7M30iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBtdWx0aSBsaW5lICcnJyBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIid7M30uKiQiLA0KICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIicoPzpbXlxcXFxdfFxcXFwuKSo/JyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGltYWdpbmFyeQ0KICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGZsb2F0TnVtYmVyICsgInxcXGQrKVtqSl1cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgcmVnZXggOiBmbG9hdE51bWJlcg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gbG9uZyBpbnRlZ2VyDQogICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiW2xMXVxcYiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXINCiAgICAgICAgICAgIHJlZ2V4IDogaW50ZWdlciArICJcXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZGVidWdnZXIiKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICByZWdleCA6ICJcXCt8XFwtfFxcKnxcXCpcXCp8XFwvfFxcL1xcL3wlfDw8fD4+fCZ8XFx8fFxcXnx+fDx8Pnw8PXw9Pnw9PXwhPXw8Pnw9Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4ucGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcW1xcKFxce10iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICByZWdleCA6ICJbXFxdXFwpXFx9XSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9IF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgIiIiIHN0cmluZyBlbmQNCiAgICAgICAgICAgIHJlZ2V4IDogJyg/OlteXFxcXF18XFxcXC4pKj8iezN9JywNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgfSBdLA0KICAgICAgICAicXN0cmluZyIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAvLyBtdWx0aSBsaW5lICcnJyBzdHJpbmcgZW5kDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/J3szfSIsDQogICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgIH0gXQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoUHl0aG9uSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuUHl0aG9uSGlnaGxpZ2h0UnVsZXMgPSBQeXRob25IaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9weXRob25pYycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKG1hcmtlcnMpIHsNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG5ldyBSZWdFeHAoIig/OihbXFxbe10pfCgiICsgbWFya2VycyArICIpKSg/OlxccyopKD86Iy4qKT8kIik7DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIG1hdGNoLmluZGV4KTsNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRlbnRhdGlvbkJsb2NrKHNlc3Npb24sIHJvdywgbWF0Y2guaW5kZXggKyBtYXRjaFsyXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50YXRpb25CbG9jayhzZXNzaW9uLCByb3cpOw0KICAgICAgICB9DQogICAgfQ0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-python.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9weXRob24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2ZvbGRpbmcvcHl0aG9uaWMiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiKS5QeXRob25IaWdobGlnaHRSdWxlcyxoPWEoIi4vZm9sZGluZy9weXRob25pYyIpLkZvbGRNb2RlLGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGgoIlxcOiIpfTtkLmluaGVyaXRzKGosZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKikjLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiIyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnM7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCIpe3ZhciBnPWIubWF0Y2goL14uKltce1woXFtcOl1ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfTt2YXIgYT17cGFzczoxLCJyZXR1cm4iOjEscmFpc2U6MSwiYnJlYWsiOjEsImNvbnRpbnVlIjoxfTt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihiLGMsZCl7aWYoZCE9PSJcclxuIiYmZCE9PSJcciImJmQhPT0iXG4iKXJldHVybiExO3ZhciBlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGMudHJpbSgpLGIpLnRva2VucztpZighZSlyZXR1cm4hMTtkbyB2YXIgZj1lLnBvcCgpO3doaWxlKGYmJihmLnR5cGU9PSJjb21tZW50Inx8Zi50eXBlPT0idGV4dCImJmYudmFsdWUubWF0Y2goL15ccyskLykpKTtyZXR1cm4gZj9mLnR5cGU9PSJrZXl3b3JkIiYmYVtmLnZhbHVlXTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7Yys9MTt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYi5nZXRMaW5lKGMpKSxlPWIuZ2V0VGFiU3RyaW5nKCk7ZC5zbGljZSgtZS5sZW5ndGgpPT1lJiZiLnJlbW92ZShuZXcgaShjLGQubGVuZ3RoLWUubGVuZ3RoLGMsZC5sZW5ndGgpKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS9weXRob25faGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiYW5kfGFzfGFzc2VydHxicmVha3xjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3xmaW5hbGx5fGZvcnxmcm9tfGdsb2JhbHxpZnxpbXBvcnR8aW58aXN8bGFtYmRhfG5vdHxvcnxwYXNzfHByaW50fHJhaXNlfHJldHVybnx0cnl8d2hpbGV8d2l0aHx5aWVsZCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIlRydWV8RmFsc2V8Tm9uZXxOb3RJbXBsZW1lbnRlZHxFbGxpcHNpc3xfX2RlYnVnX18iLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJhYnN8ZGl2bW9kfGlucHV0fG9wZW58c3RhdGljbWV0aG9kfGFsbHxlbnVtZXJhdGV8aW50fG9yZHxzdHJ8YW55fGV2YWx8aXNpbnN0YW5jZXxwb3d8c3VtfGJhc2VzdHJpbmd8ZXhlY2ZpbGV8aXNzdWJjbGFzc3xwcmludHxzdXBlcnxiaW5maWxlfGl0ZXJ8cHJvcGVydHl8dHVwbGV8Ym9vbHxmaWx0ZXJ8bGVufHJhbmdlfHR5cGV8Ynl0ZWFycmF5fGZsb2F0fGxpc3R8cmF3X2lucHV0fHVuaWNocnxjYWxsYWJsZXxmb3JtYXR8bG9jYWxzfHJlZHVjZXx1bmljb2RlfGNocnxmcm96ZW5zZXR8bG9uZ3xyZWxvYWR8dmFyc3xjbGFzc21ldGhvZHxnZXRhdHRyfG1hcHxyZXByfHhyYW5nZXxjbXB8Z2xvYmFsc3xtYXh8cmV2ZXJzZWR8emlwfGNvbXBpbGV8aGFzYXR0cnxtZW1vcnl2aWV3fHJvdW5kfF9faW1wb3J0X198Y29tcGxleHxoYXNofG1pbnxzZXR8YXBwbHl8ZGVsYXR0cnxoZWxwfG5leHR8c2V0YXR0cnxidWZmZXJ8ZGljdHxoZXh8b2JqZWN0fHNsaWNlfGNvZXJjZXxkaXJ8aWR8b2N0fHNvcnRlZHxpbnRlcm4iLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCIiLnNwbGl0KCJ8IikpLGY9Iig/OnJ8dXx1cnxSfFV8VVJ8VXJ8dVIpPyIsZz0iKD86KD86WzEtOV1cXGQqKXwoPzowKSkiLGg9Iig/OjBbb09dP1swLTddKykiLGk9Iig/OjBbeFhdW1xcZEEtRmEtZl0rKSIsaj0iKD86MFtiQl1bMDFdKykiLGs9Iig/OiIrZysifCIraCsifCIraSsifCIraisiKSIsbD0iKD86W2VFXVsrLV0/XFxkKykiLG09Iig/OlxcLlxcZCspIixuPSIoPzpcXGQrKSIsbz0iKD86KD86IituKyI/IittKyIpfCg/OiIrbisiXFwuKSkiLHA9Iig/Oig/OiIrbysifCIrbisiKSIrbCsiKSIscT0iKD86IitwKyJ8IitvKyIpIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IiMuKiQifSx7dG9rZW46InN0cmluZyIscmVnZXg6ZisnInszfSg/OlteXFxcXF18XFxcXC4pKj8iezN9J30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OmYrJyJ7M30uKiQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmYrJyIoPzpbXlxcXFxdfFxcXFwuKSo/Iid9LHt0b2tlbjoic3RyaW5nIixyZWdleDpmKyInezN9KD86W15cXFxcXXxcXFxcLikqPyd7M30ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6ZisiJ3szfS4qJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDpmKyInKD86W15cXFxcXXxcXFxcLikqPycifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIoPzoiK3ErInxcXGQrKVtqSl1cXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OnF9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6aysiW2xMXVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6aysiXFxiIn0se3Rva2VuOmZ1bmN0aW9uKGUpe3JldHVybiBhLmhhc093blByb3BlcnR5KGUpPyJrZXl3b3JkIjpiLmhhc093blByb3BlcnR5KGUpPyJjb25zdGFudC5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShlKT8iaW52YWxpZC5pbGxlZ2FsIjpjLmhhc093blByb3BlcnR5KGUpPyJzdXBwb3J0LmZ1bmN0aW9uIjplPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcK3xcXC18XFwqfFxcKlxcKnxcXC98XFwvXFwvfCV8PDx8Pj58JnxcXHx8XFxefH58PHw+fDw9fD0+fD09fCE9fDw+fD0ifSx7dG9rZW46ImxwYXJlbi5wYXJlbiIscmVnZXg6IltcXFtcXChcXHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdXFwpXFx9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86W15cXFxcXXxcXFxcLikqPyJ7M30nLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj8nezN9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19fTtkLmluaGVyaXRzKGcsZiksYi5QeXRob25IaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxmPWIuRm9sZE1vZGU9ZnVuY3Rpb24oYSl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bmV3IFJlZ0V4cCgiKD86KFtcXFt7XSl8KCIrYSsiKSkoPzpcXHMqKSg/OiMuKik/JCIpfTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGU9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZSlyZXR1cm4gZVsxXT90aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxlWzFdLGMsZS5pbmRleCk6ZVsyXT90aGlzLmluZGVudGF0aW9uQmxvY2soYSxjLGUuaW5kZXgrZVsyXS5sZW5ndGgpOnRoaXMuaW5kZW50YXRpb25CbG9jayhhLGMpfX0uY2FsbChmLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ruby-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcnVieScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3J1YnlfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgUnVieUhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9ydWJ5X2hpZ2hsaWdodF9ydWxlcyIpLlJ1YnlIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBSdWJ5SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIjIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvcnVieV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgUnVieUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhYm9ydHxBcnJheXxhc3NlcnR8YXNzZXJ0X2VxdWFsfGFzc2VydF9ub3RfZXF1YWx8YXNzZXJ0X3NhbWV8YXNzZXJ0X25vdF9zYW1lfCIgKw0KICAgICAgICAiYXNzZXJ0X25pbHxhc3NlcnRfbm90X25pbHxhc3NlcnRfbWF0Y2h8YXNzZXJ0X25vX21hdGNofGFzc2VydF9pbl9kZWx0YXxhc3NlcnRfdGhyb3dzfCIgKyANCiAgICAgICAgImFzc2VydF9yYWlzZXxhc3NlcnRfbm90aGluZ19yYWlzZWR8YXNzZXJ0X2luc3RhbmNlX29mfGFzc2VydF9raW5kX29mfGFzc2VydF9yZXNwb25kX3RvfCIgKw0KICAgICAgICAiYXNzZXJ0X29wZXJhdG9yfGFzc2VydF9zZW5kfGFzc2VydF9kaWZmZXJlbmNlfGFzc2VydF9ub19kaWZmZXJlbmNlfGFzc2VydF9yZWNvZ25pemVzfCIgKw0KICAgICAgICAiYXNzZXJ0X2dlbmVyYXRlc3xhc3NlcnRfcmVzcG9uc2V8YXNzZXJ0X3JlZGlyZWN0ZWRfdG98YXNzZXJ0X3RlbXBsYXRlfGFzc2VydF9zZWxlY3R8IiArDQogICAgICAgICJhc3NlcnRfc2VsZWN0X2VtYWlsfGFzc2VydF9zZWxlY3RfcmpzfGFzc2VydF9zZWxlY3RfZW5jb2RlZHxjc3Nfc2VsZWN0fGF0X2V4aXR8IiArDQogICAgICAgICJhdHRyfGF0dHJfd3JpdGVyfGF0dHJfcmVhZGVyfGF0dHJfYWNjZXNzb3J8YXR0cl9hY2Nlc3NpYmxlfGF1dG9sb2FkfGJpbmRpbmd8YmxvY2tfZ2l2ZW4/fGNhbGxjY3wiICsNCiAgICAgICAgImNhbGxlcnxjYXRjaHxjaG9tcHxjaG9tcCF8Y2hvcHxjaG9wIXxkZWZpbmVkP3xkZWxldGVfdmlhX3JlZGlyZWN0fGV2YWx8ZXhlY3xleGl0fCIgKw0KICAgICAgICAiZXhpdCF8ZmFpbHxGbG9hdHxmbHVua3xmb2xsb3dfcmVkaXJlY3QhfGZvcmt8Zm9ybV9mb3J8Zm9ybV90YWd8Zm9ybWF0fGdldHN8Z2xvYmFsX3ZhcmlhYmxlc3xnc3VifCIgKw0KICAgICAgICAiZ3N1YiF8Z2V0X3ZpYV9yZWRpcmVjdHxofGhvc3QhfGh0dHBzP3xodHRwcyF8aW5jbHVkZXxJbnRlZ2VyfGxhbWJkYXxsaW5rX3RvfCIgKw0KICAgICAgICAibGlua190b191bmxlc3NfY3VycmVudHxsaW5rX3RvX2Z1bmN0aW9ufGxpbmtfdG9fcmVtb3RlfGxvYWR8bG9jYWxfdmFyaWFibGVzfGxvb3B8b3BlbnxvcGVuX3Nlc3Npb258IiArDQogICAgICAgICJwfHByaW50fHByaW50Znxwcm9jfHB1dGN8cHV0c3xwb3N0X3ZpYV9yZWRpcmVjdHxwdXRfdmlhX3JlZGlyZWN0fHJhaXNlfHJhbmR8IiArDQogICAgICAgICJyYXd8cmVhZGxpbmV8cmVhZGxpbmVzfHJlZGlyZWN0P3xyZXF1ZXN0X3ZpYV9yZWRpcmVjdHxyZXF1aXJlfHNjYW58c2VsZWN0fCIgKw0KICAgICAgICAic2V0X3RyYWNlX2Z1bmN8c2xlZXB8c3BsaXR8c3ByaW50ZnxzcmFuZHxTdHJpbmd8c3R5bGVzaGVldF9saW5rX3RhZ3xzeXNjYWxsfHN5c3RlbXxzdWJ8c3ViIXx0ZXN0fCIgKw0KICAgICAgICAidGhyb3d8dHJhY2VfdmFyfHRyYXB8dW50cmFjZV92YXJ8YXRhbjJ8Y29zfGV4cHxmcmV4cHxsZGV4cHxsb2d8bG9nMTB8c2lufHNxcnR8dGFufCIgKw0KICAgICAgICAicmVuZGVyfGphdmFzY3JpcHRfaW5jbHVkZV90YWd8Y3NyZl9tZXRhX3RhZ3xsYWJlbF90YWd8dGV4dF9maWVsZF90YWd8c3VibWl0X3RhZ3xjaGVja19ib3hfdGFnfCIgKw0KICAgICAgICAiY29udGVudF90YWd8cmFkaW9fYnV0dG9uX3RhZ3x0ZXh0X2FyZWFfdGFnfHBhc3N3b3JkX2ZpZWxkX3RhZ3xoaWRkZW5fZmllbGRfdGFnfCIgKw0KICAgICAgICAiZmllbGRzX2ZvcnxzZWxlY3RfdGFnfG9wdGlvbnNfZm9yX3NlbGVjdHxvcHRpb25zX2Zyb21fY29sbGVjdGlvbl9mb3Jfc2VsZWN0fGNvbGxlY3Rpb25fc2VsZWN0fCIgKw0KICAgICAgICAidGltZV96b25lX3NlbGVjdHxzZWxlY3RfZGF0ZXxzZWxlY3RfdGltZXxzZWxlY3RfZGF0ZXRpbWV8ZGF0ZV9zZWxlY3R8dGltZV9zZWxlY3R8ZGF0ZXRpbWVfc2VsZWN0fCIgKw0KICAgICAgICAic2VsZWN0X3llYXJ8c2VsZWN0X21vbnRofHNlbGVjdF9kYXl8c2VsZWN0X2hvdXJ8c2VsZWN0X21pbnV0ZXxzZWxlY3Rfc2Vjb25kfGZpbGVfZmllbGRfdGFnfCIgKw0KICAgICAgICAiZmlsZV9maWVsZHxyZXNwb25kX3RvfHNraXBfYmVmb3JlX2ZpbHRlcnxhcm91bmRfZmlsdGVyfGFmdGVyX2ZpbHRlcnx2ZXJpZnl8IiArDQogICAgICAgICJwcm90ZWN0X2Zyb21fZm9yZ2VyeXxyZXNjdWVfZnJvbXxoZWxwZXJfbWV0aG9kfHJlZGlyZWN0X3RvfGJlZm9yZV9maWx0ZXJ8IiArDQogICAgICAgICJzZW5kX2RhdGF8c2VuZF9maWxlfHZhbGlkYXRlc19wcmVzZW5jZV9vZnx2YWxpZGF0ZXNfdW5pcXVlbmVzc19vZnx2YWxpZGF0ZXNfbGVuZ3RoX29mfCIgKw0KICAgICAgICAidmFsaWRhdGVzX2Zvcm1hdF9vZnx2YWxpZGF0ZXNfYWNjZXB0YW5jZV9vZnx2YWxpZGF0ZXNfYXNzb2NpYXRlZHx2YWxpZGF0ZXNfZXhjbHVzaW9uX29mfCIgKw0KICAgICAgICAidmFsaWRhdGVzX2luY2x1c2lvbl9vZnx2YWxpZGF0ZXNfbnVtZXJpY2FsaXR5X29mfHZhbGlkYXRlc193aXRofHZhbGlkYXRlc19lYWNofCIgKw0KICAgICAgICAiYXV0aGVudGljYXRlX29yX3JlcXVlc3Rfd2l0aF9odHRwX2Jhc2ljfGF1dGhlbnRpY2F0ZV9vcl9yZXF1ZXN0X3dpdGhfaHR0cF9kaWdlc3R8IiArDQogICAgICAgICJmaWx0ZXJfcGFyYW1ldGVyX2xvZ2dpbmd8bWF0Y2h8Z2V0fHBvc3R8cmVzb3VyY2VzfHJlZGlyZWN0fHNjb3BlfGFzc2VydF9yb3V0aW5nfCIgKw0KICAgICAgICAidHJhbnNsYXRlfGxvY2FsaXplfGV4dHJhY3RfbG9jYWxlX2Zyb21fdGxkfHR8bHxjYWNoZXNfcGFnZXxleHBpcmVfcGFnZXxjYWNoZXNfYWN0aW9ufGV4cGlyZV9hY3Rpb258IiArDQogICAgICAgICJjYWNoZXxleHBpcmVfZnJhZ21lbnR8ZXhwaXJlX2NhY2hlX2ZvcnxvYnNlcnZlfGNhY2hlX3N3ZWVwZXJ8IiArDQogICAgICAgICJoYXNfbWFueXxoYXNfb25lfGJlbG9uZ3NfdG98aGFzX2FuZF9iZWxvbmdzX3RvX21hbnkiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJhbGlhc3xhbmR8QkVHSU58YmVnaW58YnJlYWt8Y2FzZXxjbGFzc3xkZWZ8ZGVmaW5lZHxkb3xlbHNlfGVsc2lmfEVORHxlbmR8ZW5zdXJlfCIgKw0KICAgICAgICAiX19GSUxFX198ZmluYWxseXxmb3J8Z2VtfGlmfGlufF9fTElORV9ffG1vZHVsZXxuZXh0fG5vdHxvcnxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8IiArIA0KICAgICAgICAicmVkb3xyZXNjdWV8cmV0cnl8cmV0dXJufHN1cGVyfHRoZW58dW5kZWZ8dW5sZXNzfHVudGlsfHdoZW58d2hpbGV8eWllbGQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInRydWV8VFJVRXxmYWxzZXxGQUxTRXxuaWx8TklMfEFSR0Z8QVJHVnxEQVRBfEVOVnxSVUJZX1BMQVRGT1JNfFJVQllfUkVMRUFTRV9EQVRFfCIgKw0KICAgICAgICAiUlVCWV9WRVJTSU9OfFNUREVSUnxTVERJTnxTVERPVVR8VE9QTEVWRUxfQklORElORyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWx0aW5WYXJpYWJsZXMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiXCRERUJVR3xcJGRlZm91dHxcJEZJTEVOQU1FfFwkTE9BRF9QQVRIfFwkU0FGRXxcJHN0ZGlufFwkc3Rkb3V0fFwkc3RkZXJyfFwkVkVSQk9TRXwiICsNCiAgICAgICAgIiQhfHJvb3RfdXJsfGZsYXNofHNlc3Npb258Y29va2llc3xwYXJhbXN8cmVxdWVzdHxyZXNwb25zZXxsb2dnZXIiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4NCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkDQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIjLiokIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXlw9YmVnaW4kIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGJhY2t0aWNrIHN0cmluZw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltgXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bYF0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsIC8vIG5hbWVzcGFjZXMgYXJlbid0IHN5bWJvbHMNCiAgICAgICAgICAgICAgICByZWdleCA6ICI6OiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ2YXJpYWJsZS5pbnN0YW5jY2UiLCAvLyBpbnN0YW5jZSB2YXJpYWJsZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIkB7MSwyfSg/OlthLXpBLVpfXXxcZCkrIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlLmNsYXNzIiwgLy8gY2xhc3MgbmFtZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltBLVpdKD86W2EtekEtWl9dfFxkKSsiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc3ltYm9sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWzpdKD86W0EtWmEtel9dfFtAJF0oPz1bYS16QS1aMC05X10pKVthLXpBLVowLTlfXSpbIT0/XT8iDQogICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXSg/OlswLTlhLWZBLUZdfF8oPz1bMC05YS1mQS1GXSkpKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCg/OlxcZHxfKD89XFxkKSkqKD86KD86XFwuXFxkKD86XFxkfF8oPz1cXGQpKSopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJzZWxmIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluVmFyaWFibGVzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIl5cPWVuZCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoUnVieUhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlJ1YnlIaWdobGlnaHRSdWxlcyA9IFJ1YnlIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ruby.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9ydWJ5IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3J1YnlfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vcnVieV9oaWdobGlnaHRfcnVsZXMiKS5SdWJ5SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGh9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKSMvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIjIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS9ydWJ5X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFib3J0fEFycmF5fGFzc2VydHxhc3NlcnRfZXF1YWx8YXNzZXJ0X25vdF9lcXVhbHxhc3NlcnRfc2FtZXxhc3NlcnRfbm90X3NhbWV8YXNzZXJ0X25pbHxhc3NlcnRfbm90X25pbHxhc3NlcnRfbWF0Y2h8YXNzZXJ0X25vX21hdGNofGFzc2VydF9pbl9kZWx0YXxhc3NlcnRfdGhyb3dzfGFzc2VydF9yYWlzZXxhc3NlcnRfbm90aGluZ19yYWlzZWR8YXNzZXJ0X2luc3RhbmNlX29mfGFzc2VydF9raW5kX29mfGFzc2VydF9yZXNwb25kX3RvfGFzc2VydF9vcGVyYXRvcnxhc3NlcnRfc2VuZHxhc3NlcnRfZGlmZmVyZW5jZXxhc3NlcnRfbm9fZGlmZmVyZW5jZXxhc3NlcnRfcmVjb2duaXplc3xhc3NlcnRfZ2VuZXJhdGVzfGFzc2VydF9yZXNwb25zZXxhc3NlcnRfcmVkaXJlY3RlZF90b3xhc3NlcnRfdGVtcGxhdGV8YXNzZXJ0X3NlbGVjdHxhc3NlcnRfc2VsZWN0X2VtYWlsfGFzc2VydF9zZWxlY3RfcmpzfGFzc2VydF9zZWxlY3RfZW5jb2RlZHxjc3Nfc2VsZWN0fGF0X2V4aXR8YXR0cnxhdHRyX3dyaXRlcnxhdHRyX3JlYWRlcnxhdHRyX2FjY2Vzc29yfGF0dHJfYWNjZXNzaWJsZXxhdXRvbG9hZHxiaW5kaW5nfGJsb2NrX2dpdmVuP3xjYWxsY2N8Y2FsbGVyfGNhdGNofGNob21wfGNob21wIXxjaG9wfGNob3AhfGRlZmluZWQ/fGRlbGV0ZV92aWFfcmVkaXJlY3R8ZXZhbHxleGVjfGV4aXR8ZXhpdCF8ZmFpbHxGbG9hdHxmbHVua3xmb2xsb3dfcmVkaXJlY3QhfGZvcmt8Zm9ybV9mb3J8Zm9ybV90YWd8Zm9ybWF0fGdldHN8Z2xvYmFsX3ZhcmlhYmxlc3xnc3VifGdzdWIhfGdldF92aWFfcmVkaXJlY3R8aHxob3N0IXxodHRwcz98aHR0cHMhfGluY2x1ZGV8SW50ZWdlcnxsYW1iZGF8bGlua190b3xsaW5rX3RvX3VubGVzc19jdXJyZW50fGxpbmtfdG9fZnVuY3Rpb258bGlua190b19yZW1vdGV8bG9hZHxsb2NhbF92YXJpYWJsZXN8bG9vcHxvcGVufG9wZW5fc2Vzc2lvbnxwfHByaW50fHByaW50Znxwcm9jfHB1dGN8cHV0c3xwb3N0X3ZpYV9yZWRpcmVjdHxwdXRfdmlhX3JlZGlyZWN0fHJhaXNlfHJhbmR8cmF3fHJlYWRsaW5lfHJlYWRsaW5lc3xyZWRpcmVjdD98cmVxdWVzdF92aWFfcmVkaXJlY3R8cmVxdWlyZXxzY2FufHNlbGVjdHxzZXRfdHJhY2VfZnVuY3xzbGVlcHxzcGxpdHxzcHJpbnRmfHNyYW5kfFN0cmluZ3xzdHlsZXNoZWV0X2xpbmtfdGFnfHN5c2NhbGx8c3lzdGVtfHN1YnxzdWIhfHRlc3R8dGhyb3d8dHJhY2VfdmFyfHRyYXB8dW50cmFjZV92YXJ8YXRhbjJ8Y29zfGV4cHxmcmV4cHxsZGV4cHxsb2d8bG9nMTB8c2lufHNxcnR8dGFufHJlbmRlcnxqYXZhc2NyaXB0X2luY2x1ZGVfdGFnfGNzcmZfbWV0YV90YWd8bGFiZWxfdGFnfHRleHRfZmllbGRfdGFnfHN1Ym1pdF90YWd8Y2hlY2tfYm94X3RhZ3xjb250ZW50X3RhZ3xyYWRpb19idXR0b25fdGFnfHRleHRfYXJlYV90YWd8cGFzc3dvcmRfZmllbGRfdGFnfGhpZGRlbl9maWVsZF90YWd8ZmllbGRzX2ZvcnxzZWxlY3RfdGFnfG9wdGlvbnNfZm9yX3NlbGVjdHxvcHRpb25zX2Zyb21fY29sbGVjdGlvbl9mb3Jfc2VsZWN0fGNvbGxlY3Rpb25fc2VsZWN0fHRpbWVfem9uZV9zZWxlY3R8c2VsZWN0X2RhdGV8c2VsZWN0X3RpbWV8c2VsZWN0X2RhdGV0aW1lfGRhdGVfc2VsZWN0fHRpbWVfc2VsZWN0fGRhdGV0aW1lX3NlbGVjdHxzZWxlY3RfeWVhcnxzZWxlY3RfbW9udGh8c2VsZWN0X2RheXxzZWxlY3RfaG91cnxzZWxlY3RfbWludXRlfHNlbGVjdF9zZWNvbmR8ZmlsZV9maWVsZF90YWd8ZmlsZV9maWVsZHxyZXNwb25kX3RvfHNraXBfYmVmb3JlX2ZpbHRlcnxhcm91bmRfZmlsdGVyfGFmdGVyX2ZpbHRlcnx2ZXJpZnl8cHJvdGVjdF9mcm9tX2Zvcmdlcnl8cmVzY3VlX2Zyb218aGVscGVyX21ldGhvZHxyZWRpcmVjdF90b3xiZWZvcmVfZmlsdGVyfHNlbmRfZGF0YXxzZW5kX2ZpbGV8dmFsaWRhdGVzX3ByZXNlbmNlX29mfHZhbGlkYXRlc191bmlxdWVuZXNzX29mfHZhbGlkYXRlc19sZW5ndGhfb2Z8dmFsaWRhdGVzX2Zvcm1hdF9vZnx2YWxpZGF0ZXNfYWNjZXB0YW5jZV9vZnx2YWxpZGF0ZXNfYXNzb2NpYXRlZHx2YWxpZGF0ZXNfZXhjbHVzaW9uX29mfHZhbGlkYXRlc19pbmNsdXNpb25fb2Z8dmFsaWRhdGVzX251bWVyaWNhbGl0eV9vZnx2YWxpZGF0ZXNfd2l0aHx2YWxpZGF0ZXNfZWFjaHxhdXRoZW50aWNhdGVfb3JfcmVxdWVzdF93aXRoX2h0dHBfYmFzaWN8YXV0aGVudGljYXRlX29yX3JlcXVlc3Rfd2l0aF9odHRwX2RpZ2VzdHxmaWx0ZXJfcGFyYW1ldGVyX2xvZ2dpbmd8bWF0Y2h8Z2V0fHBvc3R8cmVzb3VyY2VzfHJlZGlyZWN0fHNjb3BlfGFzc2VydF9yb3V0aW5nfHRyYW5zbGF0ZXxsb2NhbGl6ZXxleHRyYWN0X2xvY2FsZV9mcm9tX3RsZHx0fGx8Y2FjaGVzX3BhZ2V8ZXhwaXJlX3BhZ2V8Y2FjaGVzX2FjdGlvbnxleHBpcmVfYWN0aW9ufGNhY2hlfGV4cGlyZV9mcmFnbWVudHxleHBpcmVfY2FjaGVfZm9yfG9ic2VydmV8Y2FjaGVfc3dlZXBlcnxoYXNfbWFueXxoYXNfb25lfGJlbG9uZ3NfdG98aGFzX2FuZF9iZWxvbmdzX3RvX21hbnkiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJhbGlhc3xhbmR8QkVHSU58YmVnaW58YnJlYWt8Y2FzZXxjbGFzc3xkZWZ8ZGVmaW5lZHxkb3xlbHNlfGVsc2lmfEVORHxlbmR8ZW5zdXJlfF9fRklMRV9ffGZpbmFsbHl8Zm9yfGdlbXxpZnxpbnxfX0xJTkVfX3xtb2R1bGV8bmV4dHxub3R8b3J8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZG98cmVzY3VlfHJldHJ5fHJldHVybnxzdXBlcnx0aGVufHVuZGVmfHVubGVzc3x1bnRpbHx3aGVufHdoaWxlfHlpZWxkIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgidHJ1ZXxUUlVFfGZhbHNlfEZBTFNFfG5pbHxOSUx8QVJHRnxBUkdWfERBVEF8RU5WfFJVQllfUExBVEZPUk18UlVCWV9SRUxFQVNFX0RBVEV8UlVCWV9WRVJTSU9OfFNUREVSUnxTVERJTnxTVERPVVR8VE9QTEVWRUxfQklORElORyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiRERUJVR3wkZGVmb3V0fCRGSUxFTkFNRXwkTE9BRF9QQVRIfCRTQUZFfCRzdGRpbnwkc3Rkb3V0fCRzdGRlcnJ8JFZFUkJPU0V8JCF8cm9vdF91cmx8Zmxhc2h8c2Vzc2lvbnxjb29raWVzfHBhcmFtc3xyZXF1ZXN0fHJlc3BvbnNlfGxvZ2dlciIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIjLiokIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXj1iZWdpbiQiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbYF0oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/W2BdIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiOjoifSx7dG9rZW46InZhcmlhYmxlLmluc3RhbmNjZSIscmVnZXg6IkB7MSwyfSg/OlthLXpBLVpfXXxkKSsifSx7dG9rZW46InZhcmlhYmxlLmNsYXNzIixyZWdleDoiW0EtWl0oPzpbYS16QS1aX118ZCkrIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbOl0oPzpbQS1aYS16X118W0AkXSg/PVthLXpBLVowLTlfXSkpW2EtekEtWjAtOV9dKlshPT9dPyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0oPzpbMC05YS1mQS1GXXxfKD89WzAtOWEtZkEtRl0pKSpcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCg/OlxcZHxfKD89XFxkKSkqKD86KD86XFwuXFxkKD86XFxkfF8oPz1cXGQpKSopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJzZWxmIj8idmFyaWFibGUubGFuZ3VhZ2UiOmIuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmMuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGUpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ZT09ImRlYnVnZ2VyIj8iaW52YWxpZC5kZXByZWNhdGVkIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJePWVuZCQiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19fTtkLmluaGVyaXRzKGcsZiksYi5SdWJ5SGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scad-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9zY2FkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvc2NhZF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIHNjYWRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vc2NhZF9oaWdobGlnaHRfcnVsZXMiKS5zY2FkSGlnaGxpZ2h0UnVsZXM7DQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOw0KdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IHNjYWRIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOw0KICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBHYXN0w7NuIEtsZWltYW4gPGdhc3Rvbi5rbGVpbWFuIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQmFzZWQgb24gQmVzcGluJ3MgQy9DKysgU3ludGF4IFBsdWdpbiBieSBNYXJjIE1jSW50eXJlLg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc2NhZF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIHNjYWRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIm1vZHVsZXxpZnxlbHNlfGZvciIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiTlVMTCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJzdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsIC8vIDxDT05TVEFOVD4NCiAgICAgICAgICAgICAgcmVnZXggOiAiPFthLXpBLVowLTkuXSs+Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gcHJlLWNvbXBpbGVyIGRpcmVjdGl2cw0KICAgICAgICAgICAgICByZWdleCA6ICIoPzp1c2V8aW5jbHVkZSkiDQogICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0aGlzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT18PXwhPXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxcXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwNCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsNCn07DQoNCm9vcC5pbmhlcml0cyhzY2FkSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuc2NhZEhpZ2hsaWdodFJ1bGVzID0gc2NhZEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWyB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLA0KICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMNCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiVE9ETyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4iDQogICAgICAgIH1dDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7DQoNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOw0KICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQ0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9Jykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICciJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsNCg0KICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuDQogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOw0KICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsNCiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4NCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0Lg0KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4NCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KfQ0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsNCg0KZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7DQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scad.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zY2FkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3NjYWRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vc2NhZF9oaWdobGlnaHRfcnVsZXMiKS5zY2FkSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsaz1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy4kYmVoYXZpb3VyPW5ldyBqLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBrfTtkLmluaGVyaXRzKGwsZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKilcL1wvLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLy8iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9ZS5zdGF0ZTtpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGg9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCIpcmV0dXJuIiI7dmFyIGg9Yi5tYXRjaCgvXlxzKihcLz8pXCovKTtoJiYoaFsxXSYmKGQrPSIgIiksZCs9IiogIil9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3NjYWRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJtb2R1bGV8aWZ8ZWxzZXxmb3IiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJOVUxMIi5zcGxpdCgifCIpKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJzdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IjxbYS16QS1aMC05Ll0rPiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OnVzZXxpbmNsdWRlKSJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYz09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT18PXwhPXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZiwiZG9jLSIsWyhuZXcgZikuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGgsZyksYi5zY2FkSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scala-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9zY2FsYScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFNjYWxhSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyIpLlNjYWxhSGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgSmF2YVNjcmlwdE1vZGUuY2FsbCh0aGlzKTsNCiAgICANCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBTY2FsYUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Ow0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsNCnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsNCg0KdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQoNCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsNCiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87DQoNCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7DQogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG91dGRlbnQpIHsNCiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsNCiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsNCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOw0KICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOw0KDQogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7DQogICAgICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7DQogICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7DQogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgew0KICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOw0KICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOw0KICAgICAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgew0KICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsNCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpDQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHJldHVybiB3b3JrZXI7DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsNCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzDQogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAvLyBDb25zdHJ1Y3RvcnMNCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKw0KICAgICAgLy8gRTRYDQogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKw0KICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsNCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKw0KICAgICAgLy8gRXJyb3JzDQogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArDQogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArDQogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucw0KICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArDQogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKw0KICAgICAgLy8gT3RoZXINCiAgICAgICAgIkpTT058TWF0aHwiICsNCiAgICAgIC8vIFBzZXVkbw0KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCINCiAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKw0KICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsNCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucw0KICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOw0KDQogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsNCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMNCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMNCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOw0KICAgICAgICANCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4DQogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLA0KICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcw0KICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3INCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZw0KICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nDQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleCI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiDQogICAgICAgICAgICB9LCB7DQoJCQkJLy8gZmxhZw0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIA0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJjb21tZW50IiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXFzdHJpbmciIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfTsNCiAgICANCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsDQogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICIuIg0KICAgICAgICB9XQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwNCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQNCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCg0KfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCg0KdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsNCiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFzdGFydCkNCiAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOw0KICAgICAgICAgICAgZW5kLmNvbHVtbi0tOw0KDQogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KZGVmaW5lKCdhY2UvbW9kZS9zY2FsYV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFNjYWxhSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHRha2VuIGZyb20gaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vamF2YXNlL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoDQogICAgICAgICAgICAiY2FzZXxkZWZhdWx0fGRvfGVsc2V8Zm9yfGlmfG1hdGNofHdoaWxlfHRocm93fHJldHVybnx0cnl8Y2F0Y2h8ZmluYWxseXx5aWVsZHwiICsNCiAgICAgICAgICAgICJhYnN0cmFjdHxjbGFzc3xkZWZ8ZXh0ZW5kc3xmaW5hbHxmb3JTb21lfGltcGxpY2l0fGltcGxpY2l0c3xpbXBvcnR8bGF6eXxuZXd8b2JqZWN0fCIgKw0KICAgICAgICAgICAgIm92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8c2VhbGVkfHN1cGVyfHRoaXN8dHJhaXR8dHlwZXx2YWx8dmFyfHdpdGgiDQogICAgICAgICkuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCJ0cnVlfGZhbHNlIikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIGxhbmdDbGFzc2VzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIkFic3RyYWN0TWV0aG9kRXJyb3J8QXNzZXJ0aW9uRXJyb3J8Q2xhc3NDaXJjdWxhcml0eUVycm9yfCIrDQogICAgICAgICJDbGFzc0Zvcm1hdEVycm9yfERlcHJlY2F0ZWR8RW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbnwiKw0KICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yfElsbGVnYWxBY2Nlc3NFcnJvcnwiKw0KICAgICAgICAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9ufEluc3RhbnRpYXRpb25FcnJvcnxJbnRlcm5hbEVycm9yfCIrDQoNCiAgICAgICAgIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3wiKw0KICAgICAgICAiUHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIlN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfCIrDQogICAgICAgICJVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfCIrDQogICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisNCiAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnwiKw0KICAgICAgICAiTm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnwiKw0KICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnwiKw0KICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258IisNCiAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfCIrDQogICAgICAgICJSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfCIrDQogICAgICAgICJOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufCIrDQogICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fCIrDQogICAgICAgICJDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnwiKw0KICAgICAgICAiSXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258IisNCiAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8IisNCiAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnwiKw0KICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufCIrDQogICAgICAgICJFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnwiKw0KICAgICAgICAiQ2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3R8IiArDQogICAgICAgICJVbml0fEFueXxBbnlWYWx8QW55UmVmfE51bGx8U2NhbGFPYmplY3R8U2luZ2xldG9ufFNlcXxJdGVyYWJsZXxMaXN0fCIgKw0KICAgICAgICAiT3B0aW9ufEFycmF5fENoYXJ8Qnl0ZXxTaG9ydHxJbnR8TG9uZ3xOb3RoaW5nIg0KICAgICAgICANCiAgICAgICAgKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICANCiAgICB2YXIgaW1wb3J0Q2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAgICAgKCIiKS5zcGxpdCgifCIpDQogICAgKTsNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQ0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgNCiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0Q2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBpZGVudGlmaWVycw0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKFNjYWxhSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7DQoNCmV4cG9ydHMuU2NhbGFIaWdobGlnaHRSdWxlcyA9IFNjYWxhSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scala.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zY2FsYSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvamF2YXNjcmlwdCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9zY2FsYV9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vamF2YXNjcmlwdCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyIpLlNjYWxhSGlnaGxpZ2h0UnVsZXMsaD1mdW5jdGlvbigpe2UuY2FsbCh0aGlzKSx0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKX07ZC5pbmhlcml0cyhoLGUpLGZ1bmN0aW9uKCl7dGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9fS5jYWxsKGgucHJvdG90eXBlKSxiLk1vZGU9aH0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvcmFuZ2UiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsaz1hKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsbD1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbT1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy4kYmVoYXZpb3VyPW5ldyBrLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBsfTtkLmluaGVyaXRzKG0sZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKilcL1wvLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLy8iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9ZS5zdGF0ZTtpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXt2YXIgaD1iLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pO2gmJihkKz1jKX1lbHNlIGlmKGE9PSJkb2Mtc3RhcnQiKXtpZihnPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpcmV0dXJuIiI7dmFyIGg9Yi5tYXRjaCgvXlxzKihcLz8pXCovKTtoJiYoaFsxXSYmKGQrPSIgIiksZCs9IiogIil9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaihbImFjZSJdLCJ3b3JrZXItamF2YXNjcmlwdC5qcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJqc2xpbnQiLGZ1bmN0aW9uKGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8Yi5kYXRhLmxlbmd0aDtkKyspe3ZhciBlPWIuZGF0YVtkXTtlJiZjLnB1c2goe3JvdzplLmxpbmUtMSxjb2x1bW46ZS5jaGFyYWN0ZXItMSx0ZXh0OmUucmVhc29uLHR5cGU6Indhcm5pbmciLGxpbnQ6ZX0pfWEuc2V0QW5ub3RhdGlvbnMoYyl9KSxiLm9uKCJuYXJjaXNzdXMiLGZ1bmN0aW9uKGIpe2Euc2V0QW5ub3RhdGlvbnMoW2IuZGF0YV0pfSksYi5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobS5wcm90b3R5cGUpLGIuTW9kZT1tfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3VuaWNvZGUiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4uL3VuaWNvZGUiKSxnPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxpPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHxjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIuc3BsaXQoInwiKSksYz0iY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCIsZD1lLmFycmF5VG9NYXAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIuc3BsaXQoInwiKSksaD1lLmFycmF5VG9NYXAoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLnNwbGl0KCJ8IikpLGk9ZS5hcnJheVRvTWFwKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiLnNwbGl0KCJ8IikpLGo9ZS5hcnJheVRvTWFwKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIuc3BsaXQoInwiKSksaz0iWyIrZi5wYWNrYWdlcy5MKyJcXCRfXVsiK2YucGFja2FnZXMuTCtmLnBhY2thZ2VzLk1uK2YucGFja2FnZXMuTWMrZi5wYWNrYWdlcy5OZCtmLnBhY2thZ2VzLlBjKyJcXCRfXSpcXGIiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBnKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOlsia2V5d29yZC5kZWZpbml0aW9uIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitrKyIpIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIoPzoiK2MrIilcXGIiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ZnVuY3Rpb24oYyl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoYyk/InZhcmlhYmxlLmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOmguaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQuZGVmaW5pdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6aS5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmouaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuaWxsZWdhbCI6Yz09ImRlYnVnZ2VyIj8iaW52YWxpZC5kZXByZWNhdGVkIjoiaWRlbnRpZmllciJ9LHJlZ2V4Omt9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJcXD98XFw6fFxcLHxcXDt8XFwuIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLz0/IixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXiMhLiokIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxyZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnRfcmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlxcLyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXg6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXgifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiIvXFx3KiIsbmV4dDoic3RhcnQiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbXlxcXFwvXFxbXSsiLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlxcWyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXhfY2hhcmFjdGVyX2NsYXNzOlt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJdIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJbXlxcXFxcXF1dKyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0sY29tbWVudF9yZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhnLCJkb2MtIixbKG5ldyBnKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaSxoKSxiLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcz1pfSksZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJUT0RPIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlteQFxcKl0rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6Ii4ifV19fTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLmdldFN0YXJ0UnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwvXFwqKD89XFwqKSIsbmV4dDphfX0sdGhpcy5nZXRFbmRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXCpcXC8iLG5leHQ6YX19fS5jYWxsKGYucHJvdG90eXBlKSxiLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcz1mfSksZGVmaW5lKCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlx9Ly50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcfSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ0JyYWNlT3V0ZGVudD1lfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZT1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyk7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QoZCk/InN0YXJ0IjpiPT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGQpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihhLGIsYyl7dmFyIGU9L15ccyovLGY9YixnPWIsaD1hLmdldExpbmUoYiksaT1jfHxoLmxlbmd0aCxqPWgubWF0Y2goZSlbMF0ubGVuZ3RoLGs9YS5nZXRMZW5ndGgoKTt3aGlsZSgrK2I8ayl7aD1hLmdldExpbmUoYik7dmFyIGw9aC5tYXRjaChlKVswXS5sZW5ndGg7aWYobD09aC5sZW5ndGgpY29udGludWU7aWYobDw9ailicmVhaztnPWJ9aWYoZz5mKXt2YXIgbT1hLmdldExpbmUoZykubGVuZ3RoO3JldHVybiBuZXcgZChmLGksZyxtKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj17cm93OmMsY29sdW1uOmUrMX0sZz1hLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYixmKTtpZighZylyZXR1cm47dmFyIGg9YS5mb2xkV2lkZ2V0c1tnLnJvd107cmV0dXJuIGg9PW51bGwmJihoPXRoaXMuZ2V0Rm9sZFdpZGdldChhLGcucm93KSksaD09InN0YXJ0IiYmKGcucm93LS0sZy5jb2x1bW49YS5nZXRMaW5lKGcucm93KS5sZW5ndGgpLGQuZnJvbVBvaW50cyhmLGcpfX0pKS5jYWxsKGUucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvc2NhbGFfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJjYXNlfGRlZmF1bHR8ZG98ZWxzZXxmb3J8aWZ8bWF0Y2h8d2hpbGV8dGhyb3d8cmV0dXJufHRyeXxjYXRjaHxmaW5hbGx5fHlpZWxkfGFic3RyYWN0fGNsYXNzfGRlZnxleHRlbmRzfGZpbmFsfGZvclNvbWV8aW1wbGljaXR8aW1wbGljaXRzfGltcG9ydHxsYXp5fG5ld3xvYmplY3R8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxzZWFsZWR8c3VwZXJ8dGhpc3x0cmFpdHx0eXBlfHZhbHx2YXJ8d2l0aCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoInRydWV8ZmFsc2UiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJBYnN0cmFjdE1ldGhvZEVycm9yfEFzc2VydGlvbkVycm9yfENsYXNzQ2lyY3VsYXJpdHlFcnJvcnxDbGFzc0Zvcm1hdEVycm9yfERlcHJlY2F0ZWR8RW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbnxFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J8SWxsZWdhbEFjY2Vzc0Vycm9yfElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbnxJbnN0YW50aWF0aW9uRXJyb3J8SW50ZXJuYWxFcnJvcnxOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbnxOb1N1Y2hGaWVsZEVycm9yfE92ZXJyaWRlfFByb2Nlc3N8UHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258U3VwcHJlc3NXYXJuaW5nc3xUeXBlTm90UHJlc2VudEV4Y2VwdGlvbnxVbmtub3duRXJyb3J8VW5zYXRpc2ZpZWRMaW5rRXJyb3J8VW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvcnxWZXJpZnlFcnJvcnxJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXhjZXB0aW9ufElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnxOdW1iZXJGb3JtYXRFeGNlcHRpb258U2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnxJbnRlcnJ1cHRlZEV4Y2VwdGlvbnxOb1N1Y2hNZXRob2RFeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnxVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbnxFbnVtfFN0cmljdE1hdGh8UGFja2FnZXxDb21waWxlcnxSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfE5vU3VjaE1ldGhvZEVycm9yfFRocmVhZExvY2FsfFJ1bnRpbWVQZXJtaXNzaW9ufEFyaXRobWV0aWNFeGNlcHRpb258TnVsbFBvaW50ZXJFeGNlcHRpb258TG9uZ3xJbnRlZ2VyfFNob3J0fEJ5dGV8RG91YmxlfE51bWJlcnxGbG9hdHxDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnxJdGVyYWJsZXxUaHJlYWRHcm91cHxSdW5uYWJsZXxUaHJlYWR8SWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnxTdGFja092ZXJmbG93RXJyb3J8T3V0T2ZNZW1vcnlFcnJvcnxWaXJ0dWFsTWFjaGluZUVycm9yfEFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnxOb0NsYXNzRGVmRm91bmRFcnJvcnxDbGFzc05vdEZvdW5kRXhjZXB0aW9ufFJ1bnRpbWVFeGNlcHRpb258RXhjZXB0aW9ufFRocmVhZERlYXRofEVycm9yfFRocm93YWJsZXxTeXN0ZW18Q2xhc3NMb2FkZXJ8Q2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3R8VW5pdHxBbnl8QW55VmFsfEFueVJlZnxOdWxsfFNjYWxhT2JqZWN0fFNpbmdsZXRvbnxTZXF8SXRlcmFibGV8TGlzdHxPcHRpb258QXJyYXl8Q2hhcnxCeXRlfFNob3J0fEludHxMb25nfE5vdGhpbmciLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCIiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBmKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJ0aGlzIj8idmFyaWFibGUubGFuZ3VhZ2UiOmEuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmMuaGFzT3duUHJvcGVydHkoZSk/InN1cHBvcnQuZnVuY3Rpb24iOmQuaGFzT3duUHJvcGVydHkoZSk/InN1cHBvcnQuZnVuY3Rpb24iOmIuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLlNjYWxhSGlnaGxpZ2h0UnVsZXM9aH0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scss-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc2NzcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBTY3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3Njc3NfaGlnaGxpZ2h0X3J1bGVzIikuU2Nzc0hpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgU2Nzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsNCiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsNCn07DQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsNCg0KICAgICAgICAvLyBpZ25vcmUgYnJhY2VzIGluIGNvbW1lbnRzDQogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOw0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKlx7XHMqJC8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIGluZGVudCArPSB0YWI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaW5kZW50Ow0KICAgIH07DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7DQogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFNjc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKCAoZnVuY3Rpb24gKCkgew0KDQogICAgICAgIHZhciBicm93c2VyUHJlZml4ID0gKCItd2Via2l0LXwtbW96LXwtby18LW1zLXwtc3ZnLXwtcGllLXwta2h0bWwtIikuc3BsaXQoInwiKTsNCiAgICAgICAgDQogICAgICAgIHZhciBwcmVmaXhQcm9wZXJ0aWVzID0gKCJhcHBlYXJhbmNlfGJhY2tncm91bmQtY2xpcHxiYWNrZ3JvdW5kLWlubGluZS1wb2xpY3l8YmFja2dyb3VuZC1vcmlnaW58IiArIA0KICAgICAgICAgICAgICJiYWNrZ3JvdW5kLXNpemV8YmluZGluZ3xib3JkZXItYm90dG9tLWNvbG9yc3xib3JkZXItbGVmdC1jb2xvcnN8IiArIA0KICAgICAgICAgICAgICJib3JkZXItcmlnaHQtY29sb3JzfGJvcmRlci10b3AtY29sb3JzfGJvcmRlci1lbmR8Ym9yZGVyLWVuZC1jb2xvcnwiICsgDQogICAgICAgICAgICAgImJvcmRlci1lbmQtc3R5bGV8Ym9yZGVyLWVuZC13aWR0aHxib3JkZXItaW1hZ2V8Ym9yZGVyLXN0YXJ0fCIgKyANCiAgICAgICAgICAgICAiYm9yZGVyLXN0YXJ0LWNvbG9yfGJvcmRlci1zdGFydC1zdHlsZXxib3JkZXItc3RhcnQtd2lkdGh8Ym94LWFsaWdufCIgKyANCiAgICAgICAgICAgICAiYm94LWRpcmVjdGlvbnxib3gtZmxleHxib3gtZmxleGdyb3VwfGJveC1vcmRpbmFsLWdyb3VwfGJveC1vcmllbnR8IiArIA0KICAgICAgICAgICAgICJib3gtcGFja3xib3gtc2l6aW5nfGNvbHVtbi1jb3VudHxjb2x1bW4tZ2FwfGNvbHVtbi13aWR0aHxjb2x1bW4tcnVsZXwiICsgDQogICAgICAgICAgICAgImNvbHVtbi1ydWxlLXdpZHRofGNvbHVtbi1ydWxlLXN0eWxlfGNvbHVtbi1ydWxlLWNvbG9yfGZsb2F0LWVkZ2V8IiArIA0KICAgICAgICAgICAgICJmb250LWZlYXR1cmUtc2V0dGluZ3N8Zm9udC1sYW5ndWFnZS1vdmVycmlkZXxmb3JjZS1icm9rZW4taW1hZ2UtaWNvbnwiICsgDQogICAgICAgICAgICAgImltYWdlLXJlZ2lvbnxtYXJnaW4tZW5kfG1hcmdpbi1zdGFydHxvcGFjaXR5fG91dGxpbmV8b3V0bGluZS1jb2xvcnwiICsgDQogICAgICAgICAgICAgIm91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfG91dGxpbmUtcmFkaXVzLWJvdHRvbWxlZnR8IiArIA0KICAgICAgICAgICAgICJvdXRsaW5lLXJhZGl1cy1ib3R0b21yaWdodHxvdXRsaW5lLXJhZGl1cy10b3BsZWZ0fG91dGxpbmUtcmFkaXVzLXRvcHJpZ2h0fCIgKyANCiAgICAgICAgICAgICAib3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofHBhZGRpbmctZW5kfHBhZGRpbmctc3RhcnR8c3RhY2stc2l6aW5nfCIgKyANCiAgICAgICAgICAgICAidGFiLXNpemV8dGV4dC1ibGlua3x0ZXh0LWRlY29yYXRpb24tY29sb3J8dGV4dC1kZWNvcmF0aW9uLWxpbmV8IiArIA0KICAgICAgICAgICAgICJ0ZXh0LWRlY29yYXRpb24tc3R5bGV8dHJhbnNmb3JtfHRyYW5zZm9ybS1vcmlnaW58dHJhbnNpdGlvbnwiICsgDQogICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXl8dHJhbnNpdGlvbi1kdXJhdGlvbnx0cmFuc2l0aW9uLXByb3BlcnR5fCIgKyANCiAgICAgICAgICAgICAidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb258dXNlci1mb2N1c3x1c2VyLWlucHV0fHVzZXItbW9kaWZ5fHVzZXItc2VsZWN0fCIgKw0KICAgICAgICAgICAgICJ3aW5kb3ctc2hhZG93fGJvcmRlci1yYWRpdXMiKS5zcGxpdCgifCIpOw0KICAgICAgICANCiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSAoImF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXwiICsNCiAgICAgICAgICAgICJiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsNCiAgICAgICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArDQogICAgICAgICAgICAiYm9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofCIgKw0KICAgICAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKw0KICAgICAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsNCiAgICAgICAgICAgICJib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfCIgKw0KICAgICAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArDQogICAgICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKw0KICAgICAgICAgICAgImVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXwiICsNCiAgICAgICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsNCiAgICAgICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArDQogICAgICAgICAgICAibGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8IiArDQogICAgICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKw0KICAgICAgICAgICAgIm1pbi13aWR0aHxvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnwiICsNCiAgICAgICAgICAgICJvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218IiArDQogICAgICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKw0KICAgICAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfCIgKw0KICAgICAgICAgICAgInBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvc2l0aW9ufHF1b3Rlc3xyaWNobmVzc3xyaWdodHwiICsNCiAgICAgICAgICAgICJzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfCIgKw0KICAgICAgICAgICAgInN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8IiArDQogICAgICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnwiICsNCiAgICAgICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsNCiAgICAgICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKTsNCiAgICAgICAgICANCiAgICAgICAgLy9UaGUgcmV0dXJuIGFycmF5ICAgICANCiAgICAgICAgdmFyIHJldCA9IFtdOw0KICAgICAgICANCiAgICAgICAgLy9BbGwgcHJlZml4UHJvcGVydGllcyB3aWxsIGdldCB0aGUgYnJvd3NlclByZWZpeCBpbg0KICAgICAgICAvL3RoZSBiZWduaW5nIGJ5IGpvaW4gdGhlIHByZWZpeFByb3BlcnRpZXMgYXJyYXkgd2l0aCB0aGUgdmFsdWUgb2YgYnJvd3NlclByZWZpeA0KICAgICAgICBmb3IgKHZhciBpPTAsIGxuPWJyb3dzZXJQcmVmaXgubGVuZ3RoOyBpPGxuOyBpKyspIHsNCiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KA0KICAgICAgICAgICAgICAgIHJldCwNCiAgICAgICAgICAgICAgICAoKCBicm93c2VyUHJlZml4W2ldICsgcHJlZml4UHJvcGVydGllcy5qb2luKCJ8IiArIGJyb3dzZXJQcmVmaXhbaV0pICkuc3BsaXQoInwiKSkNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vQWRkIGFsc28gcHJlZml4UHJvcGVydGllcyBhbmQgcHJvcGVydGllcyB3aXRob3V0IGFueSBicm93c2VyIHByZWZpeA0KICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXQsIHByZWZpeFByb3BlcnRpZXMpOw0KICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXQsIHByb3BlcnRpZXMpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHJldDsNCiAgICAgICAgDQogICAgfSkoKSApOw0KICAgIA0KDQoNCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImhzbHxoc2xhfHJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnN8YWJzfGFkanVzdF9jb2xvcnxhZGp1c3RfaHVlfCIgKw0KICAgICAgICAgImFscGhhfGpvaW58Ymx1ZXxjZWlsfGNoYW5nZV9jb2xvcnxjb21wYXJhYmxlfGNvbXBsZW1lbnR8ZGFya2VufGRlc2F0dXJhdGV8IiArIA0KICAgICAgICAgImZsb29yfGdyYXlzY2FsZXxncmVlbnxodWV8aWZ8aW52ZXJ0fGpvaW58bGVuZ3RofGxpZ2h0ZW58bGlnaHRuZXNzfG1peHwiICsgDQogICAgICAgICAibnRofG9wYWNpZnl8b3BhY2l0eXxwZXJjZW50YWdlfHF1b3RlfHJlZHxyb3VuZHxzYXR1cmF0ZXxzYXR1cmF0aW9ufCIgKw0KICAgICAgICAgInNjYWxlX2NvbG9yfHRyYW5zcGFyZW50aXplfHR5cGVfb2Z8dW5pdHx1bml0bGVzc3x1bnFvdXRlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgY29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsNCiAgICAgICAgImJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8IiArDQogICAgICAgICJjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfCIgKw0KICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArDQogICAgICAgICJkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfCIgKw0KICAgICAgICAiZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXwiICsNCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArDQogICAgICAgICJpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfCIgKw0KICAgICAgICAiaWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8IiArDQogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsNCiAgICAgICAgImtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfCIgKw0KICAgICAgICAibG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnwiICsNCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKw0KICAgICAgICAibnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfCIgKw0KICAgICAgICAib3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8IiArDQogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArDQogICAgICAgICJzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfCIgKw0KICAgICAgICAidGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8IiArDQogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKw0KICAgICAgICAidmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXwiICsNCiAgICAgICAgInplcm8iKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBjb2xvcnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsNCiAgICAgICAgInB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Iikuc3BsaXQoInwiKQ0KICAgICk7DQogICAgDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIkBtaXhpbnxAZXh0ZW5kfEBpbmNsdWRlfEBpbXBvcnR8QG1lZGlhfEBkZWJ1Z3xAd2FybnxAaWZ8QGZvcnxAZWFjaHxAd2hpbGV8QGVsc2V8QGZvbnQtZmFjZXxALXdlYmtpdC1rZXlmcmFtZXN8aWZ8YW5kfCFkZWZhdWx0fG1vZHVsZXxkZWZ8ZW5kfGRlY2xhcmUiKS5zcGxpdCgifCIpDQogICAgKQ0KICAgIA0KICAgIHZhciB0YWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImF8YWJicnxhY3JvbnltfGFkZHJlc3N8YXBwbGV0fGFyZWF8YXJ0aWNsZXxhc2lkZXxhdWRpb3xifGJhc2V8YmFzZWZvbnR8YmRvfCIgKyANCiAgICAgICAgICJiaWd8YmxvY2txdW90ZXxib2R5fGJyfGJ1dHRvbnxjYW52YXN8Y2FwdGlvbnxjZW50ZXJ8Y2l0ZXxjb2RlfGNvbHxjb2xncm91cHwiICsgDQogICAgICAgICAiY29tbWFuZHxkYXRhbGlzdHxkZHxkZWx8ZGV0YWlsc3xkZm58ZGlyfGRpdnxkbHxkdHxlbXxlbWJlZHxmaWVsZHNldHwiICsgDQogICAgICAgICAiZmlnY2FwdGlvbnxmaWd1cmV8Zm9udHxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoMXxoMnxoM3xoNHxoNXxoNnxoZWFkfCIgKyANCiAgICAgICAgICJoZWFkZXJ8aGdyb3VwfGhyfGh0bWx8aXxpZnJhbWV8aW1nfGlucHV0fGluc3xrZXlnZW58a2JkfGxhYmVsfGxlZ2VuZHxsaXwiICsgDQogICAgICAgICAibGlua3xtYXB8bWFya3xtZW51fG1ldGF8bWV0ZXJ8bmF2fG5vZnJhbWVzfG5vc2NyaXB0fG9iamVjdHxvbHxvcHRncm91cHwiICsgDQogICAgICAgICAib3B0aW9ufG91dHB1dHxwfHBhcmFtfHByZXxwcm9ncmVzc3xxfHJwfHJ0fHJ1Ynl8c3xzYW1wfHNjcmlwdHxzZWN0aW9ufHNlbGVjdHwiICsgDQogICAgICAgICAic21hbGx8c291cmNlfHNwYW58c3RyaWtlfHN0cm9uZ3xzdHlsZXxzdWJ8c3VtbWFyeXxzdXB8dGFibGV8dGJvZHl8dGR8IiArIA0KICAgICAgICAgInRleHRhcmVhfHRmb290fHRofHRoZWFkfHRpbWV8dGl0bGV8dHJ8dHR8dXx1bHx2YXJ8dmlkZW98d2JyfHhtcCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7DQoNCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiBudW1SZSArICIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDYgY29sb3INCiAgICAgICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17Nn0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3INCiAgICAgICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17M30iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsDQogICAgICAgICAgICAgICAgcmVnZXggOiBudW1SZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQudHlwZSI7DQogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC0/W0BhLXpfXVtAYS16MC05X1xcLV0qIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16X1xcLSRdW2EtejAtOV9cXC0kXSpcXGIiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZS5sYW5ndWFnZSIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZS5sYW5ndWFnZSIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlLmxhbmd1YWdlIiwNCiAgICAgICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwNCiAgICAgICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjx8Pnw8PXw+PXw9PXwhPXwtfCV8I3xcXCt8XFwkfFxcK3xcXCoiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQp9Ow0KDQpvb3AuaW5oZXJpdHMoU2Nzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlNjc3NIaWdobGlnaHRSdWxlcyA9IFNjc3NIaWdobGlnaHRSdWxlczsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsNCiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsNCg0KICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOw0KICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOw0KDQogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsNCg0KICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7DQogICAgfTsNCg0KICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICIiOw0KICAgIH07DQoNCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsNCiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOw0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsNCg0KICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9Ow0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoIXN0YXJ0KQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7DQogICAgICAgICAgICBlbmQuY29sdW1uLS07DQoNCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scss.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zY3NzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9zY3NzX2hpZ2hsaWdodF9ydWxlcyIpLlNjc3NIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpLCJpIiksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKS50b2tlbnM7aWYoZS5sZW5ndGgmJmVbZS5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO3ZhciBmPWIubWF0Y2goL14uKlx7XHMqJC8pO3JldHVybiBmJiYoZCs9YyksZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUvc2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKGZ1bmN0aW9uKCl7dmFyIGE9Ii13ZWJraXQtfC1tb3otfC1vLXwtbXMtfC1zdmctfC1waWUtfC1raHRtbC0iLnNwbGl0KCJ8IiksYj0iYXBwZWFyYW5jZXxiYWNrZ3JvdW5kLWNsaXB8YmFja2dyb3VuZC1pbmxpbmUtcG9saWN5fGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtc2l6ZXxiaW5kaW5nfGJvcmRlci1ib3R0b20tY29sb3JzfGJvcmRlci1sZWZ0LWNvbG9yc3xib3JkZXItcmlnaHQtY29sb3JzfGJvcmRlci10b3AtY29sb3JzfGJvcmRlci1lbmR8Ym9yZGVyLWVuZC1jb2xvcnxib3JkZXItZW5kLXN0eWxlfGJvcmRlci1lbmQtd2lkdGh8Ym9yZGVyLWltYWdlfGJvcmRlci1zdGFydHxib3JkZXItc3RhcnQtY29sb3J8Ym9yZGVyLXN0YXJ0LXN0eWxlfGJvcmRlci1zdGFydC13aWR0aHxib3gtYWxpZ258Ym94LWRpcmVjdGlvbnxib3gtZmxleHxib3gtZmxleGdyb3VwfGJveC1vcmRpbmFsLWdyb3VwfGJveC1vcmllbnR8Ym94LXBhY2t8Ym94LXNpemluZ3xjb2x1bW4tY291bnR8Y29sdW1uLWdhcHxjb2x1bW4td2lkdGh8Y29sdW1uLXJ1bGV8Y29sdW1uLXJ1bGUtd2lkdGh8Y29sdW1uLXJ1bGUtc3R5bGV8Y29sdW1uLXJ1bGUtY29sb3J8ZmxvYXQtZWRnZXxmb250LWZlYXR1cmUtc2V0dGluZ3N8Zm9udC1sYW5ndWFnZS1vdmVycmlkZXxmb3JjZS1icm9rZW4taW1hZ2UtaWNvbnxpbWFnZS1yZWdpb258bWFyZ2luLWVuZHxtYXJnaW4tc3RhcnR8b3BhY2l0eXxvdXRsaW5lfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8b3V0bGluZS1yYWRpdXMtYm90dG9tbGVmdHxvdXRsaW5lLXJhZGl1cy1ib3R0b21yaWdodHxvdXRsaW5lLXJhZGl1cy10b3BsZWZ0fG91dGxpbmUtcmFkaXVzLXRvcHJpZ2h0fG91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxwYWRkaW5nLWVuZHxwYWRkaW5nLXN0YXJ0fHN0YWNrLXNpemluZ3x0YWItc2l6ZXx0ZXh0LWJsaW5rfHRleHQtZGVjb3JhdGlvbi1jb2xvcnx0ZXh0LWRlY29yYXRpb24tbGluZXx0ZXh0LWRlY29yYXRpb24tc3R5bGV8dHJhbnNmb3JtfHRyYW5zZm9ybS1vcmlnaW58dHJhbnNpdGlvbnx0cmFuc2l0aW9uLWRlbGF5fHRyYW5zaXRpb24tZHVyYXRpb258dHJhbnNpdGlvbi1wcm9wZXJ0eXx0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbnx1c2VyLWZvY3VzfHVzZXItaW5wdXR8dXNlci1tb2RpZnl8dXNlci1zZWxlY3R8d2luZG93LXNoYWRvd3xib3JkZXItcmFkaXVzIi5zcGxpdCgifCIpLGM9ImF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8Ym9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofGJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofGJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfGJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8Y291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fGVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHxsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8bWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fG1pbi13aWR0aHxvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvc2l0aW9ufHF1b3Rlc3xyaWNobmVzc3xyaWdodHxzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfHN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8dGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnx2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3x6LWluZGV4Ii5zcGxpdCgifCIpLGQ9W107Zm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsKGFbZV0rYi5qb2luKCJ8IithW2VdKSkuc3BsaXQoInwiKSk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYiksQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZCxjKSxkfSgpKSxiPWUuYXJyYXlUb01hcCgiaHNsfGhzbGF8cmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVyc3xhYnN8YWRqdXN0X2NvbG9yfGFkanVzdF9odWV8YWxwaGF8am9pbnxibHVlfGNlaWx8Y2hhbmdlX2NvbG9yfGNvbXBhcmFibGV8Y29tcGxlbWVudHxkYXJrZW58ZGVzYXR1cmF0ZXxmbG9vcnxncmF5c2NhbGV8Z3JlZW58aHVlfGlmfGludmVydHxqb2lufGxlbmd0aHxsaWdodGVufGxpZ2h0bmVzc3xtaXh8bnRofG9wYWNpZnl8b3BhY2l0eXxwZXJjZW50YWdlfHF1b3RlfHJlZHxyb3VuZHxzYXR1cmF0ZXxzYXR1cmF0aW9ufHNjYWxlX2NvbG9yfHRyYW5zcGFyZW50aXplfHR5cGVfb2Z8dW5pdHx1bml0bGVzc3x1bnFvdXRlIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj1lLmFycmF5VG9NYXAoIkBtaXhpbnxAZXh0ZW5kfEBpbmNsdWRlfEBpbXBvcnR8QG1lZGlhfEBkZWJ1Z3xAd2FybnxAaWZ8QGZvcnxAZWFjaHxAd2hpbGV8QGVsc2V8QGZvbnQtZmFjZXxALXdlYmtpdC1rZXlmcmFtZXN8aWZ8YW5kfCFkZWZhdWx0fG1vZHVsZXxkZWZ8ZW5kfGRlY2xhcmUiLnNwbGl0KCJ8IikpLGc9ZS5hcnJheVRvTWFwKCJhfGFiYnJ8YWNyb255bXxhZGRyZXNzfGFwcGxldHxhcmVhfGFydGljbGV8YXNpZGV8YXVkaW98YnxiYXNlfGJhc2Vmb250fGJkb3xiaWd8YmxvY2txdW90ZXxib2R5fGJyfGJ1dHRvbnxjYW52YXN8Y2FwdGlvbnxjZW50ZXJ8Y2l0ZXxjb2RlfGNvbHxjb2xncm91cHxjb21tYW5kfGRhdGFsaXN0fGRkfGRlbHxkZXRhaWxzfGRmbnxkaXJ8ZGl2fGRsfGR0fGVtfGVtYmVkfGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvbnR8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aGVhZHxoZWFkZXJ8aGdyb3VwfGhyfGh0bWx8aXxpZnJhbWV8aW1nfGlucHV0fGluc3xrZXlnZW58a2JkfGxhYmVsfGxlZ2VuZHxsaXxsaW5rfG1hcHxtYXJrfG1lbnV8bWV0YXxtZXRlcnxuYXZ8bm9mcmFtZXN8bm9zY3JpcHR8b2JqZWN0fG9sfG9wdGdyb3VwfG9wdGlvbnxvdXRwdXR8cHxwYXJhbXxwcmV8cHJvZ3Jlc3N8cXxycHxydHxydWJ5fHN8c2FtcHxzY3JpcHR8c2VjdGlvbnxzZWxlY3R8c21hbGx8c291cmNlfHNwYW58c3RyaWtlfHN0cm9uZ3xzdHlsZXxzdWJ8c3VtbWFyeXxzdXB8dGFibGV8dGJvZHl8dGR8dGV4dGFyZWF8dGZvb3R8dGh8dGhlYWR8dGltZXx0aXRsZXx0cnx0dHx1fHVsfHZhcnx2aWRlb3x3YnJ8eG1wIi5zcGxpdCgifCIpKSxoPSJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpoKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4Omh9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LnR5cGUiOmYuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmMuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpiLmhhc093blByb3BlcnR5KGUpPyJzdXBwb3J0LmZ1bmN0aW9uIjpkLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuY29uc3RhbnQuY29sb3IiOmcuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8idmFyaWFibGUubGFuZ3VhZ2UiOiJ0ZXh0In0scmVnZXg6IlxcLT9bQGEtel9dW0BhLXowLTlfXFwtXSoifSx7dG9rZW46InZhcmlhYmxlIixyZWdleDoiW2Etel9cXC0kXVthLXowLTlfXFwtJF0qXFxiIn0se3Rva2VuOiJ2YXJpYWJsZS5sYW5ndWFnZSIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUubGFuZ3VhZ2UiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUubGFuZ3VhZ2UiLHJlZ2V4OiI6W2EtejAtOS1fXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW2EtejAtOS1fXSsifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI8fD58PD18Pj18PT18IT18LXwlfCN8XFwrfFxcJHxcXCt8XFwqIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuU2Nzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-sql-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCioNCiogQ29udHJpYnV0b3Iocyk6DQoqICAgICAgSm9uYXRoYW4gQ2FtaWxlIDxqb25hdGhhbi5jYW1pbGUgQVQgZ21haWwgRE9UIGNvbT4NCioNCiogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQoqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQoqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQoqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQoqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCioNCiogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9zcWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9zcWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFNxbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9zcWxfaGlnaGxpZ2h0X3J1bGVzIikuU3FsSGlnaGxpZ2h0UnVsZXM7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFNxbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQp9Ow0Kb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIG91dGVudGVkUm93cyA9IFtdOw0KICAgICAgICB2YXIgcmUgPSAvXihccyopLS0vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICItLSIpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEpvbmF0aGFuIENhbWlsZSA8am9uYXRoYW4uY2FtaWxlIEFUIGdtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9zcWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIFNxbEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQoNCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgic2VsZWN0fGZyb218d2hlcmV8YW5kfG9yfGdyb3VwfGJ5fG9yZGVyfGxpbWl0fG9mZnNldHxoYXZpbmd8YXN8Y2FzZXwiICsNCiAgICAgICAgIndoZW58ZWxzZXxlbmR8dHlwZXxsZWZ0fHJpZ2h0fGpvaW58b258b3V0ZXJ8ZGVzY3xhc2MiKS5zcGxpdCgifCIpDQogICAgKTsNCg0KICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoInRydWV8ZmFsc2V8bnVsbCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY291bnR8bWlufG1heHxhdmd8c3VtfHJhbmt8bm93fGNvYWxlc2NlIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgInN0YXJ0IiA6IFsgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsDQogICAgICAgICAgICByZWdleCA6ICItLS4qJCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nDQogICAgICAgICAgICByZWdleCA6ICciLioiJw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcNCiAgICAgICAgICAgIHJlZ2V4IDogIicuKiciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICByZWdleCA6ICJcXCt8XFwtfFxcL3xcXC9cXC98JXw8QD58QD58PEB8JnxcXF58fnw8fD58PD18PT58PT18IT18PD58PSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuLnBhcmVuIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIltcXChdIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLA0KICAgICAgICAgICAgcmVnZXggOiAiW1xcKV0iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSBdDQogICAgfTsNCn07DQoNCm9vcC5pbmhlcml0cyhTcWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5TcWxIaWdobGlnaHRSdWxlcyA9IFNxbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-sql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zcWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvc3FsX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlNxbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSl9O2QuaW5oZXJpdHMoaSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9W10sZz0vXihccyopLS0vO2Zvcih2YXIgaT1jO2k8PWQ7aSsrKWlmKCFnLnRlc3QoYi5nZXRMaW5lKGkpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaj1uZXcgaCgwLDAsMCwwKTtmb3IodmFyIGk9YztpPD1kO2krKyl7dmFyIGs9Yi5nZXRMaW5lKGkpLGw9ay5tYXRjaChnKTtqLnN0YXJ0LnJvdz1pLGouZW5kLnJvdz1pLGouZW5kLmNvbHVtbj1sWzBdLmxlbmd0aCxiLnJlcGxhY2UoaixsWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCItLSIpfX0uY2FsbChpLnByb3RvdHlwZSksYi5Nb2RlPWl9KSxkZWZpbmUoImFjZS9tb2RlL3NxbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8Z3JvdXB8Ynl8b3JkZXJ8bGltaXR8b2Zmc2V0fGhhdmluZ3xhc3xjYXNlfHdoZW58ZWxzZXxlbmR8dHlwZXxsZWZ0fHJpZ2h0fGpvaW58b258b3V0ZXJ8ZGVzY3xhc2MiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJ0cnVlfGZhbHNlfG51bGwiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJjb3VudHxtaW58bWF4fGF2Z3xzdW18cmFua3xub3d8Y29hbGVzY2UiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLS0uKiQifSx7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKiInfSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKicifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gZD1kLnRvTG93ZXJDYXNlKCksYS5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmMuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcK3xcXC18XFwvfFxcL1xcL3wlfDxAPnxAPnw8QHwmfFxcXnx+fDx8Pnw8PXw9Pnw9PXwhPXw8Pnw9In0se3Rva2VuOiJscGFyZW4ucGFyZW4iLHJlZ2V4OiJbXFwoXSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcKV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuU3FsSGlnaGxpZ2h0UnVsZXM9Z30p]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-svg-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc3ZnJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWwnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3N2Z19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBYbWxNb2RlID0gcmVxdWlyZSgiLi94bWwiKS5Nb2RlOw0KdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgU3ZnSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3N2Z19oaWdobGlnaHRfcnVsZXMiKS5TdmdIaWdobGlnaHRSdWxlczsNCnZhciBNaXhlZEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL21peGVkIikuRm9sZE1vZGU7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgWG1sTW9kZS5jYWxsKHRoaXMpOw0KICAgIA0KICAgIHRoaXMuaGlnaGxpZ2h0ZXIgPSBuZXcgU3ZnSGlnaGxpZ2h0UnVsZXMoKTsNCiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKHRoaXMuaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7DQogICAgDQogICAgdGhpcy4kZW1iZWRzID0gdGhpcy5oaWdobGlnaHRlci5nZXRFbWJlZHMoKTsNCiAgICB0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoew0KICAgICAgICAianMtIjogSmF2YVNjcmlwdE1vZGUNCiAgICB9KTsNCiAgICANCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBNaXhlZEZvbGRNb2RlKG5ldyBYbWxGb2xkTW9kZSh7fSksIHsNCiAgICAgICAgImpzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpDQogICAgfSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoTW9kZSwgWG1sTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQogICAgfTsNCiAgICANCg0KfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTW9kZSA9IE1vZGU7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3htbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7DQp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOw0KdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOw0KdmFyIFhtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlOw0KDQp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFhtbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IFhtbEJlaGF2aW91cigpOw0KICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IFhtbEZvbGRNb2RlKCk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsNCiAgICB9Ow0KDQp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Nb2RlID0gTW9kZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgeG1sVXRpbCA9IHJlcXVpcmUoIi4veG1sX3V0aWwiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcw0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCiAgICB0aGlzLiRydWxlcyA9IHsNCiAgICAgICAgc3RhcnQgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICI8XFwhXFxbQ0RBVEFcXFsiLA0KICAgICAgICAgICAgbmV4dCA6ICJjZGF0YSINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAieG1sX3BlIiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXD8uKj9cXD8+Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCEtLSIsDQogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwgLy8gb3BlbmluZyB0YWcNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/IiwNCiAgICAgICAgICAgIG5leHQgOiAidGFnIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiW148XSsiDQogICAgICAgIH1dLA0KICAgICAgICANCiAgICAgICAgY2RhdGEgOiBbew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyINCiAgICAgICAgfV0sDQoNCiAgICAgICAgY29tbWVudCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4qPy0tPiIsDQogICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICB9XQ0KICAgIH07DQogICAgDQogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsNCn07DQoNCm9vcC5pbmhlcml0cyhYbWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5YbWxIaWdobGlnaHRSdWxlcyA9IFhtbEhpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfdXRpbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQoNCnZhciBmb3JtVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoImJ1dHRvbnxmb3JtfGlucHV0fGxhYmVsfHNlbGVjdHx0ZXh0YXJlYSIpLnNwbGl0KCJ8IikNCik7DQoNCnZhciB0YWJsZVRhZ3MgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIpLnNwbGl0KCJ8IikNCik7DQoNCmZ1bmN0aW9uIHN0cmluZyhzdGF0ZSkgew0KICAgIHJldHVybiBbew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICciLio/IicNCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAnWyJdLionLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3Fxc3RyaW5nIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgcmVnZXggOiAiJy4qPyciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlsnXS4qIiwNCiAgICAgICAgbmV4dCA6IHN0YXRlICsgIl9xc3RyaW5nIg0KICAgIH1dOw0KfQ0KDQpmdW5jdGlvbiBtdWx0aUxpbmVTdHJpbmcocXVvdGUsIHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiLio/IiArIHF1b3RlLA0KICAgICAgICBuZXh0IDogc3RhdGUNCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAnLisnDQogICAgfV07DQp9DQoNCmV4cG9ydHMudGFnID0gZnVuY3Rpb24oc3RhdGVzLCBuYW1lLCBuZXh0U3RhdGUpIHsNCiAgICBzdGF0ZXNbbmFtZV0gPSBbew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9LCB7DQogICAgICAgIC8vdG9rZW4gOiAibWV0YS50YWciLA0KICAgICAgICANCiAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICBpZiAoIHZhbHVlPT09J2EnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuYW5jaG9yIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdpbWcnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuaW1hZ2UiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J3NjcmlwdCcgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5zY3JpcHQiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J3N0eWxlJyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnN0eWxlIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1UYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5mb3JtIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHRhYmxlVGFncy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcudGFibGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZyI7DQogICAgICAgICAgICB9DQogICAgICAgIH0sICAgICAgICANCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6IV0rIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiANCiAgICB9LCB7DQogICAgICAgIHRva2VuOiAiZW1wdHkiLA0KICAgICAgICByZWdleDogIiIsDQogICAgICAgIG5leHQgOiBuYW1lICsgIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCINCiAgICB9XTsNCg0KICAgIHN0YXRlc1tuYW1lICsgIl9xc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIiciLCBuYW1lICsgIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpOw0KICAgIHN0YXRlc1tuYW1lICsgIl9xcXN0cmluZyJdID0gbXVsdGlMaW5lU3RyaW5nKCJcIiIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgDQogICAgc3RhdGVzW25hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Il0gPSBbew0KICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiXC8/PiIsDQogICAgICAgIG5leHQgOiBuZXh0U3RhdGUNCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICByZWdleCA6ICI9Ig0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIiwNCiAgICAgICAgcmVnZXggOiAiWy1fYS16QS1aMC05Ol0rIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0DQogICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgfV0uY29uY2F0KHN0cmluZyhuYW1lKSk7DQp9Ow0KDQp9KTsNCi8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyOw0KdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOw0KDQp2YXIgWG1sQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KICAgIA0KICAgIHRoaXMuaW5oZXJpdChDc3R5bGVCZWhhdmlvdXIsIFsic3RyaW5nX2RxdW90ZXMiXSk7IC8vIEdldCBzdHJpbmcgYmVoYXZpb3VyDQogICAgDQogICAgdGhpcy5hZGQoImJyYWNrZXRzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJzwnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICc8PicsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJz4nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnPicpIHsgLy8gbmVlZCBzb21lIGtpbmQgb2YgbWF0Y2hpbmcgY2hlY2sgaGVyZQ0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXJzID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhcnMgPT0gJzwvJykgew0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KSkgKyBzZXNzaW9uLmdldFRhYlN0cmluZygpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQogICAgDQp9DQpvb3AuaW5oZXJpdHMoWG1sQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLlhtbEJlaGF2aW91ciA9IFhtbEJlaGF2aW91cjsNCn0pOy8qIHZpbTp0cz00OnN0cz00OnN3PTQ6DQogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsNCg0KdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsNCg0KICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9Jykgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOw0KICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7DQogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpDQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCg0KICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICcoJykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOw0KDQogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4NCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLg0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7DQogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOw0KICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLg0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuDQogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLg0KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgew0KICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOw0KICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsNCiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOw0KICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQp9DQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOw0KDQpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vLi4vbGliL2xhbmciKTsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsNCnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24odm9pZEVsZW1lbnRzKSB7DQogICAgQmFzZUZvbGRNb2RlLmNhbGwodGhpcyk7DQogICAgdGhpcy52b2lkRWxlbWVudHMgPSB2b2lkRWxlbWVudHMgfHwge307DQp9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgdGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCg0KICAgICAgICBpZiAodGFnLmNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiID8gImVuZCIgOiAiIjsNCg0KICAgICAgICBpZiAoIXRhZy50YWdOYW1lIHx8IHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQ0KICAgICAgICAgICAgcmV0dXJuICIiOw0KDQogICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy52YWx1ZS5pbmRleE9mKCIvIiArIHRhZy50YWdOYW1lKSAhPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZSA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdykgew0KICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsNCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHZhbHVlICs9IGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgdG9rZW4udmFsdWUubGVuZ3RoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy50YWdSZSA9IC9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLzsNCiAgICB0aGlzLl9wYXJzZVRhZyA9IGZ1bmN0aW9uKHRhZykgew0KICAgICAgICANCiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy50YWdSZS5leGVjKHRhZyk7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnRhZ1JlLmxhc3RJbmRleCB8fCAwOw0KICAgICAgICB0aGlzLnRhZ1JlLmxhc3RJbmRleCA9IDA7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHZhbHVlOiB0YWcsDQogICAgICAgICAgICBtYXRjaDogbWF0Y2ggPyBtYXRjaFsyXSA6ICIiLA0KICAgICAgICAgICAgY2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzNdIDogZmFsc2UsDQogICAgICAgICAgICBzZWxmQ2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzVdIHx8IG1hdGNoWzJdID09ICIvPiIgOiBmYWxzZSwNCiAgICAgICAgICAgIHRhZ05hbWU6IG1hdGNoID8gbWF0Y2hbNF0gOiAiIiwNCiAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hbMV0gPyBjb2x1bW4gKyBtYXRjaFsxXS5sZW5ndGggOiBjb2x1bW4NCiAgICAgICAgfTsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIHJlYWRzIGEgZnVsbCB0YWcgYW5kIHBsYWNlcyB0aGUgaXRlcmF0b3IgYWZ0ZXIgdGhlIHRhZw0KICAgICAqLw0KICAgIHRoaXMuX3JlYWRUYWdGb3J3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7DQogICAgICAgIGlmICghdG9rZW4pDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgdmFyIHN0YXJ0Ow0KICAgICAgICANCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghc3RhcnQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj4iKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9yZWFkVGFnQmFja3dhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgZW5kOw0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICBpZiAoIWVuZCkgew0KICAgICAgICAgICAgICAgICAgICBlbmQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlICsgdmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IGVuZDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCkpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLl9wb3AgPSBmdW5jdGlvbihzdGFjaywgdGFnKSB7DQogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsNCiAgICAgICAgICAgIGlmICghdGFnIHx8IHRvcC50YWdOYW1lID09IHRhZy50YWdOYW1lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdG9wLnRhZ05hbWVdKSB7DQogICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7DQogICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBmaXJzdFRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7DQogICAgICAgIA0KICAgICAgICBpZiAoIWZpcnN0VGFnLm1hdGNoKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIA0KICAgICAgICB2YXIgaXNCYWNrd2FyZCA9IGZpcnN0VGFnLmNsb3NpbmcgfHwgZmlyc3RUYWcuc2VsZkNsb3Npbmc7DQogICAgICAgIHZhciBzdGFjayA9IFtdOw0KICAgICAgICB2YXIgdGFnOw0KICAgICAgICANCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkKSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbik7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy50YWdOYW1lLmxlbmd0aCArIDINCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0ZvcndhcmQoaXRlcmF0b3IpKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCB0YWcuc3RhcnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy5tYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdCYWNrd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF0YWcuY2xvc2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCBlbmQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgfTsNCg0KfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOw0KDQogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZw0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7DQogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyDQogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQ0KICAgICAgICAgICAgcmV0dXJuICJlbmQiOw0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH07DQoNCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcmUgPSAvXlxzKi87DQogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOw0KICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsNCiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkNCiAgICAgICAgDQogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgew0KICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpDQogICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBlbmRSb3cgPSByb3c7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7DQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsNCiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7DQogICAgICAgIGlmICghZW5kKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107DQogICAgICAgIGlmIChmdyA9PSBudWxsKQ0KICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7DQoNCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsNCiAgICAgICAgICAgIGVuZC5yb3cgLS07DQogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsNCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Ow0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsNCnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsNCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7DQogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsNCiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOw0KDQogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgew0KICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvdXRkZW50KSB7DQogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsNCiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7DQogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7DQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7DQoNCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7DQogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsNCiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsNCg0KICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50Iikgew0KICAgICAgICAgICAgcmV0dXJuIGluZGVudDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0Iikgew0KICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBpbmRlbnQ7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsNCiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsNCiAgICAgICAgICAgIA0KICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsNCiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKGVycm9yKQ0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sDQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gd29ya2VyOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7DQp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cw0KICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgLy8gQ29uc3RydWN0b3JzDQogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsNCiAgICAgIC8vIEU0WA0KICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsNCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArDQogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsNCiAgICAgIC8vIEVycm9ycw0KICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKw0KICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKw0KICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMNCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKw0KICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsNCiAgICAgIC8vIE90aGVyDQogICAgICAgICJKU09OfE1hdGh8IiArDQogICAgICAvLyBQc2V1ZG8NCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiDQogICAgICApLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsNCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArDQogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsNCg0KICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOw0KDQogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQ0KICAgICk7DQoNCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoDQogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArDQogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikNCiAgICApOw0KDQogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzDQogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jDQogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZA0KICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsNCiAgICAgICAgDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLg0KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQNCg0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICAic3RhcnQiIDogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50DQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lDQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOw0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwNCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIg0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiANCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMNCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yDQogICAgICAgICJyZWdleF9hbGxvd2VkIjogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwNCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcNCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZw0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0Ig0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicmVnZXgiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4Ig0KICAgICAgICAgICAgfSwgew0KCQkJCS8vIGZsYWcNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCANCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLA0KICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIA0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgDQogICAgICAgICAgICAgICAgcmVnZXg6ICIiLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsDQogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIl0iLA0KICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsDQogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwNCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwNCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwNCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQ0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCANCiAgICAgICAgICAgICAgICByZWdleDogIiIsDQogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiANCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiY29tbWVudCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQ0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyINCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgInFxc3RyaW5nIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywNCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0Ig0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAicXN0cmluZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsDQogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH07DQogICAgDQogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLA0KICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOw0KfTsNCg0Kb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsNCg0KdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsDQogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3Nlcw0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJUT0RPIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsDQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLiINCiAgICAgICAgfV0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsDQogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0DQogICAgICAgIH07DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50DQogICAgICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLA0KICAgICAgICAgICAgbmV4dCAgOiBzdGFydA0KICAgICAgICB9Ow0KICAgIH07DQoNCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsNCg0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgew0KICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOw0KICAgIH07DQoNCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOw0KDQogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7DQogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7DQoNCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOw0KDQogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOw0KICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsNCiAgICB9Ow0KDQogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgew0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0Kb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOw0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOw0KICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87DQogICAgDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4Ow0KDQogICAgICAgICAgICBpZiAobWF0Y2hbMV0pDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgew0KICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOw0KICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07DQogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghc3RhcnQpDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsNCg0KICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS94bWxfdXRpbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOw0KdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7DQp2YXIgeG1sVXRpbCA9IHJlcXVpcmUoIi4veG1sX3V0aWwiKTsNCg0KdmFyIFN2Z0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgWG1sSGlnaGxpZ2h0UnVsZXMuY2FsbCh0aGlzKTsNCg0KICAgIHRoaXMuJHJ1bGVzLnN0YXJ0LnNwbGljZSgzLCAwLCB7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgcmVnZXggOiAiPCg/PVxzKnNjcmlwdCkiLA0KICAgICAgICBuZXh0IDogInNjcmlwdCINCiAgICB9KTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInNjcmlwdCIsICJqcy1zdGFydCIpOw0KICAgIA0KICAgIHRoaXMuZW1iZWRSdWxlcyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsICJqcy0iLCBbew0KICAgICAgICB0b2tlbjogImNvbW1lbnQiLA0KICAgICAgICByZWdleDogIlxcL1xcLy4qKD89PFxcL3NjcmlwdD4pIiwNCiAgICAgICAgbmV4dDogInRhZyINCiAgICB9LCB7DQogICAgICAgIHRva2VuOiAibWV0YS50YWciLA0KICAgICAgICByZWdleDogIjxcXC8oPz1zY3JpcHQpIiwNCiAgICAgICAgbmV4dDogInRhZyINCiAgICB9XSk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoU3ZnSGlnaGxpZ2h0UnVsZXMsIFhtbEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5TdmdIaWdobGlnaHRSdWxlcyA9IFN2Z0hpZ2hsaWdodFJ1bGVzOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KDQp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oZGVmYXVsdE1vZGUsIHN1Yk1vZGVzKSB7DQogICAgdGhpcy5kZWZhdWx0TW9kZSA9IGRlZmF1bHRNb2RlOw0KICAgIHRoaXMuc3ViTW9kZXMgPSBzdWJNb2RlczsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KDQogICAgdGhpcy4kZ2V0TW9kZSA9IGZ1bmN0aW9uKHN0YXRlKSB7DQogICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnN1Yk1vZGVzKSB7DQogICAgICAgICAgICBpZiAoc3RhdGUuaW5kZXhPZihrZXkpID09PSAwKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Yk1vZGVzW2tleV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiR0cnlNb2RlID0gZnVuY3Rpb24oc3RhdGUsIHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzdGF0ZSk7DQogICAgICAgIHJldHVybiAobW9kZSA/IG1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgOiAiIik7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuJHRyeU1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykNCiAgICAgICAgKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgew0KICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3ctMSkpOw0KICAgICAgICANCiAgICAgICAgaWYgKCFtb2RlIHx8ICFtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpKQ0KICAgICAgICAgICAgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpKTsNCiAgICAgICAgDQogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkNCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLmRlZmF1bHRNb2RlOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIG1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KTsNCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOw==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-svg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zdmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3htbCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGg9YSgiLi9zdmdfaGlnaGxpZ2h0X3J1bGVzIikuU3ZnSGlnaGxpZ2h0UnVsZXMsaT1hKCIuL2ZvbGRpbmcvbWl4ZWQiKS5Gb2xkTW9kZSxqPWEoIi4vZm9sZGluZy94bWwiKS5Gb2xkTW9kZSxrPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpLHRoaXMuaGlnaGxpZ2h0ZXI9bmV3IGgsdGhpcy4kdG9rZW5pemVyPW5ldyBnKHRoaXMuaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSksdGhpcy4kZW1iZWRzPXRoaXMuaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCksdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsianMtIjpmfSksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGkobmV3IGooe30pLHsianMtIjpuZXcga30pfTtkLmluaGVyaXRzKGwsZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXIsaT1hKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGUsaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbF91dGlsIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Iig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZS50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0Iil9O2QuaW5oZXJpdHMoZyxmKSxiLlhtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIl9xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIl9xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJ9XSxhW2IrIl9xc3RyaW5nIl09aCgiJyIsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfcXFzdHJpbmciXT1oKCciJyxiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKSxhW2IrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCJdPVt7dG9rZW46Im1ldGEudGFnIixtZXJnZTohMCxyZWdleDoiLz8+IixuZXh0OmN9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ij0ifSx7dG9rZW46ImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIscmVnZXg6IlstX2EtekEtWjAtOTpdKyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XS5jb25jYXQoZyhiKSl9fSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1hKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixnPWZ1bmN0aW9uKCl7dGhpcy5pbmhlcml0KGYsWyJzdHJpbmdfZHF1b3RlcyJdKSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IjwiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj8hMTp7dGV4dDoiPD4iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09Ij4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSI+IilyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaz1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisyKTtpZihrPT0iPC8iKXt2YXIgbD10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpK2QuZ2V0VGFiU3RyaW5nKCksbT10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShoLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbCsiXG4iK20sc2VsZWN0aW9uOlsxLGwubGVuZ3RoLDEsbC5sZW5ndGhdfX19fSl9O2QuaW5oZXJpdHMoZyxlKSxiLlhtbEJlaGF2aW91cj1nfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9saWIvbGFuZyIpLGY9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsaD1hKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzKSx0aGlzLnZvaWRFbGVtZW50cz1hfHx7fX07ZC5pbmhlcml0cyhpLGcpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO3JldHVybiBkLmNsb3Npbmc/Yj09Im1hcmtiZWdpbmVuZCI/ImVuZCI6IiI6IWQudGFnTmFtZXx8dGhpcy52b2lkRWxlbWVudHNbZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldPyIiOmQuc2VsZkNsb3Npbmc/IiI6ZC52YWx1ZS5pbmRleE9mKCIvIitkLnRhZ05hbWUpIT09LTE/IiI6InN0YXJ0In0sdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFRva2VucyhiLGIpWzBdLnRva2VucyxkPSIiO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2cudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MD9kKz1nLnZhbHVlOmQrPWUuc3RyaW5nUmVwZWF0KCIgIixnLnZhbHVlLmxlbmd0aCl9cmV0dXJuIHRoaXMuX3BhcnNlVGFnKGQpfSx0aGlzLnRhZ1JlPS9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLyx0aGlzLl9wYXJzZVRhZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRhZ1JlLmV4ZWMoYSksYz10aGlzLnRhZ1JlLmxhc3RJbmRleHx8MDtyZXR1cm4gdGhpcy50YWdSZS5sYXN0SW5kZXg9MCx7dmFsdWU6YSxtYXRjaDpiP2JbMl06IiIsY2xvc2luZzpiPyEhYlszXTohMSxzZWxmQ2xvc2luZzpiPyEhYls1XXx8YlsyXT09Ii8+IjohMSx0YWdOYW1lOmI/Yls0XToiIixjb2x1bW46YlsxXT9jK2JbMV0ubGVuZ3RoOmN9fSx0aGlzLl9yZWFkVGFnRm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtpZighZCl2YXIgZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9O2MrPWIudmFsdWU7aWYoYy5pbmRleE9mKCI+IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuc3RhcnQ9ZCxlLmVuZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9LGEuc3RlcEZvcndhcmQoKSxlfX13aGlsZShiPWEuc3RlcEZvcndhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3JlYWRUYWdCYWNrd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtkfHwoZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9KSxjPWIudmFsdWUrYztpZihjLmluZGV4T2YoIjwiKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5lbmQ9ZCxlLnN0YXJ0PXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX0sYS5zdGVwQmFja3dhcmQoKSxlfX13aGlsZShiPWEuc3RlcEJhY2t3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9wb3A9ZnVuY3Rpb24oYSxiKXt3aGlsZShhLmxlbmd0aCl7dmFyIGM9YVthLmxlbmd0aC0xXTtpZighYnx8Yy50YWdOYW1lPT1iLnRhZ05hbWUpcmV0dXJuIGEucG9wKCk7aWYodGhpcy52b2lkRWxlbWVudHNbYi50YWdOYW1lXSlyZXR1cm47aWYodGhpcy52b2lkRWxlbWVudHNbYy50YWdOYW1lXSl7YS5wb3AoKTtjb250aW51ZX1yZXR1cm4gbnVsbH19LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO2lmKCFkLm1hdGNoKXJldHVybiBudWxsO3ZhciBlPWQuY2xvc2luZ3x8ZC5zZWxmQ2xvc2luZyxnPVtdLGk7aWYoIWUpe3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbiksaz17cm93OmMsY29sdW1uOmQuY29sdW1uK2QudGFnTmFtZS5sZW5ndGgrMn07d2hpbGUoaT10aGlzLl9yZWFkVGFnRm9yd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gZi5mcm9tUG9pbnRzKGssaS5zdGFydCl9ZWxzZSBnLnB1c2goaSl9fWVsc2V7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uK2QubWF0Y2gubGVuZ3RoKSxsPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW59O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZighaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixmLmZyb21Qb2ludHMoaS5zdGFydCxsKX1lbHNlIGcucHVzaChpKX19fX0uY2FsbChpLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGw9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLG09ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgayx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgbH07ZC5pbmhlcml0cyhtLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIil7dmFyIGg9Yi5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTtoJiYoZCs9Yyl9ZWxzZSBpZihhPT0iZG9jLXN0YXJ0Iil7aWYoZz09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWphdmFzY3JpcHQuanMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigianNsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MDtkPGIuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZT1iLmRhdGFbZF07ZSYmYy5wdXNoKHtyb3c6ZS5saW5lLTEsY29sdW1uOmUuY2hhcmFjdGVyLTEsdGV4dDplLnJlYXNvbix0eXBlOiJ3YXJuaW5nIixsaW50OmV9KX1hLnNldEFubm90YXRpb25zKGMpfSksYi5vbigibmFyY2lzc3VzIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXthLmNsZWFyQW5ub3RhdGlvbnMoKX0pLGJ9fS5jYWxsKG0ucHJvdG90eXBlKSxiLk1vZGU9bX0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS91bmljb2RlIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuLi91bmljb2RlIiksZz1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8Y29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiLnNwbGl0KCJ8IikpLGM9ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiLGQ9ZS5hcnJheVRvTWFwKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIi5zcGxpdCgifCIpKSxpPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxqPWUuYXJyYXlUb01hcCgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLnNwbGl0KCJ8IikpLGs9IlsiK2YucGFja2FnZXMuTCsiXFwkX11bIitmLnBhY2thZ2VzLkwrZi5wYWNrYWdlcy5NbitmLnBhY2thZ2VzLk1jK2YucGFja2FnZXMuTmQrZi5wYWNrYWdlcy5QYysiXFwkX10qXFxiIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZykuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpbImtleXdvcmQuZGVmaW5pdGlvbiIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIraysiKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IitjKyIpXFxiIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBhLmhhc093blByb3BlcnR5KGMpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5kZXByZWNhdGVkIjpoLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkLmRlZmluaXRpb24iOmIuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmkuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjpqLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmlsbGVnYWwiOmM9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDprfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXC89PyIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il4jIS4qJCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50X3JlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1xcdyoiLG5leHQ6InN0YXJ0IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiW15cXFxcL1xcW10rIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJcXFsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXSIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiW15cXFxcXFxdXSsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLGNvbW1lbnRfcmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZywiZG9jLSIsWyhuZXcgZykuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGksaCksYi5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUveG1sX3V0aWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZj1hKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlcyxnPWEoIi4veG1sX3V0aWwiKSxoPWZ1bmN0aW9uKCl7Zi5jYWxsKHRoaXMpLHRoaXMuJHJ1bGVzLnN0YXJ0LnNwbGljZSgzLDAse3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnNjcmlwdCkiLG5leHQ6InNjcmlwdCJ9KSxnLnRhZyh0aGlzLiRydWxlcywic2NyaXB0IiwianMtc3RhcnQiKSx0aGlzLmVtYmVkUnVsZXMoZSwianMtIixbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLG5leHQ6InRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c2NyaXB0KSIsbmV4dDoidGFnIn1dKX07ZC5pbmhlcml0cyhoLGYpLGIuU3ZnSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9taXhlZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZj1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEsYil7dGhpcy5kZWZhdWx0TW9kZT1hLHRoaXMuc3ViTW9kZXM9Yn07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy4kZ2V0TW9kZT1mdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gdGhpcy5zdWJNb2RlcylpZihhLmluZGV4T2YoYik9PT0wKXJldHVybiB0aGlzLnN1Yk1vZGVzW2JdO3JldHVybiBudWxsfSx0aGlzLiR0cnlNb2RlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJGdldE1vZGUoYSk7cmV0dXJuIGU/ZS5nZXRGb2xkV2lkZ2V0KGIsYyxkKToiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kdHJ5TW9kZShhLmdldFN0YXRlKGMtMSksYSxiLGMpfHx0aGlzLiR0cnlNb2RlKGEuZ2V0U3RhdGUoYyksYSxiLGMpfHx0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoYSxiLGMpfSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0TW9kZShhLmdldFN0YXRlKGMtMSkpO2lmKCFkfHwhZC5nZXRGb2xkV2lkZ2V0KGEsYixjKSlkPXRoaXMuJGdldE1vZGUoYS5nZXRTdGF0ZShjKSk7aWYoIWR8fCFkLmdldEZvbGRXaWRnZXQoYSxiLGMpKWQ9dGhpcy5kZWZhdWx0TW9kZTtyZXR1cm4gZC5nZXRGb2xkV2lkZ2V0UmFuZ2UoYSxiLGMpfX0uY2FsbChmLnByb3RvdHlwZSl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-text-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-text.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-textile-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBLZWxsZXkgdmFuIEV2ZXJ0IDxrZWxsZXkudmFuZXZlcnRAZ21haWwuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvdGV4dGlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOw0KdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsNCnZhciBUZXh0aWxlSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dGlsZUhpZ2hsaWdodFJ1bGVzOw0KdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgVGV4dGlsZUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7DQogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOw0KfTsNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICBpZiAoc3RhdGUgPT0gImludGFnIikNCiAgICAgICAgICAgIHJldHVybiB0YWI7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gIiI7DQogICAgfTsNCg0KICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsNCiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7DQogICAgfTsNCiAgICANCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgS2VsbGV5IHZhbiBFdmVydCA8a2VsbGV5LnZhbmV2ZXJ0QGdtYWlsLmNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOw0KDQp2YXIgVGV4dGlsZUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kcnVsZXMgPSB7DQogICAgICAgICJzdGFydCIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubWF0Y2goL15oXGQkLykpDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1hcmt1cC5oZWFkaW5nLiIgKyB2YWx1ZS5jaGFyQXQoMSk7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWFya3VwLmhlYWRpbmciOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVnZXggOiAiaDF8aDJ8aDN8aDR8aDV8aDZ8YnF8cHxiY3xwcmUiLA0KICAgICAgICAgICAgICAgIG5leHQgIDogImJsb2NrdGFnIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFwqXSt8WyNdKyINCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICJibG9ja3RhZyIgOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsDQogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwuICIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcKCIsDQogICAgICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2t0YWdwcm9wZXJ0aWVzIg0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAiYmxvY2t0YWdwcm9wZXJ0aWVzIiA6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwNCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCkiLA0KICAgICAgICAgICAgICAgIG5leHQgIDogImJsb2NrdGFnIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVowLTlcXC1fXSsiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLA0KICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMiDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9Ow0KfTsNCg0Kb29wLmluaGVyaXRzKFRleHRpbGVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsNCg0KZXhwb3J0cy5UZXh0aWxlSGlnaGxpZ2h0UnVsZXMgPSBUZXh0aWxlSGlnaGxpZ2h0UnVsZXM7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOw0KDQp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7DQogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7DQogICAgfTsNCg0KICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgew0KICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7DQoNCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsNCiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsNCg0KICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7DQoNCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7DQogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOw0KICAgIH07DQoNCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7DQogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KDQp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-textile.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS90ZXh0aWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vdGV4dGlsZV9oaWdobGlnaHRfcnVsZXMiKS5UZXh0aWxlSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaH07ZC5pbmhlcml0cyhpLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE9PSJpbnRhZyI/YzoiIn0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGkucHJvdG90eXBlKSxiLk1vZGU9aX0pLGRlZmluZSgiYWNlL21vZGUvdGV4dGlsZV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXRjaCgvXmhcZCQvKT8ibWFya3VwLmhlYWRpbmcuIithLmNoYXJBdCgxKToibWFya3VwLmhlYWRpbmcifSxyZWdleDoiaDF8aDJ8aDN8aDR8aDV8aDZ8YnF8cHxiY3xwcmUiLG5leHQ6ImJsb2NrdGFnIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcKl0rfFsjXSsifSx7dG9rZW46InRleHQiLHJlZ2V4OiIuKyJ9XSxibG9ja3RhZzpbe3Rva2VuOiJrZXl3b3JkIixyZWdleDoiXFwuICIsbmV4dDoic3RhcnQifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJcXCgiLG5leHQ6ImJsb2NrdGFncHJvcGVydGllcyJ9XSxibG9ja3RhZ3Byb3BlcnRpZXM6W3t0b2tlbjoia2V5d29yZCIscmVnZXg6IlxcKSIsbmV4dDoiYmxvY2t0YWcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlthLXpBLVowLTlcXC1fXSsifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIjIn1dfX07ZC5pbmhlcml0cyhmLGUpLGIuVGV4dGlsZUhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-xml-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsNCnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7DQp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsNCnZhciBYbWxCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXI7DQp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7DQoNCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsNCiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7DQogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgWG1sRm9sZE1vZGUoKTsNCn07DQoNCm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgew0KICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOw0KICAgIH07DQoNCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOw0KDQpleHBvcnRzLk1vZGUgPSBNb2RlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOw0KdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7DQoNCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgew0KDQogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzDQogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZA0KICAgIHRoaXMuJHJ1bGVzID0gew0KICAgICAgICBzdGFydCA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXCFcXFtDREFUQVxcWyIsDQogICAgICAgICAgICBuZXh0IDogImNkYXRhIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ4bWxfcGUiLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwNCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZw0KICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLA0KICAgICAgICAgICAgbmV4dCA6ICJ0YWciDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJbXjxdKyINCiAgICAgICAgfV0sDQogICAgICAgIA0KICAgICAgICBjZGF0YSA6IFt7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXVxcXT4iLA0KICAgICAgICAgICAgbmV4dCA6ICJzdGFydCINCiAgICAgICAgfSwgew0KICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsDQogICAgICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgICAgICB9LCB7DQogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIg0KICAgICAgICB9XSwNCg0KICAgICAgICBjb21tZW50IDogW3sNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwNCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiDQogICAgICAgIH0sIHsNCiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLA0KICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICAgICAgcmVnZXggOiAiLisiDQogICAgICAgIH1dDQogICAgfTsNCiAgICANCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOw0KfTsNCg0Kb29wLmluaGVyaXRzKFhtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOw0KDQpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCg0KdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKA0KICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQ0KKTsNCg0KdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgNCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQ0KKTsNCg0KZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7DQogICAgcmV0dXJuIFt7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsDQogICAgICAgIHJlZ2V4IDogJyIuKj8iJw0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICdbIl0uKicsDQogICAgICAgIG5leHQgOiBzdGF0ZSArICJfcXFzdHJpbmciDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJzdHJpbmciLA0KICAgICAgICByZWdleCA6ICInLio/JyINCiAgICB9LCB7DQogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0DQogICAgICAgIG1lcmdlIDogdHJ1ZSwNCiAgICAgICAgcmVnZXggOiAiWyddLioiLA0KICAgICAgICBuZXh0IDogc3RhdGUgKyAiX3FzdHJpbmciDQogICAgfV07DQp9DQoNCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsNCiAgICByZXR1cm4gW3sNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsDQogICAgICAgIG5leHQgOiBzdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICcuKycNCiAgICB9XTsNCn0NCg0KZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgew0KICAgIHN0YXRlc1tuYW1lXSA9IFt7DQogICAgICAgIHRva2VuIDogInRleHQiLA0KICAgICAgICByZWdleCA6ICJcXHMrIg0KICAgIH0sIHsNCiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsDQogICAgICAgIA0KICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgew0KICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgICAgICAgIA0KICAgICAgICBtZXJnZSA6IHRydWUsDQogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLA0KICAgICAgICBuZXh0IDogbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiIA0KICAgIH0sIHsNCiAgICAgICAgdG9rZW46ICJlbXB0eSIsDQogICAgICAgIHJlZ2V4OiAiIiwNCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Ig0KICAgIH1dOw0KDQogICAgc3RhdGVzW25hbWUgKyAiX3FzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiX2VtYmVkX2F0dHJpYnV0ZV9saXN0Iik7DQogICAgc3RhdGVzW25hbWUgKyAiX3Fxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiKTsNCiAgICANCiAgICBzdGF0ZXNbbmFtZSArICJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXSA9IFt7DQogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwNCiAgICAgICAgbWVyZ2UgOiB0cnVlLA0KICAgICAgICByZWdleCA6ICJcLz8+IiwNCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQ0KICAgIH0sIHsNCiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsDQogICAgICAgIHJlZ2V4IDogIj0iDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLA0KICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQNCiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiDQogICAgfSwgew0KICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwNCiAgICAgICAgcmVnZXggOiAiXFxzKyINCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsNCn07DQoNCn0pOw0KLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsNCnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7DQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7DQoNCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7DQogICAgDQogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXINCiAgICANCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgew0KICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOw0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7DQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICANCn0NCm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOw0KfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7DQp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOw0KDQp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgew0KDQogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0ID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOw0KICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7DQogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7DQogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsNCiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykNCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsNCiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsNCiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7Jykgew0KICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7DQogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsNCiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsNCiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsNCiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgew0KICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOw0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7DQogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOw0KICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLg0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuDQogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsNCiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47DQogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuDQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4NCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuDQogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7DQogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7DQogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsNCiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOw0KICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsNCiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCn0NCm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7DQoNCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOw0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOw0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOw0KdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsNCiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsNCiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsNCn07DQpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7DQogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOw0KDQogICAgICAgIGlmICh0YWcuY2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOw0KDQogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgICAgICByZXR1cm4gIiI7DQoNCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiAiIjsNCg0KICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7DQogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOw0KICAgICAgICB2YXIgdmFsdWUgPSAiIjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsNCiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOw0KICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7DQogICAgICAgIA0KICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7DQogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IHRhZywNCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsDQogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwNCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLA0KICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLA0KICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbg0KICAgICAgICB9Ow0KICAgIH07DQogICAgDQogICAgLyoqDQogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnDQogICAgICovDQogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsNCiAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciB2YWx1ZSA9ICIiOw0KICAgICAgICB2YXIgc3RhcnQ7DQogICAgICAgIA0KICAgICAgICBkbyB7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsNCiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOw0KICAgICAgICBpZiAoIXRva2VuKQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgdmFyIHZhbHVlID0gIiI7DQogICAgICAgIHZhciBlbmQ7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICghZW5kKSB7DQogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOw0KICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsNCiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsNCiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsNCiAgICAgICAgDQogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgDQogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsNCiAgICAgICAgdmFyIHN0YWNrID0gW107DQogICAgICAgIHZhciB0YWc7DQogICAgICAgIA0KICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsNCiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsNCiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9Ow0KDQp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7DQoNCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7DQogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7DQoNCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nDQogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsNCiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsNCiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIg0KICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXINCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpDQogICAgICAgICAgICByZXR1cm4gImVuZCI7DQogICAgICAgIHJldHVybiAiIjsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCg0KICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciByZSA9IC9eXHMqLzsNCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93Ow0KICAgICAgICB2YXIgZW5kUm93ID0gcm93Ow0KICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7DQogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOw0KICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQ0KICAgICAgICANCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7DQogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7DQogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7DQoNCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9Ow0KICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsNCiAgICAgICAgaWYgKCFlbmQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsNCiAgICAgICAgaWYgKGZ3ID09IG51bGwpDQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsNCg0KICAgICAgICBpZiAoZncgPT0gInN0YXJ0Iikgew0KICAgICAgICAgICAgZW5kLnJvdyAtLTsNCiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOw0KICAgIH07DQoNCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-xml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyLGk9YSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRiZWhhdmlvdXI9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGl9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUveG1sX3V0aWwiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi94bWxfdXRpbCIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InRleHQiLHJlZ2V4OiI8XFwhXFxbQ0RBVEFcXFsiLG5leHQ6ImNkYXRhIn0se3Rva2VuOiJ4bWxfcGUiLHJlZ2V4OiI8XFw/Lio/XFw/PiJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IjxcXCEtLSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvPyIsbmV4dDoidGFnIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IltePF0rIn1dLGNkYXRhOlt7dG9rZW46InRleHQiLHJlZ2V4OiJcXF1cXF0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGUudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpfTtkLmluaGVyaXRzKGcsZiksYi5YbWxIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVyblt7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKj8iJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKicsbmV4dDphKyJfcXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKiIsbmV4dDphKyJfcXN0cmluZyJ9XX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLio/IithLG5leHQ6Yn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWQuYXJyYXlUb01hcCgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIi5zcGxpdCgifCIpKSxmPWQuYXJyYXlUb01hcCgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiLnNwbGl0KCJ8IikpO2IudGFnPWZ1bmN0aW9uKGEsYixjKXthW2JdPVt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ImEiPyJtZXRhLnRhZy5hbmNob3IiOmE9PT0iaW1nIj8ibWV0YS50YWcuaW1hZ2UiOmE9PT0ic2NyaXB0Ij8ibWV0YS50YWcuc2NyaXB0IjphPT09InN0eWxlIj8ibWV0YS50YWcuc3R5bGUiOmUuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcuZm9ybSI6Zi5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy50YWJsZSI6Im1ldGEudGFnIn0sbWVyZ2U6ITAscmVnZXg6IlstX2EtekEtWjAtOTohXSsiLG5leHQ6YisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0In0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDpiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QifV0sYVtiKyJfcXN0cmluZyJdPWgoIiciLGIrIl9lbWJlZF9hdHRyaWJ1dGVfbGlzdCIpLGFbYisiX3Fxc3RyaW5nIl09aCgnIicsYisiX2VtYmVkX2F0dHJpYnV0ZV9saXN0IiksYVtiKyJfZW1iZWRfYXR0cmlidXRlX2xpc3QiXT1be3Rva2VuOiJtZXRhLnRhZyIsbWVyZ2U6ITAscmVnZXg6Ii8/PiIsbmV4dDpjfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI9In0se3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLHJlZ2V4OiJbLV9hLXpBLVowLTk6XSsifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0uY29uY2F0KGcoYikpfX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9YSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsZz1mdW5jdGlvbigpe3RoaXMuaW5oZXJpdChmLFsic3RyaW5nX2RxdW90ZXMiXSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSI8Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/ITE6e3RleHQ6Ijw+IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSI+Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iPiIpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGs9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMik7aWYoaz09IjwvIil7dmFyIGw9dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKStkLmdldFRhYlN0cmluZygpLG09dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK2wrIlxuIittLHNlbGVjdGlvbjpbMSxsLmxlbmd0aCwxLGwubGVuZ3RoXX19fX0pfTtkLmluaGVyaXRzKGcsZSksYi5YbWxCZWhhdmlvdXI9Z30pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-chrome-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Nocm9tZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNocm9tZSI7DQpleHBvcnRzLmNzc1RleHQgPSAiLmFjZS1jaHJvbWUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXIge1wNCiAgd2lkdGg6IDUwcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KICBvdmVyZmxvdyA6IGhpZGRlbjtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIge1wNCiAgd2lkdGg6IDEwMCU7XA0KICB0ZXh0LWFsaWduOiByaWdodDtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIgLmFjZV9ndXR0ZXItY2VsbCB7XA0KICBwYWRkaW5nLXJpZ2h0OiA2cHg7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfcHJpbnRfbWFyZ2luIHtcDQogIHdpZHRoOiAxcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XA0KfVwNCiAgICAgICAgXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6IGJsdWU7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcDQogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7XA0KICBjb2xvcjogd2hpdGU7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ZvbGQge1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSxcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7XA0KICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6ICMxOTE5YTY7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6ICMyMzZlMjQ7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogIzIzNmUyNDtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wNCiAgY29sb3I6ICMyMzZlMjQ7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV94bWxfcGUge1wNCiAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6ICMwMDAwQTI7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9tYXJrdXBpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XA0KICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcDQogIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTtcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wNCn1cDQpcDQouYWNlLWNocm9tZSAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDE0NywgMTUsIDEyOCk7XA0KfVwNClwNCi5hY2UtY2hyb21lIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7XA0KICBjb2xvcjogcmdiKDI1NSwgMCwgMClcDQp9XA0KXA0KLmFjZS1jaHJvbWUgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZXtcDQogIGNvbG9yOiAjOTk0NDA5O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KDQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-chrome.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY2hyb21lIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5jc3NDbGFzcz0iYWNlLWNocm9tZSIsYi5jc3NUZXh0PSIuYWNlLWNocm9tZSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtY2hyb21lIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWNocm9tZSAuYWNlX2d1dHRlciB7ICB3aWR0aDogNTBweDsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzsgIG92ZXJmbG93IDogaGlkZGVuO30uYWNlLWNocm9tZSAuYWNlX2d1dHRlci1sYXllciB7ICB3aWR0aDogMTAwJTsgIHRleHQtYWxpZ246IHJpZ2h0O30uYWNlLWNocm9tZSAuYWNlX2d1dHRlci1sYXllciAuYWNlX2d1dHRlci1jZWxsIHsgIHBhZGRpbmctcmlnaHQ6IDZweDt9LmFjZS1jaHJvbWUgLmFjZV9wcmludF9tYXJnaW4geyAgd2lkdGg6IDFweDsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7fS5hY2UtY2hyb21lIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7fS5hY2UtY2hyb21lIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7fS5hY2UtY2hyb21lIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9ICAgICAgICAuYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjogYmx1ZTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4geyAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfaW52YWxpZCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTUzLCAwLCAwKTsgIGNvbG9yOiB3aGl0ZTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfZm9sZCB7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLC5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHsgIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7ICBjb2xvcjogIzE5MTlhNjt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29tbWVudCB7ICBjb2xvcjogIzIzNmUyNDt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHsgIGNvbG9yOiAjMjM2ZTI0O30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7ICBjb2xvcjogIzIzNmUyNDt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IHJnYigwLCAwLCAyMDUpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7ICBjb2xvcjogcmdiKDEwNCwgMTA0LCA5MSk7fS5hY2UtY2hyb21lIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogIzAwMDBBMjt9LmFjZS1jaHJvbWUgLmFjZV9tYXJrdXAuYWNlX21hcmt1cGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHsgIGNvbG9yOiByZ2IoMTIsIDcsIDI1NSk7fS5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7fS5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7fS5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sgeyAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO30uYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNyk7fS5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtY2hyb21lIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiByZ2IoMTQ3LCAxNSwgMTI4KTt9LmFjZS1jaHJvbWUgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHsgIGNvbG9yOiByZ2IoMjU1LCAwLCAwKX0uYWNlLWNocm9tZSAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1leyAgY29sb3I6ICM5OTQ0MDk7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Nsb3VkcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1jbG91ZHMiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtY2xvdWRzIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjMDAwMDAwO1wNCn1cDQpcDQouYWNlLWNsb3VkcyAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwMDAwMDA7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO1wNCn1cDQogXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogI0JERDVGQztcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkICNCRkJGQkY7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogI0ZGRkJEMTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICNCREQ1RkM7XA0KfVwNCiAgICAgICBcDQouYWNlLWNsb3VkcyAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogI0JGQkZCRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNBRjk1NkY7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IzQ4NDg0ODtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IzM5OTQ2QTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojNDZBNjA5O1wNCn1cDQpcDQouYWNlLWNsb3VkcyAuYWNlX2ludmFsaWQge1wNCiAgYmFja2dyb3VuZC1jb2xvcjojRkYwMDJBO1wNCn1cDQpcDQouYWNlLWNsb3VkcyAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUY5NTZGO1wNCiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0M1MjcyNztcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzVEOTBDRDtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiNCQ0M4QkE7XA0KfVwNClwNCi5hY2UtY2xvdWRzIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzYwNjA2MDtcDQp9XA0KXA0KLmFjZS1jbG91ZHMgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQoNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY2xvdWRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITEsYi5jc3NDbGFzcz0iYWNlLWNsb3VkcyIsYi5jc3NUZXh0PSIuYWNlLWNsb3VkcyAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtY2xvdWRzIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWNsb3VkcyAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtY2xvdWRzIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWNsb3VkcyAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7fS5hY2UtY2xvdWRzIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogIzAwMDAwMDt9LmFjZS1jbG91ZHMgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDAwMDAwO30uYWNlLWNsb3VkcyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDt9IC5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICNCREQ1RkM7fS5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjQkZCRkJGO30uYWNlLWNsb3VkcyAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICNGRkZCRDE7fS5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjQkRENUZDO30gICAgICAgLmFjZS1jbG91ZHMgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICNCRkJGQkY7fS5hY2UtY2xvdWRzIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojQUY5NTZGO30uYWNlLWNsb3VkcyAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiM0ODQ4NDg7fS5hY2UtY2xvdWRzIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiMzOTk0NkE7fS5hY2UtY2xvdWRzIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IzQ2QTYwOTt9LmFjZS1jbG91ZHMgLmFjZV9pbnZhbGlkIHsgIGJhY2tncm91bmQtY29sb3I6I0ZGMDAyQTt9LmFjZS1jbG91ZHMgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0FGOTU2RjsgICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO30uYWNlLWNsb3VkcyAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNDNTI3Mjc7fS5hY2UtY2xvdWRzIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiM1RDkwQ0Q7fS5hY2UtY2xvdWRzIC5hY2VfY29tbWVudCB7ICBjb2xvcjojQkNDOEJBO30uYWNlLWNsb3VkcyAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiM2MDYwNjA7fS5hY2UtY2xvdWRzIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds_midnight-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Nsb3Vkc19taWRuaWdodCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNsb3Vkcy1taWRuaWdodCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTkxOTE5O1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICM5MjkyOTI7XA0KfVwNClwNCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzdEQTVEQztcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3REE1REM7XA0KfVwNCiBcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiAjMDAwMDAwO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgI0JGQkZCRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDIxNSwgMjE1LCAyMTUsIDAuMDMxKTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7XA0KfVwNCiAgICAgICBcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogI0JGQkZCRjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM5MjdDNUQ7XA0KfVwNClwNCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IzRCNEI0QjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6IzM5OTQ2QTtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojNDZBNjA5O1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0ZGRkZGRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNFOTJFMkU7XA0KfVwNClwNCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICM5MjdDNUQ7XA0KICAgIGJvcmRlci1jb2xvcjogIzkyOTI5MjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojRTkyRTJFO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojNUQ5MENEO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IzNDNDAzQjtcDQp9XA0KXA0KLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBjb2xvcjojNjA2MDYwO1wNCn1cDQpcDQouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCg0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds_midnight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY2xvdWRzX21pZG5pZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLWNsb3Vkcy1taWRuaWdodCIsYi5jc3NUZXh0PSIuYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMxOTE5MTk7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogIzkyOTI5Mjt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjN0RBNURDO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzdEQTVEQzt9IC5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICMwMDAwMDA7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjQkZCRkJGO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYmEoMjE1LCAyMTUsIDIxNSwgMC4wMzEpO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDt9ICAgICAgIC5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjQkZCRkJGO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2tleXdvcmQgeyAgY29sb3I6IzkyN0M1RDt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojNEI0QjRCO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojMzk5NDZBO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiM0NkE2MDk7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfaW52YWxpZCB7ICBjb2xvcjojRkZGRkZGO2JhY2tncm91bmQtY29sb3I6I0U5MkUyRTt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzkyN0M1RDsgICAgYm9yZGVyLWNvbG9yOiAjOTI5MjkyO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNFOTJFMkU7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiM1RDkwQ0Q7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfY29tbWVudCB7ICBjb2xvcjojM0M0MDNCO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiM2MDYwNjA7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-cobalt-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2NvYmFsdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNvYmFsdCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1jb2JhbHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAyMjQwO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XA0KfVwNCiBcDQouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7XA0KfVwNCiAgICAgICBcDQouYWNlLWNvYmFsdCAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNGRjlEMDA7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6I0ZGNjI4QztcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGOEY4Rjg7XA0KYmFja2dyb3VuZC1jb2xvcjojODAwRjAwO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3N1cHBvcnQge1wNCiAgY29sb3I6IzgwRkZCQjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGOUQwMDtcDQogICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNGRkIwNTQ7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6IzgwRkZDMjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiMwMDg4RkY7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6I0NDQ0NDQztcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0ZGODBFMTtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6IzlFRkZGRjtcDQp9XA0KXA0KLmFjZS1jb2JhbHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtY29iYWx0IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcDQogIGNvbG9yOiNDOEU0RkQ7XA0KYmFja2dyb3VuZC1jb2xvcjojMDAxMjIxO1wNCn1cDQpcDQouYWNlLWNvYmFsdCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiMxMzBEMjY7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-cobalt.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY29iYWx0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLWNvYmFsdCIsYi5jc3NUZXh0PSIuYWNlLWNvYmFsdCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtY29iYWx0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWNvYmFsdCAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtY29iYWx0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWNvYmFsdCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMwMDIyNDA7fS5hY2UtY29iYWx0IC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0ZGRkZGRjt9LmFjZS1jb2JhbHQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO30uYWNlLWNvYmFsdCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjt9IC5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYmEoMTc5LCAxMDEsIDU3LCAwLjc1KTt9LmFjZS1jb2JhbHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTt9LmFjZS1jb2JhbHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7fS5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTt9LmFjZS1jb2JhbHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTc5LCAxMDEsIDU3LCAwLjc1KTt9ICAgICAgIC5hY2UtY29iYWx0IC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO30uYWNlLWNvYmFsdCAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0ZGOUQwMDt9LmFjZS1jb2JhbHQgLmFjZV9jb25zdGFudCB7ICBjb2xvcjojRkY2MjhDO30uYWNlLWNvYmFsdCAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0Y4RjhGODtiYWNrZ3JvdW5kLWNvbG9yOiM4MDBGMDA7fS5hY2UtY29iYWx0IC5hY2Vfc3VwcG9ydCB7ICBjb2xvcjojODBGRkJCO30uYWNlLWNvYmFsdCAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkY5RDAwOyAgICBib3JkZXItY29sb3I6ICNGRkZGRkY7fS5hY2UtY29iYWx0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0ZGQjA1NDt9LmFjZS1jb2JhbHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojODBGRkMyO30uYWNlLWNvYmFsdCAuYWNlX2NvbW1lbnQgeyAgZm9udC1zdHlsZTppdGFsaWM7Y29sb3I6IzAwODhGRjt9LmFjZS1jb2JhbHQgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojQ0NDQ0NDO30uYWNlLWNvYmFsdCAuYWNlX3ZhcmlhYmxlLmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojRkY4MEUxO30uYWNlLWNvYmFsdCAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojOUVGRkZGO30uYWNlLWNvYmFsdCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS1jb2JhbHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6I0M4RTRGRDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDEyMjE7fS5hY2UtY29iYWx0IC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGJhY2tncm91bmQtY29sb3I6IzEzMEQyNjt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-crimson_editor-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2NyaW1zb25fZWRpdG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7DQpleHBvcnRzLmNzc1RleHQgPSAiLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2VkaXRvciB7XA0KICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9ndXR0ZXIge1wNCiAgd2lkdGg6IDUwcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KICBvdmVyZmxvdyA6IGhpZGRlbjtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2d1dHRlci1sYXllciB7XA0KICB3aWR0aDogMTAwJTtcDQogIHRleHQtYWxpZ246IHJpZ2h0O1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZ3V0dGVyLWxheWVyIC5hY2VfZ3V0dGVyLWNlbGwge1wNCiAgcGFkZGluZy1yaWdodDogNnB4O1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfcHJpbnRfbWFyZ2luIHtcDQogIHdpZHRoOiAxcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogcmdiKDY0LCA2NCwgNjQpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2lkZW50aWZpZXIge1wNCiAgY29sb3I6IGJsYWNrO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6IGJsdWU7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4ge1wNCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiByZ2IoMjU1LCAxNTYsIDApO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcDQogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfaW52YWxpZCB7XA0KICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcDQogIGNvbG9yOiByZ2IoMjI0LCAwLCAwKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9mb2xkIHtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjogcmdiKDE5MiwgMCwgMCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLFwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge1wNCiAgY29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiByZ2IoMTI4LCAwLCAxMjgpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XA0KICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiByZ2IoMCwgMCwgNjQpO1wNCn1cDQpcDQouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiByZ2IoMCwgNjQsIDEyOCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfeG1sX3BlIHtcDQogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6IHJnYigyMzIsIDI0MiwgMjU0KTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjpyZ2IoMjgsIDIsIDI1NSk7XA0KfVwNClwNCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTtcDQp9XA0KXA0KLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX3N0cmluZy5hY2VfcmVnZXgge1wNCiAgY29sb3I6IHJnYigxOTIsIDAsIDE5Mik7XA0KfSI7DQoNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNyaW1zb24tZWRpdG9yIjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-crimson_editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY3JpbXNvbl9lZGl0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMSxiLmNzc1RleHQ9Ii5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZ3V0dGVyIHsgIHdpZHRoOiA1MHB4OyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzOyAgb3ZlcmZsb3cgOiBoaWRkZW47fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9ndXR0ZXItbGF5ZXIgeyAgd2lkdGg6IDEwMCU7ICB0ZXh0LWFsaWduOiByaWdodDt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2d1dHRlci1sYXllciAuYWNlX2d1dHRlci1jZWxsIHsgIHBhZGRpbmctcmlnaHQ6IDZweDt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6IHJnYig2NCwgNjQsIDY0KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2N1cnNvciB7ICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9pZGVudGlmaWVyIHsgIGNvbG9yOiBibGFjazt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiBibHVlO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHsgIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjogcmdiKDI1NSwgMTU2LCAwKTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2ludmFsaWQgeyAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7ICBjb2xvcjogcmdiKDIyNCwgMCwgMCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfZm9sZCB7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IHJnYigxOTIsIDAsIDApO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSwuYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHsgIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3IgeyAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7ICBjb2xvcjogcmdiKDEyOCwgMCwgMTI4KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHsgIGNvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MgeyAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcgeyAgY29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjogcmdiKDAsIDAsIDY0KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjogcmdiKDAsIDY0LCAxMjgpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7ICBjb2xvcjogcmdiKDEwNCwgMTA0LCA5MSk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sgeyAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2IoMjMyLCAyNDIsIDI1NCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6cmdiKDI4LCAyLCAyNTUpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHsgIGNvbG9yOiByZ2IoMTkyLCAwLCAxOTIpO30iLGIuY3NzQ2xhc3M9ImFjZS1jcmltc29uLWVkaXRvciI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dawn-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2Rhd24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IGZhbHNlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtZGF3biI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1kYXduIC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICNGOUY5Rjk7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICMwODA4MDg7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwMDAwMDA7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDtcDQp9XA0KIFwNCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDM5LCA5NSwgMjU1LCAwLjMwKTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3NSwgNzUsIDEyNiwgMC41MCk7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6IHJnYmEoMzYsIDk5LCAxODAsIDAuMTIpO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzksIDk1LCAyNTUsIDAuMzApO1wNCn1cDQogICAgICAgXA0KLmFjZS1kYXduIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2JhKDc1LCA3NSwgMTI2LCAwLjUwKTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojNzk0OTM4O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojODExRjI0O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9pbnZhbGlkLmFjZV9pbGxlZ2FsIHtcDQogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNCNTJBMUQ7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wNCiAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQpmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojQjUyQTFEO1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9zdXBwb3J0IHtcDQogIGNvbG9yOiM2OTFDOTc7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzk0OTM4O1wNCiAgICBib3JkZXItY29sb3I6ICMwODA4MDg7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiM2OTNBMTc7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojMEI2MTI1O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojQ0Y1NjI4O1wNCn1cDQpcDQouYWNlLWRhd24gLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiM1QTUyNUY7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiMyMzRBOTc7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS1kYXduIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcDQogIGNvbG9yOiMxOTM1NkQ7XA0KfVwNClwNCi5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjojNjkzQTE3O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dawn.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvZGF3biIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSExLGIuY3NzQ2xhc3M9ImFjZS1kYXduIixiLmNzc1RleHQ9Ii5hY2UtZGF3biAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtZGF3biAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1kYXduIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS1kYXduIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWRhd24gLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjlGOUY5O30uYWNlLWRhd24gLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjMDgwODA4O30uYWNlLWRhd24gLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDAwMDAwO30uYWNlLWRhd24gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMDAwMDA7fSAuYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiYSgzOSwgOTUsIDI1NSwgMC4zMCk7fS5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNzUsIDc1LCAxMjYsIDAuNTApO30uYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDM2LCA5OSwgMTgwLCAwLjEyKTt9LmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM5LCA5NSwgMjU1LCAwLjMwKTt9ICAgICAgIC5hY2UtZGF3biAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogcmdiYSg3NSwgNzUsIDEyNiwgMC41MCk7fS5hY2UtZGF3biAuYWNlX2tleXdvcmQgeyAgY29sb3I6Izc5NDkzODt9LmFjZS1kYXduIC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IzgxMUYyNDt9LmFjZS1kYXduIC5hY2VfaW52YWxpZC5hY2VfaWxsZWdhbCB7ICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNGOEY4Rjg7YmFja2dyb3VuZC1jb2xvcjojQjUyQTFEO30uYWNlLWRhd24gLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Zm9udC1zdHlsZTppdGFsaWM7Y29sb3I6I0I1MkExRDt9LmFjZS1kYXduIC5hY2Vfc3VwcG9ydCB7ICBjb2xvcjojNjkxQzk3O30uYWNlLWRhd24gLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzc5NDkzODsgICAgYm9yZGVyLWNvbG9yOiAjMDgwODA4O30uYWNlLWRhd24gLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojNjkzQTE3O30uYWNlLWRhd24gLmFjZV9zdHJpbmcgeyAgY29sb3I6IzBCNjEyNTt9LmFjZS1kYXduIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6I0NGNTYyODt9LmFjZS1kYXduIC5hY2VfY29tbWVudCB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojNUE1MjVGO30uYWNlLWRhd24gLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojMjM0QTk3O30uYWNlLWRhd24gLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojMTkzNTZEO30uYWNlLWRhd24gLmFjZV9tYXJrdXAuYWNlX2xpc3QgeyAgY29sb3I6IzY5M0ExNzt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dreamweaver-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBBZGFtIEppbWVuZXogPGFkYW0gQVQgc2hpZnRjcmVhdGUgRE9UIGNvbT4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS90aGVtZS9kcmVhbXdlYXZlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQpleHBvcnRzLmlzRGFyayA9IGZhbHNlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG0iOw0KZXhwb3J0cy5jc3NUZXh0ID0gIi5hY2UtdG0gLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBGO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9jdXJzb3Ige1wNCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjaztcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XA0KfVwNCiAgICAgICAgXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiBibHVlO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcDQogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XA0KICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7XA0KICBjb2xvcjogd2hpdGU7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLFwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge1wNCiAgY29sb3I6ICMwMDk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfcGhwX3RhZyB7XA0KICBjb2xvcjogI2YwMDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjogIzAwRjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2Mge1wNCiAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wNCiAgY29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjogcmdiKDAsIDAsIDIwNSk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6ICMwNkZcDQp9XA0KXA0KLmFjZS10bSAuYWNlX2xpbmUgLmFjZV94bWxfcGUge1wNCiAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjogIzAwRjtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XA0KICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9saXN0IHtcDQogIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge1wNCiAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wNCn1cDQpcDQouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6IzAwOTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfYW5jaG9yIHtcDQogIGNvbG9yOiMwNjA7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX2Zvcm0ge1wNCiAgY29sb3I6I0Y5MDtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfaW1hZ2Uge1wNCiAgY29sb3I6IzkwOTtcDQp9XA0KXA0KLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2Vfc2NyaXB0IHtcDQogIGNvbG9yOiM5MDA7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX3N0eWxlIHtcDQogIGNvbG9yOiM5MDk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX3RhYmxlIHtcDQogIGNvbG9yOiMwOTk7XA0KfVwNClwNCi5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHtcDQogIGNvbG9yOiByZ2IoMjU1LCAwLCAwKVwNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dreamweaver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvZHJlYW13ZWF2ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMSxiLmNzc0NsYXNzPSJhY2UtdG0iLGIuY3NzVGV4dD0iLmFjZS10bSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG0gLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdG0gLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXRtIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRtIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICMwMEY7fS5hY2UtdG0gLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDt9LmFjZS10bSAuYWNlX2N1cnNvciB7ICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO30uYWNlLXRtIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9ICAgICAgICAuYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2tleXdvcmQgeyAgY29sb3I6IGJsdWU7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4geyAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiByZ2IoODgsIDkyLCAyNDYpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHsgIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52YWxpZCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTUzLCAwLCAwKTsgIGNvbG9yOiB3aGl0ZTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7ICBjb2xvcjogIzAwOTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9waHBfdGFnIHsgIGNvbG9yOiAjZjAwO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiAjMDBGO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7ICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7ICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjogIzA2Rn0uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7ICBjb2xvcjogcmdiKDEwNCwgMTA0LCA5MSk7fS5hY2UtdG0gLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiAjMDBGO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9tYXJrdXBpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHsgIGNvbG9yOiByZ2IoMTIsIDcsIDI1NSk7fS5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2xpc3QgeyAgY29sb3I6cmdiKDE4NSwgNiwgMTQ0KTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7ICBiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNyk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojMDA5O30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnLmFjZV9hbmNob3IgeyAgY29sb3I6IzA2MDt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfZm9ybSB7ICBjb2xvcjojRjkwO30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnLmFjZV9pbWFnZSB7ICBjb2xvcjojOTA5O30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnLmFjZV9zY3JpcHQgeyAgY29sb3I6IzkwMDt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2Vfc3R5bGUgeyAgY29sb3I6IzkwOTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfdGFibGUgeyAgY29sb3I6IzA5OTt9LmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXggeyAgY29sb3I6IHJnYigyNTUsIDAsIDApfSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-eclipse-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2VjbGlwc2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpleHBvcnRzLmlzRGFyayA9IGZhbHNlOw0KZXhwb3J0cy5jc3NUZXh0ID0gIi5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvciB7XA0KICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6IHJnYigyMjcsIDIyNywgMjI3KTtcDQogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQogIGNvbG9yOiByZ2IoMTM2LCAxMzYsIDEzNik7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2IxYjRiYTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9jdXJzb3Ige1wNCiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjaztcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2tleXdvcmQsIC5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjogcmdiKDEyNywgMCwgODUpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4ge1wNCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XA0KICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IHJnYig0MiwgMCwgMjU1KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IHJnYig2MywgMTI3LCA5NSk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2Mge1wNCiAgY29sb3I6IHJnYig2MywgOTUsIDE5MSk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XA0KICBjb2xvcjogcmdiKDEyNywgMTU5LCAxOTEpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfdGFnIHtcDQogIGNvbG9yOiByZ2IoNjMsIDEyNywgMTI3KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3R5cGUge1wNCiAgY29sb3I6IHJnYigxMjcsIDAsIDEyNyk7XA0KfVwNClwNCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV94bWxfcGUge1wNCiAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO1wNCn1cDQpcDQouYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjpyZ2IoNjMsIDEyNywgMTI3KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6cmdiKDEyNywgMCwgMTI3KTtcDQp9XA0KXA0KLmFjZS1lY2xpcHNlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiKDIzMiwgMjQyLCAyNTQpO1wNCn0iOw0KDQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1lY2xpcHNlIjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-eclipse.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvZWNsaXBzZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixiLmlzRGFyaz0hMSxiLmNzc1RleHQ9Ii5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1lY2xpcHNlIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6IHJnYigyMjcsIDIyNywgMjI3KTsgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTsgIGNvbG9yOiByZ2IoMTM2LCAxMzYsIDEzNik7fS5hY2UtZWNsaXBzZSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2IxYjRiYTt9LmFjZS1lY2xpcHNlIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtZWNsaXBzZSAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0O30uYWNlLWVjbGlwc2UgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2tleXdvcmQsIC5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjogcmdiKDEyNywgMCwgODUpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4geyAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcgeyAgY29sb3I6IHJnYig0MiwgMCwgMjU1KTt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IHJnYig2MywgMTI3LCA5NSk7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MgeyAgY29sb3I6IHJnYig2MywgOTUsIDE5MSk7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7ICBjb2xvcjogcmdiKDEyNywgMTU5LCAxOTEpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfdGFnIHsgIGNvbG9yOiByZ2IoNjMsIDEyNywgMTI3KTt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3R5cGUgeyAgY29sb3I6IHJnYigxMjcsIDAsIDEyNyk7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV94bWxfcGUgeyAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjpyZ2IoNjMsIDEyNywgMTI3KTt9LmFjZS1lY2xpcHNlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6cmdiKDEyNywgMCwgMTI3KTt9LmFjZS1lY2xpcHNlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiKDIzMiwgMjQyLCAyNTQpO30iLGIuY3NzQ2xhc3M9ImFjZS1lY2xpcHNlIjt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-idle_fingers-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2lkbGVfZmluZ2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWlkbGUtZmluZ2VycyI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzkxRkYwMDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5MUZGMDA7XA0KfVwNCiBcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICMzNTM2Mzc7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7XA0KfVwNCiAgICAgICBcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogIzQwNDA0MDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNDQzc4MzM7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IzZDOTlCQjtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojRkYwMDAwO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0M3ODMzO1wNCiAgICBib3JkZXItY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0I4MzQyNjtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6I0E1QzI2MTtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojQ0NDQzMzO1wNCn1cDQpcDQouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2NvbW1lbnQge1wNCiAgZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6I0JDOTQ1ODtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6I0ZGRTVCQjtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lbnRpdHkuYWNlX25hbWUge1wNCiAgY29sb3I6I0ZGQzY2RDtcDQp9XA0KXA0KLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29sbGFiLmFjZV91c2VyMSB7XA0KICBjb2xvcjojMzIzMjMyO1wNCmJhY2tncm91bmQtY29sb3I6I0ZGRjk4MDsgICBcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-idle_fingers.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvaWRsZV9maW5nZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLWlkbGUtZmluZ2VycyIsYi5jc3NUZXh0PSIuYWNlLWlkbGUtZmluZ2VycyAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMzMjMyMzI7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0ZGRkZGRjt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjOTFGRjAwO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzkxRkYwMDt9IC5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYmEoOTAsIDEwMCwgMTI2LCAwLjg4KTt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzM1MzYzNzt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTAsIDEwMCwgMTI2LCAwLjg4KTt9ICAgICAgIC5hY2UtaWRsZS1maW5nZXJzIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjNDA0MDQwO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0NDNzgzMzt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9jb25zdGFudCB7ICBjb2xvcjojNkM5OUJCO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOiNGRjAwMDA7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNDQzc4MzM7ICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojQjgzNDI2O30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX3N0cmluZyB7ICBjb2xvcjojQTVDMjYxO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNDQ0NDMzM7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29tbWVudCB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojQkM5NDU4O30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojRkZFNUJCO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2VudGl0eS5hY2VfbmFtZSB7ICBjb2xvcjojRkZDNjZEO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9jb2xsYWIuYWNlX3VzZXIxIHsgIGNvbG9yOiMzMjMyMzI7YmFja2dyb3VuZC1jb2xvcjojRkZGOTgwOyAgIH0iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-kr_theme-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL2tyX3RoZW1lJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2Uta3ItdGhlbWUiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2Uta3ItdGhlbWUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMwQjBBMDk7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRkNGRkUwO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGOTkwMDtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGOTkwMDtcDQp9XA0KIFwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiYSgxNzAsIDAsIDI1NSwgMC40NSk7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDE3NywgMTExLCAwLjMyKTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICMzODQwM0Q7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTcwLCAwLCAyNTUsIDAuNDUpO1wNCn1cDQogICAgICAgXA0KLmFjZS1rci10aGVtZSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiYSgyNTUsIDE3NywgMTExLCAwLjMyKTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6Izk0OUM4QjtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOnJnYmEoMjEwLCAxMTcsIDI0LCAwLjc2KTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNBNDEzMDA7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9zdXBwb3J0IHtcDQogIGNvbG9yOiM5RkMyOEE7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzk0OUM4QjtcDQogICAgYm9yZGVyLWNvbG9yOiAjRkNGRkUwO1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6Izg1ODczQTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOnJnYmEoMTI1LCAyNTUsIDE5MiwgMC42NSk7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiM3MDZENUI7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjojRDFBNzk2O1wNCn1cDQpcDQouYWNlLWtyLXRoZW1lIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNGRjgwRTE7XA0KfVwNClwNCi5hY2Uta3ItdGhlbWUgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6I0JBQkQ5QztcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiMwRjAwNDA7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-kr_theme.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUva3JfdGhlbWUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2Uta3ItdGhlbWUiLGIuY3NzVGV4dD0iLmFjZS1rci10aGVtZSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2Uta3ItdGhlbWUgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2Uta3ItdGhlbWUgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLWtyLXRoZW1lIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWtyLXRoZW1lIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzBCMEEwOTt9LmFjZS1rci10aGVtZSAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNGQ0ZGRTA7fS5hY2Uta3ItdGhlbWUgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkY5OTAwO30uYWNlLWtyLXRoZW1lIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkY5OTAwO30gLmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2JhKDE3MCwgMCwgMjU1LCAwLjQ1KTt9LmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLWtyLXRoZW1lIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTc3LCAxMTEsIDAuMzIpO30uYWNlLWtyLXRoZW1lIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzM4NDAzRDt9LmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNzAsIDAsIDI1NSwgMC40NSk7fSAgICAgICAuYWNlLWtyLXRoZW1lIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2JhKDI1NSwgMTc3LCAxMTEsIDAuMzIpO30uYWNlLWtyLXRoZW1lIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojOTQ5QzhCO30uYWNlLWtyLXRoZW1lIC5hY2VfY29uc3RhbnQgeyAgY29sb3I6cmdiYSgyMTAsIDExNywgMjQsIDAuNzYpO30uYWNlLWtyLXRoZW1lIC5hY2VfaW52YWxpZCB7ICBjb2xvcjojRjhGOEY4O2JhY2tncm91bmQtY29sb3I6I0E0MTMwMDt9LmFjZS1rci10aGVtZSAuYWNlX3N1cHBvcnQgeyAgY29sb3I6IzlGQzI4QTt9LmFjZS1rci10aGVtZSAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTQ5QzhCOyAgICBib3JkZXItY29sb3I6ICNGQ0ZGRTA7fS5hY2Uta3ItdGhlbWUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojODU4NzNBO30uYWNlLWtyLXRoZW1lIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6cmdiYSgxMjUsIDI1NSwgMTkyLCAwLjY1KTt9LmFjZS1rci10aGVtZSAuYWNlX2NvbW1lbnQgeyAgZm9udC1zdHlsZTppdGFsaWM7Y29sb3I6IzcwNkQ1Qjt9LmFjZS1rci10aGVtZSAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiNEMUE3OTY7fS5hY2Uta3ItdGhlbWUgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0ZGODBFMTt9LmFjZS1rci10aGVtZSAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojQkFCRDlDO30uYWNlLWtyLXRoZW1lIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLWtyLXRoZW1lIC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGJhY2tncm91bmQtY29sb3I6IzBGMDA0MDt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21lcmJpdm9yZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLW1lcmJpdm9yZSI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTYxNjE2O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNFNkUxREM7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XA0KfVwNCiBcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiAjNDU0NTQ1O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQwNDA0MDtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiAjMzMzNDM1O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQ1NDU0NTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbWVyYml2b3JlIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6I0ZDNkYwOTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojMUVEQUZCO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojRkRDMjUxO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcDQogIGNvbG9yOiM4REZGMEE7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6IzU4QzU1NDtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojOTkwMDAwO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZSAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkM2RjA5O1wNCiAgICBib3JkZXItY29sb3I6ICNFNkUxREM7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0ZDNkYwOTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzhERkYwQTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9jb21tZW50IHtcDQogIGZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiNBRDJFQTQ7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNGQzZGMDk7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6I0ZGRkY4OTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbWVyYml2b3JlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLW1lcmJpdm9yZSIsYi5jc3NUZXh0PSIuYWNlLW1lcmJpdm9yZSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtbWVyYml2b3JlIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLW1lcmJpdm9yZSAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtbWVyYml2b3JlIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLW1lcmJpdm9yZSAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMxNjE2MTY7fS5hY2UtbWVyYml2b3JlIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0U2RTFEQzt9LmFjZS1tZXJiaXZvcmUgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO30uYWNlLW1lcmJpdm9yZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjt9IC5hY2UtbWVyYml2b3JlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICM0NTQ1NDU7fS5hY2UtbWVyYml2b3JlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtbWVyYml2b3JlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO30uYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICMzMzM0MzU7fS5hY2UtbWVyYml2b3JlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjNDU0NTQ1O30gICAgICAgLmFjZS1tZXJiaXZvcmUgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICM0MDQwNDA7fS5hY2UtbWVyYml2b3JlIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojRkM2RjA5O30uYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiMxRURBRkI7fS5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNGREMyNTE7fS5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkgeyAgY29sb3I6IzhERkYwQTt9LmFjZS1tZXJiaXZvcmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojNThDNTU0O30uYWNlLW1lcmJpdm9yZSAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOiM5OTAwMDA7fS5hY2UtbWVyYml2b3JlIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNGQzZGMDk7ICAgIGJvcmRlci1jb2xvcjogI0U2RTFEQzt9LmFjZS1tZXJiaXZvcmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojRkM2RjA5O30uYWNlLW1lcmJpdm9yZSAuYWNlX3N0cmluZyB7ICBjb2xvcjojOERGRjBBO30uYWNlLW1lcmJpdm9yZSAuYWNlX2NvbW1lbnQgeyAgZm9udC1zdHlsZTppdGFsaWM7Y29sb3I6I0FEMkVBNDt9LmFjZS1tZXJiaXZvcmUgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0ZDNkYwOTt9LmFjZS1tZXJiaXZvcmUgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojRkZGRjg5O30uYWNlLW1lcmJpdm9yZSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore_soft-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21lcmJpdm9yZV9zb2Z0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtbWVyYml2b3JlLXNvZnQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMxQzFDMUM7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRTZFMURDO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjtcDQp9XA0KIFwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzQ5NDk0OTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzMzMzQzNTtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDk0OTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM0MDQwNDA7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNGQzgwM0E7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojNjhDMUQ4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNFMUM1ODI7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XA0KICBjb2xvcjojOEVDNjVGO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6IzdGQzU3ODtcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0ZGRkZGRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNGRTM4Mzg7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojRkUzODM4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGQzgwM0E7XA0KICAgIGJvcmRlci1jb2xvcjogI0U2RTFEQztcDQp9XA0KXA0KLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojOEVDNjVGO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29tbWVudCB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojQUM0QkI4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YSB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojQUM0QkI4O1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNGQzgwM0E7XA0KfVwNClwNCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBjb2xvcjojRUFGMUEzO1wNCn1cDQpcDQouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore_soft.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbWVyYml2b3JlX3NvZnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtbWVyYml2b3JlLXNvZnQiLGIuY3NzVGV4dD0iLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzFDMUMxQzt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNFNkUxREM7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGO30gLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjNDk0OTQ5O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMzMzNDM1O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjNDk0OTQ5O30gICAgICAgLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzQwNDA0MDt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0ZDODAzQTt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiM2OEMxRDg7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0UxQzU4Mjt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHsgIGNvbG9yOiM4RUM2NUY7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojN0ZDNTc4O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfaW52YWxpZCB7ICBjb2xvcjojRkZGRkZGO2JhY2tncm91bmQtY29sb3I6I0ZFMzgzODt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOiNGRTM4Mzg7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZDODAzQTsgICAgYm9yZGVyLWNvbG9yOiAjRTZFMURDO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiM4RUM2NUY7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb21tZW50IHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNBQzRCQjg7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tZXRhIHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNBQzRCQjg7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0ZDODAzQTt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiNFQUYxQTM7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-monokai-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21vbm9rYWknLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IHRydWU7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1tb25va2FpIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICJcDQouYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjgyMjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogI0Y4RjhGMjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0Y4RjhGMDtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjhGOEYwO1wNCn1cDQogXA0KLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6ICM0OTQ4M0U7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkICM0OTQ4M0U7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICM0OTQ4M0U7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDgzRTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbW9ub2thaSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogIzQ5NDgzRTtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojRjkyNjcyO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0FFODFGRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0FFODFGRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojRjhGOEYwO1wNCmJhY2tncm91bmQtY29sb3I6I0Y5MjY3MjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XA0KICBjb2xvcjojRjhGOEYwO1wNCmJhY2tncm91bmQtY29sb3I6I0FFODFGRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBNkUyMkU7XA0KICAgIGJvcmRlci1jb2xvcjogI0Y4RjhGMjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzY2RDlFRjtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiNFNkRCNzQ7XA0KfVwNClwNCi5hY2UtbW9ub2thaSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6Izc1NzE1RTtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6I0E2RTIyRTtcDQp9XA0KXA0KLmFjZS1tb25va2FpIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojQTZFMjJFO1wNCn1cDQpcDQouYWNlLW1vbm9rYWkgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-monokai.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbW9ub2thaSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS1tb25va2FpIixiLmNzc1RleHQ9Ii5hY2UtbW9ub2thaSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtbW9ub2thaSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1tb25va2FpIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS1tb25va2FpIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLW1vbm9rYWkgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjcyODIyO30uYWNlLW1vbm9rYWkgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjRjhGOEYyO30uYWNlLW1vbm9rYWkgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRjhGOEYwO30uYWNlLW1vbm9rYWkgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGOEY4RjA7fSAuYWNlLW1vbm9rYWkgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzQ5NDgzRTt9LmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDgzRTt9LmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzQ5NDgzRTt9LmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjNDk0ODNFO30gICAgICAgLmFjZS1tb25va2FpIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjNDk0ODNFO30uYWNlLW1vbm9rYWkgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNGOTI2NzI7fS5hY2UtbW9ub2thaSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojQUU4MUZGO30uYWNlLW1vbm9rYWkgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojQUU4MUZGO30uYWNlLW1vbm9rYWkgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGOEY4RjA7YmFja2dyb3VuZC1jb2xvcjojRjkyNjcyO30uYWNlLW1vbm9rYWkgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIGNvbG9yOiNGOEY4RjA7YmFja2dyb3VuZC1jb2xvcjojQUU4MUZGO30uYWNlLW1vbm9rYWkgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0E2RTIyRTsgICAgYm9yZGVyLWNvbG9yOiAjRjhGOEYyO30uYWNlLW1vbm9rYWkgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojNjZEOUVGO30uYWNlLW1vbm9rYWkgLmFjZV9zdHJpbmcgeyAgY29sb3I6I0U2REI3NDt9LmFjZS1tb25va2FpIC5hY2VfY29tbWVudCB7ICBjb2xvcjojNzU3MTVFO30uYWNlLW1vbm9rYWkgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojQTZFMjJFO30uYWNlLW1vbm9rYWkgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNBNkUyMkU7fS5hY2UtbW9ub2thaSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-mono_industrial-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL21vbm9faW5kdXN0cmlhbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLW1vbm8taW5kdXN0cmlhbCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyQzI4O1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNGRkZGRkY7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XA0KfVwNCiBcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDE0NSwgMTUzLCAxNDgsIDAuNDApO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMDIsIDEwOCwgMTA0LCAwLjUwKTtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDEyLCAxMywgMTIsIDAuMjUpO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDUsIDE1MywgMTQ4LCAwLjQwKTtcDQp9XA0KICAgICAgIFwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2JhKDEwMiwgMTA4LCAxMDQsIDAuNTApO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6I0EzOUU2NDtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojQThCM0FCO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbnN0YW50IHtcDQogIGNvbG9yOiNFOTg4MDA7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0U5ODgwMDtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9pbnZhbGlkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE1MywgMCwgMCwgMC42OCk7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNBOEIzQUI7XA0KICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojNTg4RTYwO1wNCn1cDQpcDQouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IzY2NkM2ODtcDQpiYWNrZ3JvdW5kLWNvbG9yOiMxNTFDMTk7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiM2NDhCRDI7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzkwOTk5MztcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUge1wNCiAgY29sb3I6IzU3NzhCNjtcDQp9XA0KXA0KLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNBOEIzQUI7XA0KfVwNClwNCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-mono_industrial.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbW9ub19pbmR1c3RyaWFsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLW1vbm8taW5kdXN0cmlhbCIsYi5jc3NUZXh0PSIuYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMyMjJDMjg7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0ZGRkZGRjt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjt9IC5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYmEoMTQ1LCAxNTMsIDE0OCwgMC40MCk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEwMiwgMTA4LCAxMDQsIDAuNTApO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYmEoMTIsIDEzLCAxMiwgMC4yNSk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE0NSwgMTUzLCAxNDgsIDAuNDApO30gICAgICAgLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYmEoMTAyLCAxMDgsIDEwNCwgMC41MCk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojQTM5RTY0O30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiNBOEIzQUI7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY29uc3RhbnQgeyAgY29sb3I6I0U5ODgwMDt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojRTk4ODAwO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTUzLCAwLCAwLCAwLjY4KTt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0E4QjNBQjsgICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiM1ODhFNjA7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY29tbWVudCB7ICBjb2xvcjojNjY2QzY4O2JhY2tncm91bmQtY29sb3I6IzE1MUMxOTt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IzY0OEJEMjt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojOTA5OTkzO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2VudGl0eS5hY2VfbmFtZSB7ICBjb2xvcjojNTc3OEI2O30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0E4QjNBQjt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-pastel_on_dark-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvdGhlbWUvcGFzdGVsX29uX2RhcmsnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IHRydWU7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1wYXN0ZWwtb24tZGFyayI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2VkaXRvciB7XA0KICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfcHJpbnRfbWFyZ2luIHtcDQogIHdpZHRoOiAxcHg7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogIzJDMjgyODtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICM4RjkzOEY7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jdXJzb3Ige1wNCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQTdBN0E3O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQTdBN0E3O1wNCn1cDQogXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgMjQwLCAyNTUsIDAuMjApO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XA0KICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMxKTtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTtcDQp9XA0KICAgICAgIFwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM3NTdhRDg7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojNzk3ODc4O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6IzRGQjdDNTtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojREU4RTMwO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0NDQ0NDQztcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZhbGlkLmFjZV9pbGxlZ2FsIHtcDQogIGNvbG9yOiNGOEY4Rjg7XA0KYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDg2LCA0NSwgODYsIDAuNzUpO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XA0KICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCmZvbnQtc3R5bGU6aXRhbGljO1wNCmNvbG9yOiNEMkE4QTE7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzc1N2FEODtcDQogICAgYm9yZGVyLWNvbG9yOiAjOEY5MzhGO1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0FFQjJGODtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojNjZBOTY4O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0U5QzA2MjtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6I0E2QzZGRjtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiNCRUJGNTU7XA0KfVwNClwNCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0MxQzE0NDtcDQp9XA0KXA0KLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3htbF9wZSB7XA0KICBjb2xvcjojNDk0OTQ5O1wNCn1cDQpcDQouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-pastel_on_dark.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvcGFzdGVsX29uX2RhcmsiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtcGFzdGVsLW9uLWRhcmsiLGIuY3NzVGV4dD0iLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzJDMjgyODt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICM4RjkzOEY7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQTdBN0E3O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQTdBN0E3O30gLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgMjQwLCAyNTUsIDAuMjApO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMxKTt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTt9ICAgICAgIC5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiM3NTdhRDg7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojNzk3ODc4O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IzRGQjdDNTt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojREU4RTMwO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6I0NDQ0NDQzt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0Y4RjhGODtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZhbGlkLmFjZV9pbGxlZ2FsIHsgIGNvbG9yOiNGOEY4Rjg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDg2LCA0NSwgODYsIDAuNzUpO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNEMkE4QTE7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzc1N2FEODsgICAgYm9yZGVyLWNvbG9yOiAjOEY5MzhGO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0FFQjJGODt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3N0cmluZyB7ICBjb2xvcjojNjZBOTY4O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6I0U5QzA2Mjt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbW1lbnQgeyAgY29sb3I6I0E2QzZGRjt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiNCRUJGNTU7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0MxQzE0NDt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3htbF9wZSB7ICBjb2xvcjojNDk0OTQ5O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_dark-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3NvbGFyaXplZF9kYXJrJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2Utc29sYXJpemVkLWRhcmsiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMwMDJCMzY7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjOTNBMUExO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0QzMDEwMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0QzMDEwMjtcDQp9XA0KIFwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzA3MzY0MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE0NywgMTYxLCAxNjEsIDAuNTApO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzA3MzY0MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzA3MzY0MjtcDQp9XA0KICAgICAgIFwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6IHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM4NTk5MDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0I1ODkwMDtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiNEMzM2ODI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzI2OEJEMjtcDQogICAgYm9yZGVyLWNvbG9yOiAjOTNBMUExO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzI2OEJEMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojMkFBMTk4O1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0QzMDEwMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbW1lbnQge1wNCiAgZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6IzY1N0I4MztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3ZhcmlhYmxlLmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojMjY4QkQyO1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzkzQTFBMTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzI2OEJEMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_dark.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvc29sYXJpemVkX2RhcmsiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2Utc29sYXJpemVkLWRhcmsiLGIuY3NzVGV4dD0iLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzAwMkIzNjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICM5M0ExQTE7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRDMwMTAyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRDMwMTAyO30gLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjMDczNjQyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMDczNjQyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjMDczNjQyO30gICAgICAgLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogcmdiYSgxNDcsIDE2MSwgMTYxLCAwLjUwKTt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2tleXdvcmQgeyAgY29sb3I6Izg1OTkwMDt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojQjU4OTAwO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6I0QzMzY4Mjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjY4QkQyOyAgICBib3JkZXItY29sb3I6ICM5M0ExQTE7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojMjY4QkQyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiMyQUExOTg7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojRDMwMTAyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY29tbWVudCB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojNjU3QjgzO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiMyNjhCRDI7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojOTNBMUExO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojMjY4QkQyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_light-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3NvbGFyaXplZF9saWdodCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1zb2xhcml6ZWQtbGlnaHQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogI0ZERjZFMztcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjNTg2RTc1O1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwMDAwMDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO1wNCn1cDQogXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzA3MzY0MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogI0VFRThENTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICMwNzM2NDI7XA0KfVwNCiAgICAgICBcDQouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogcmdiYSgxNDcsIDE2MSwgMTYxLCAwLjUwKTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiM4NTk5MDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNCNTg5MDA7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0QzMzY4MjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzI2OEJEMjtcDQogICAgYm9yZGVyLWNvbG9yOiAjNTg2RTc1O1wNCn1cDQpcDQouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiMyNjhCRDI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiMyQUExOTg7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0QzMDEwMjtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiM5M0ExQTE7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiMyNjhCRDI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6IzkzQTFBMTtcDQp9XA0KXA0KLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiMyNjhCRDI7XA0KfVwNClwNCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_light.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvc29sYXJpemVkX2xpZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITEsYi5jc3NDbGFzcz0iYWNlLXNvbGFyaXplZC1saWdodCIsYi5jc3NUZXh0PSIuYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICNGREY2RTM7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogIzU4NkU3NTt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDAwMDAwO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDt9IC5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICMwNzM2NDI7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE0NywgMTYxLCAxNjEsIDAuNTApO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICNFRUU4RDU7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjMDczNjQyO30gICAgICAgLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojODU5OTAwO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojQjU4OTAwO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNEMzM2ODI7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICMyNjhCRDI7ICAgIGJvcmRlci1jb2xvcjogIzU4NkU3NTt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojMjY4QkQyO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3N0cmluZyB7ICBjb2xvcjojMkFBMTk4O30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNEMzAxMDI7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY29tbWVudCB7ICBjb2xvcjojOTNBMUExO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3ZhcmlhYmxlLmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojMjY4QkQyO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiM5M0ExQTE7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojMjY4QkQyO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-textmate-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-textmate.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRvbW9ycm93IjsNCmV4cG9ydHMuY3NzVGV4dCA9ICJcDQouYWNlLXRvbW9ycm93IC5hY2VfZWRpdG9yIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9wcmludF9tYXJnaW4ge1wNCiAgd2lkdGg6IDFweDtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogIzRENEQ0QztcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2N1cnNvciB7XA0KICBib3JkZXItbGVmdDogMnB4IHNvbGlkICNBRUFGQUQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNBRUFGQUQ7XA0KfVwNCiBcDQouYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6ICNENkQ2RDY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcDQogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgI0QxRDFEMTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICNFRkVGRUY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkICNENkQ2RDY7XA0KfVwNCiAgICAgICBcDQouYWNlLXRvbW9ycm93IC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiAjRDFEMUQxO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojODk1OUE4O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wNCiAgY29sb3I6IzNFOTk5RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojRjU4NzFGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0Y1ODcxRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0ZGRkZGRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNDODI4Mjk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNGRkZGRkY7XA0KYmFja2dyb3VuZC1jb2xvcjojODk1OUE4O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICM0MjcxQUU7XA0KICAgIGJvcmRlci1jb2xvcjogIzRENEQ0QztcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiM0MjcxQUU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzcxOEMwMDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdyAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOiNDODI4Mjk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiM4RTkwOEM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjojQzgyODI5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNDODI4Mjk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3cgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBjb2xvcjojQzgyODI5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojNDI3MUFFO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcDQogIGNvbG9yOiM3MThDMDA7XA0KfSI7DQoNCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7DQpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3ciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMSxiLmNzc0NsYXNzPSJhY2UtdG9tb3Jyb3ciLGIuY3NzVGV4dD0iLmFjZS10b21vcnJvdyAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG9tb3Jyb3cgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdG9tb3Jyb3cgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXRvbW9ycm93IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRvbW9ycm93IC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjt9LmFjZS10b21vcnJvdyAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICM0RDRENEM7fS5hY2UtdG9tb3Jyb3cgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQUVBRkFEO30uYWNlLXRvbW9ycm93IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQUVBRkFEO30gLmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjRDZENkQ2O30uYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICNEMUQxRDE7fS5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjRUZFRkVGO30uYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjRDZENkQ2O30gICAgICAgLmFjZS10b21vcnJvdyAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogI0QxRDFEMTt9LmFjZS10b21vcnJvdyAuYWNlX2tleXdvcmQgeyAgY29sb3I6Izg5NTlBODt9LmFjZS10b21vcnJvdyAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiMzRTk5OUY7fS5hY2UtdG9tb3Jyb3cgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0Y1ODcxRjt9LmFjZS10b21vcnJvdyAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNGNTg3MUY7fS5hY2UtdG9tb3Jyb3cgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojQzgyODI5O30uYWNlLXRvbW9ycm93IC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICBjb2xvcjojRkZGRkZGO2JhY2tncm91bmQtY29sb3I6Izg5NTlBODt9LmFjZS10b21vcnJvdyAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI3MUFFOyAgICBib3JkZXItY29sb3I6ICM0RDRENEM7fS5hY2UtdG9tb3Jyb3cgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojNDI3MUFFO30uYWNlLXRvbW9ycm93IC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiM3MThDMDA7fS5hY2UtdG9tb3Jyb3cgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojQzgyODI5O30uYWNlLXRvbW9ycm93IC5hY2VfY29tbWVudCB7ICBjb2xvcjojOEU5MDhDO30uYWNlLXRvbW9ycm93IC5hY2VfdmFyaWFibGUgeyAgY29sb3I6I0M4MjgyOTt9LmFjZS10b21vcnJvdyAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojQzgyODI5O30uYWNlLXRvbW9ycm93IC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0M4MjgyOTt9LmFjZS10b21vcnJvdyAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzQyNzFBRTt9LmFjZS10b21vcnJvdyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10b21vcnJvdyAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojNzE4QzAwO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG9tb3Jyb3ctbmlnaHQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMxRDFGMjE7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjQzVDOEM2O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0FFQUZBRDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0FFQUZBRDtcDQp9XA0KIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzM3M0I0MTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNEI0RTU1O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzI4MkEyRTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzM3M0I0MTtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM0QjRFNTU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNCMjk0QkI7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojOEFCRUI3O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNERTkzNUY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojREU5MzVGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojQ0VEMkNGO1wNCmJhY2tncm91bmQtY29sb3I6I0RGNUY1RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wNCiAgY29sb3I6I0NFRDJDRjtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNCNzk4QkY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzgxQTJCRTtcDQogICAgYm9yZGVyLWNvbG9yOiAjQzVDOEM2O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzgxQTJCRTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojQjVCRDY4O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wNCiAgY29sb3I6I0NDNjY2NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6Izk2OTg5NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ZhcmlhYmxlIHtcDQogIGNvbG9yOiNDQzY2NjY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tZXRhLmFjZV90YWcge1wNCiAgY29sb3I6I0NDNjY2NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcDQogIGNvbG9yOiNDQzY2NjY7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiM4MUEyQkU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0I1QkQ2ODtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtdG9tb3Jyb3ctbmlnaHQiLGIuY3NzVGV4dD0iLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzFEMUYyMTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNDNUM4QzY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQUVBRkFEO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQUVBRkFEO30gLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjMzczQjQxO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM0QjRFNTU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMjgyQTJFO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjMzczQjQxO30gICAgICAgLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzRCNEU1NTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0IyOTRCQjt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiM4QUJFQjc7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0RFOTM1Rjt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNERTkzNUY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNDRUQyQ0Y7YmFja2dyb3VuZC1jb2xvcjojREY1RjVGO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICBjb2xvcjojQ0VEMkNGO2JhY2tncm91bmQtY29sb3I6I0I3OThCRjt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODFBMkJFOyAgICBib3JkZXItY29sb3I6ICNDNUM4QzY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojODFBMkJFO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiNCNUJENjg7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojQ0M2NjY2O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY29tbWVudCB7ICBjb2xvcjojOTY5ODk2O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfdmFyaWFibGUgeyAgY29sb3I6I0NDNjY2Njt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojQ0M2NjY2O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0NDNjY2Njt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzgxQTJCRTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojQjVCRDY4O30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_blue-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0X2JsdWUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQpleHBvcnRzLmlzRGFyayA9IHRydWU7DQpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10b21vcnJvdy1uaWdodC1ibHVlIjsNCmV4cG9ydHMuY3NzVGV4dCA9ICJcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcDQogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2d1dHRlciB7XA0KICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wNCiAgY29sb3I6ICMzMzM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc2Nyb2xsZXIge1wNCiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMjQ1MTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdGV4dC1sYXllciB7XA0KICBjdXJzb3I6IHRleHQ7XA0KICBjb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wNCiAgYm9yZGVyLWxlZnQ6IDBweDtcDQogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGO1wNCn1cDQogXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcDQogIGJhY2tncm91bmQ6ICMwMDNGOEU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcDQogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcDQogIGJvcmRlcjogMXB4IHNvbGlkICM0MDRGN0Q7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcDQogIGJhY2tncm91bmQ6ICMwMDM0NkU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzAwM0Y4RTtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2ludmlzaWJsZSB7XA0KICBjb2xvcjogIzQwNEY3RDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojRUJCQkZGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojOTlGRkZGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wNCiAgY29sb3I6I0ZGQzU4RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6I0ZGQzU4RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojRkZGRkZGO1wNCmJhY2tncm91bmQtY29sb3I6I0Y5OURBNTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XA0KICBjb2xvcjojRkZGRkZGO1wNCmJhY2tncm91bmQtY29sb3I6I0VCQkJGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNCQkRBRkY7XA0KICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0JCREFGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiNEMUYxQTk7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOiNGRjlEQTQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6IzcyODVCNztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6I0ZGOURBNDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNGRjlEQTQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcDQogIGNvbG9yOiNGRjlEQTQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6I0JCREFGRjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0QxRjFBOTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_blue.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfYmx1ZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS10b21vcnJvdy1uaWdodC1ibHVlIixiLmNzc1RleHQ9Ii5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAyNDUxO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjRkZGRkZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7fSAuYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzAwM0Y4RTt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgIzQwNEY3RDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzAwMzQ2RTt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjMDAzRjhFO30gICAgICAgLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjNDA0RjdEO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNFQkJCRkY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiM5OUZGRkY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojRkZDNThGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojRkZDNThGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojRjk5REE1O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojRUJCQkZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0JCREFGRjsgICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojQkJEQUZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9zdHJpbmcgeyAgY29sb3I6I0QxRjFBOTt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6I0ZGOURBNDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY29tbWVudCB7ICBjb2xvcjojNzI4NUI3O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojRkY5REE0O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0ZGOURBNDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0ZGOURBNDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojQkJEQUZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojRDFGMUE5O30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_bright-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0X2JyaWdodCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsNCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCI7DQpleHBvcnRzLmNzc1RleHQgPSAiXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wNCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9ndXR0ZXIge1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQogIGNvbG9yOiAjMzMzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zY3JvbGxlciB7XA0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3RleHQtbGF5ZXIge1wNCiAgY3Vyc29yOiB0ZXh0O1wNCiAgY29sb3I6ICNERURFREU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzlGOUY5RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XA0KICBib3JkZXItbGVmdDogMHB4O1wNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5RjlGOUY7XA0KfVwNCiBcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XA0KICBiYWNrZ3JvdW5kOiAjNDI0MjQyO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wNCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzM0MzQzNDtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XA0KICBiYWNrZ3JvdW5kOiAjMkEyQTJBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzQyNDI0MjtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiAjMzQzNDM0O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2tleXdvcmQge1wNCiAgY29sb3I6I0MzOTdEODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojNzBDMEIxO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XA0KICBjb2xvcjojRTc4QzQ1O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcDQogIGNvbG9yOiNFNzhDNDU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojQ0VEMkNGO1wNCmJhY2tncm91bmQtY29sb3I6I0RGNUY1RjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNDRUQyQ0Y7XA0KYmFja2dyb3VuZC1jb2xvcjojQjc5OEJGO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN0FBNkRBO1wNCiAgICBib3JkZXItY29sb3I6ICNERURFREU7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzdBQTZEQTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6I0I5Q0E0QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojRDU0RTUzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbW1lbnQge1wNCiAgY29sb3I6Izk2OTg5NjtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV92YXJpYWJsZSB7XA0KICBjb2xvcjojRDU0RTUzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjojRDU0RTUzO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcDQogIGNvbG9yOiNENTRFNTM7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojN0FBNkRBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0I5Q0E0QTtcDQp9IjsNCg0KdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsNCmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsNCn0pOw0K]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_bright.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfYnJpZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCIsYi5jc3NUZXh0PSIuYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0RFREVERTt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjOUY5RjlGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzlGOUY5Rjt9IC5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICM0MjQyNDI7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjMzQzNDM0O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICMyQTJBMkE7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjNDI0MjQyO30gICAgICAgLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICMzNDM0MzQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojQzM5N0Q4O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiM3MEMwQjE7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNFNzhDNDU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6I0U3OEM0NTt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNDRUQyQ0Y7YmFja2dyb3VuZC1jb2xvcjojREY1RjVGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgY29sb3I6I0NFRDJDRjtiYWNrZ3JvdW5kLWNvbG9yOiNCNzk4QkY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICM3QUE2REE7ICAgIGJvcmRlci1jb2xvcjogI0RFREVERTt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojN0FBNkRBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3N0cmluZyB7ICBjb2xvcjojQjlDQTRBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNENTRFNTM7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY29tbWVudCB7ICBjb2xvcjojOTY5ODk2O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiNENTRFNTM7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiNENTRFNTM7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0Q1NEU1Mzt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiM3QUE2REE7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojQjlDQTRBO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_eighties-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMyRDJEMkQ7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjQ0NDQ0NDO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0NDQ0NDQztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0NDQ0NDQztcDQp9XA0KIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzUxNTE1MTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNkE2QTZBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzM5MzkzOTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzUxNTE1MTtcDQp9XA0KICAgICAgIFwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM2QTZBNkE7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNDQzk5Q0M7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XA0KICBjb2xvcjojNjZDQ0NDO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcDQogIGNvbG9yOiNGOTkxNTc7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XA0KICBjb2xvcjojRjk5MTU3O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfaW52YWxpZCB7XA0KICBjb2xvcjojQ0RDRENEO1wNCmJhY2tncm91bmQtY29sb3I6I0YyNzc3QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wNCiAgY29sb3I6I0NEQ0RDRDtcDQpiYWNrZ3JvdW5kLWNvbG9yOiNDQzk5Q0M7XA0KfVwNClwNCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9mb2xkIHtcDQogICAgYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQztcDQogICAgYm9yZGVyLWNvbG9yOiAjQ0NDQ0NDO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzY2OTlDQztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3N0cmluZyB7XA0KICBjb2xvcjojOTlDQzk5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29tbWVudCB7XA0KICBjb2xvcjojOTk5OTk5O1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6I0YyNzc3QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21ldGEuYWNlX3RhZyB7XA0KICBjb2xvcjojRjI3NzdBO1wNCn1cDQpcDQouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wNCiAgY29sb3I6I0YyNzc3QTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wNCiAgY29sb3I6IzY2OTlDQztcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcDQogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcDQp9XA0KXA0KLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XA0KICBjb2xvcjojOTlDQzk5O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_eighties.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMiLGIuY3NzVGV4dD0iLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzJEMkQyRDt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNDQ0NDQ0M7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQ0NDQ0NDO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDQ0NDO30gLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjNTE1MTUxO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM2QTZBNkE7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMzkzOTM5O30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjNTE1MTUxO30gICAgICAgLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzZBNkE2QTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0NDOTlDQzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiM2NkNDQ0M7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0Y5OTE1Nzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNGOTkxNTc7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNDRENEQ0Q7YmFja2dyb3VuZC1jb2xvcjojRjI3NzdBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICBjb2xvcjojQ0RDRENEO2JhY2tncm91bmQtY29sb3I6I0NDOTlDQzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY5OUNDOyAgICBib3JkZXItY29sb3I6ICNDQ0NDQ0M7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojNjY5OUNDO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiM5OUNDOTk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jb21tZW50IHsgIGNvbG9yOiM5OTk5OTk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojRjI3NzdBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiNGMjc3N0E7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojRjI3NzdBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojNjY5OUNDO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHsgIGNvbG9yOiM5OUNDOTk7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-twilight-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3R3aWxpZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdHdpbGlnaHQiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdHdpbGlnaHQgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMxNDE0MTQ7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRjhGOEY4O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0E3QTdBNztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0E3QTdBNztcDQp9XA0KIFwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSk7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcDQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjIxLCAyNDAsIDI1NSwgMC4yMCk7XA0KfVwNCiAgICAgICBcDQouYWNlLXR3aWxpZ2h0IC5hY2VfaW52aXNpYmxlIHtcDQogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2Vfa2V5d29yZCB7XA0KICBjb2xvcjojQ0RBODY5O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfY29uc3RhbnQge1wNCiAgY29sb3I6I0NGNkE0QztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX2ludmFsaWQuYWNlX2lsbGVnYWwge1wNCiAgY29sb3I6I0Y4RjhGODtcDQpiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KZm9udC1zdHlsZTppdGFsaWM7XA0KY29sb3I6I0QyQThBMTtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3N1cHBvcnQge1wNCiAgY29sb3I6IzlCODU5RDtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX2ZvbGQge1wNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUM4ODVCO1wNCiAgICBib3JkZXItY29sb3I6ICNGOEY4Rjg7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojREFEMDg1O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2Vfc3RyaW5nIHtcDQogIGNvbG9yOiM4RjlENkE7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XA0KICBjb2xvcjojRTlDMDYyO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfY29tbWVudCB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojNUY1QTYwO1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfdmFyaWFibGUge1wNCiAgY29sb3I6Izc1ODdBNjtcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX3htbF9wZSB7XA0KICBjb2xvcjojNDk0OTQ5O1wNCn1cDQpcDQouYWNlLXR3aWxpZ2h0IC5hY2VfbWV0YS5hY2VfdGFnIHtcDQogIGNvbG9yOiNBQzg4NUI7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNBQzg4NUI7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XA0KICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XA0KfVwNClwNCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wNCiAgY29sb3I6I0NGNkE0QztcDQp9XA0KXA0KLmFjZS10d2lsaWdodCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XA0KICBjb2xvcjojRjlFRTk4O1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-twilight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdHdpbGlnaHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtdHdpbGlnaHQiLGIuY3NzVGV4dD0iLmFjZS10d2lsaWdodCAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdHdpbGlnaHQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdHdpbGlnaHQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXR3aWxpZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXR3aWxpZ2h0IC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzE0MTQxNDt9LmFjZS10d2lsaWdodCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNGOEY4Rjg7fS5hY2UtdHdpbGlnaHQgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQTdBN0E3O30uYWNlLXR3aWxpZ2h0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQTdBN0E3O30gLmFjZS10d2lsaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgMjQwLCAyNTUsIDAuMjApO30uYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7fS5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMxKTt9LmFjZS10d2lsaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTt9ICAgICAgIC5hY2UtdHdpbGlnaHQgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7fS5hY2UtdHdpbGlnaHQgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNDREE4Njk7fS5hY2UtdHdpbGlnaHQgLmFjZV9jb25zdGFudCB7ICBjb2xvcjojQ0Y2QTRDO30uYWNlLXR3aWxpZ2h0IC5hY2VfaW52YWxpZC5hY2VfaWxsZWdhbCB7ICBjb2xvcjojRjhGOEY4O2JhY2tncm91bmQtY29sb3I6cmdiYSg4NiwgNDUsIDg2LCAwLjc1KTt9LmFjZS10d2lsaWdodCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXN0eWxlOml0YWxpYztjb2xvcjojRDJBOEExO30uYWNlLXR3aWxpZ2h0IC5hY2Vfc3VwcG9ydCB7ICBjb2xvcjojOUI4NTlEO30uYWNlLXR3aWxpZ2h0IC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNBQzg4NUI7ICAgIGJvcmRlci1jb2xvcjogI0Y4RjhGODt9LmFjZS10d2lsaWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNEQUQwODU7fS5hY2UtdHdpbGlnaHQgLmFjZV9zdHJpbmcgeyAgY29sb3I6IzhGOUQ2QTt9LmFjZS10d2lsaWdodCAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNFOUMwNjI7fS5hY2UtdHdpbGlnaHQgLmFjZV9jb21tZW50IHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiM1RjVBNjA7fS5hY2UtdHdpbGlnaHQgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojNzU4N0E2O30uYWNlLXR3aWxpZ2h0IC5hY2VfeG1sX3BlIHsgIGNvbG9yOiM0OTQ5NDk7fS5hY2UtdHdpbGlnaHQgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0FDODg1Qjt9LmFjZS10d2lsaWdodCAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0FDODg1Qjt9LmFjZS10d2lsaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10d2lsaWdodCAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojQ0Y2QTRDO30uYWNlLXR3aWxpZ2h0IC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGNvbG9yOiNGOUVFOTg7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-vibrant_ink-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3RoZW1lL3ZpYnJhbnRfaW5rJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KZXhwb3J0cy5pc0RhcmsgPSB0cnVlOw0KZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdmlicmFudC1pbmsiOw0KZXhwb3J0cy5jc3NUZXh0ID0gIlwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lZGl0b3Ige1wNCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XA0KICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZ3V0dGVyIHtcDQogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XA0KICBjb2xvcjogIzMzMztcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3ByaW50X21hcmdpbiB7XA0KICB3aWR0aDogMXB4O1wNCiAgYmFja2dyb3VuZDogI2U4ZThlODtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3Njcm9sbGVyIHtcDQogIGJhY2tncm91bmQtY29sb3I6ICMwRjBGMEY7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV90ZXh0LWxheWVyIHtcDQogIGN1cnNvcjogdGV4dDtcDQogIGNvbG9yOiAjRkZGRkZGO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY3Vyc29yIHtcDQogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcDQogIGJvcmRlci1sZWZ0OiAwcHg7XA0KICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjtcDQp9XA0KIFwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wNCiAgYmFja2dyb3VuZDogIzY2OTlDQztcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wNCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XA0KICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XA0KICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wNCiAgYmFja2dyb3VuZDogIzMzMzMzMztcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wNCiAgYm9yZGVyOiAxcHggc29saWQgIzY2OTlDQztcDQp9XA0KICAgICAgIFwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZpc2libGUge1wNCiAgY29sb3I6ICM0MDQwNDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9rZXl3b3JkIHtcDQogIGNvbG9yOiNGRjY2MDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9jb25zdGFudCB7XA0KICBjb2xvcjojMzM5OTk5O1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wNCiAgY29sb3I6Izk5Q0M5OTtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX2ludmFsaWQge1wNCiAgY29sb3I6I0NDRkYzMztcDQpiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcDQogIGNvbG9yOiNDQ0ZGMzM7XA0KYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZm9sZCB7XA0KICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkNDMDA7XA0KICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcDQogIGNvbG9yOiNGRkNDMDA7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9zdHJpbmcge1wNCiAgY29sb3I6IzY2RkYwMDtcDQp9XA0KXA0KLmFjZS12aWJyYW50LWluayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcDQogIGNvbG9yOiM0NEI0Q0M7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9jb21tZW50IHtcDQogIGNvbG9yOiM5OTMzQ0M7XA0KfVwNClwNCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XA0KICBmb250LXN0eWxlOml0YWxpYztcDQpjb2xvcjojOTlDQzk5O1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XA0KICBjb2xvcjojRkZDQzAwO1wNCn1cDQpcDQouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wNCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wNCn0iOw0KDQp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOw0KZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-vibrant_ink.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdmlicmFudF9pbmsiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtdmlicmFudC1pbmsiLGIuY3NzVGV4dD0iLmFjZS12aWJyYW50LWluayAuYWNlX2VkaXRvciB7ICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXZpYnJhbnQtaW5rIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzBGMEYwRjt9LmFjZS12aWJyYW50LWluayAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNGRkZGRkY7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGO30gLmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjNjY5OUNDO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMzMzMzMzO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCAjNjY5OUNDO30gICAgICAgLmFjZS12aWJyYW50LWluayAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzQwNDA0MDt9LmFjZS12aWJyYW50LWluayAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0ZGNjYwMDt9LmFjZS12aWJyYW50LWluayAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiMzMzk5OTk7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojOTlDQzk5O30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfaW52YWxpZCB7ICBjb2xvcjojQ0NGRjMzO2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDt9LmFjZS12aWJyYW50LWluayAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgY29sb3I6I0NDRkYzMztiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGQ0MwMDsgICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO30uYWNlLXZpYnJhbnQtaW5rIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0ZGQ0MwMDt9LmFjZS12aWJyYW50LWluayAuYWNlX3N0cmluZyB7ICBjb2xvcjojNjZGRjAwO30uYWNlLXZpYnJhbnQtaW5rIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6IzQ0QjRDQzt9LmFjZS12aWJyYW50LWluayAuYWNlX2NvbW1lbnQgeyAgY29sb3I6Izk5MzNDQzt9LmFjZS12aWJyYW50LWluayAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiM5OUNDOTk7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNGRkNDMDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0p]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-coffee.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKCB0eXBlb2Yoc3RyKSA9PSAnc3RyaW5nJyAmJiBtYXRjaCkgew0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yDQogICAgICAgICAgICAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgew0KICAgICAgICAgICAgICAgIHIyID0gUmVnRXhwKHRoaXMuc291cmNlLCByZWFsLnJlcGxhY2UuY2FsbChnZXROYXRpdmVGbGFncyh0aGlzKSwgImciLCAiIikpOw0KICAgICAgICAgICAgICAgIC8vIFVzaW5nIGBzdHIuc2xpY2UobWF0Y2guaW5kZXgpYCByYXRoZXIgdGhhbiBgbWF0Y2hbMF1gIGluIGNhc2UgbG9va2FoZWFkIGFsbG93ZWQNCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaA0KICAgICAgICAgICAgICAgIHJlYWwucmVwbGFjZS5jYWxsKHN0ci5zbGljZShtYXRjaC5pbmRleCksIHIyLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW2ldID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBBdHRhY2ggbmFtZWQgY2FwdHVyZSBwcm9wZXJ0aWVzDQogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWF0Y2gubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2kgLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW25hbWVdID0gbWF0Y2hbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHRoYXQgaW5jcmVtZW50IGBsYXN0SW5kZXhgIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50ICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgIH07DQoNCiAgICAvLyBEb24ndCBvdmVycmlkZSBgdGVzdGAgaWYgaXQgd29uJ3QgY2hhbmdlIGFueXRoaW5nDQogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsNCiAgICAgICAgLy8gRml4IGJyb3dzZXIgYnVnIGluIG5hdGl2ZSBtZXRob2QNCiAgICAgICAgUmVnRXhwLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHN0cikgew0KICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuDQogICAgICAgICAgICAvLyBgZXhlY2Agd291bGQgdGFrZSBjYXJlIG9mIHRoZSBgbGFzdEluZGV4YCBmaXgNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlYWwuZXhlYy5jYWxsKHRoaXMsIHN0cik7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgZnVuY3Rpb24gZ2V0TmF0aXZlRmxhZ3MgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguaWdub3JlQ2FzZSA/ICJpIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXgubXVsdGlsaW5lICA/ICJtIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMw0KICAgICAgICAgICAgICAgKHJlZ2V4LnN0aWNreSAgICAgPyAieSIgOiAiIik7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGluZGV4T2YgKGFycmF5LCBpdGVtLCBmcm9tKSB7DQogICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgLy8gVXNlIHRoZSBuYXRpdmUgYXJyYXkgbWV0aG9kIGlmIGF2YWlsYWJsZQ0KICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7DQogICAgICAgIGZvciAodmFyIGkgPSBmcm9tIHx8IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KDQp9KTsNCi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29mZmVlX3dvcmtlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3dvcmtlci9taXJyb3InLCAnYWNlL21vZGUvY29mZmVlL2NvZmZlZS1zY3JpcHQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7DQp2YXIgTWlycm9yID0gcmVxdWlyZSgiLi4vd29ya2VyL21pcnJvciIpLk1pcnJvcjsNCnZhciBjb2ZmZWUgPSByZXF1aXJlKCIuLi9tb2RlL2NvZmZlZS9jb2ZmZWUtc2NyaXB0Iik7DQoNCndpbmRvdy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oKSB7fTsNCg0KDQp2YXIgV29ya2VyID0gZXhwb3J0cy5Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsNCiAgICBNaXJyb3IuY2FsbCh0aGlzLCBzZW5kZXIpOw0KICAgIHRoaXMuc2V0VGltZW91dCgyMDApOw0KfTsNCg0Kb29wLmluaGVyaXRzKFdvcmtlciwgTWlycm9yKTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOw0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBjb2ZmZWUucGFyc2UodmFsdWUpOw0KICAgICAgICB9IGNhdGNoKGUpIHsNCiAgICAgICAgICAgIHZhciBtID0gZS5tZXNzYWdlLm1hdGNoKC9QYXJzZSBlcnJvciBvbiBsaW5lIChcZCspOiAoLiopLyk7DQogICAgICAgICAgICBpZiAobSkgew0KICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImVycm9yIiwgew0KICAgICAgICAgICAgICAgICAgICByb3c6IHBhcnNlSW50KG1bMV0sIDEwKSAtIDEsDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogbVsyXSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikgew0KICAgICAgICAgICAgICAgIHZhciBtID0gZS5tZXNzYWdlLm1hdGNoKC8gb24gbGluZSAoXGQrKS8pOw0KICAgICAgICAgICAgICAgIGlmIChtKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImVycm9yIiwgew0KICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBwYXJzZUludChtWzFdLCAxMCkgLSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBudWxsLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZS5tZXNzYWdlLnJlcGxhY2UobVswXSwgIiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgib2siKTsNCiAgICB9Ow0KDQp9KS5jYWxsKFdvcmtlci5wcm90b3R5cGUpOw0KDQp9KTtkZWZpbmUoJ2FjZS93b3JrZXIvbWlycm9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuLi9kb2N1bWVudCIpLkRvY3VtZW50Ow0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KICAgIA0KdmFyIE1pcnJvciA9IGV4cG9ydHMuTWlycm9yID0gZnVuY3Rpb24oc2VuZGVyKSB7DQogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7DQogICAgdmFyIGRvYyA9IHRoaXMuZG9jID0gbmV3IERvY3VtZW50KCIiKTsNCiAgICANCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWZlcnJlZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsNCiAgICANCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICBkb2MuYXBwbHlEZWx0YXMoW2UuZGF0YV0pOyAgICAgICAgDQogICAgICAgIGRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKF9zZWxmLiR0aW1lb3V0KTsNCiAgICB9KTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLiR0aW1lb3V0ID0gNTAwOw0KICAgIA0KICAgIHRoaXMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsNCiAgICAgICAgdGhpcy4kdGltZW91dCA9IHRpbWVvdXQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOw0KICAgICAgICB0aGlzLmRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKHRoaXMuJHRpbWVvdXQpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrSWQpIHsNCiAgICAgICAgdGhpcy5zZW5kZXIuY2FsbGJhY2sodGhpcy5kb2MuZ2V0VmFsdWUoKSwgY2FsbGJhY2tJZCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uVXBkYXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIC8vIGFic3RyYWN0IG1ldGhvZA0KICAgIH07DQogICAgDQp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7DQoNCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICB0aGlzLiRsaW5lcyA9IFtdOw0KDQogICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHsNCiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsNCiAgICB9DQogICAgLy8gVGhlcmUgaGFzIHRvIGJlIG9uZSBsaW5lIGF0IGxlYXN0IGluIHRoZSBkb2N1bWVudC4gSWYgeW91IHBhc3MgYW4gZW1wdHkNCiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4NCiAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuJGxpbmVzID0gWyIiXTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuLTEpLmxlbmd0aCkpOw0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICAvLyBjaGVjayBmb3IgSUUgc3BsaXQgYnVnDQogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApDQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHJcbnxcci9nLCAiXG4iKS5zcGxpdCgiXG4iKTsNCiAgICAgICAgfQ0KICAgIGVsc2UNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOw0KICAgICAgICB9Ow0KDQoNCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyID0gZnVuY3Rpb24oKSB7DQogICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7DQogICAgICAgICAgY2FzZSAid2luZG93cyI6DQogICAgICAgICAgICAgIHJldHVybiAiXHJcbiI7DQoNCiAgICAgICAgICBjYXNlICJ1bml4IjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcbiI7DQoNCiAgICAgICAgICBjYXNlICJhdXRvIjoNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lOw0KICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7DQogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7DQogICAgICAgIGlmICh0aGlzLiRuZXdMaW5lTW9kZSA9PT0gbmV3TGluZU1vZGUpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7DQogICAgfTsNCg0KICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudA0KICAgICAqLw0KICAgIHRoaXMuZ2V0TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcm93XSB8fCAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIGFsbCBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgc3RyaW5nIGFycmF5LiBXYXJuaW5nOiBUaGUgY2FsbGVyDQogICAgICogc2hvdWxkIG5vdCBtb2RpZnkgdGhpcyBhcnJheSENCiAgICAgKi8NCiAgICB0aGlzLmdldEFsbExpbmVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5nZXRMaW5lcyhyYW5nZS5zdGFydC5yb3crMSwgcmFuZ2UuZW5kLnJvdy0xKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7DQogICAgICAgICAgICByZXR1cm4gbGluZXMuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7DQogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBsZW5ndGggLSAxKTsNCiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQoNCiAgICAgICAgaWYgKHRoaXMuZ2V0TGVuZ3RoKCkgPD0gMSkNCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kc3BsaXQodGV4dCk7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07DQogICAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IGxpbmVzLnNwbGljZShsaW5lcy5sZW5ndGggLSAxLCAxKVswXTsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOw0KICAgICAgICBpZiAobGFzdExpbmUgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnROZXdMaW5lKHBvc2l0aW9uKTsgLy8gdGVybWluYXRlIGZpcnN0IGxpbmUNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGxhc3RMaW5lIHx8ICIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7DQogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogMH07DQoNCiAgICAgICAgdmFyIGFyZ3MgPSBbcm93LCAwXTsNCiAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGxpbmVzKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3cgKyBsaW5lcy5sZW5ndGgsIDApOw0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBsaW5lczogbGluZXMNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShwb3NpdGlvbi5yb3cgKyAxLCAwLCBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4sIGxpbmUubGVuZ3RoKSk7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdyArIDEsDQogICAgICAgICAgICBjb2x1bW4gOiAwDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRJbkxpbmUgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbikgKyB0ZXh0DQogICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4pOw0KDQogICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3csDQogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aA0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAvLyBjbGlwIHRvIGRvY3VtZW50DQogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsNCiAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLmVuZCk7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gcmFuZ2UuZW5kLnJvdzsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgdmFyIGZpcnN0RnVsbFJvdyA9IHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSAwID8gZmlyc3RSb3cgOiBmaXJzdFJvdyArIDE7DQogICAgICAgICAgICB2YXIgbGFzdEZ1bGxSb3cgPSBsYXN0Um93IC0gMTsNCg0KICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPiAwKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGxhc3RSb3csIDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KDQogICAgICAgICAgICBpZiAobGFzdEZ1bGxSb3cgPj0gZmlyc3RGdWxsUm93KQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMoZmlyc3RGdWxsUm93LCBsYXN0RnVsbFJvdyk7DQoNCiAgICAgICAgICAgIGlmIChmaXJzdEZ1bGxSb3cgIT0gZmlyc3RSb3cpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCB0aGlzLmdldExpbmUoZmlyc3RSb3cpLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7DQogICAgICAgIGlmIChzdGFydENvbHVtbiA9PSBlbmRDb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgc3RhcnRDb2x1bW4sIHJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIG5ld0xpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4sIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMSwgbmV3TGluZSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICB0ZXh0OiByZW1vdmVkDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIHJhbmdlIG9mIGZ1bGwgbGluZXMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBmaXJzdFJvdyB7SW50ZWdlcn0gVGhlIGZpcnN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHBhcmFtIGxhc3RSb3cge0ludGVnZXJ9IFRoZSBsYXN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzDQogICAgICovDQogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuJGxpbmVzLnNwbGljZShmaXJzdFJvdywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlTGluZXMiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLA0KICAgICAgICAgICAgbGluZXM6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBmaXJzdExpbmUubGVuZ3RoLCByb3crMSwgMCk7DQogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsNCg0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAyLCBsaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICAvLyBTaG9ydGN1dDogSWYgdGhlIHRleHQgd2Ugd2FudCB0byBpbnNlcnQgaXMgdGhlIHNhbWUgYXMgaXQgaXMgYWxyZWFkeQ0KICAgICAgICAvLyBpbiB0aGUgZG9jdW1lbnQsIHdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSBhbnl0aGluZy4NCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCg0KICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIGlmICh0ZXh0KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmFwcGx5RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOw0KDQogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChEb2N1bWVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9yYW5nZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsNCiAgICB0aGlzLnN0YXJ0ID0gew0KICAgICAgICByb3c6IHN0YXJ0Um93LA0KICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMuZW5kID0gew0KICAgICAgICByb3c6IGVuZFJvdywNCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmDQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmDQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbg0KICAgIH07DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAoIlJhbmdlOiBbIiArIHRoaXMuc3RhcnQucm93ICsgIi8iICsgdGhpcy5zdGFydC5jb2x1bW4gKw0KICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ29tcGFyZXMgdGhpcyByYW5nZSAoQSkgd2l0aCBhbm90aGVyIHJhbmdlIChCKSwgd2hlcmUgQiBpcyB0aGUgcGFzc2VkIGluDQogICAgICogcmFuZ2UuDQogICAgICoNCiAgICAgKiBSZXR1cm4gdmFsdWVzOg0KICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkNCiAgICAgKiAgIDA6IChCKSBpcyBjb21wbGV0bHkgaW5zaWRlIG9mIChBKSBPUiAoQSkgaXMgY29tcGxldHkgaW5zaWRlIG9mIChCKQ0KICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpDQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqDQogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpDQogICAgICovDQogICAgdGhpcy5jb21wYXJlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICB2YXIgY21wLA0KICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLA0KICAgICAgICAgICAgc3RhcnQgPSByYW5nZS5zdGFydDsNCg0KICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7DQogICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIHJldHVybiAtMjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiA0MjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOw0KICAgIH0NCg0KICAgIHRoaXMuY29udGFpbnNSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7DQogICAgfQ0KDQogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gY29sdW1uOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHJvdyA8IHRoaXMuc3RhcnQucm93KQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KDQogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpDQogICAgICAgICAgICByZXR1cm4gMTsNCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT09IHJvdykNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7DQoNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsNCg0KICAgICAgICByZXR1cm4gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7DQogICAgICovDQogICAgdGhpcy5jb21wYXJlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc0VuZCBpcyB0cnVlLCByZXR1cm4gMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA+IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgIHJvdzogbGFzdFJvdysxLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5leHRlbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCg0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQ0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCg0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ICE9PSB0aGlzLmVuZC5yb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdy0xKSwgMCkNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQ0KICAgIH07DQoNCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsNCiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7DQoNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgNCiAgICAgICAgICAgIHNjcmVlblBvc1N0YXJ0LnJvdywgc2NyZWVuUG9zU3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbg0KICAgICAgICApOw0KICAgIH07DQoNCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsNCg0KDQpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnQucm93LCBzdGFydC5jb2x1bW4sIGVuZC5yb3csIGVuZC5jb2x1bW4pOw0KfTsNCg0KZXhwb3J0cy5SYW5nZSA9IFJhbmdlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvYW5jaG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQovKioNCiAqIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yDQogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkDQogKi8NCnZhciBBbmNob3IgPSBleHBvcnRzLkFuY2hvciA9IGZ1bmN0aW9uKGRvYywgcm93LCBjb2x1bW4pIHsNCiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOw0KICAgIA0KICAgIGlmICh0eXBlb2YgY29sdW1uID09ICJ1bmRlZmluZWQiKQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOw0KICAgIGVsc2UNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbik7DQoNCiAgICB0aGlzLiRvbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTsNCiAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICANCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LCB0aGlzLmNvbHVtbik7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldERvY3VtZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB2YXIgcmFuZ2UgPSBkZWx0YS5yYW5nZTsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbjsNCiAgICAgICAgDQogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0Iikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8PSBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydExpbmVzIikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPCBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+PSBjb2x1bW4pDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIChyYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJvdyAtPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93IDw9IHJvdykNCiAgICAgICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uLCB0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBub0NsaXApIHsNCiAgICAgICAgdmFyIHBvczsNCiAgICAgICAgaWYgKG5vQ2xpcCkgew0KICAgICAgICAgICAgcG9zID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICh0aGlzLnJvdyA9PSBwb3Mucm93ICYmIHRoaXMuY29sdW1uID09IHBvcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG9sZCA9IHsNCiAgICAgICAgICAgIHJvdzogdGhpcy5yb3csDQogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uDQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7DQogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgew0KICAgICAgICAgICAgb2xkOiBvbGQsDQogICAgICAgICAgICB2YWx1ZTogcG9zDQogICAgICAgIH0pOw0KICAgIH07DQogICAgDQogICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHBvcyA9IHt9Ow0KICAgIA0KICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSBNYXRoLm1heCgwLCB0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7DQogICAgICAgICAgICBwb3Mucm93ID0gMDsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSBNYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoLCBNYXRoLm1heCgwLCBjb2x1bW4pKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKGNvbHVtbiA8IDApDQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gcG9zOw0KICAgIH07DQogICAgDQp9KS5jYWxsKEFuY2hvci5wcm90b3R5cGUpOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCmV4cG9ydHMuc3RyaW5nUmV2ZXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsNCn07DQoNCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsNCiAgICAgcmV0dXJuIG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4oc3RyaW5nKTsNCn07DQoNCnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsNCnZhciB0cmltRW5kUmVnZXhwID0gL1xzXHMqJC87DQoNCmV4cG9ydHMuc3RyaW5nVHJpbUxlZnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsNCn07DQoNCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgew0KICAgIHZhciBjb3B5ID0ge307DQogICAgZm9yICh2YXIga2V5IGluIG9iaikgew0KICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmNvcHlBcnJheSA9IGZ1bmN0aW9uKGFycmF5KXsNCiAgICB2YXIgY29weSA9IFtdOw0KICAgIGZvciAodmFyIGk9MCwgbD1hcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7DQogICAgICAgIGlmIChhcnJheVtpXSAmJiB0eXBlb2YgYXJyYXlbaV0gPT0gIm9iamVjdCIpDQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KCBhcnJheVtpXSApOw0KICAgICAgICBlbHNlIA0KICAgICAgICAgICAgY29weVtpXSA9IGFycmF5W2ldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuZGVlcENvcHkgPSBmdW5jdGlvbiAob2JqKSB7DQogICAgaWYgKHR5cGVvZiBvYmogIT0gIm9iamVjdCIpIHsNCiAgICAgICAgcmV0dXJuIG9iajsNCiAgICB9DQogICAgDQogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIGNvcHlba2V5XSA9IHRoaXMuZGVlcENvcHkob2JqW2tleV0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmFycmF5VG9NYXAgPSBmdW5jdGlvbihhcnIpIHsNCiAgICB2YXIgbWFwID0ge307DQogICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgew0KICAgICAgICBtYXBbYXJyW2ldXSA9IDE7DQogICAgfQ0KICAgIHJldHVybiBtYXA7DQoNCn07DQoNCi8qKg0KICogc3BsaWNlIG91dCBvZiAnYXJyYXknIGFueXRoaW5nIHRoYXQgPT09ICd2YWx1ZScNCiAqLw0KZXhwb3J0cy5hcnJheVJlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgew0KICBmb3IgKHZhciBpID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgIGlmICh2YWx1ZSA9PT0gYXJyYXlbaV0pIHsNCiAgICAgIGFycmF5LnNwbGljZShpLCAxKTsNCiAgICB9DQogIH0NCn07DQoNCmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24oc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7DQp9Ow0KDQpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgew0KDQogICAgdmFyIHRpbWVyID0gbnVsbDsNCiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGltZXIgPSBudWxsOw0KICAgICAgICBmY24oKTsNCiAgICB9Ow0KDQogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24odGltZW91dCkgew0KICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsNCiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IDApOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7DQoNCiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuY2FuY2VsKCk7DQogICAgICAgIGZjbigpOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOw0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgcmV0dXJuIGRlZmVycmVkOw0KfTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCiANCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL2NvZmZlZS1zY3JpcHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9tb2RlL2NvZmZlZS9sZXhlcicsICdhY2UvbW9kZS9jb2ZmZWUvcGFyc2VyJywgJ2FjZS9tb2RlL2NvZmZlZS9ub2RlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICANCiAgICB2YXIgTGV4ZXIgPSByZXF1aXJlKCIuL2xleGVyIikuTGV4ZXI7DQogICAgdmFyIHBhcnNlciA9IHJlcXVpcmUoIi4vcGFyc2VyIik7DQoNCiAgICB2YXIgbGV4ZXIgPSBuZXcgTGV4ZXIoKTsNCiAgICBwYXJzZXIubGV4ZXIgPSB7DQogICAgICAgIGxleDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgdGFnLCBfcmVmMjsNCiAgICAgICAgICAgIF9yZWYyID0gdGhpcy50b2tlbnNbdGhpcy5wb3MrK10gfHwgWycnXSwgdGFnID0gX3JlZjJbMF0sIHRoaXMueXl0ZXh0ID0gX3JlZjJbMV0sIHRoaXMueXlsaW5lbm8gPSBfcmVmMlsyXTsNCiAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgIH0sDQogICAgICAgIHNldElucHV0OiBmdW5jdGlvbih0b2tlbnMpIHsNCiAgICAgICAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zID0gMDsNCiAgICAgICAgfSwNCiAgICAgICAgdXBjb21pbmdJbnB1dDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIHBhcnNlci55eSA9IHJlcXVpcmUoJy4vbm9kZXMnKTsNCiAgICANCiAgICBleHBvcnRzLnBhcnNlID0gZnVuY3Rpb24oY29kZSkgew0KICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGxleGVyLnRva2VuaXplKGNvZGUpKTsNCiAgICB9Ow0KfSk7LyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvbGV4ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9tb2RlL2NvZmZlZS9yZXdyaXRlcicsICdhY2UvbW9kZS9jb2ZmZWUvaGVscGVycyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICANCiAgdmFyIEFTU0lHTkVELCBCT09MLCBDQUxMQUJMRSwgQ09ERSwgQ09GRkVFX0FMSUFTRVMsIENPRkZFRV9BTElBU19NQVAsIENPRkZFRV9LRVlXT1JEUywgQ09NTUVOVCwgQ09NUEFSRSwgQ09NUE9VTkRfQVNTSUdOLCBIRVJFRE9DLCBIRVJFRE9DX0lMTEVHQUwsIEhFUkVET0NfSU5ERU5ULCBIRVJFR0VYLCBIRVJFR0VYX09NSVQsIElERU5USUZJRVIsIElOREVYQUJMRSwgSlNUT0tFTiwgSlNfRk9SQklEREVOLCBKU19LRVlXT1JEUywgTElORV9CUkVBSywgTElORV9DT05USU5VRVIsIExPR0lDLCBMZXhlciwgTUFUSCwgTVVMVElMSU5FUiwgTVVMVElfREVOVCwgTk9UX1JFR0VYLCBOT1RfU1BBQ0VEX1JFR0VYLCBOT19ORVdMSU5FLCBOVU1CRVIsIE9QRVJBVE9SLCBSRUdFWCwgUkVMQVRJT04sIFJFU0VSVkVELCBSZXdyaXRlciwgU0hJRlQsIFNJTVBMRVNUUiwgVFJBSUxJTkdfU1BBQ0VTLCBVTkFSWSwgV0hJVEVTUEFDRSwgY29tcGFjdCwgY291bnQsIGtleSwgbGFzdCwgc3RhcnRzLCBfcmVmOw0KICB2YXIgX19pbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgew0KICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICAgIGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsNCiAgICB9DQogICAgcmV0dXJuIC0xOw0KICB9Ow0KICBSZXdyaXRlciA9IHJlcXVpcmUoJy4vcmV3cml0ZXInKS5SZXdyaXRlcjsNCiAgX3JlZiA9IHJlcXVpcmUoJy4vaGVscGVycycpLCBjb3VudCA9IF9yZWYuY291bnQsIHN0YXJ0cyA9IF9yZWYuc3RhcnRzLCBjb21wYWN0ID0gX3JlZi5jb21wYWN0LCBsYXN0ID0gX3JlZi5sYXN0Ow0KICBleHBvcnRzLkxleGVyID0gTGV4ZXIgPSAoZnVuY3Rpb24oKSB7DQogICAgZnVuY3Rpb24gTGV4ZXIoKSB7fQ0KICAgIExleGVyLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uKGNvZGUsIG9wdHMpIHsNCiAgICAgIHZhciBpOw0KICAgICAgaWYgKG9wdHMgPT0gbnVsbCkgew0KICAgICAgICBvcHRzID0ge307DQogICAgICB9DQogICAgICBpZiAoV0hJVEVTUEFDRS50ZXN0KGNvZGUpKSB7DQogICAgICAgIGNvZGUgPSAiXG4iICsgY29kZTsNCiAgICAgIH0NCiAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL1xyL2csICcnKS5yZXBsYWNlKFRSQUlMSU5HX1NQQUNFUywgJycpOw0KICAgICAgdGhpcy5jb2RlID0gY29kZTsNCiAgICAgIHRoaXMubGluZSA9IG9wdHMubGluZSB8fCAwOw0KICAgICAgdGhpcy5pbmRlbnQgPSAwOw0KICAgICAgdGhpcy5pbmRlYnQgPSAwOw0KICAgICAgdGhpcy5vdXRkZWJ0ID0gMDsNCiAgICAgIHRoaXMuaW5kZW50cyA9IFtdOw0KICAgICAgdGhpcy50b2tlbnMgPSBbXTsNCiAgICAgIGkgPSAwOw0KICAgICAgd2hpbGUgKHRoaXMuY2h1bmsgPSBjb2RlLnNsaWNlKGkpKSB7DQogICAgICAgIGkgKz0gdGhpcy5pZGVudGlmaWVyVG9rZW4oKSB8fCB0aGlzLmNvbW1lbnRUb2tlbigpIHx8IHRoaXMud2hpdGVzcGFjZVRva2VuKCkgfHwgdGhpcy5saW5lVG9rZW4oKSB8fCB0aGlzLmhlcmVkb2NUb2tlbigpIHx8IHRoaXMuc3RyaW5nVG9rZW4oKSB8fCB0aGlzLm51bWJlclRva2VuKCkgfHwgdGhpcy5yZWdleFRva2VuKCkgfHwgdGhpcy5qc1Rva2VuKCkgfHwgdGhpcy5saXRlcmFsVG9rZW4oKTsNCiAgICAgIH0NCiAgICAgIHRoaXMuY2xvc2VJbmRlbnRhdGlvbigpOw0KICAgICAgaWYgKG9wdHMucmV3cml0ZSA9PT0gZmFsc2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIChuZXcgUmV3cml0ZXIpLnJld3JpdGUodGhpcy50b2tlbnMpOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLmlkZW50aWZpZXJUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGNvbG9uLCBmb3JjZWRJZGVudGlmaWVyLCBpZCwgaW5wdXQsIG1hdGNoLCBwcmV2LCB0YWcsIF9yZWYyLCBfcmVmMzsNCiAgICAgIGlmICghKG1hdGNoID0gSURFTlRJRklFUi5leGVjKHRoaXMuY2h1bmspKSkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICAgIGlucHV0ID0gbWF0Y2hbMF0sIGlkID0gbWF0Y2hbMV0sIGNvbG9uID0gbWF0Y2hbMl07DQogICAgICBpZiAoaWQgPT09ICdvd24nICYmIHRoaXMudGFnKCkgPT09ICdGT1InKSB7DQogICAgICAgIHRoaXMudG9rZW4oJ09XTicsIGlkKTsNCiAgICAgICAgcmV0dXJuIGlkLmxlbmd0aDsNCiAgICAgIH0NCiAgICAgIGZvcmNlZElkZW50aWZpZXIgPSBjb2xvbiB8fCAocHJldiA9IGxhc3QodGhpcy50b2tlbnMpKSAmJiAoKChfcmVmMiA9IHByZXZbMF0pID09PSAnLicgfHwgX3JlZjIgPT09ICc/LicgfHwgX3JlZjIgPT09ICc6OicpIHx8ICFwcmV2LnNwYWNlZCAmJiBwcmV2WzBdID09PSAnQCcpOw0KICAgICAgdGFnID0gJ0lERU5USUZJRVInOw0KICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEpTX0tFWVdPUkRTLCBpZCkgPj0gMCB8fCAhZm9yY2VkSWRlbnRpZmllciAmJiBfX2luZGV4T2YuY2FsbChDT0ZGRUVfS0VZV09SRFMsIGlkKSA+PSAwKSB7DQogICAgICAgIHRhZyA9IGlkLnRvVXBwZXJDYXNlKCk7DQogICAgICAgIGlmICh0YWcgPT09ICdXSEVOJyAmJiAoX3JlZjMgPSB0aGlzLnRhZygpLCBfX2luZGV4T2YuY2FsbChMSU5FX0JSRUFLLCBfcmVmMykgPj0gMCkpIHsNCiAgICAgICAgICB0YWcgPSAnTEVBRElOR19XSEVOJzsNCiAgICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdGT1InKSB7DQogICAgICAgICAgdGhpcy5zZWVuRm9yID0gdHJ1ZTsNCiAgICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdVTkxFU1MnKSB7DQogICAgICAgICAgdGFnID0gJ0lGJzsNCiAgICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChVTkFSWSwgdGFnKSA+PSAwKSB7DQogICAgICAgICAgdGFnID0gJ1VOQVJZJzsNCiAgICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChSRUxBVElPTiwgdGFnKSA+PSAwKSB7DQogICAgICAgICAgaWYgKHRhZyAhPT0gJ0lOU1RBTkNFT0YnICYmIHRoaXMuc2VlbkZvcikgew0KICAgICAgICAgICAgdGFnID0gJ0ZPUicgKyB0YWc7DQogICAgICAgICAgICB0aGlzLnNlZW5Gb3IgPSBmYWxzZTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGFnID0gJ1JFTEFUSU9OJzsNCiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgPT09ICchJykgew0KICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTsNCiAgICAgICAgICAgICAgaWQgPSAnIScgKyBpZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmIChfX2luZGV4T2YuY2FsbChKU19GT1JCSURERU4sIGlkKSA+PSAwKSB7DQogICAgICAgIGlmIChmb3JjZWRJZGVudGlmaWVyKSB7DQogICAgICAgICAgdGFnID0gJ0lERU5USUZJRVInOw0KICAgICAgICAgIGlkID0gbmV3IFN0cmluZyhpZCk7DQogICAgICAgICAgaWQucmVzZXJ2ZWQgPSB0cnVlOw0KICAgICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKFJFU0VSVkVELCBpZCkgPj0gMCkgew0KICAgICAgICAgIHRoaXMuaWRlbnRpZmllckVycm9yKGlkKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKCFmb3JjZWRJZGVudGlmaWVyKSB7DQogICAgICAgIGlmIChfX2luZGV4T2YuY2FsbChDT0ZGRUVfQUxJQVNFUywgaWQpID49IDApIHsNCiAgICAgICAgICBpZCA9IENPRkZFRV9BTElBU19NQVBbaWRdOw0KICAgICAgICB9DQogICAgICAgIHRhZyA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICBzd2l0Y2ggKGlkKSB7DQogICAgICAgICAgICBjYXNlICchJzoNCiAgICAgICAgICAgICAgcmV0dXJuICdVTkFSWSc7DQogICAgICAgICAgICBjYXNlICc9PSc6DQogICAgICAgICAgICBjYXNlICchPSc6DQogICAgICAgICAgICAgIHJldHVybiAnQ09NUEFSRSc7DQogICAgICAgICAgICBjYXNlICcmJic6DQogICAgICAgICAgICBjYXNlICd8fCc6DQogICAgICAgICAgICAgIHJldHVybiAnTE9HSUMnOw0KICAgICAgICAgICAgY2FzZSAndHJ1ZSc6DQogICAgICAgICAgICBjYXNlICdmYWxzZSc6DQogICAgICAgICAgICBjYXNlICdudWxsJzoNCiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6DQogICAgICAgICAgICAgIHJldHVybiAnQk9PTCc7DQogICAgICAgICAgICBjYXNlICdicmVhayc6DQogICAgICAgICAgICBjYXNlICdjb250aW51ZSc6DQogICAgICAgICAgICBjYXNlICdkZWJ1Z2dlcic6DQogICAgICAgICAgICAgIHJldHVybiAnU1RBVEVNRU5UJzsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgIHJldHVybiB0YWc7DQogICAgICAgICAgfQ0KICAgICAgICB9KSgpOw0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbih0YWcsIGlkKTsNCiAgICAgIGlmIChjb2xvbikgew0KICAgICAgICB0aGlzLnRva2VuKCc6JywgJzonKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBpbnB1dC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUubnVtYmVyVG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBtYXRjaCwgbnVtYmVyOw0KICAgICAgaWYgKCEobWF0Y2ggPSBOVU1CRVIuZXhlYyh0aGlzLmNodW5rKSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBudW1iZXIgPSBtYXRjaFswXTsNCiAgICAgIHRoaXMudG9rZW4oJ05VTUJFUicsIG51bWJlcik7DQogICAgICByZXR1cm4gbnVtYmVyLmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5zdHJpbmdUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIG1hdGNoLCBzdHJpbmc7DQogICAgICBzd2l0Y2ggKHRoaXMuY2h1bmsuY2hhckF0KDApKSB7DQogICAgICAgIGNhc2UgIiciOg0KICAgICAgICAgIGlmICghKG1hdGNoID0gU0lNUExFU1RSLmV4ZWModGhpcy5jaHVuaykpKSB7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgKHN0cmluZyA9IG1hdGNoWzBdKS5yZXBsYWNlKE1VTFRJTElORVIsICdcXFxuJykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICciJzoNCiAgICAgICAgICBpZiAoIShzdHJpbmcgPSB0aGlzLmJhbGFuY2VkU3RyaW5nKHRoaXMuY2h1bmssICciJykpKSB7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKDAgPCBzdHJpbmcuaW5kZXhPZignI3snLCAxKSkgew0KICAgICAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZVN0cmluZyhzdHJpbmcuc2xpY2UoMSwgLTEpKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgdGhpcy5lc2NhcGVMaW5lcyhzdHJpbmcpKTsNCiAgICAgICAgICB9DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICB0aGlzLmxpbmUgKz0gY291bnQoc3RyaW5nLCAnXG4nKTsNCiAgICAgIHJldHVybiBzdHJpbmcubGVuZ3RoOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLmhlcmVkb2NUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGRvYywgaGVyZWRvYywgbWF0Y2gsIHF1b3RlOw0KICAgICAgaWYgKCEobWF0Y2ggPSBIRVJFRE9DLmV4ZWModGhpcy5jaHVuaykpKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgaGVyZWRvYyA9IG1hdGNoWzBdOw0KICAgICAgcXVvdGUgPSBoZXJlZG9jLmNoYXJBdCgwKTsNCiAgICAgIGRvYyA9IHRoaXMuc2FuaXRpemVIZXJlZG9jKG1hdGNoWzJdLCB7DQogICAgICAgIHF1b3RlOiBxdW90ZSwNCiAgICAgICAgaW5kZW50OiBudWxsDQogICAgICB9KTsNCiAgICAgIGlmIChxdW90ZSA9PT0gJyInICYmIDAgPD0gZG9jLmluZGV4T2YoJyN7JykpIHsNCiAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZVN0cmluZyhkb2MsIHsNCiAgICAgICAgICBoZXJlZG9jOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgdGhpcy5tYWtlU3RyaW5nKGRvYywgcXVvdGUsIHRydWUpKTsNCiAgICAgIH0NCiAgICAgIHRoaXMubGluZSArPSBjb3VudChoZXJlZG9jLCAnXG4nKTsNCiAgICAgIHJldHVybiBoZXJlZG9jLmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5jb21tZW50VG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBjb21tZW50LCBoZXJlLCBtYXRjaDsNCiAgICAgIGlmICghKG1hdGNoID0gdGhpcy5jaHVuay5tYXRjaChDT01NRU5UKSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBjb21tZW50ID0gbWF0Y2hbMF0sIGhlcmUgPSBtYXRjaFsxXTsNCiAgICAgIGlmIChoZXJlKSB7DQogICAgICAgIHRoaXMudG9rZW4oJ0hFUkVDT01NRU5UJywgdGhpcy5zYW5pdGl6ZUhlcmVkb2MoaGVyZSwgew0KICAgICAgICAgIGhlcmVjb21tZW50OiB0cnVlLA0KICAgICAgICAgIGluZGVudDogQXJyYXkodGhpcy5pbmRlbnQgKyAxKS5qb2luKCcgJykNCiAgICAgICAgfSkpOw0KICAgICAgICB0aGlzLnRva2VuKCdURVJNSU5BVE9SJywgJ1xuJyk7DQogICAgICB9DQogICAgICB0aGlzLmxpbmUgKz0gY291bnQoY29tbWVudCwgJ1xuJyk7DQogICAgICByZXR1cm4gY29tbWVudC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuanNUb2tlbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIG1hdGNoLCBzY3JpcHQ7DQogICAgICBpZiAoISh0aGlzLmNodW5rLmNoYXJBdCgwKSA9PT0gJ2AnICYmIChtYXRjaCA9IEpTVE9LRU4uZXhlYyh0aGlzLmNodW5rKSkpKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbignSlMnLCAoc2NyaXB0ID0gbWF0Y2hbMF0pLnNsaWNlKDEsIC0xKSk7DQogICAgICByZXR1cm4gc2NyaXB0Lmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5yZWdleFRva2VuID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgbWF0Y2gsIHByZXYsIHJlZ2V4LCBfcmVmMjsNCiAgICAgIGlmICh0aGlzLmNodW5rLmNoYXJBdCgwKSAhPT0gJy8nKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgaWYgKG1hdGNoID0gSEVSRUdFWC5leGVjKHRoaXMuY2h1bmspKSB7DQogICAgICAgIHRoaXMubGluZSArPSBjb3VudChtYXRjaFswXSwgJ1xuJyk7ICAgICAgICANCiAgICAgICAgcmV0dXJuIHRoaXMuaGVyZWdleFRva2VuKG1hdGNoKTsNCiAgICAgIH0NCiAgICAgIHByZXYgPSBsYXN0KHRoaXMudG9rZW5zKTsNCiAgICAgIGlmIChwcmV2ICYmIChfcmVmMiA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKChwcmV2LnNwYWNlZCA/IE5PVF9SRUdFWCA6IE5PVF9TUEFDRURfUkVHRVgpLCBfcmVmMikgPj0gMCkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBpZiAoIShtYXRjaCA9IFJFR0VYLmV4ZWModGhpcy5jaHVuaykpKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgcmVnZXggPSBtYXRjaFswXTsNCiAgICAgIHRoaXMudG9rZW4oJ1JFR0VYJywgcmVnZXggPT09ICcvLycgPyAnLyg/OikvJyA6IHJlZ2V4KTsNCiAgICAgIHJldHVybiByZWdleC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuaGVyZWdleFRva2VuID0gZnVuY3Rpb24obWF0Y2gpIHsNCiAgICAgIHZhciBib2R5LCBmbGFncywgaGVyZWdleCwgcmUsIHRhZywgdG9rZW5zLCB2YWx1ZSwgX2ksIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgaGVyZWdleCA9IG1hdGNoWzBdLCBib2R5ID0gbWF0Y2hbMV0sIGZsYWdzID0gbWF0Y2hbMl07DQogICAgICBpZiAoMCA+IGJvZHkuaW5kZXhPZignI3snKSkgew0KICAgICAgICByZSA9IGJvZHkucmVwbGFjZShIRVJFR0VYX09NSVQsICcnKS5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7DQogICAgICAgIHRoaXMudG9rZW4oJ1JFR0VYJywgIi8iICsgKHJlIHx8ICcoPzopJykgKyAiLyIgKyBmbGFncyk7DQogICAgICAgIHJldHVybiBoZXJlZ2V4Lmxlbmd0aDsNCiAgICAgIH0NCiAgICAgIHRoaXMudG9rZW4oJ0lERU5USUZJRVInLCAnUmVnRXhwJyk7DQogICAgICB0aGlzLnRva2Vucy5wdXNoKFsnQ0FMTF9TVEFSVCcsICcoJ10pOw0KICAgICAgdG9rZW5zID0gW107DQogICAgICBfcmVmMiA9IHRoaXMuaW50ZXJwb2xhdGVTdHJpbmcoYm9keSwgew0KICAgICAgICByZWdleDogdHJ1ZQ0KICAgICAgfSk7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIF9yZWYzID0gX3JlZjJbX2ldLCB0YWcgPSBfcmVmM1swXSwgdmFsdWUgPSBfcmVmM1sxXTsNCiAgICAgICAgaWYgKHRhZyA9PT0gJ1RPS0VOUycpIHsNCiAgICAgICAgICB0b2tlbnMucHVzaC5hcHBseSh0b2tlbnMsIHZhbHVlKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpZiAoISh2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoSEVSRUdFWF9PTUlULCAnJykpKSB7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXC9nLCAnXFxcXCcpOw0KICAgICAgICAgIHRva2Vucy5wdXNoKFsnU1RSSU5HJywgdGhpcy5tYWtlU3RyaW5nKHZhbHVlLCAnIicsIHRydWUpXSk7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zLnB1c2goWycrJywgJysnXSk7DQogICAgICB9DQogICAgICB0b2tlbnMucG9wKCk7DQogICAgICBpZiAoKChfcmVmNCA9IHRva2Vuc1swXSkgIT0gbnVsbCA/IF9yZWY0WzBdIDogdm9pZCAwKSAhPT0gJ1NUUklORycpIHsNCiAgICAgICAgdGhpcy50b2tlbnMucHVzaChbJ1NUUklORycsICciIiddLCBbJysnLCAnKyddKTsNCiAgICAgIH0NCiAgICAgIChfcmVmNSA9IHRoaXMudG9rZW5zKS5wdXNoLmFwcGx5KF9yZWY1LCB0b2tlbnMpOw0KICAgICAgaWYgKGZsYWdzKSB7DQogICAgICAgIHRoaXMudG9rZW5zLnB1c2goWycsJywgJywnXSwgWydTVFJJTkcnLCAnIicgKyBmbGFncyArICciJ10pOw0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbignKScsICcpJyk7DQogICAgICByZXR1cm4gaGVyZWdleC5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUubGluZVRva2VuID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZGlmZiwgaW5kZW50LCBtYXRjaCwgbm9OZXdsaW5lcywgcHJldiwgc2l6ZTsNCiAgICAgIGlmICghKG1hdGNoID0gTVVMVElfREVOVC5leGVjKHRoaXMuY2h1bmspKSkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICAgIGluZGVudCA9IG1hdGNoWzBdOw0KICAgICAgdGhpcy5saW5lICs9IGNvdW50KGluZGVudCwgJ1xuJyk7DQogICAgICBwcmV2ID0gbGFzdCh0aGlzLnRva2VucywgMSk7DQogICAgICBzaXplID0gaW5kZW50Lmxlbmd0aCAtIDEgLSBpbmRlbnQubGFzdEluZGV4T2YoJ1xuJyk7DQogICAgICBub05ld2xpbmVzID0gdGhpcy51bmZpbmlzaGVkKCk7DQogICAgICBpZiAoc2l6ZSAtIHRoaXMuaW5kZWJ0ID09PSB0aGlzLmluZGVudCkgew0KICAgICAgICBpZiAobm9OZXdsaW5lcykgew0KICAgICAgICAgIHRoaXMuc3VwcHJlc3NOZXdsaW5lcygpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMubmV3bGluZVRva2VuKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGluZGVudC5sZW5ndGg7DQogICAgICB9DQogICAgICBpZiAoc2l6ZSA+IHRoaXMuaW5kZW50KSB7DQogICAgICAgIGlmIChub05ld2xpbmVzKSB7DQogICAgICAgICAgdGhpcy5pbmRlYnQgPSBzaXplIC0gdGhpcy5pbmRlbnQ7DQogICAgICAgICAgdGhpcy5zdXBwcmVzc05ld2xpbmVzKCk7DQogICAgICAgICAgcmV0dXJuIGluZGVudC5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgZGlmZiA9IHNpemUgLSB0aGlzLmluZGVudCArIHRoaXMub3V0ZGVidDsNCiAgICAgICAgdGhpcy50b2tlbignSU5ERU5UJywgZGlmZik7DQogICAgICAgIHRoaXMuaW5kZW50cy5wdXNoKGRpZmYpOw0KICAgICAgICB0aGlzLm91dGRlYnQgPSB0aGlzLmluZGVidCA9IDA7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluZGVidCA9IDA7DQogICAgICAgIHRoaXMub3V0ZGVudFRva2VuKHRoaXMuaW5kZW50IC0gc2l6ZSwgbm9OZXdsaW5lcyk7DQogICAgICB9DQogICAgICB0aGlzLmluZGVudCA9IHNpemU7DQogICAgICByZXR1cm4gaW5kZW50Lmxlbmd0aDsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5vdXRkZW50VG9rZW4gPSBmdW5jdGlvbihtb3ZlT3V0LCBub05ld2xpbmVzLCBjbG9zZSkgew0KICAgICAgdmFyIGRlbnQsIGxlbjsNCiAgICAgIHdoaWxlIChtb3ZlT3V0ID4gMCkgew0KICAgICAgICBsZW4gPSB0aGlzLmluZGVudHMubGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKHRoaXMuaW5kZW50c1tsZW5dID09PSB2b2lkIDApIHsNCiAgICAgICAgICBtb3ZlT3V0ID0gMDsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGVudHNbbGVuXSA9PT0gdGhpcy5vdXRkZWJ0KSB7DQogICAgICAgICAgbW92ZU91dCAtPSB0aGlzLm91dGRlYnQ7DQogICAgICAgICAgdGhpcy5vdXRkZWJ0ID0gMDsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGVudHNbbGVuXSA8IHRoaXMub3V0ZGVidCkgew0KICAgICAgICAgIHRoaXMub3V0ZGVidCAtPSB0aGlzLmluZGVudHNbbGVuXTsNCiAgICAgICAgICBtb3ZlT3V0IC09IHRoaXMuaW5kZW50c1tsZW5dOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGRlbnQgPSB0aGlzLmluZGVudHMucG9wKCkgLSB0aGlzLm91dGRlYnQ7DQogICAgICAgICAgbW92ZU91dCAtPSBkZW50Ow0KICAgICAgICAgIHRoaXMub3V0ZGVidCA9IDA7DQogICAgICAgICAgdGhpcy50b2tlbignT1VUREVOVCcsIGRlbnQpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoZGVudCkgew0KICAgICAgICB0aGlzLm91dGRlYnQgLT0gbW92ZU91dDsNCiAgICAgIH0NCiAgICAgIGlmICghKHRoaXMudGFnKCkgPT09ICdURVJNSU5BVE9SJyB8fCBub05ld2xpbmVzKSkgew0KICAgICAgICB0aGlzLnRva2VuKCdURVJNSU5BVE9SJywgJ1xuJyk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS53aGl0ZXNwYWNlVG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBtYXRjaCwgbmxpbmUsIHByZXY7DQogICAgICBpZiAoISgobWF0Y2ggPSBXSElURVNQQUNFLmV4ZWModGhpcy5jaHVuaykpIHx8IChubGluZSA9IHRoaXMuY2h1bmsuY2hhckF0KDApID09PSAnXG4nKSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgICBwcmV2ID0gbGFzdCh0aGlzLnRva2Vucyk7DQogICAgICBpZiAocHJldikgew0KICAgICAgICBwcmV2W21hdGNoID8gJ3NwYWNlZCcgOiAnbmV3TGluZSddID0gdHJ1ZTsNCiAgICAgIH0NCiAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICByZXR1cm4gbWF0Y2hbMF0ubGVuZ3RoOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUubmV3bGluZVRva2VuID0gZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy50YWcoKSAhPT0gJ1RFUk1JTkFUT1InKSB7DQogICAgICAgIHRoaXMudG9rZW4oJ1RFUk1JTkFUT1InLCAnXG4nKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLnN1cHByZXNzTmV3bGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIGlmICh0aGlzLnZhbHVlKCkgPT09ICdcXCcpIHsNCiAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5saXRlcmFsVG9rZW4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBtYXRjaCwgcHJldiwgdGFnLCB2YWx1ZSwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7DQogICAgICBpZiAobWF0Y2ggPSBPUEVSQVRPUi5leGVjKHRoaXMuY2h1bmspKSB7DQogICAgICAgIHZhbHVlID0gbWF0Y2hbMF07DQogICAgICAgIGlmIChDT0RFLnRlc3QodmFsdWUpKSB7DQogICAgICAgICAgdGhpcy50YWdQYXJhbWV0ZXJzKCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhbHVlID0gdGhpcy5jaHVuay5jaGFyQXQoMCk7DQogICAgICB9DQogICAgICB0YWcgPSB2YWx1ZTsNCiAgICAgIHByZXYgPSBsYXN0KHRoaXMudG9rZW5zKTsNCiAgICAgIGlmICh2YWx1ZSA9PT0gJz0nICYmIHByZXYpIHsNCiAgICAgICAgaWYgKCFwcmV2WzFdLnJlc2VydmVkICYmIChfcmVmMiA9IHByZXZbMV0sIF9faW5kZXhPZi5jYWxsKEpTX0ZPUkJJRERFTiwgX3JlZjIpID49IDApKSB7DQogICAgICAgICAgdGhpcy5hc3NpZ25tZW50RXJyb3IoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoKF9yZWYzID0gcHJldlsxXSkgPT09ICd8fCcgfHwgX3JlZjMgPT09ICcmJicpIHsNCiAgICAgICAgICBwcmV2WzBdID0gJ0NPTVBPVU5EX0FTU0lHTic7DQogICAgICAgICAgcHJldlsxXSArPSAnPSc7DQogICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHZhbHVlID09PSAnOycpIHsNCiAgICAgICAgdGFnID0gJ1RFUk1JTkFUT1InOw0KICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChNQVRILCB2YWx1ZSkgPj0gMCkgew0KICAgICAgICB0YWcgPSAnTUFUSCc7DQogICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKENPTVBBUkUsIHZhbHVlKSA+PSAwKSB7DQogICAgICAgIHRhZyA9ICdDT01QQVJFJzsNCiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoQ09NUE9VTkRfQVNTSUdOLCB2YWx1ZSkgPj0gMCkgew0KICAgICAgICB0YWcgPSAnQ09NUE9VTkRfQVNTSUdOJzsNCiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoVU5BUlksIHZhbHVlKSA+PSAwKSB7DQogICAgICAgIHRhZyA9ICdVTkFSWSc7DQogICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKFNISUZULCB2YWx1ZSkgPj0gMCkgew0KICAgICAgICB0YWcgPSAnU0hJRlQnOw0KICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChMT0dJQywgdmFsdWUpID49IDAgfHwgdmFsdWUgPT09ICc/JyAmJiAocHJldiAhPSBudWxsID8gcHJldi5zcGFjZWQgOiB2b2lkIDApKSB7DQogICAgICAgIHRhZyA9ICdMT0dJQyc7DQogICAgICB9IGVsc2UgaWYgKHByZXYgJiYgIXByZXYuc3BhY2VkKSB7DQogICAgICAgIGlmICh2YWx1ZSA9PT0gJygnICYmIChfcmVmNCA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKENBTExBQkxFLCBfcmVmNCkgPj0gMCkpIHsNCiAgICAgICAgICBpZiAocHJldlswXSA9PT0gJz8nKSB7DQogICAgICAgICAgICBwcmV2WzBdID0gJ0ZVTkNfRVhJU1QnOw0KICAgICAgICAgIH0NCiAgICAgICAgICB0YWcgPSAnQ0FMTF9TVEFSVCc7DQogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdbJyAmJiAoX3JlZjUgPSBwcmV2WzBdLCBfX2luZGV4T2YuY2FsbChJTkRFWEFCTEUsIF9yZWY1KSA+PSAwKSkgew0KICAgICAgICAgIHRhZyA9ICdJTkRFWF9TVEFSVCc7DQogICAgICAgICAgc3dpdGNoIChwcmV2WzBdKSB7DQogICAgICAgICAgICBjYXNlICc/JzoNCiAgICAgICAgICAgICAgcHJldlswXSA9ICdJTkRFWF9TT0FLJzsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICc6Oic6DQogICAgICAgICAgICAgIHByZXZbMF0gPSAnSU5ERVhfUFJPVE8nOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdGhpcy50b2tlbih0YWcsIHZhbHVlKTsNCiAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuc2FuaXRpemVIZXJlZG9jID0gZnVuY3Rpb24oZG9jLCBvcHRpb25zKSB7DQogICAgICB2YXIgYXR0ZW1wdCwgaGVyZWNvbW1lbnQsIGluZGVudCwgbWF0Y2gsIF9yZWYyOw0KICAgICAgaW5kZW50ID0gb3B0aW9ucy5pbmRlbnQsIGhlcmVjb21tZW50ID0gb3B0aW9ucy5oZXJlY29tbWVudDsNCiAgICAgIGlmIChoZXJlY29tbWVudCkgew0KICAgICAgICBpZiAoSEVSRURPQ19JTExFR0FMLnRlc3QoZG9jKSkgew0KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYmxvY2sgY29tbWVudCBjYW5ub3QgY29udGFpbiBcIiovXCIsIHN0YXJ0aW5nIG9uIGxpbmUgIiArICh0aGlzLmxpbmUgKyAxKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRvYy5pbmRleE9mKCdcbicpIDw9IDApIHsNCiAgICAgICAgICByZXR1cm4gZG9jOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3aGlsZSAobWF0Y2ggPSBIRVJFRE9DX0lOREVOVC5leGVjKGRvYykpIHsNCiAgICAgICAgICBhdHRlbXB0ID0gbWF0Y2hbMV07DQogICAgICAgICAgaWYgKGluZGVudCA9PT0gbnVsbCB8fCAoMCA8IChfcmVmMiA9IGF0dGVtcHQubGVuZ3RoKSAmJiBfcmVmMiA8IGluZGVudC5sZW5ndGgpKSB7DQogICAgICAgICAgICBpbmRlbnQgPSBhdHRlbXB0Ow0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGluZGVudCkgew0KICAgICAgICBkb2MgPSBkb2MucmVwbGFjZShSZWdFeHAoIlxcbiIgKyBpbmRlbnQsICJnIiksICdcbicpOw0KICAgICAgfQ0KICAgICAgaWYgKCFoZXJlY29tbWVudCkgew0KICAgICAgICBkb2MgPSBkb2MucmVwbGFjZSgvXlxuLywgJycpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGRvYzsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS50YWdQYXJhbWV0ZXJzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaSwgc3RhY2ssIHRvaywgdG9rZW5zOw0KICAgICAgaWYgKHRoaXMudGFnKCkgIT09ICcpJykgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgIH0NCiAgICAgIHN0YWNrID0gW107DQogICAgICB0b2tlbnMgPSB0aGlzLnRva2VuczsNCiAgICAgIGkgPSB0b2tlbnMubGVuZ3RoOw0KICAgICAgdG9rZW5zWy0taV1bMF0gPSAnUEFSQU1fRU5EJzsNCiAgICAgIHdoaWxlICh0b2sgPSB0b2tlbnNbLS1pXSkgew0KICAgICAgICBzd2l0Y2ggKHRva1swXSkgew0KICAgICAgICAgIGNhc2UgJyknOg0KICAgICAgICAgICAgc3RhY2sucHVzaCh0b2spOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgY2FzZSAnKCc6DQogICAgICAgICAgY2FzZSAnQ0FMTF9TVEFSVCc6DQogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoKSB7DQogICAgICAgICAgICAgIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tbMF0gPT09ICcoJykgew0KICAgICAgICAgICAgICB0b2tbMF0gPSAnUEFSQU1fU1RBUlQnOw0KICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuY2xvc2VJbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMub3V0ZGVudFRva2VuKHRoaXMuaW5kZW50KTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5pZGVudGlmaWVyRXJyb3IgPSBmdW5jdGlvbih3b3JkKSB7DQogICAgICB0aHJvdyBTeW50YXhFcnJvcigiUmVzZXJ2ZWQgd29yZCBcIiIgKyB3b3JkICsgIlwiIG9uIGxpbmUgIiArICh0aGlzLmxpbmUgKyAxKSk7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuYXNzaWdubWVudEVycm9yID0gZnVuY3Rpb24oKSB7DQogICAgICB0aHJvdyBTeW50YXhFcnJvcigiUmVzZXJ2ZWQgd29yZCBcIiIgKyAodGhpcy52YWx1ZSgpKSArICJcIiBvbiBsaW5lICIgKyAodGhpcy5saW5lICsgMSkgKyAiIGNhbid0IGJlIGFzc2lnbmVkIik7DQogICAgfTsNCiAgICBMZXhlci5wcm90b3R5cGUuYmFsYW5jZWRTdHJpbmcgPSBmdW5jdGlvbihzdHIsIGVuZCkgew0KICAgICAgdmFyIGksIGxldHRlciwgcHJldiwgc3RhY2ssIF9yZWYyOw0KICAgICAgc3RhY2sgPSBbZW5kXTsNCiAgICAgIGZvciAoaSA9IDEsIF9yZWYyID0gc3RyLmxlbmd0aDsgMSA8PSBfcmVmMiA/IGkgPCBfcmVmMiA6IGkgPiBfcmVmMjsgMSA8PSBfcmVmMiA/IGkrKyA6IGktLSkgew0KICAgICAgICBzd2l0Y2ggKGxldHRlciA9IHN0ci5jaGFyQXQoaSkpIHsNCiAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICBpKys7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICBjYXNlIGVuZDoNCiAgICAgICAgICAgIHN0YWNrLnBvcCgpOw0KICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCBpICsgMSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbmQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbmQgPT09ICd9JyAmJiAobGV0dGVyID09PSAnIicgfHwgbGV0dGVyID09PSAiJyIpKSB7DQogICAgICAgICAgc3RhY2sucHVzaChlbmQgPSBsZXR0ZXIpOw0KICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gJ30nICYmIGxldHRlciA9PT0gJ3snKSB7DQogICAgICAgICAgc3RhY2sucHVzaChlbmQgPSAnfScpOw0KICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gJyInICYmIHByZXYgPT09ICcjJyAmJiBsZXR0ZXIgPT09ICd7Jykgew0KICAgICAgICAgIHN0YWNrLnB1c2goZW5kID0gJ30nKTsNCiAgICAgICAgfQ0KICAgICAgICBwcmV2ID0gbGV0dGVyOw0KICAgICAgfQ0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nICIgKyAoc3RhY2sucG9wKCkpICsgIiwgc3RhcnRpbmcgb24gbGluZSAiICsgKHRoaXMubGluZSArIDEpKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgb3B0aW9ucykgew0KICAgICAgdmFyIGV4cHIsIGhlcmVkb2MsIGksIGlubmVyLCBpbnRlcnBvbGF0ZWQsIGxlbiwgbGV0dGVyLCBuZXN0ZWQsIHBpLCByZWdleCwgdGFnLCB0b2tlbnMsIHZhbHVlLCBfbGVuLCBfcmVmMiwgX3JlZjMsIF9yZWY0Ow0KICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgew0KICAgICAgICBvcHRpb25zID0ge307DQogICAgICB9DQogICAgICBoZXJlZG9jID0gb3B0aW9ucy5oZXJlZG9jLCByZWdleCA9IG9wdGlvbnMucmVnZXg7DQogICAgICB0b2tlbnMgPSBbXTsNCiAgICAgIHBpID0gMDsNCiAgICAgIGkgPSAtMTsNCiAgICAgIHdoaWxlIChsZXR0ZXIgPSBzdHIuY2hhckF0KGkgKz0gMSkpIHsNCiAgICAgICAgaWYgKGxldHRlciA9PT0gJ1xcJykgew0KICAgICAgICAgIGkgKz0gMTsNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIShsZXR0ZXIgPT09ICcjJyAmJiBzdHIuY2hhckF0KGkgKyAxKSA9PT0gJ3snICYmIChleHByID0gdGhpcy5iYWxhbmNlZFN0cmluZyhzdHIuc2xpY2UoaSArIDEpLCAnfScpKSkpIHsNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocGkgPCBpKSB7DQogICAgICAgICAgdG9rZW5zLnB1c2goWydORU9TVFJJTkcnLCBzdHIuc2xpY2UocGksIGkpXSk7DQogICAgICAgIH0NCiAgICAgICAgaW5uZXIgPSBleHByLnNsaWNlKDEsIC0xKTsNCiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCkgew0KICAgICAgICAgIG5lc3RlZCA9IG5ldyBMZXhlcigpLnRva2VuaXplKGlubmVyLCB7DQogICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsDQogICAgICAgICAgICByZXdyaXRlOiBmYWxzZQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIG5lc3RlZC5wb3AoKTsNCiAgICAgICAgICBpZiAoKChfcmVmMiA9IG5lc3RlZFswXSkgIT0gbnVsbCA/IF9yZWYyWzBdIDogdm9pZCAwKSA9PT0gJ1RFUk1JTkFUT1InKSB7DQogICAgICAgICAgICBuZXN0ZWQuc2hpZnQoKTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKGxlbiA9IG5lc3RlZC5sZW5ndGgpIHsNCiAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7DQogICAgICAgICAgICAgIG5lc3RlZC51bnNoaWZ0KFsnKCcsICcoJ10pOw0KICAgICAgICAgICAgICBuZXN0ZWQucHVzaChbJyknLCAnKSddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnVE9LRU5TJywgbmVzdGVkXSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGkgKz0gZXhwci5sZW5ndGg7DQogICAgICAgIHBpID0gaSArIDE7DQogICAgICB9DQogICAgICBpZiAoKGkgPiBwaSAmJiBwaSA8IHN0ci5sZW5ndGgpKSB7DQogICAgICAgIHRva2Vucy5wdXNoKFsnTkVPU1RSSU5HJywgc3RyLnNsaWNlKHBpKV0pOw0KICAgICAgfQ0KICAgICAgaWYgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiB0b2tlbnM7DQogICAgICB9DQogICAgICBpZiAoIXRva2Vucy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4oJ1NUUklORycsICciIicpOw0KICAgICAgfQ0KICAgICAgaWYgKHRva2Vuc1swXVswXSAhPT0gJ05FT1NUUklORycpIHsNCiAgICAgICAgdG9rZW5zLnVuc2hpZnQoWycnLCAnJ10pOw0KICAgICAgfQ0KICAgICAgaWYgKGludGVycG9sYXRlZCA9IHRva2Vucy5sZW5ndGggPiAxKSB7DQogICAgICAgIHRoaXMudG9rZW4oJygnLCAnKCcpOw0KICAgICAgfQ0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgX3JlZjMgPSB0b2tlbnNbaV0sIHRhZyA9IF9yZWYzWzBdLCB2YWx1ZSA9IF9yZWYzWzFdOw0KICAgICAgICBpZiAoaSkgew0KICAgICAgICAgIHRoaXMudG9rZW4oJysnLCAnKycpOw0KICAgICAgICB9DQogICAgICAgIGlmICh0YWcgPT09ICdUT0tFTlMnKSB7DQogICAgICAgICAgKF9yZWY0ID0gdGhpcy50b2tlbnMpLnB1c2guYXBwbHkoX3JlZjQsIHZhbHVlKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLnRva2VuKCdTVFJJTkcnLCB0aGlzLm1ha2VTdHJpbmcodmFsdWUsICciJywgaGVyZWRvYykpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoaW50ZXJwb2xhdGVkKSB7DQogICAgICAgIHRoaXMudG9rZW4oJyknLCAnKScpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRva2VuczsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS50b2tlbiA9IGZ1bmN0aW9uKHRhZywgdmFsdWUpIHsNCiAgICAgIHJldHVybiB0aGlzLnRva2Vucy5wdXNoKFt0YWcsIHZhbHVlLCB0aGlzLmxpbmVdKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS50YWcgPSBmdW5jdGlvbihpbmRleCwgdGFnKSB7DQogICAgICB2YXIgdG9rOw0KICAgICAgcmV0dXJuICh0b2sgPSBsYXN0KHRoaXMudG9rZW5zLCBpbmRleCkpICYmICh0YWcgPyB0b2tbMF0gPSB0YWcgOiB0b2tbMF0pOw0KICAgIH07DQogICAgTGV4ZXIucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oaW5kZXgsIHZhbCkgew0KICAgICAgdmFyIHRvazsNCiAgICAgIHJldHVybiAodG9rID0gbGFzdCh0aGlzLnRva2VucywgaW5kZXgpKSAmJiAodmFsID8gdG9rWzFdID0gdmFsIDogdG9rWzFdKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS51bmZpbmlzaGVkID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgcHJldiwgdmFsdWU7DQogICAgICByZXR1cm4gTElORV9DT05USU5VRVIudGVzdCh0aGlzLmNodW5rKSB8fCAocHJldiA9IGxhc3QodGhpcy50b2tlbnMsIDEpKSAmJiBwcmV2WzBdICE9PSAnLicgJiYgKHZhbHVlID0gdGhpcy52YWx1ZSgpKSAmJiAhdmFsdWUucmVzZXJ2ZWQgJiYgTk9fTkVXTElORS50ZXN0KHZhbHVlKSAmJiAhQ09ERS50ZXN0KHZhbHVlKSAmJiAhQVNTSUdORUQudGVzdCh0aGlzLmNodW5rKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5lc2NhcGVMaW5lcyA9IGZ1bmN0aW9uKHN0ciwgaGVyZWRvYykgew0KICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKE1VTFRJTElORVIsIGhlcmVkb2MgPyAnXFxuJyA6ICcnKTsNCiAgICB9Ow0KICAgIExleGVyLnByb3RvdHlwZS5tYWtlU3RyaW5nID0gZnVuY3Rpb24oYm9keSwgcXVvdGUsIGhlcmVkb2MpIHsNCiAgICAgIGlmICghYm9keSkgew0KICAgICAgICByZXR1cm4gcXVvdGUgKyBxdW90ZTsNCiAgICAgIH0NCiAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoL1xcKFtcc1xTXSkvZywgZnVuY3Rpb24obWF0Y2gsIGNvbnRlbnRzKSB7DQogICAgICAgIGlmIChjb250ZW50cyA9PT0gJ1xuJyB8fCBjb250ZW50cyA9PT0gcXVvdGUpIHsNCiAgICAgICAgICByZXR1cm4gY29udGVudHM7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoUmVnRXhwKCIiICsgcXVvdGUsICJnIiksICdcXCQmJyk7DQogICAgICByZXR1cm4gcXVvdGUgKyB0aGlzLmVzY2FwZUxpbmVzKGJvZHksIGhlcmVkb2MpICsgcXVvdGU7DQogICAgfTsNCiAgICByZXR1cm4gTGV4ZXI7DQogIH0pKCk7DQogIEpTX0tFWVdPUkRTID0gWyd0cnVlJywgJ2ZhbHNlJywgJ251bGwnLCAndGhpcycsICduZXcnLCAnZGVsZXRlJywgJ3R5cGVvZicsICdpbicsICdpbnN0YW5jZW9mJywgJ3JldHVybicsICd0aHJvdycsICdicmVhaycsICdjb250aW51ZScsICdkZWJ1Z2dlcicsICdpZicsICdlbHNlJywgJ3N3aXRjaCcsICdmb3InLCAnd2hpbGUnLCAnZG8nLCAndHJ5JywgJ2NhdGNoJywgJ2ZpbmFsbHknLCAnY2xhc3MnLCAnZXh0ZW5kcycsICdzdXBlciddOw0KICBDT0ZGRUVfS0VZV09SRFMgPSBbJ3VuZGVmaW5lZCcsICd0aGVuJywgJ3VubGVzcycsICd1bnRpbCcsICdsb29wJywgJ29mJywgJ2J5JywgJ3doZW4nXTsNCiAgQ09GRkVFX0FMSUFTX01BUCA9IHsNCiAgICBhbmQ6ICcmJicsDQogICAgb3I6ICd8fCcsDQogICAgaXM6ICc9PScsDQogICAgaXNudDogJyE9JywNCiAgICBub3Q6ICchJywNCiAgICB5ZXM6ICd0cnVlJywNCiAgICBubzogJ2ZhbHNlJywNCiAgICBvbjogJ3RydWUnLA0KICAgIG9mZjogJ2ZhbHNlJw0KICB9Ow0KICBDT0ZGRUVfQUxJQVNFUyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgX3Jlc3VsdHM7DQogICAgX3Jlc3VsdHMgPSBbXTsNCiAgICBmb3IgKGtleSBpbiBDT0ZGRUVfQUxJQVNfTUFQKSB7DQogICAgICBfcmVzdWx0cy5wdXNoKGtleSk7DQogICAgfQ0KICAgIHJldHVybiBfcmVzdWx0czsNCiAgfSkoKTsNCiAgQ09GRkVFX0tFWVdPUkRTID0gQ09GRkVFX0tFWVdPUkRTLmNvbmNhdChDT0ZGRUVfQUxJQVNFUyk7DQogIFJFU0VSVkVEID0gWydjYXNlJywgJ2RlZmF1bHQnLCAnZnVuY3Rpb24nLCAndmFyJywgJ3ZvaWQnLCAnd2l0aCcsICdjb25zdCcsICdsZXQnLCAnZW51bScsICdleHBvcnQnLCAnaW1wb3J0JywgJ25hdGl2ZScsICdfX2hhc1Byb3AnLCAnX19leHRlbmRzJywgJ19fc2xpY2UnLCAnX19iaW5kJywgJ19faW5kZXhPZiddOw0KICBKU19GT1JCSURERU4gPSBKU19LRVlXT1JEUy5jb25jYXQoUkVTRVJWRUQpOw0KICBleHBvcnRzLlJFU0VSVkVEID0gUkVTRVJWRUQuY29uY2F0KEpTX0tFWVdPUkRTKS5jb25jYXQoQ09GRkVFX0tFWVdPUkRTKTsNCiAgSURFTlRJRklFUiA9IC9eKFskQS1aYS16X1x4N2YtXHVmZmZmXVskXHdceDdmLVx1ZmZmZl0qKShbXlxuXFNdKjooPyE6KSk/LzsNCiAgTlVNQkVSID0gL14weFtcZGEtZl0rfF4oPzpcZCsoXC5cZCspP3xcLlxkKykoPzplWystXT9cZCspPy9pOw0KICBIRVJFRE9DID0gL14oIiIifCcnJykoW1xzXFNdKj8pKD86XG5bXlxuXFNdKik/XDEvOw0KICBPUEVSQVRPUiA9IC9eKD86Wy09XT58Wy0rKlwvJTw+JnxeIT89XT18Pj4+PT98KFstKzpdKVwxfChbJnw8Pl0pXDI9P3xcP1wufFwuezIsM30pLzsNCiAgV0hJVEVTUEFDRSA9IC9eW15cblxTXSsvOw0KICBDT01NRU5UID0gL14jIyMoW14jXVtcc1xTXSo/KSg/OiMjI1teXG5cU10qfCg/OiMjIyk/JCl8Xig/OlxzKiMoPyEjI1teI10pLiopKy87DQogIENPREUgPSAvXlstPV0+LzsNCiAgTVVMVElfREVOVCA9IC9eKD86XG5bXlxuXFNdKikrLzsNCiAgU0lNUExFU1RSID0gL14nW15cXCddKig/OlxcLlteXFwnXSopKicvOw0KICBKU1RPS0VOID0gL15gW15cXGBdKig/OlxcLlteXFxgXSopKmAvOw0KICBSRUdFWCA9IC9eXC8oPyFbXHM9XSlbXltcL1xuXFxdKig/Oig/OlxcW1xzXFNdfFxbW15cXVxuXFxdKig/OlxcW1xzXFNdW15cXVxuXFxdKikqXSlbXltcL1xuXFxdKikqXC9baW1neV17MCw0fSg/IVx3KS87DQogIEhFUkVHRVggPSAvXlwvezN9KFtcc1xTXSs/KVwvezN9KFtpbWd5XXswLDR9KSg/IVx3KS87DQogIEhFUkVHRVhfT01JVCA9IC9ccysoPzojLiopPy9nOw0KICBNVUxUSUxJTkVSID0gL1xuL2c7DQogIEhFUkVET0NfSU5ERU5UID0gL1xuKyhbXlxuXFNdKikvZzsNCiAgSEVSRURPQ19JTExFR0FMID0gL1wqXC8vOw0KICBBU1NJR05FRCA9IC9eXHMqQD8oWyRBLVphLXpfXVskXHdceDdmLVx1ZmZmZl0qfFsnIl0uKlsnIl0pW15cblxTXSo/Wzo9XVteOj0+XS87DQogIExJTkVfQ09OVElOVUVSID0gL15ccyooPzosfFw/P1wuKD8hWy5cZF0pfDo6KS87DQogIFRSQUlMSU5HX1NQQUNFUyA9IC9ccyskLzsNCiAgTk9fTkVXTElORSA9IC9eKD86Wy0rKiZ8XC8lPTw+IS5cXF1bPD49JnxdKnxhbmR8b3J8aXMoPzpudCk/fG4oPzpvdHxldyl8ZGVsZXRlfHR5cGVvZnxpbnN0YW5jZW9mKSQvOw0KICBDT01QT1VORF9BU1NJR04gPSBbJy09JywgJys9JywgJy89JywgJyo9JywgJyU9JywgJ3x8PScsICcmJj0nLCAnPz0nLCAnPDw9JywgJz4+PScsICc+Pj49JywgJyY9JywgJ149JywgJ3w9J107DQogIFVOQVJZID0gWychJywgJ34nLCAnTkVXJywgJ1RZUEVPRicsICdERUxFVEUnLCAnRE8nXTsNCiAgTE9HSUMgPSBbJyYmJywgJ3x8JywgJyYnLCAnfCcsICdeJ107DQogIFNISUZUID0gWyc8PCcsICc+PicsICc+Pj4nXTsNCiAgQ09NUEFSRSA9IFsnPT0nLCAnIT0nLCAnPCcsICc+JywgJzw9JywgJz49J107DQogIE1BVEggPSBbJyonLCAnLycsICclJ107DQogIFJFTEFUSU9OID0gWydJTicsICdPRicsICdJTlNUQU5DRU9GJ107DQogIEJPT0wgPSBbJ1RSVUUnLCAnRkFMU0UnLCAnTlVMTCcsICdVTkRFRklORUQnXTsNCiAgTk9UX1JFR0VYID0gWydOVU1CRVInLCAnUkVHRVgnLCAnQk9PTCcsICcrKycsICctLScsICddJ107DQogIE5PVF9TUEFDRURfUkVHRVggPSBOT1RfUkVHRVguY29uY2F0KCcpJywgJ30nLCAnVEhJUycsICdJREVOVElGSUVSJywgJ1NUUklORycpOw0KICBDQUxMQUJMRSA9IFsnSURFTlRJRklFUicsICdTVFJJTkcnLCAnUkVHRVgnLCAnKScsICddJywgJ30nLCAnPycsICc6OicsICdAJywgJ1RISVMnLCAnU1VQRVInXTsNCiAgSU5ERVhBQkxFID0gQ0FMTEFCTEUuY29uY2F0KCdOVU1CRVInLCAnQk9PTCcpOw0KICBMSU5FX0JSRUFLID0gWydJTkRFTlQnLCAnT1VUREVOVCcsICdURVJNSU5BVE9SJ107DQp9KTsNCi8qKg0KICogQ29weXJpZ2h0IChjKSAyMDExIEplcmVteSBBc2hrZW5hcw0KICoNCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uDQogKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbg0KICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dA0KICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsDQogKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlDQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZw0KICogY29uZGl0aW9uczoNCiAqIA0KICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KICogDQogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUw0KICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQNCiAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUDQogKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwNCiAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORw0KICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUg0KICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KICovDQoNCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL3Jld3JpdGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiAgICANCiAgdmFyIEJBTEFOQ0VEX1BBSVJTLCBFWFBSRVNTSU9OX0NMT1NFLCBFWFBSRVNTSU9OX0VORCwgRVhQUkVTU0lPTl9TVEFSVCwgSU1QTElDSVRfQkxPQ0ssIElNUExJQ0lUX0NBTEwsIElNUExJQ0lUX0VORCwgSU1QTElDSVRfRlVOQywgSU1QTElDSVRfVU5TUEFDRURfQ0FMTCwgSU5WRVJTRVMsIExJTkVCUkVBS1MsIFNJTkdMRV9DTE9TRVJTLCBTSU5HTEVfTElORVJTLCBsZWZ0LCByaXRlLCBfaSwgX2xlbiwgX3JlZjsNCiAgdmFyIF9faW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHx8IGZ1bmN0aW9uKGl0ZW0pIHsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgICBpZiAodGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7DQogICAgfQ0KICAgIHJldHVybiAtMTsNCiAgfSwgX19zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsNCiAgZXhwb3J0cy5SZXdyaXRlciA9IChmdW5jdGlvbigpIHsNCiAgICBmdW5jdGlvbiBSZXdyaXRlcigpIHt9DQogICAgUmV3cml0ZXIucHJvdG90eXBlLnJld3JpdGUgPSBmdW5jdGlvbih0b2tlbnMpIHsNCiAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zOw0KICAgICAgdGhpcy5yZW1vdmVMZWFkaW5nTmV3bGluZXMoKTsNCiAgICAgIHRoaXMucmVtb3ZlTWlkRXhwcmVzc2lvbk5ld2xpbmVzKCk7DQogICAgICB0aGlzLmNsb3NlT3BlbkNhbGxzKCk7DQogICAgICB0aGlzLmNsb3NlT3BlbkluZGV4ZXMoKTsNCiAgICAgIHRoaXMuYWRkSW1wbGljaXRJbmRlbnRhdGlvbigpOw0KICAgICAgdGhpcy50YWdQb3N0Zml4Q29uZGl0aW9uYWxzKCk7DQogICAgICB0aGlzLmFkZEltcGxpY2l0QnJhY2VzKCk7DQogICAgICB0aGlzLmFkZEltcGxpY2l0UGFyZW50aGVzZXMoKTsNCiAgICAgIHRoaXMuZW5zdXJlQmFsYW5jZShCQUxBTkNFRF9QQUlSUyk7DQogICAgICB0aGlzLnJld3JpdGVDbG9zaW5nUGFyZW5zKCk7DQogICAgICByZXR1cm4gdGhpcy50b2tlbnM7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUuc2NhblRva2VucyA9IGZ1bmN0aW9uKGJsb2NrKSB7DQogICAgICB2YXIgaSwgdG9rZW4sIHRva2VuczsNCiAgICAgIHRva2VucyA9IHRoaXMudG9rZW5zOw0KICAgICAgaSA9IDA7DQogICAgICB3aGlsZSAodG9rZW4gPSB0b2tlbnNbaV0pIHsNCiAgICAgICAgaSArPSBibG9jay5jYWxsKHRoaXMsIHRva2VuLCBpLCB0b2tlbnMpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUuZGV0ZWN0RW5kID0gZnVuY3Rpb24oaSwgY29uZGl0aW9uLCBhY3Rpb24pIHsNCiAgICAgIHZhciBsZXZlbHMsIHRva2VuLCB0b2tlbnMsIF9yZWYsIF9yZWYyOw0KICAgICAgdG9rZW5zID0gdGhpcy50b2tlbnM7DQogICAgICBsZXZlbHMgPSAwOw0KICAgICAgd2hpbGUgKHRva2VuID0gdG9rZW5zW2ldKSB7DQogICAgICAgIGlmIChsZXZlbHMgPT09IDAgJiYgY29uZGl0aW9uLmNhbGwodGhpcywgdG9rZW4sIGkpKSB7DQogICAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsKHRoaXMsIHRva2VuLCBpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXRva2VuIHx8IGxldmVscyA8IDApIHsNCiAgICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwodGhpcywgdG9rZW4sIGkgLSAxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoX3JlZiA9IHRva2VuWzBdLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7DQogICAgICAgICAgbGV2ZWxzICs9IDE7DQogICAgICAgIH0gZWxzZSBpZiAoX3JlZjIgPSB0b2tlblswXSwgX19pbmRleE9mLmNhbGwoRVhQUkVTU0lPTl9FTkQsIF9yZWYyKSA+PSAwKSB7DQogICAgICAgICAgbGV2ZWxzIC09IDE7DQogICAgICAgIH0NCiAgICAgICAgaSArPSAxOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGkgLSAxOw0KICAgIH07DQogICAgUmV3cml0ZXIucHJvdG90eXBlLnJlbW92ZUxlYWRpbmdOZXdsaW5lcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGksIHRhZywgX2xlbiwgX3JlZjsNCiAgICAgIF9yZWYgPSB0aGlzLnRva2VuczsNCiAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICB0YWcgPSBfcmVmW2ldWzBdOw0KICAgICAgICBpZiAodGFnICE9PSAnVEVSTUlOQVRPUicpIHsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGkpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNwbGljZSgwLCBpKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5yZW1vdmVNaWRFeHByZXNzaW9uTmV3bGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbnMoZnVuY3Rpb24odG9rZW4sIGksIHRva2Vucykgew0KICAgICAgICB2YXIgX3JlZjsNCiAgICAgICAgaWYgKCEodG9rZW5bMF0gPT09ICdURVJNSU5BVE9SJyAmJiAoX3JlZiA9IHRoaXMudGFnKGkgKyAxKSwgX19pbmRleE9mLmNhbGwoRVhQUkVTU0lPTl9DTE9TRSwgX3JlZikgPj0gMCkpKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zLnNwbGljZShpLCAxKTsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5jbG9zZU9wZW5DYWxscyA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGFjdGlvbiwgY29uZGl0aW9uOw0KICAgICAgY29uZGl0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgdmFyIF9yZWY7DQogICAgICAgIHJldHVybiAoKF9yZWYgPSB0b2tlblswXSkgPT09ICcpJyB8fCBfcmVmID09PSAnQ0FMTF9FTkQnKSB8fCB0b2tlblswXSA9PT0gJ09VVERFTlQnICYmIHRoaXMudGFnKGkgLSAxKSA9PT0gJyknOw0KICAgICAgfTsNCiAgICAgIGFjdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1t0b2tlblswXSA9PT0gJ09VVERFTlQnID8gaSAtIDEgOiBpXVswXSA9ICdDQUxMX0VORCc7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICBpZiAodG9rZW5bMF0gPT09ICdDQUxMX1NUQVJUJykgew0KICAgICAgICAgIHRoaXMuZGV0ZWN0RW5kKGkgKyAxLCBjb25kaXRpb24sIGFjdGlvbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDE7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5jbG9zZU9wZW5JbmRleGVzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYWN0aW9uLCBjb25kaXRpb247DQogICAgICBjb25kaXRpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICB2YXIgX3JlZjsNCiAgICAgICAgcmV0dXJuIChfcmVmID0gdG9rZW5bMF0pID09PSAnXScgfHwgX3JlZiA9PT0gJ0lOREVYX0VORCc7DQogICAgICB9Ow0KICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgcmV0dXJuIHRva2VuWzBdID0gJ0lOREVYX0VORCc7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICBpZiAodG9rZW5bMF0gPT09ICdJTkRFWF9TVEFSVCcpIHsNCiAgICAgICAgICB0aGlzLmRldGVjdEVuZChpICsgMSwgY29uZGl0aW9uLCBhY3Rpb24pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUuYWRkSW1wbGljaXRCcmFjZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhY3Rpb24sIGNvbmRpdGlvbiwgc3RhY2ssIHN0YXJ0LCBzdGFydEluZGVudDsNCiAgICAgIHN0YWNrID0gW107DQogICAgICBzdGFydCA9IG51bGw7DQogICAgICBzdGFydEluZGVudCA9IDA7DQogICAgICBjb25kaXRpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICB2YXIgb25lLCB0YWcsIHRocmVlLCB0d28sIF9yZWYsIF9yZWYyOw0KICAgICAgICBfcmVmID0gdGhpcy50b2tlbnMuc2xpY2UoaSArIDEsIChpICsgMyArIDEpIHx8IDllOSksIG9uZSA9IF9yZWZbMF0sIHR3byA9IF9yZWZbMV0sIHRocmVlID0gX3JlZlsyXTsNCiAgICAgICAgaWYgKCdIRVJFQ09NTUVOVCcgPT09IChvbmUgIT0gbnVsbCA/IG9uZVswXSA6IHZvaWQgMCkpIHsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdGFnID0gdG9rZW5bMF07DQogICAgICAgIHJldHVybiAoKHRhZyA9PT0gJ1RFUk1JTkFUT1InIHx8IHRhZyA9PT0gJ09VVERFTlQnKSAmJiAhKCh0d28gIT0gbnVsbCA/IHR3b1swXSA6IHZvaWQgMCkgPT09ICc6JyB8fCAob25lICE9IG51bGwgPyBvbmVbMF0gOiB2b2lkIDApID09PSAnQCcgJiYgKHRocmVlICE9IG51bGwgPyB0aHJlZVswXSA6IHZvaWQgMCkgPT09ICc6JykpIHx8ICh0YWcgPT09ICcsJyAmJiBvbmUgJiYgKChfcmVmMiA9IG9uZVswXSkgIT09ICdJREVOVElGSUVSJyAmJiBfcmVmMiAhPT0gJ05VTUJFUicgJiYgX3JlZjIgIT09ICdTVFJJTkcnICYmIF9yZWYyICE9PSAnQCcgJiYgX3JlZjIgIT09ICdURVJNSU5BVE9SJyAmJiBfcmVmMiAhPT0gJ09VVERFTlQnKSk7DQogICAgICB9Ow0KICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgdmFyIHRvazsNCiAgICAgICAgdG9rID0gWyd9JywgJ30nLCB0b2tlblsyXV07DQogICAgICAgIHRvay5nZW5lcmF0ZWQgPSB0cnVlOw0KICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc3BsaWNlKGksIDAsIHRvayk7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSwgdG9rZW5zKSB7DQogICAgICAgIHZhciBhZ28sIGlkeCwgdGFnLCB0b2ssIHZhbHVlLCBfcmVmLCBfcmVmMjsNCiAgICAgICAgaWYgKF9yZWYgPSAodGFnID0gdG9rZW5bMF0pLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7DQogICAgICAgICAgc3RhY2sucHVzaChbKHRhZyA9PT0gJ0lOREVOVCcgJiYgdGhpcy50YWcoaSAtIDEpID09PSAneycgPyAneycgOiB0YWcpLCBpXSk7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fRU5ELCB0YWcpID49IDApIHsNCiAgICAgICAgICBzdGFydCA9IHN0YWNrLnBvcCgpOw0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGlmICghKHRhZyA9PT0gJzonICYmICgoYWdvID0gdGhpcy50YWcoaSAtIDIpKSA9PT0gJzonIHx8ICgoX3JlZjIgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXSkgIT0gbnVsbCA/IF9yZWYyWzBdIDogdm9pZCAwKSAhPT0gJ3snKSkpIHsNCiAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfQ0KICAgICAgICBzdGFjay5wdXNoKFsneyddKTsNCiAgICAgICAgaWR4ID0gYWdvID09PSAnQCcgPyBpIC0gMiA6IGkgLSAxOw0KICAgICAgICB3aGlsZSAodGhpcy50YWcoaWR4IC0gMikgPT09ICdIRVJFQ09NTUVOVCcpIHsNCiAgICAgICAgICBpZHggLT0gMjsNCiAgICAgICAgfQ0KICAgICAgICB2YWx1ZSA9IG5ldyBTdHJpbmcoJ3snKTsNCiAgICAgICAgdmFsdWUuZ2VuZXJhdGVkID0gdHJ1ZTsNCiAgICAgICAgdG9rID0gWyd7JywgdmFsdWUsIHRva2VuWzJdXTsNCiAgICAgICAgdG9rLmdlbmVyYXRlZCA9IHRydWU7DQogICAgICAgIHRva2Vucy5zcGxpY2UoaWR4LCAwLCB0b2spOw0KICAgICAgICB0aGlzLmRldGVjdEVuZChpICsgMiwgY29uZGl0aW9uLCBhY3Rpb24pOw0KICAgICAgICByZXR1cm4gMjsNCiAgICAgIH0pOw0KICAgIH07DQogICAgUmV3cml0ZXIucHJvdG90eXBlLmFkZEltcGxpY2l0UGFyZW50aGVzZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhY3Rpb24sIG5vQ2FsbDsNCiAgICAgIG5vQ2FsbCA9IGZhbHNlOw0KICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgdmFyIGlkeDsNCiAgICAgICAgaWR4ID0gdG9rZW5bMF0gPT09ICdPVVRERU5UJyA/IGkgKyAxIDogaTsNCiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNwbGljZShpZHgsIDAsIFsnQ0FMTF9FTkQnLCAnKScsIHRva2VuWzJdXSk7DQogICAgICB9Ow0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSwgdG9rZW5zKSB7DQogICAgICAgIHZhciBjYWxsT2JqZWN0LCBjdXJyZW50LCBuZXh0LCBwcmV2LCBzZWVuQ29udHJvbCwgc2VlblNpbmdsZSwgdGFnLCBfcmVmLCBfcmVmMiwgX3JlZjM7DQogICAgICAgIHRhZyA9IHRva2VuWzBdOw0KICAgICAgICBpZiAodGFnID09PSAnQ0xBU1MnIHx8IHRhZyA9PT0gJ0lGJykgew0KICAgICAgICAgIG5vQ2FsbCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgX3JlZiA9IHRva2Vucy5zbGljZShpIC0gMSwgKGkgKyAxICsgMSkgfHwgOWU5KSwgcHJldiA9IF9yZWZbMF0sIGN1cnJlbnQgPSBfcmVmWzFdLCBuZXh0ID0gX3JlZlsyXTsNCiAgICAgICAgY2FsbE9iamVjdCA9ICFub0NhbGwgJiYgdGFnID09PSAnSU5ERU5UJyAmJiBuZXh0ICYmIG5leHQuZ2VuZXJhdGVkICYmIG5leHRbMF0gPT09ICd7JyAmJiBwcmV2ICYmIChfcmVmMiA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX0ZVTkMsIF9yZWYyKSA+PSAwKTsNCiAgICAgICAgc2VlblNpbmdsZSA9IGZhbHNlOw0KICAgICAgICBzZWVuQ29udHJvbCA9IGZhbHNlOw0KICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoTElORUJSRUFLUywgdGFnKSA+PSAwKSB7DQogICAgICAgICAgbm9DYWxsID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHByZXYgJiYgIXByZXYuc3BhY2VkICYmIHRhZyA9PT0gJz8nKSB7DQogICAgICAgICAgdG9rZW4uY2FsbCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRva2VuLmZyb21UaGVuKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEoY2FsbE9iamVjdCB8fCAocHJldiAhPSBudWxsID8gcHJldi5zcGFjZWQgOiB2b2lkIDApICYmIChwcmV2LmNhbGwgfHwgKF9yZWYzID0gcHJldlswXSwgX19pbmRleE9mLmNhbGwoSU1QTElDSVRfRlVOQywgX3JlZjMpID49IDApKSAmJiAoX19pbmRleE9mLmNhbGwoSU1QTElDSVRfQ0FMTCwgdGFnKSA+PSAwIHx8ICEodG9rZW4uc3BhY2VkIHx8IHRva2VuLm5ld0xpbmUpICYmIF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwsIHRhZykgPj0gMCkpKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zLnNwbGljZShpLCAwLCBbJ0NBTExfU1RBUlQnLCAnKCcsIHRva2VuWzJdXSk7DQogICAgICAgIHRoaXMuZGV0ZWN0RW5kKGkgKyAxLCBmdW5jdGlvbih0b2tlbiwgaSkgew0KICAgICAgICAgIHZhciBwb3N0LCBfcmVmNDsNCiAgICAgICAgICB0YWcgPSB0b2tlblswXTsNCiAgICAgICAgICBpZiAoIXNlZW5TaW5nbGUgJiYgdG9rZW4uZnJvbVRoZW4pIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGFnID09PSAnSUYnIHx8IHRhZyA9PT0gJ0VMU0UnIHx8IHRhZyA9PT0gJ0NBVENIJyB8fCB0YWcgPT09ICctPicgfHwgdGFnID09PSAnPT4nKSB7DQogICAgICAgICAgICBzZWVuU2luZ2xlID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRhZyA9PT0gJ0lGJyB8fCB0YWcgPT09ICdFTFNFJyB8fCB0YWcgPT09ICdTV0lUQ0gnIHx8IHRhZyA9PT0gJ1RSWScpIHsNCiAgICAgICAgICAgIHNlZW5Db250cm9sID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCh0YWcgPT09ICcuJyB8fCB0YWcgPT09ICc/LicgfHwgdGFnID09PSAnOjonKSAmJiB0aGlzLnRhZyhpIC0gMSkgPT09ICdPVVRERU5UJykgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiAhdG9rZW4uZ2VuZXJhdGVkICYmIHRoaXMudGFnKGkgLSAxKSAhPT0gJywnICYmIChfX2luZGV4T2YuY2FsbChJTVBMSUNJVF9FTkQsIHRhZykgPj0gMCB8fCAodGFnID09PSAnSU5ERU5UJyAmJiAhc2VlbkNvbnRyb2wpKSAmJiAodGFnICE9PSAnSU5ERU5UJyB8fCAodGhpcy50YWcoaSAtIDIpICE9PSAnQ0xBU1MnICYmIChfcmVmNCA9IHRoaXMudGFnKGkgLSAxKSwgX19pbmRleE9mLmNhbGwoSU1QTElDSVRfQkxPQ0ssIF9yZWY0KSA8IDApICYmICEoKHBvc3QgPSB0aGlzLnRva2Vuc1tpICsgMV0pICYmIHBvc3QuZ2VuZXJhdGVkICYmIHBvc3RbMF0gPT09ICd7JykpKTsNCiAgICAgICAgfSwgYWN0aW9uKTsNCiAgICAgICAgaWYgKHByZXZbMF0gPT09ICc/Jykgew0KICAgICAgICAgIHByZXZbMF0gPSAnRlVOQ19FWElTVCc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDI7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5hZGRJbXBsaWNpdEluZGVudGF0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpLCB0b2tlbnMpIHsNCiAgICAgICAgdmFyIGFjdGlvbiwgY29uZGl0aW9uLCBpbmRlbnQsIG91dGRlbnQsIHN0YXJ0ZXIsIHRhZywgX3JlZiwgX3JlZjI7DQogICAgICAgIHRhZyA9IHRva2VuWzBdOw0KICAgICAgICBpZiAodGFnID09PSAnVEVSTUlOQVRPUicgJiYgdGhpcy50YWcoaSArIDEpID09PSAnVEhFTicpIHsNCiAgICAgICAgICB0b2tlbnMuc3BsaWNlKGksIDEpOw0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICAgIGlmICh0YWcgPT09ICdFTFNFJyAmJiB0aGlzLnRhZyhpIC0gMSkgIT09ICdPVVRERU5UJykgew0KICAgICAgICAgIHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSwgMF0uY29uY2F0KF9fc2xpY2UuY2FsbCh0aGlzLmluZGVudGF0aW9uKHRva2VuKSkpKTsNCiAgICAgICAgICByZXR1cm4gMjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGFnID09PSAnQ0FUQ0gnICYmICgoX3JlZiA9IHRoaXMudGFnKGkgKyAyKSkgPT09ICdPVVRERU5UJyB8fCBfcmVmID09PSAnVEVSTUlOQVRPUicgfHwgX3JlZiA9PT0gJ0ZJTkFMTFknKSkgew0KICAgICAgICAgIHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSArIDIsIDBdLmNvbmNhdChfX3NsaWNlLmNhbGwodGhpcy5pbmRlbnRhdGlvbih0b2tlbikpKSk7DQogICAgICAgICAgcmV0dXJuIDQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKFNJTkdMRV9MSU5FUlMsIHRhZykgPj0gMCAmJiB0aGlzLnRhZyhpICsgMSkgIT09ICdJTkRFTlQnICYmICEodGFnID09PSAnRUxTRScgJiYgdGhpcy50YWcoaSArIDEpID09PSAnSUYnKSkgew0KICAgICAgICAgIHN0YXJ0ZXIgPSB0YWc7DQogICAgICAgICAgX3JlZjIgPSB0aGlzLmluZGVudGF0aW9uKHRva2VuKSwgaW5kZW50ID0gX3JlZjJbMF0sIG91dGRlbnQgPSBfcmVmMlsxXTsNCiAgICAgICAgICBpZiAoc3RhcnRlciA9PT0gJ1RIRU4nKSB7DQogICAgICAgICAgICBpbmRlbnQuZnJvbVRoZW4gPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpbmRlbnQuZ2VuZXJhdGVkID0gb3V0ZGVudC5nZW5lcmF0ZWQgPSB0cnVlOw0KICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSArIDEsIDAsIGluZGVudCk7DQogICAgICAgICAgY29uZGl0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgICAgIHZhciBfcmVmMzsNCiAgICAgICAgICAgIHJldHVybiB0b2tlblsxXSAhPT0gJzsnICYmIChfcmVmMyA9IHRva2VuWzBdLCBfX2luZGV4T2YuY2FsbChTSU5HTEVfQ0xPU0VSUywgX3JlZjMpID49IDApICYmICEodG9rZW5bMF0gPT09ICdFTFNFJyAmJiAoc3RhcnRlciAhPT0gJ0lGJyAmJiBzdGFydGVyICE9PSAnVEhFTicpKTsNCiAgICAgICAgICB9Ow0KICAgICAgICAgIGFjdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc3BsaWNlKCh0aGlzLnRhZyhpIC0gMSkgPT09ICcsJyA/IGkgLSAxIDogaSksIDAsIG91dGRlbnQpOw0KICAgICAgICAgIH07DQogICAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDIsIGNvbmRpdGlvbiwgYWN0aW9uKTsNCiAgICAgICAgICBpZiAodGFnID09PSAnVEhFTicpIHsNCiAgICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUudGFnUG9zdGZpeENvbmRpdGlvbmFscyA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGNvbmRpdGlvbjsNCiAgICAgIGNvbmRpdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgIHZhciBfcmVmOw0KICAgICAgICByZXR1cm4gKF9yZWYgPSB0b2tlblswXSkgPT09ICdURVJNSU5BVE9SJyB8fCBfcmVmID09PSAnSU5ERU5UJzsNCiAgICAgIH07DQogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpKSB7DQogICAgICAgIHZhciBvcmlnaW5hbDsNCiAgICAgICAgaWYgKHRva2VuWzBdICE9PSAnSUYnKSB7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgb3JpZ2luYWwgPSB0b2tlbjsNCiAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDEsIGNvbmRpdGlvbiwgZnVuY3Rpb24odG9rZW4sIGkpIHsNCiAgICAgICAgICBpZiAodG9rZW5bMF0gIT09ICdJTkRFTlQnKSB7DQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxbMF0gPSAnUE9TVF8nICsgb3JpZ2luYWxbMF07DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5lbnN1cmVCYWxhbmNlID0gZnVuY3Rpb24ocGFpcnMpIHsNCiAgICAgIHZhciBjbG9zZSwgbGV2ZWwsIGxldmVscywgb3Blbiwgb3BlbkxpbmUsIHRhZywgdG9rZW4sIF9pLCBfaiwgX2xlbiwgX2xlbjIsIF9yZWYsIF9yZWYyOw0KICAgICAgbGV2ZWxzID0ge307DQogICAgICBvcGVuTGluZSA9IHt9Ow0KICAgICAgX3JlZiA9IHRoaXMudG9rZW5zOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHRva2VuID0gX3JlZltfaV07DQogICAgICAgIHRhZyA9IHRva2VuWzBdOw0KICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjIgPSBwYWlycy5sZW5ndGg7IF9qIDwgX2xlbjI7IF9qKyspIHsNCiAgICAgICAgICBfcmVmMiA9IHBhaXJzW19qXSwgb3BlbiA9IF9yZWYyWzBdLCBjbG9zZSA9IF9yZWYyWzFdOw0KICAgICAgICAgIGxldmVsc1tvcGVuXSB8PSAwOw0KICAgICAgICAgIGlmICh0YWcgPT09IG9wZW4pIHsNCiAgICAgICAgICAgIGlmIChsZXZlbHNbb3Blbl0rKyA9PT0gMCkgew0KICAgICAgICAgICAgICBvcGVuTGluZVtvcGVuXSA9IHRva2VuWzJdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09PSBjbG9zZSAmJiAtLWxldmVsc1tvcGVuXSA8IDApIHsNCiAgICAgICAgICAgIHRocm93IEVycm9yKCJ0b28gbWFueSAiICsgdG9rZW5bMV0gKyAiIG9uIGxpbmUgIiArICh0b2tlblsyXSArIDEpKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGZvciAob3BlbiBpbiBsZXZlbHMpIHsNCiAgICAgICAgbGV2ZWwgPSBsZXZlbHNbb3Blbl07DQogICAgICAgIGlmIChsZXZlbCA+IDApIHsNCiAgICAgICAgICB0aHJvdyBFcnJvcigidW5jbG9zZWQgIiArIG9wZW4gKyAiIG9uIGxpbmUgIiArIChvcGVuTGluZVtvcGVuXSArIDEpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBSZXdyaXRlci5wcm90b3R5cGUucmV3cml0ZUNsb3NpbmdQYXJlbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBkZWJ0LCBrZXksIHN0YWNrOw0KICAgICAgc3RhY2sgPSBbXTsNCiAgICAgIGRlYnQgPSB7fTsNCiAgICAgIGZvciAoa2V5IGluIElOVkVSU0VTKSB7DQogICAgICAgIGRlYnRba2V5XSA9IDA7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpLCB0b2tlbnMpIHsNCiAgICAgICAgdmFyIGludiwgbWF0Y2gsIG10YWcsIG9wcG9zLCB0YWcsIHZhbCwgX3JlZjsNCiAgICAgICAgaWYgKF9yZWYgPSAodGFnID0gdG9rZW5bMF0pLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7DQogICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7DQogICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fRU5ELCB0YWcpIDwgMCkgew0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGlmIChkZWJ0W2ludiA9IElOVkVSU0VTW3RhZ11dID4gMCkgew0KICAgICAgICAgIGRlYnRbaW52XSAtPSAxOw0KICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIH0NCiAgICAgICAgbWF0Y2ggPSBzdGFjay5wb3AoKTsNCiAgICAgICAgbXRhZyA9IG1hdGNoWzBdOw0KICAgICAgICBvcHBvcyA9IElOVkVSU0VTW210YWddOw0KICAgICAgICBpZiAodGFnID09PSBvcHBvcykgew0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGRlYnRbbXRhZ10gKz0gMTsNCiAgICAgICAgdmFsID0gW29wcG9zLCBtdGFnID09PSAnSU5ERU5UJyA/IG1hdGNoWzFdIDogb3Bwb3NdOw0KICAgICAgICBpZiAodGhpcy50YWcoaSArIDIpID09PSBtdGFnKSB7DQogICAgICAgICAgdG9rZW5zLnNwbGljZShpICsgMywgMCwgdmFsKTsNCiAgICAgICAgICBzdGFjay5wdXNoKG1hdGNoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0b2tlbnMuc3BsaWNlKGksIDAsIHZhbCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDE7DQogICAgICB9KTsNCiAgICB9Ow0KICAgIFJld3JpdGVyLnByb3RvdHlwZS5pbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKHRva2VuKSB7DQogICAgICByZXR1cm4gW1snSU5ERU5UJywgMiwgdG9rZW5bMl1dLCBbJ09VVERFTlQnLCAyLCB0b2tlblsyXV1dOw0KICAgIH07DQogICAgUmV3cml0ZXIucHJvdG90eXBlLnRhZyA9IGZ1bmN0aW9uKGkpIHsNCiAgICAgIHZhciBfcmVmOw0KICAgICAgcmV0dXJuIChfcmVmID0gdGhpcy50b2tlbnNbaV0pICE9IG51bGwgPyBfcmVmWzBdIDogdm9pZCAwOw0KICAgIH07DQogICAgcmV0dXJuIFJld3JpdGVyOw0KICB9KSgpOw0KICBCQUxBTkNFRF9QQUlSUyA9IFtbJygnLCAnKSddLCBbJ1snLCAnXSddLCBbJ3snLCAnfSddLCBbJ0lOREVOVCcsICdPVVRERU5UJ10sIFsnQ0FMTF9TVEFSVCcsICdDQUxMX0VORCddLCBbJ1BBUkFNX1NUQVJUJywgJ1BBUkFNX0VORCddLCBbJ0lOREVYX1NUQVJUJywgJ0lOREVYX0VORCddXTsNCiAgSU5WRVJTRVMgPSB7fTsNCiAgRVhQUkVTU0lPTl9TVEFSVCA9IFtdOw0KICBFWFBSRVNTSU9OX0VORCA9IFtdOw0KICBmb3IgKF9pID0gMCwgX2xlbiA9IEJBTEFOQ0VEX1BBSVJTLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgX3JlZiA9IEJBTEFOQ0VEX1BBSVJTW19pXSwgbGVmdCA9IF9yZWZbMF0sIHJpdGUgPSBfcmVmWzFdOw0KICAgIEVYUFJFU1NJT05fU1RBUlQucHVzaChJTlZFUlNFU1tyaXRlXSA9IGxlZnQpOw0KICAgIEVYUFJFU1NJT05fRU5ELnB1c2goSU5WRVJTRVNbbGVmdF0gPSByaXRlKTsNCiAgfQ0KICBFWFBSRVNTSU9OX0NMT1NFID0gWydDQVRDSCcsICdXSEVOJywgJ0VMU0UnLCAnRklOQUxMWSddLmNvbmNhdChFWFBSRVNTSU9OX0VORCk7DQogIElNUExJQ0lUX0ZVTkMgPSBbJ0lERU5USUZJRVInLCAnU1VQRVInLCAnKScsICdDQUxMX0VORCcsICddJywgJ0lOREVYX0VORCcsICdAJywgJ1RISVMnXTsNCiAgSU1QTElDSVRfQ0FMTCA9IFsnSURFTlRJRklFUicsICdOVU1CRVInLCAnU1RSSU5HJywgJ0pTJywgJ1JFR0VYJywgJ05FVycsICdQQVJBTV9TVEFSVCcsICdDTEFTUycsICdJRicsICdUUlknLCAnU1dJVENIJywgJ1RISVMnLCAnQk9PTCcsICdVTkFSWScsICdTVVBFUicsICdAJywgJy0+JywgJz0+JywgJ1snLCAnKCcsICd7JywgJy0tJywgJysrJ107DQogIElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwgPSBbJysnLCAnLSddOw0KICBJTVBMSUNJVF9CTE9DSyA9IFsnLT4nLCAnPT4nLCAneycsICdbJywgJywnXTsNCiAgSU1QTElDSVRfRU5EID0gWydQT1NUX0lGJywgJ0ZPUicsICdXSElMRScsICdVTlRJTCcsICdXSEVOJywgJ0JZJywgJ0xPT1AnLCAnVEVSTUlOQVRPUiddOw0KICBTSU5HTEVfTElORVJTID0gWydFTFNFJywgJy0+JywgJz0+JywgJ1RSWScsICdGSU5BTExZJywgJ1RIRU4nXTsNCiAgU0lOR0xFX0NMT1NFUlMgPSBbJ1RFUk1JTkFUT1InLCAnQ0FUQ0gnLCAnRklOQUxMWScsICdFTFNFJywgJ09VVERFTlQnLCAnTEVBRElOR19XSEVOJ107DQogIExJTkVCUkVBS1MgPSBbJ1RFUk1JTkFUT1InLCAnSU5ERU5UJywgJ09VVERFTlQnXTsNCn0pOw0KLyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvaGVscGVycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQogICAgDQogIHZhciBleHRlbmQsIGZsYXR0ZW47DQogIGV4cG9ydHMuc3RhcnRzID0gZnVuY3Rpb24oc3RyaW5nLCBsaXRlcmFsLCBzdGFydCkgew0KICAgIHJldHVybiBsaXRlcmFsID09PSBzdHJpbmcuc3Vic3RyKHN0YXJ0LCBsaXRlcmFsLmxlbmd0aCk7DQogIH07DQogIGV4cG9ydHMuZW5kcyA9IGZ1bmN0aW9uKHN0cmluZywgbGl0ZXJhbCwgYmFjaykgew0KICAgIHZhciBsZW47DQogICAgbGVuID0gbGl0ZXJhbC5sZW5ndGg7DQogICAgcmV0dXJuIGxpdGVyYWwgPT09IHN0cmluZy5zdWJzdHIoc3RyaW5nLmxlbmd0aCAtIGxlbiAtIChiYWNrIHx8IDApLCBsZW4pOw0KICB9Ow0KICBleHBvcnRzLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkgew0KICAgIHZhciBpdGVtLCBfaSwgX2xlbiwgX3Jlc3VsdHM7DQogICAgX3Jlc3VsdHMgPSBbXTsNCiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFycmF5Lmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICBpdGVtID0gYXJyYXlbX2ldOw0KICAgICAgaWYgKGl0ZW0pIHsNCiAgICAgICAgX3Jlc3VsdHMucHVzaChpdGVtKTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIF9yZXN1bHRzOw0KICB9Ow0KICBleHBvcnRzLmNvdW50ID0gZnVuY3Rpb24oc3RyaW5nLCBzdWJzdHIpIHsNCiAgICB2YXIgbnVtLCBwb3M7DQogICAgbnVtID0gcG9zID0gMDsNCiAgICBpZiAoIXN1YnN0ci5sZW5ndGgpIHsNCiAgICAgIHJldHVybiAxIC8gMDsNCiAgICB9DQogICAgd2hpbGUgKHBvcyA9IDEgKyBzdHJpbmcuaW5kZXhPZihzdWJzdHIsIHBvcykpIHsNCiAgICAgIG51bSsrOw0KICAgIH0NCiAgICByZXR1cm4gbnVtOw0KICB9Ow0KICBleHBvcnRzLm1lcmdlID0gZnVuY3Rpb24ob3B0aW9ucywgb3ZlcnJpZGVzKSB7DQogICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIG9wdGlvbnMpLCBvdmVycmlkZXMpOw0KICB9Ow0KICBleHRlbmQgPSBleHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydGllcykgew0KICAgIHZhciBrZXksIHZhbDsNCiAgICBmb3IgKGtleSBpbiBwcm9wZXJ0aWVzKSB7DQogICAgICB2YWwgPSBwcm9wZXJ0aWVzW2tleV07DQogICAgICBvYmplY3Rba2V5XSA9IHZhbDsNCiAgICB9DQogICAgcmV0dXJuIG9iamVjdDsNCiAgfTsNCiAgZXhwb3J0cy5mbGF0dGVuID0gZmxhdHRlbiA9IGZ1bmN0aW9uKGFycmF5KSB7DQogICAgdmFyIGVsZW1lbnQsIGZsYXR0ZW5lZCwgX2ksIF9sZW47DQogICAgZmxhdHRlbmVkID0gW107DQogICAgZm9yIChfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgZWxlbWVudCA9IGFycmF5W19pXTsNCiAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXkpIHsNCiAgICAgICAgZmxhdHRlbmVkID0gZmxhdHRlbmVkLmNvbmNhdChmbGF0dGVuKGVsZW1lbnQpKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZsYXR0ZW5lZC5wdXNoKGVsZW1lbnQpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmxhdHRlbmVkOw0KICB9Ow0KICBleHBvcnRzLmRlbCA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7DQogICAgdmFyIHZhbDsNCiAgICB2YWwgPSBvYmpba2V5XTsNCiAgICBkZWxldGUgb2JqW2tleV07DQogICAgcmV0dXJuIHZhbDsNCiAgfTsNCiAgZXhwb3J0cy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIGJhY2spIHsNCiAgICByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gKGJhY2sgfHwgMCkgLSAxXTsNCiAgfTsNCn0pOw0KLyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvcGFyc2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCg0KLyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqLw0KdmFyIHBhcnNlciA9IHt0cmFjZTogZnVuY3Rpb24gdHJhY2UoKSB7IH0sDQp5eToge30sDQpzeW1ib2xzXzogeyJlcnJvciI6MiwiUm9vdCI6MywiQm9keSI6NCwiQmxvY2siOjUsIlRFUk1JTkFUT1IiOjYsIkxpbmUiOjcsIkV4cHJlc3Npb24iOjgsIlN0YXRlbWVudCI6OSwiUmV0dXJuIjoxMCwiVGhyb3ciOjExLCJDb21tZW50IjoxMiwiU1RBVEVNRU5UIjoxMywiVmFsdWUiOjE0LCJJbnZvY2F0aW9uIjoxNSwiQ29kZSI6MTYsIk9wZXJhdGlvbiI6MTcsIkFzc2lnbiI6MTgsIklmIjoxOSwiVHJ5IjoyMCwiV2hpbGUiOjIxLCJGb3IiOjIyLCJTd2l0Y2giOjIzLCJDbGFzcyI6MjQsIklOREVOVCI6MjUsIk9VVERFTlQiOjI2LCJJZGVudGlmaWVyIjoyNywiSURFTlRJRklFUiI6MjgsIkFscGhhTnVtZXJpYyI6MjksIk5VTUJFUiI6MzAsIlNUUklORyI6MzEsIkxpdGVyYWwiOjMyLCJKUyI6MzMsIlJFR0VYIjozNCwiQk9PTCI6MzUsIkFzc2lnbmFibGUiOjM2LCI9IjozNywiQXNzaWduT2JqIjozOCwiT2JqQXNzaWduYWJsZSI6MzksIjoiOjQwLCJUaGlzUHJvcGVydHkiOjQxLCJSRVRVUk4iOjQyLCJIRVJFQ09NTUVOVCI6NDMsIlBBUkFNX1NUQVJUIjo0NCwiUGFyYW1MaXN0Ijo0NSwiUEFSQU1fRU5EIjo0NiwiRnVuY0dseXBoIjo0NywiLT4iOjQ4LCI9PiI6NDksIk9wdENvbW1hIjo1MCwiLCI6NTEsIlBhcmFtIjo1MiwiUGFyYW1WYXIiOjUzLCIuLi4iOjU0LCJBcnJheSI6NTUsIk9iamVjdCI6NTYsIlNwbGF0Ijo1NywiU2ltcGxlQXNzaWduYWJsZSI6NTgsIkFjY2Vzc29yIjo1OSwiUGFyZW50aGV0aWNhbCI6NjAsIlJhbmdlIjo2MSwiVGhpcyI6NjIsIi4iOjYzLCI/LiI6NjQsIjo6Ijo2NSwiSW5kZXgiOjY2LCJJTkRFWF9TVEFSVCI6NjcsIkluZGV4VmFsdWUiOjY4LCJJTkRFWF9FTkQiOjY5LCJJTkRFWF9TT0FLIjo3MCwiSU5ERVhfUFJPVE8iOjcxLCJTbGljZSI6NzIsInsiOjczLCJBc3NpZ25MaXN0Ijo3NCwifSI6NzUsIkNMQVNTIjo3NiwiRVhURU5EUyI6NzcsIk9wdEZ1bmNFeGlzdCI6NzgsIkFyZ3VtZW50cyI6NzksIlNVUEVSIjo4MCwiRlVOQ19FWElTVCI6ODEsIkNBTExfU1RBUlQiOjgyLCJDQUxMX0VORCI6ODMsIkFyZ0xpc3QiOjg0LCJUSElTIjo4NSwiQCI6ODYsIlsiOjg3LCJdIjo4OCwiUmFuZ2VEb3RzIjo4OSwiLi4iOjkwLCJBcmciOjkxLCJTaW1wbGVBcmdzIjo5MiwiVFJZIjo5MywiQ2F0Y2giOjk0LCJGSU5BTExZIjo5NSwiQ0FUQ0giOjk2LCJUSFJPVyI6OTcsIigiOjk4LCIpIjo5OSwiV2hpbGVTb3VyY2UiOjEwMCwiV0hJTEUiOjEwMSwiV0hFTiI6MTAyLCJVTlRJTCI6MTAzLCJMb29wIjoxMDQsIkxPT1AiOjEwNSwiRm9yQm9keSI6MTA2LCJGT1IiOjEwNywiRm9yU3RhcnQiOjEwOCwiRm9yU291cmNlIjoxMDksIkZvclZhcmlhYmxlcyI6MTEwLCJPV04iOjExMSwiRm9yVmFsdWUiOjExMiwiRk9SSU4iOjExMywiRk9ST0YiOjExNCwiQlkiOjExNSwiU1dJVENIIjoxMTYsIldoZW5zIjoxMTcsIkVMU0UiOjExOCwiV2hlbiI6MTE5LCJMRUFESU5HX1dIRU4iOjEyMCwiSWZCbG9jayI6MTIxLCJJRiI6MTIyLCJQT1NUX0lGIjoxMjMsIlVOQVJZIjoxMjQsIi0iOjEyNSwiKyI6MTI2LCItLSI6MTI3LCIrKyI6MTI4LCI/IjoxMjksIk1BVEgiOjEzMCwiU0hJRlQiOjEzMSwiQ09NUEFSRSI6MTMyLCJMT0dJQyI6MTMzLCJSRUxBVElPTiI6MTM0LCJDT01QT1VORF9BU1NJR04iOjEzNSwiJGFjY2VwdCI6MCwiJGVuZCI6MX0sDQp0ZXJtaW5hbHNfOiB7MjoiZXJyb3IiLDY6IlRFUk1JTkFUT1IiLDEzOiJTVEFURU1FTlQiLDI1OiJJTkRFTlQiLDI2OiJPVVRERU5UIiwyODoiSURFTlRJRklFUiIsMzA6Ik5VTUJFUiIsMzE6IlNUUklORyIsMzM6IkpTIiwzNDoiUkVHRVgiLDM1OiJCT09MIiwzNzoiPSIsNDA6IjoiLDQyOiJSRVRVUk4iLDQzOiJIRVJFQ09NTUVOVCIsNDQ6IlBBUkFNX1NUQVJUIiw0NjoiUEFSQU1fRU5EIiw0ODoiLT4iLDQ5OiI9PiIsNTE6IiwiLDU0OiIuLi4iLDYzOiIuIiw2NDoiPy4iLDY1OiI6OiIsNjc6IklOREVYX1NUQVJUIiw2OToiSU5ERVhfRU5EIiw3MDoiSU5ERVhfU09BSyIsNzE6IklOREVYX1BST1RPIiw3MzoieyIsNzU6In0iLDc2OiJDTEFTUyIsNzc6IkVYVEVORFMiLDgwOiJTVVBFUiIsODE6IkZVTkNfRVhJU1QiLDgyOiJDQUxMX1NUQVJUIiw4MzoiQ0FMTF9FTkQiLDg1OiJUSElTIiw4NjoiQCIsODc6IlsiLDg4OiJdIiw5MDoiLi4iLDkzOiJUUlkiLDk1OiJGSU5BTExZIiw5NjoiQ0FUQ0giLDk3OiJUSFJPVyIsOTg6IigiLDk5OiIpIiwxMDE6IldISUxFIiwxMDI6IldIRU4iLDEwMzoiVU5USUwiLDEwNToiTE9PUCIsMTA3OiJGT1IiLDExMToiT1dOIiwxMTM6IkZPUklOIiwxMTQ6IkZPUk9GIiwxMTU6IkJZIiwxMTY6IlNXSVRDSCIsMTE4OiJFTFNFIiwxMjA6IkxFQURJTkdfV0hFTiIsMTIyOiJJRiIsMTIzOiJQT1NUX0lGIiwxMjQ6IlVOQVJZIiwxMjU6Ii0iLDEyNjoiKyIsMTI3OiItLSIsMTI4OiIrKyIsMTI5OiI/IiwxMzA6Ik1BVEgiLDEzMToiU0hJRlQiLDEzMjoiQ09NUEFSRSIsMTMzOiJMT0dJQyIsMTM0OiJSRUxBVElPTiIsMTM1OiJDT01QT1VORF9BU1NJR04ifSwNCnByb2R1Y3Rpb25zXzogWzAsWzMsMF0sWzMsMV0sWzMsMl0sWzQsMV0sWzQsM10sWzQsMl0sWzcsMV0sWzcsMV0sWzksMV0sWzksMV0sWzksMV0sWzksMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzUsMl0sWzUsM10sWzI3LDFdLFsyOSwxXSxbMjksMV0sWzMyLDFdLFszMiwxXSxbMzIsMV0sWzMyLDFdLFsxOCwzXSxbMTgsNV0sWzM4LDFdLFszOCwzXSxbMzgsNV0sWzM4LDFdLFszOSwxXSxbMzksMV0sWzM5LDFdLFsxMCwyXSxbMTAsMV0sWzEyLDFdLFsxNiw1XSxbMTYsMl0sWzQ3LDFdLFs0NywxXSxbNTAsMF0sWzUwLDFdLFs0NSwwXSxbNDUsMV0sWzQ1LDNdLFs1MiwxXSxbNTIsMl0sWzUyLDNdLFs1MywxXSxbNTMsMV0sWzUzLDFdLFs1MywxXSxbNTcsMl0sWzU4LDFdLFs1OCwyXSxbNTgsMl0sWzU4LDFdLFszNiwxXSxbMzYsMV0sWzM2LDFdLFsxNCwxXSxbMTQsMV0sWzE0LDFdLFsxNCwxXSxbMTQsMV0sWzU5LDJdLFs1OSwyXSxbNTksMl0sWzU5LDFdLFs1OSwxXSxbNjYsM10sWzY2LDJdLFs2NiwyXSxbNjgsMV0sWzY4LDFdLFs1Niw0XSxbNzQsMF0sWzc0LDFdLFs3NCwzXSxbNzQsNF0sWzc0LDZdLFsyNCwxXSxbMjQsMl0sWzI0LDNdLFsyNCw0XSxbMjQsMl0sWzI0LDNdLFsyNCw0XSxbMjQsNV0sWzE1LDNdLFsxNSwzXSxbMTUsMV0sWzE1LDJdLFs3OCwwXSxbNzgsMV0sWzc5LDJdLFs3OSw0XSxbNjIsMV0sWzYyLDFdLFs0MSwyXSxbNTUsMl0sWzU1LDRdLFs4OSwxXSxbODksMV0sWzYxLDVdLFs3MiwzXSxbNzIsMl0sWzcyLDJdLFs4NCwxXSxbODQsM10sWzg0LDRdLFs4NCw0XSxbODQsNl0sWzkxLDFdLFs5MSwxXSxbOTIsMV0sWzkyLDNdLFsyMCwyXSxbMjAsM10sWzIwLDRdLFsyMCw1XSxbOTQsM10sWzExLDJdLFs2MCwzXSxbNjAsNV0sWzEwMCwyXSxbMTAwLDRdLFsxMDAsMl0sWzEwMCw0XSxbMjEsMl0sWzIxLDJdLFsyMSwyXSxbMjEsMV0sWzEwNCwyXSxbMTA0LDJdLFsyMiwyXSxbMjIsMl0sWzIyLDJdLFsxMDYsMl0sWzEwNiwyXSxbMTA4LDJdLFsxMDgsM10sWzExMiwxXSxbMTEyLDFdLFsxMTIsMV0sWzExMCwxXSxbMTEwLDNdLFsxMDksMl0sWzEwOSwyXSxbMTA5LDRdLFsxMDksNF0sWzEwOSw0XSxbMTA5LDZdLFsxMDksNl0sWzIzLDVdLFsyMyw3XSxbMjMsNF0sWzIzLDZdLFsxMTcsMV0sWzExNywyXSxbMTE5LDNdLFsxMTksNF0sWzEyMSwzXSxbMTIxLDVdLFsxOSwxXSxbMTksM10sWzE5LDNdLFsxOSwzXSxbMTcsMl0sWzE3LDJdLFsxNywyXSxbMTcsMl0sWzE3LDJdLFsxNywyXSxbMTcsMl0sWzE3LDJdLFsxNywzXSxbMTcsM10sWzE3LDNdLFsxNywzXSxbMTcsM10sWzE3LDNdLFsxNywzXSxbMTcsM10sWzE3LDVdLFsxNywzXV0sDQpwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LHl5bGVuZyx5eWxpbmVubyx5eSx5eXN0YXRlLCQkLF8kKSB7DQoNCnZhciAkMCA9ICQkLmxlbmd0aCAtIDE7DQpzd2l0Y2ggKHl5c3RhdGUpIHsNCmNhc2UgMTpyZXR1cm4gdGhpcy4kID0gbmV3IHl5LkJsb2NrOw0KYnJlYWs7DQpjYXNlIDI6cmV0dXJuIHRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAzOnJldHVybiB0aGlzLiQgPSAkJFskMC0xXTsNCmJyZWFrOw0KY2FzZSA0OnRoaXMuJCA9IHl5LkJsb2NrLndyYXAoWyQkWyQwXV0pOw0KYnJlYWs7DQpjYXNlIDU6dGhpcy4kID0gJCRbJDAtMl0ucHVzaCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDY6dGhpcy4kID0gJCRbJDAtMV07DQpicmVhazsNCmNhc2UgNzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgODp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgOTp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTA6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDExOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxMjp0aGlzLiQgPSBuZXcgeXkuTGl0ZXJhbCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDEzOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxNDp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTU6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE2OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxNzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTg6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE5OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAyMDp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMjE6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDIyOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAyMzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMjQ6dGhpcy4kID0gbmV3IHl5LkJsb2NrOw0KYnJlYWs7DQpjYXNlIDI1OnRoaXMuJCA9ICQkWyQwLTFdOw0KYnJlYWs7DQpjYXNlIDI2OnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMjc6dGhpcy4kID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAyODp0aGlzLiQgPSBuZXcgeXkuTGl0ZXJhbCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDI5OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAzMDp0aGlzLiQgPSBuZXcgeXkuTGl0ZXJhbCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDMxOnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMzI6dGhpcy4kID0gKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHZhbDsNCiAgICAgICAgdmFsID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsNCiAgICAgICAgaWYgKCQkWyQwXSA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgICAgICB2YWwuaXNVbmRlZmluZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB2YWw7DQogICAgICB9KCkpOw0KYnJlYWs7DQpjYXNlIDMzOnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24oJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMzQ6dGhpcy4kID0gbmV3IHl5LkFzc2lnbigkJFskMC00XSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDM1OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDM2OnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24obmV3IHl5LlZhbHVlKCQkWyQwLTJdKSwgJCRbJDBdLCAnb2JqZWN0Jyk7DQpicmVhazsNCmNhc2UgMzc6dGhpcy4kID0gbmV3IHl5LkFzc2lnbihuZXcgeXkuVmFsdWUoJCRbJDAtNF0pLCAkJFskMC0xXSwgJ29iamVjdCcpOw0KYnJlYWs7DQpjYXNlIDM4OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAzOTp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNDA6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDQxOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA0Mjp0aGlzLiQgPSBuZXcgeXkuUmV0dXJuKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNDM6dGhpcy4kID0gbmV3IHl5LlJldHVybjsNCmJyZWFrOw0KY2FzZSA0NDp0aGlzLiQgPSBuZXcgeXkuQ29tbWVudCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDQ1OnRoaXMuJCA9IG5ldyB5eS5Db2RlKCQkWyQwLTNdLCAkJFskMF0sICQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSA0Njp0aGlzLiQgPSBuZXcgeXkuQ29kZShbXSwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgNDc6dGhpcy4kID0gJ2Z1bmMnOw0KYnJlYWs7DQpjYXNlIDQ4OnRoaXMuJCA9ICdib3VuZGZ1bmMnOw0KYnJlYWs7DQpjYXNlIDQ5OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA1MDp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNTE6dGhpcy4kID0gW107DQpicmVhazsNCmNhc2UgNTI6dGhpcy4kID0gWyQkWyQwXV07DQpicmVhazsNCmNhc2UgNTM6dGhpcy4kID0gJCRbJDAtMl0uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNTQ6dGhpcy4kID0gbmV3IHl5LlBhcmFtKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNTU6dGhpcy4kID0gbmV3IHl5LlBhcmFtKCQkWyQwLTFdLCBudWxsLCB0cnVlKTsNCmJyZWFrOw0KY2FzZSA1Njp0aGlzLiQgPSBuZXcgeXkuUGFyYW0oJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgNTc6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDU4OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA1OTp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNjA6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDYxOnRoaXMuJCA9IG5ldyB5eS5TcGxhdCgkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgNjI6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNjM6dGhpcy4kID0gJCRbJDAtMV0ucHVzaCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDY0OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMC0xXSwgWyQkWyQwXV0pOw0KYnJlYWs7DQpjYXNlIDY1OnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA2Njp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNjc6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNjg6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNjk6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDcwOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDcxOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDcyOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDczOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSA3NDp0aGlzLiQgPSBuZXcgeXkuQWNjZXNzKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgNzU6dGhpcy4kID0gbmV3IHl5LkFjY2VzcygkJFskMF0sICdzb2FrJyk7DQpicmVhazsNCmNhc2UgNzY6dGhpcy4kID0gbmV3IHl5LkFjY2VzcygkJFskMF0sICdwcm90bycpOw0KYnJlYWs7DQpjYXNlIDc3OnRoaXMuJCA9IG5ldyB5eS5BY2Nlc3MobmV3IHl5LkxpdGVyYWwoJ3Byb3RvdHlwZScpKTsNCmJyZWFrOw0KY2FzZSA3ODp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgNzk6dGhpcy4kID0gJCRbJDAtMV07DQpicmVhazsNCmNhc2UgODA6dGhpcy4kID0geXkuZXh0ZW5kKCQkWyQwXSwgew0KICAgICAgICAgIHNvYWs6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgODE6dGhpcy4kID0geXkuZXh0ZW5kKCQkWyQwXSwgew0KICAgICAgICAgIHByb3RvOiB0cnVlDQogICAgICAgIH0pOw0KYnJlYWs7DQpjYXNlIDgyOnRoaXMuJCA9IG5ldyB5eS5JbmRleCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDgzOnRoaXMuJCA9IG5ldyB5eS5TbGljZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDg0OnRoaXMuJCA9IG5ldyB5eS5PYmooJCRbJDAtMl0sICQkWyQwLTNdLmdlbmVyYXRlZCk7DQpicmVhazsNCmNhc2UgODU6dGhpcy4kID0gW107DQpicmVhazsNCmNhc2UgODY6dGhpcy4kID0gWyQkWyQwXV07DQpicmVhazsNCmNhc2UgODc6dGhpcy4kID0gJCRbJDAtMl0uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgODg6dGhpcy4kID0gJCRbJDAtM10uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgODk6dGhpcy4kID0gJCRbJDAtNV0uY29uY2F0KCQkWyQwLTJdKTsNCmJyZWFrOw0KY2FzZSA5MDp0aGlzLiQgPSBuZXcgeXkuQ2xhc3M7DQpicmVhazsNCmNhc2UgOTE6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsIG51bGwsICQkWyQwXSk7DQpicmVhazsNCmNhc2UgOTI6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsICQkWyQwXSk7DQpicmVhazsNCmNhc2UgOTM6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsICQkWyQwLTFdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDk0OnRoaXMuJCA9IG5ldyB5eS5DbGFzcygkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDk1OnRoaXMuJCA9IG5ldyB5eS5DbGFzcygkJFskMC0xXSwgbnVsbCwgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSA5Njp0aGlzLiQgPSBuZXcgeXkuQ2xhc3MoJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgOTc6dGhpcy4kID0gbmV3IHl5LkNsYXNzKCQkWyQwLTNdLCAkJFskMC0xXSwgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSA5ODp0aGlzLiQgPSBuZXcgeXkuQ2FsbCgkJFskMC0yXSwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgOTk6dGhpcy4kID0gbmV3IHl5LkNhbGwoJCRbJDAtMl0sICQkWyQwXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDEwMDp0aGlzLiQgPSBuZXcgeXkuQ2FsbCgnc3VwZXInLCBbbmV3IHl5LlNwbGF0KG5ldyB5eS5MaXRlcmFsKCdhcmd1bWVudHMnKSldKTsNCmJyZWFrOw0KY2FzZSAxMDE6dGhpcy4kID0gbmV3IHl5LkNhbGwoJ3N1cGVyJywgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxMDI6dGhpcy4kID0gZmFsc2U7DQpicmVhazsNCmNhc2UgMTAzOnRoaXMuJCA9IHRydWU7DQpicmVhazsNCmNhc2UgMTA0OnRoaXMuJCA9IFtdOw0KYnJlYWs7DQpjYXNlIDEwNTp0aGlzLiQgPSAkJFskMC0yXTsNCmJyZWFrOw0KY2FzZSAxMDY6dGhpcy4kID0gbmV3IHl5LlZhbHVlKG5ldyB5eS5MaXRlcmFsKCd0aGlzJykpOw0KYnJlYWs7DQpjYXNlIDEwNzp0aGlzLiQgPSBuZXcgeXkuVmFsdWUobmV3IHl5LkxpdGVyYWwoJ3RoaXMnKSk7DQpicmVhazsNCmNhc2UgMTA4OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZShuZXcgeXkuTGl0ZXJhbCgndGhpcycpLCBbbmV3IHl5LkFjY2VzcygkJFskMF0pXSwgJ3RoaXMnKTsNCmJyZWFrOw0KY2FzZSAxMDk6dGhpcy4kID0gbmV3IHl5LkFycihbXSk7DQpicmVhazsNCmNhc2UgMTEwOnRoaXMuJCA9IG5ldyB5eS5BcnIoJCRbJDAtMl0pOw0KYnJlYWs7DQpjYXNlIDExMTp0aGlzLiQgPSAnaW5jbHVzaXZlJzsNCmJyZWFrOw0KY2FzZSAxMTI6dGhpcy4kID0gJ2V4Y2x1c2l2ZSc7DQpicmVhazsNCmNhc2UgMTEzOnRoaXMuJCA9IG5ldyB5eS5SYW5nZSgkJFskMC0zXSwgJCRbJDAtMV0sICQkWyQwLTJdKTsNCmJyZWFrOw0KY2FzZSAxMTQ6dGhpcy4kID0gbmV3IHl5LlJhbmdlKCQkWyQwLTJdLCAkJFskMF0sICQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSAxMTU6dGhpcy4kID0gbmV3IHl5LlJhbmdlKCQkWyQwLTFdLCBudWxsLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDExNjp0aGlzLiQgPSBuZXcgeXkuUmFuZ2UobnVsbCwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgMTE3OnRoaXMuJCA9IFskJFskMF1dOw0KYnJlYWs7DQpjYXNlIDExODp0aGlzLiQgPSAkJFskMC0yXS5jb25jYXQoJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxMTk6dGhpcy4kID0gJCRbJDAtM10uY29uY2F0KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTIwOnRoaXMuJCA9ICQkWyQwLTJdOw0KYnJlYWs7DQpjYXNlIDEyMTp0aGlzLiQgPSAkJFskMC01XS5jb25jYXQoJCRbJDAtMl0pOw0KYnJlYWs7DQpjYXNlIDEyMjp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTIzOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxMjQ6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDEyNTp0aGlzLiQgPSBbXS5jb25jYXQoJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTI2OnRoaXMuJCA9IG5ldyB5eS5UcnkoJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxMjc6dGhpcy4kID0gbmV3IHl5LlRyeSgkJFskMC0xXSwgJCRbJDBdWzBdLCAkJFskMF1bMV0pOw0KYnJlYWs7DQpjYXNlIDEyODp0aGlzLiQgPSBuZXcgeXkuVHJ5KCQkWyQwLTJdLCBudWxsLCBudWxsLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDEyOTp0aGlzLiQgPSBuZXcgeXkuVHJ5KCQkWyQwLTNdLCAkJFskMC0yXVswXSwgJCRbJDAtMl1bMV0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTMwOnRoaXMuJCA9IFskJFskMC0xXSwgJCRbJDBdXTsNCmJyZWFrOw0KY2FzZSAxMzE6dGhpcy4kID0gbmV3IHl5LlRocm93KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTMyOnRoaXMuJCA9IG5ldyB5eS5QYXJlbnMoJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDEzMzp0aGlzLiQgPSBuZXcgeXkuUGFyZW5zKCQkWyQwLTJdKTsNCmJyZWFrOw0KY2FzZSAxMzQ6dGhpcy4kID0gbmV3IHl5LldoaWxlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTM1OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMC0yXSwgew0KICAgICAgICAgIGd1YXJkOiAkJFskMF0NCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTM2OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMF0sIHsNCiAgICAgICAgICBpbnZlcnQ6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTM3OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMC0yXSwgew0KICAgICAgICAgIGludmVydDogdHJ1ZSwNCiAgICAgICAgICBndWFyZDogJCRbJDBdDQogICAgICAgIH0pOw0KYnJlYWs7DQpjYXNlIDEzODp0aGlzLiQgPSAkJFskMC0xXS5hZGRCb2R5KCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTM5OnRoaXMuJCA9ICQkWyQwXS5hZGRCb2R5KHl5LkJsb2NrLndyYXAoWyQkWyQwLTFdXSkpOw0KYnJlYWs7DQpjYXNlIDE0MDp0aGlzLiQgPSAkJFskMF0uYWRkQm9keSh5eS5CbG9jay53cmFwKFskJFskMC0xXV0pKTsNCmJyZWFrOw0KY2FzZSAxNDE6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE0Mjp0aGlzLiQgPSBuZXcgeXkuV2hpbGUobmV3IHl5LkxpdGVyYWwoJ3RydWUnKSkuYWRkQm9keSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE0Mzp0aGlzLiQgPSBuZXcgeXkuV2hpbGUobmV3IHl5LkxpdGVyYWwoJ3RydWUnKSkuYWRkQm9keSh5eS5CbG9jay53cmFwKFskJFskMF1dKSk7DQpicmVhazsNCmNhc2UgMTQ0OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDAtMV0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTQ1OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDAtMV0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTQ2OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgMTQ3OnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6IG5ldyB5eS5WYWx1ZSgkJFskMF0pDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTQ4OnRoaXMuJCA9IChmdW5jdGlvbiAoKSB7DQogICAgICAgICQkWyQwXS5vd24gPSAkJFskMC0xXS5vd247DQogICAgICAgICQkWyQwXS5uYW1lID0gJCRbJDAtMV1bMF07DQogICAgICAgICQkWyQwXS5pbmRleCA9ICQkWyQwLTFdWzFdOw0KICAgICAgICByZXR1cm4gJCRbJDBdOw0KICAgICAgfSgpKTsNCmJyZWFrOw0KY2FzZSAxNDk6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE1MDp0aGlzLiQgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgICAkJFskMF0ub3duID0gdHJ1ZTsNCiAgICAgICAgcmV0dXJuICQkWyQwXTsNCiAgICAgIH0oKSk7DQpicmVhazsNCmNhc2UgMTUxOnRoaXMuJCA9ICQkWyQwXTsNCmJyZWFrOw0KY2FzZSAxNTI6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTUzOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE1NDp0aGlzLiQgPSBbJCRbJDBdXTsNCmJyZWFrOw0KY2FzZSAxNTU6dGhpcy4kID0gWyQkWyQwLTJdLCAkJFskMF1dOw0KYnJlYWs7DQpjYXNlIDE1Njp0aGlzLiQgPSB7DQogICAgICAgICAgc291cmNlOiAkJFskMF0NCiAgICAgICAgfTsNCmJyZWFrOw0KY2FzZSAxNTc6dGhpcy4kID0gew0KICAgICAgICAgIHNvdXJjZTogJCRbJDBdLA0KICAgICAgICAgIG9iamVjdDogdHJ1ZQ0KICAgICAgICB9Ow0KYnJlYWs7DQpjYXNlIDE1ODp0aGlzLiQgPSB7DQogICAgICAgICAgc291cmNlOiAkJFskMC0yXSwNCiAgICAgICAgICBndWFyZDogJCRbJDBdDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTU5OnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLA0KICAgICAgICAgIGd1YXJkOiAkJFskMF0sDQogICAgICAgICAgb2JqZWN0OiB0cnVlDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTYwOnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLA0KICAgICAgICAgIHN0ZXA6ICQkWyQwXQ0KICAgICAgICB9Ow0KYnJlYWs7DQpjYXNlIDE2MTp0aGlzLiQgPSB7DQogICAgICAgICAgc291cmNlOiAkJFskMC00XSwNCiAgICAgICAgICBndWFyZDogJCRbJDAtMl0sDQogICAgICAgICAgc3RlcDogJCRbJDBdDQogICAgICAgIH07DQpicmVhazsNCmNhc2UgMTYyOnRoaXMuJCA9IHsNCiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTRdLA0KICAgICAgICAgIHN0ZXA6ICQkWyQwLTJdLA0KICAgICAgICAgIGd1YXJkOiAkJFskMF0NCiAgICAgICAgfTsNCmJyZWFrOw0KY2FzZSAxNjM6dGhpcy4kID0gbmV3IHl5LlN3aXRjaCgkJFskMC0zXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDE2NDp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKCQkWyQwLTVdLCAkJFskMC0zXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDE2NTp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKG51bGwsICQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSAxNjY6dGhpcy4kID0gbmV3IHl5LlN3aXRjaChudWxsLCAkJFskMC0zXSwgJCRbJDAtMV0pOw0KYnJlYWs7DQpjYXNlIDE2Nzp0aGlzLiQgPSAkJFskMF07DQpicmVhazsNCmNhc2UgMTY4OnRoaXMuJCA9ICQkWyQwLTFdLmNvbmNhdCgkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE2OTp0aGlzLiQgPSBbWyQkWyQwLTFdLCAkJFskMF1dXTsNCmJyZWFrOw0KY2FzZSAxNzA6dGhpcy4kID0gW1skJFskMC0yXSwgJCRbJDAtMV1dXTsNCmJyZWFrOw0KY2FzZSAxNzE6dGhpcy4kID0gbmV3IHl5LklmKCQkWyQwLTFdLCAkJFskMF0sIHsNCiAgICAgICAgICB0eXBlOiAkJFskMC0yXQ0KICAgICAgICB9KTsNCmJyZWFrOw0KY2FzZSAxNzI6dGhpcy4kID0gJCRbJDAtNF0uYWRkRWxzZShuZXcgeXkuSWYoJCRbJDAtMV0sICQkWyQwXSwgew0KICAgICAgICAgIHR5cGU6ICQkWyQwLTJdDQogICAgICAgIH0pKTsNCmJyZWFrOw0KY2FzZSAxNzM6dGhpcy4kID0gJCRbJDBdOw0KYnJlYWs7DQpjYXNlIDE3NDp0aGlzLiQgPSAkJFskMC0yXS5hZGRFbHNlKCQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTc1OnRoaXMuJCA9IG5ldyB5eS5JZigkJFskMF0sIHl5LkJsb2NrLndyYXAoWyQkWyQwLTJdXSksIHsNCiAgICAgICAgICB0eXBlOiAkJFskMC0xXSwNCiAgICAgICAgICBzdGF0ZW1lbnQ6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTc2OnRoaXMuJCA9IG5ldyB5eS5JZigkJFskMF0sIHl5LkJsb2NrLndyYXAoWyQkWyQwLTJdXSksIHsNCiAgICAgICAgICB0eXBlOiAkJFskMC0xXSwNCiAgICAgICAgICBzdGF0ZW1lbnQ6IHRydWUNCiAgICAgICAgfSk7DQpicmVhazsNCmNhc2UgMTc3OnRoaXMuJCA9IG5ldyB5eS5PcCgkJFskMC0xXSwgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxNzg6dGhpcy4kID0gbmV3IHl5Lk9wKCctJywgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxNzk6dGhpcy4kID0gbmV3IHl5Lk9wKCcrJywgJCRbJDBdKTsNCmJyZWFrOw0KY2FzZSAxODA6dGhpcy4kID0gbmV3IHl5Lk9wKCctLScsICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTgxOnRoaXMuJCA9IG5ldyB5eS5PcCgnKysnLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4Mjp0aGlzLiQgPSBuZXcgeXkuT3AoJy0tJywgJCRbJDAtMV0sIG51bGwsIHRydWUpOw0KYnJlYWs7DQpjYXNlIDE4Mzp0aGlzLiQgPSBuZXcgeXkuT3AoJysrJywgJCRbJDAtMV0sIG51bGwsIHRydWUpOw0KYnJlYWs7DQpjYXNlIDE4NDp0aGlzLiQgPSBuZXcgeXkuRXhpc3RlbmNlKCQkWyQwLTFdKTsNCmJyZWFrOw0KY2FzZSAxODU6dGhpcy4kID0gbmV3IHl5Lk9wKCcrJywgJCRbJDAtMl0sICQkWyQwXSk7DQpicmVhazsNCmNhc2UgMTg2OnRoaXMuJCA9IG5ldyB5eS5PcCgnLScsICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4Nzp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4ODp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE4OTp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE5MDp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQpjYXNlIDE5MTp0aGlzLiQgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgICBpZiAoJCRbJDAtMV0uY2hhckF0KDApID09PSAnIScpIHsNCiAgICAgICAgICByZXR1cm4gbmV3IHl5Lk9wKCQkWyQwLTFdLnNsaWNlKDEpLCAkJFskMC0yXSwgJCRbJDBdKS5pbnZlcnQoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gbmV3IHl5Lk9wKCQkWyQwLTFdLCAkJFskMC0yXSwgJCRbJDBdKTsNCiAgICAgICAgfQ0KICAgICAgfSgpKTsNCmJyZWFrOw0KY2FzZSAxOTI6dGhpcy4kID0gbmV3IHl5LkFzc2lnbigkJFskMC0yXSwgJCRbJDBdLCAkJFskMC0xXSk7DQpicmVhazsNCmNhc2UgMTkzOnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24oJCRbJDAtNF0sICQkWyQwLTFdLCAkJFskMC0zXSk7DQpicmVhazsNCmNhc2UgMTk0OnRoaXMuJCA9IG5ldyB5eS5FeHRlbmRzKCQkWyQwLTJdLCAkJFskMF0pOw0KYnJlYWs7DQp9DQp9LA0KdGFibGU6IFt7MTpbMiwxXSwzOjEsNDoyLDU6Myw3OjQsODo2LDk6NywxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDVdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlszXX0sezE6WzIsMl0sNjpbMSw3MV19LHs2OlsxLDcyXX0sezE6WzIsNF0sNjpbMiw0XSwyNjpbMiw0XSw5OTpbMiw0XX0sezQ6NzQsNzo0LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNjpbMSw3M10sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsN10sNjpbMiw3XSwyNjpbMiw3XSw5OTpbMiw3XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsOF0sNjpbMiw4XSwyNjpbMiw4XSw5OTpbMiw4XSwxMDA6ODcsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4OCwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODZdfSx7MTpbMiwxM10sNjpbMiwxM10sMjU6WzIsMTNdLDI2OlsyLDEzXSw0NjpbMiwxM10sNTE6WzIsMTNdLDU0OlsyLDEzXSw1OTo5MCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsMTNdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsMTNdLDc4Ojg5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDEzXSw4ODpbMiwxM10sOTA6WzIsMTNdLDk5OlsyLDEzXSwxMDE6WzIsMTNdLDEwMjpbMiwxM10sMTAzOlsyLDEzXSwxMDc6WzIsMTNdLDExNTpbMiwxM10sMTIzOlsyLDEzXSwxMjU6WzIsMTNdLDEyNjpbMiwxM10sMTI5OlsyLDEzXSwxMzA6WzIsMTNdLDEzMTpbMiwxM10sMTMyOlsyLDEzXSwxMzM6WzIsMTNdLDEzNDpbMiwxM119LHsxOlsyLDE0XSw2OlsyLDE0XSwyNTpbMiwxNF0sMjY6WzIsMTRdLDQ2OlsyLDE0XSw1MTpbMiwxNF0sNTQ6WzIsMTRdLDU5OjEwMCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsMTRdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsMTRdLDc4Ojk5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDE0XSw4ODpbMiwxNF0sOTA6WzIsMTRdLDk5OlsyLDE0XSwxMDE6WzIsMTRdLDEwMjpbMiwxNF0sMTAzOlsyLDE0XSwxMDc6WzIsMTRdLDExNTpbMiwxNF0sMTIzOlsyLDE0XSwxMjU6WzIsMTRdLDEyNjpbMiwxNF0sMTI5OlsyLDE0XSwxMzA6WzIsMTRdLDEzMTpbMiwxNF0sMTMyOlsyLDE0XSwxMzM6WzIsMTRdLDEzNDpbMiwxNF19LHsxOlsyLDE1XSw2OlsyLDE1XSwyNTpbMiwxNV0sMjY6WzIsMTVdLDQ2OlsyLDE1XSw1MTpbMiwxNV0sNTQ6WzIsMTVdLDY5OlsyLDE1XSw3NTpbMiwxNV0sODM6WzIsMTVdLDg4OlsyLDE1XSw5MDpbMiwxNV0sOTk6WzIsMTVdLDEwMTpbMiwxNV0sMTAyOlsyLDE1XSwxMDM6WzIsMTVdLDEwNzpbMiwxNV0sMTE1OlsyLDE1XSwxMjM6WzIsMTVdLDEyNTpbMiwxNV0sMTI2OlsyLDE1XSwxMjk6WzIsMTVdLDEzMDpbMiwxNV0sMTMxOlsyLDE1XSwxMzI6WzIsMTVdLDEzMzpbMiwxNV0sMTM0OlsyLDE1XX0sezE6WzIsMTZdLDY6WzIsMTZdLDI1OlsyLDE2XSwyNjpbMiwxNl0sNDY6WzIsMTZdLDUxOlsyLDE2XSw1NDpbMiwxNl0sNjk6WzIsMTZdLDc1OlsyLDE2XSw4MzpbMiwxNl0sODg6WzIsMTZdLDkwOlsyLDE2XSw5OTpbMiwxNl0sMTAxOlsyLDE2XSwxMDI6WzIsMTZdLDEwMzpbMiwxNl0sMTA3OlsyLDE2XSwxMTU6WzIsMTZdLDEyMzpbMiwxNl0sMTI1OlsyLDE2XSwxMjY6WzIsMTZdLDEyOTpbMiwxNl0sMTMwOlsyLDE2XSwxMzE6WzIsMTZdLDEzMjpbMiwxNl0sMTMzOlsyLDE2XSwxMzQ6WzIsMTZdfSx7MTpbMiwxN10sNjpbMiwxN10sMjU6WzIsMTddLDI2OlsyLDE3XSw0NjpbMiwxN10sNTE6WzIsMTddLDU0OlsyLDE3XSw2OTpbMiwxN10sNzU6WzIsMTddLDgzOlsyLDE3XSw4ODpbMiwxN10sOTA6WzIsMTddLDk5OlsyLDE3XSwxMDE6WzIsMTddLDEwMjpbMiwxN10sMTAzOlsyLDE3XSwxMDc6WzIsMTddLDExNTpbMiwxN10sMTIzOlsyLDE3XSwxMjU6WzIsMTddLDEyNjpbMiwxN10sMTI5OlsyLDE3XSwxMzA6WzIsMTddLDEzMTpbMiwxN10sMTMyOlsyLDE3XSwxMzM6WzIsMTddLDEzNDpbMiwxN119LHsxOlsyLDE4XSw2OlsyLDE4XSwyNTpbMiwxOF0sMjY6WzIsMThdLDQ2OlsyLDE4XSw1MTpbMiwxOF0sNTQ6WzIsMThdLDY5OlsyLDE4XSw3NTpbMiwxOF0sODM6WzIsMThdLDg4OlsyLDE4XSw5MDpbMiwxOF0sOTk6WzIsMThdLDEwMTpbMiwxOF0sMTAyOlsyLDE4XSwxMDM6WzIsMThdLDEwNzpbMiwxOF0sMTE1OlsyLDE4XSwxMjM6WzIsMThdLDEyNTpbMiwxOF0sMTI2OlsyLDE4XSwxMjk6WzIsMThdLDEzMDpbMiwxOF0sMTMxOlsyLDE4XSwxMzI6WzIsMThdLDEzMzpbMiwxOF0sMTM0OlsyLDE4XX0sezE6WzIsMTldLDY6WzIsMTldLDI1OlsyLDE5XSwyNjpbMiwxOV0sNDY6WzIsMTldLDUxOlsyLDE5XSw1NDpbMiwxOV0sNjk6WzIsMTldLDc1OlsyLDE5XSw4MzpbMiwxOV0sODg6WzIsMTldLDkwOlsyLDE5XSw5OTpbMiwxOV0sMTAxOlsyLDE5XSwxMDI6WzIsMTldLDEwMzpbMiwxOV0sMTA3OlsyLDE5XSwxMTU6WzIsMTldLDEyMzpbMiwxOV0sMTI1OlsyLDE5XSwxMjY6WzIsMTldLDEyOTpbMiwxOV0sMTMwOlsyLDE5XSwxMzE6WzIsMTldLDEzMjpbMiwxOV0sMTMzOlsyLDE5XSwxMzQ6WzIsMTldfSx7MTpbMiwyMF0sNjpbMiwyMF0sMjU6WzIsMjBdLDI2OlsyLDIwXSw0NjpbMiwyMF0sNTE6WzIsMjBdLDU0OlsyLDIwXSw2OTpbMiwyMF0sNzU6WzIsMjBdLDgzOlsyLDIwXSw4ODpbMiwyMF0sOTA6WzIsMjBdLDk5OlsyLDIwXSwxMDE6WzIsMjBdLDEwMjpbMiwyMF0sMTAzOlsyLDIwXSwxMDc6WzIsMjBdLDExNTpbMiwyMF0sMTIzOlsyLDIwXSwxMjU6WzIsMjBdLDEyNjpbMiwyMF0sMTI5OlsyLDIwXSwxMzA6WzIsMjBdLDEzMTpbMiwyMF0sMTMyOlsyLDIwXSwxMzM6WzIsMjBdLDEzNDpbMiwyMF19LHsxOlsyLDIxXSw2OlsyLDIxXSwyNTpbMiwyMV0sMjY6WzIsMjFdLDQ2OlsyLDIxXSw1MTpbMiwyMV0sNTQ6WzIsMjFdLDY5OlsyLDIxXSw3NTpbMiwyMV0sODM6WzIsMjFdLDg4OlsyLDIxXSw5MDpbMiwyMV0sOTk6WzIsMjFdLDEwMTpbMiwyMV0sMTAyOlsyLDIxXSwxMDM6WzIsMjFdLDEwNzpbMiwyMV0sMTE1OlsyLDIxXSwxMjM6WzIsMjFdLDEyNTpbMiwyMV0sMTI2OlsyLDIxXSwxMjk6WzIsMjFdLDEzMDpbMiwyMV0sMTMxOlsyLDIxXSwxMzI6WzIsMjFdLDEzMzpbMiwyMV0sMTM0OlsyLDIxXX0sezE6WzIsMjJdLDY6WzIsMjJdLDI1OlsyLDIyXSwyNjpbMiwyMl0sNDY6WzIsMjJdLDUxOlsyLDIyXSw1NDpbMiwyMl0sNjk6WzIsMjJdLDc1OlsyLDIyXSw4MzpbMiwyMl0sODg6WzIsMjJdLDkwOlsyLDIyXSw5OTpbMiwyMl0sMTAxOlsyLDIyXSwxMDI6WzIsMjJdLDEwMzpbMiwyMl0sMTA3OlsyLDIyXSwxMTU6WzIsMjJdLDEyMzpbMiwyMl0sMTI1OlsyLDIyXSwxMjY6WzIsMjJdLDEyOTpbMiwyMl0sMTMwOlsyLDIyXSwxMzE6WzIsMjJdLDEzMjpbMiwyMl0sMTMzOlsyLDIyXSwxMzQ6WzIsMjJdfSx7MTpbMiwyM10sNjpbMiwyM10sMjU6WzIsMjNdLDI2OlsyLDIzXSw0NjpbMiwyM10sNTE6WzIsMjNdLDU0OlsyLDIzXSw2OTpbMiwyM10sNzU6WzIsMjNdLDgzOlsyLDIzXSw4ODpbMiwyM10sOTA6WzIsMjNdLDk5OlsyLDIzXSwxMDE6WzIsMjNdLDEwMjpbMiwyM10sMTAzOlsyLDIzXSwxMDc6WzIsMjNdLDExNTpbMiwyM10sMTIzOlsyLDIzXSwxMjU6WzIsMjNdLDEyNjpbMiwyM10sMTI5OlsyLDIzXSwxMzA6WzIsMjNdLDEzMTpbMiwyM10sMTMyOlsyLDIzXSwxMzM6WzIsMjNdLDEzNDpbMiwyM119LHsxOlsyLDldLDY6WzIsOV0sMjY6WzIsOV0sOTk6WzIsOV0sMTAxOlsyLDldLDEwMzpbMiw5XSwxMDc6WzIsOV0sMTIzOlsyLDldfSx7MTpbMiwxMF0sNjpbMiwxMF0sMjY6WzIsMTBdLDk5OlsyLDEwXSwxMDE6WzIsMTBdLDEwMzpbMiwxMF0sMTA3OlsyLDEwXSwxMjM6WzIsMTBdfSx7MTpbMiwxMV0sNjpbMiwxMV0sMjY6WzIsMTFdLDk5OlsyLDExXSwxMDE6WzIsMTFdLDEwMzpbMiwxMV0sMTA3OlsyLDExXSwxMjM6WzIsMTFdfSx7MTpbMiwxMl0sNjpbMiwxMl0sMjY6WzIsMTJdLDk5OlsyLDEyXSwxMDE6WzIsMTJdLDEwMzpbMiwxMl0sMTA3OlsyLDEyXSwxMjM6WzIsMTJdfSx7MTpbMiw2OV0sNjpbMiw2OV0sMjU6WzIsNjldLDI2OlsyLDY5XSwzNzpbMSwxMDFdLDQ2OlsyLDY5XSw1MTpbMiw2OV0sNTQ6WzIsNjldLDYzOlsyLDY5XSw2NDpbMiw2OV0sNjU6WzIsNjldLDY3OlsyLDY5XSw2OTpbMiw2OV0sNzA6WzIsNjldLDcxOlsyLDY5XSw3NTpbMiw2OV0sODE6WzIsNjldLDgyOlsyLDY5XSw4MzpbMiw2OV0sODg6WzIsNjldLDkwOlsyLDY5XSw5OTpbMiw2OV0sMTAxOlsyLDY5XSwxMDI6WzIsNjldLDEwMzpbMiw2OV0sMTA3OlsyLDY5XSwxMTU6WzIsNjldLDEyMzpbMiw2OV0sMTI1OlsyLDY5XSwxMjY6WzIsNjldLDEyOTpbMiw2OV0sMTMwOlsyLDY5XSwxMzE6WzIsNjldLDEzMjpbMiw2OV0sMTMzOlsyLDY5XSwxMzQ6WzIsNjldfSx7MTpbMiw3MF0sNjpbMiw3MF0sMjU6WzIsNzBdLDI2OlsyLDcwXSw0NjpbMiw3MF0sNTE6WzIsNzBdLDU0OlsyLDcwXSw2MzpbMiw3MF0sNjQ6WzIsNzBdLDY1OlsyLDcwXSw2NzpbMiw3MF0sNjk6WzIsNzBdLDcwOlsyLDcwXSw3MTpbMiw3MF0sNzU6WzIsNzBdLDgxOlsyLDcwXSw4MjpbMiw3MF0sODM6WzIsNzBdLDg4OlsyLDcwXSw5MDpbMiw3MF0sOTk6WzIsNzBdLDEwMTpbMiw3MF0sMTAyOlsyLDcwXSwxMDM6WzIsNzBdLDEwNzpbMiw3MF0sMTE1OlsyLDcwXSwxMjM6WzIsNzBdLDEyNTpbMiw3MF0sMTI2OlsyLDcwXSwxMjk6WzIsNzBdLDEzMDpbMiw3MF0sMTMxOlsyLDcwXSwxMzI6WzIsNzBdLDEzMzpbMiw3MF0sMTM0OlsyLDcwXX0sezE6WzIsNzFdLDY6WzIsNzFdLDI1OlsyLDcxXSwyNjpbMiw3MV0sNDY6WzIsNzFdLDUxOlsyLDcxXSw1NDpbMiw3MV0sNjM6WzIsNzFdLDY0OlsyLDcxXSw2NTpbMiw3MV0sNjc6WzIsNzFdLDY5OlsyLDcxXSw3MDpbMiw3MV0sNzE6WzIsNzFdLDc1OlsyLDcxXSw4MTpbMiw3MV0sODI6WzIsNzFdLDgzOlsyLDcxXSw4ODpbMiw3MV0sOTA6WzIsNzFdLDk5OlsyLDcxXSwxMDE6WzIsNzFdLDEwMjpbMiw3MV0sMTAzOlsyLDcxXSwxMDc6WzIsNzFdLDExNTpbMiw3MV0sMTIzOlsyLDcxXSwxMjU6WzIsNzFdLDEyNjpbMiw3MV0sMTI5OlsyLDcxXSwxMzA6WzIsNzFdLDEzMTpbMiw3MV0sMTMyOlsyLDcxXSwxMzM6WzIsNzFdLDEzNDpbMiw3MV19LHsxOlsyLDcyXSw2OlsyLDcyXSwyNTpbMiw3Ml0sMjY6WzIsNzJdLDQ2OlsyLDcyXSw1MTpbMiw3Ml0sNTQ6WzIsNzJdLDYzOlsyLDcyXSw2NDpbMiw3Ml0sNjU6WzIsNzJdLDY3OlsyLDcyXSw2OTpbMiw3Ml0sNzA6WzIsNzJdLDcxOlsyLDcyXSw3NTpbMiw3Ml0sODE6WzIsNzJdLDgyOlsyLDcyXSw4MzpbMiw3Ml0sODg6WzIsNzJdLDkwOlsyLDcyXSw5OTpbMiw3Ml0sMTAxOlsyLDcyXSwxMDI6WzIsNzJdLDEwMzpbMiw3Ml0sMTA3OlsyLDcyXSwxMTU6WzIsNzJdLDEyMzpbMiw3Ml0sMTI1OlsyLDcyXSwxMjY6WzIsNzJdLDEyOTpbMiw3Ml0sMTMwOlsyLDcyXSwxMzE6WzIsNzJdLDEzMjpbMiw3Ml0sMTMzOlsyLDcyXSwxMzQ6WzIsNzJdfSx7MTpbMiw3M10sNjpbMiw3M10sMjU6WzIsNzNdLDI2OlsyLDczXSw0NjpbMiw3M10sNTE6WzIsNzNdLDU0OlsyLDczXSw2MzpbMiw3M10sNjQ6WzIsNzNdLDY1OlsyLDczXSw2NzpbMiw3M10sNjk6WzIsNzNdLDcwOlsyLDczXSw3MTpbMiw3M10sNzU6WzIsNzNdLDgxOlsyLDczXSw4MjpbMiw3M10sODM6WzIsNzNdLDg4OlsyLDczXSw5MDpbMiw3M10sOTk6WzIsNzNdLDEwMTpbMiw3M10sMTAyOlsyLDczXSwxMDM6WzIsNzNdLDEwNzpbMiw3M10sMTE1OlsyLDczXSwxMjM6WzIsNzNdLDEyNTpbMiw3M10sMTI2OlsyLDczXSwxMjk6WzIsNzNdLDEzMDpbMiw3M10sMTMxOlsyLDczXSwxMzI6WzIsNzNdLDEzMzpbMiw3M10sMTM0OlsyLDczXX0sezE6WzIsMTAwXSw2OlsyLDEwMF0sMjU6WzIsMTAwXSwyNjpbMiwxMDBdLDQ2OlsyLDEwMF0sNTE6WzIsMTAwXSw1NDpbMiwxMDBdLDYzOlsyLDEwMF0sNjQ6WzIsMTAwXSw2NTpbMiwxMDBdLDY3OlsyLDEwMF0sNjk6WzIsMTAwXSw3MDpbMiwxMDBdLDcxOlsyLDEwMF0sNzU6WzIsMTAwXSw3OToxMDIsODE6WzIsMTAwXSw4MjpbMSwxMDNdLDgzOlsyLDEwMF0sODg6WzIsMTAwXSw5MDpbMiwxMDBdLDk5OlsyLDEwMF0sMTAxOlsyLDEwMF0sMTAyOlsyLDEwMF0sMTAzOlsyLDEwMF0sMTA3OlsyLDEwMF0sMTE1OlsyLDEwMF0sMTIzOlsyLDEwMF0sMTI1OlsyLDEwMF0sMTI2OlsyLDEwMF0sMTI5OlsyLDEwMF0sMTMwOlsyLDEwMF0sMTMxOlsyLDEwMF0sMTMyOlsyLDEwMF0sMTMzOlsyLDEwMF0sMTM0OlsyLDEwMF19LHsyNzoxMDcsMjg6WzEsNzBdLDQxOjEwOCw0NToxMDQsNDY6WzIsNTFdLDUxOlsyLDUxXSw1MjoxMDUsNTM6MTA2LDU1OjEwOSw1NjoxMTAsNzM6WzEsNjddLDg2OlsxLDExMV0sODc6WzEsMTEyXX0sezU6MTEzLDI1OlsxLDVdfSx7ODoxMTQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxMTYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxMTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTQ6MTE5LDE1OjEyMCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNTU6NDcsNTY6NDgsNTg6MTE4LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTg6WzEsNTNdfSx7MTQ6MTE5LDE1OjEyMCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNTU6NDcsNTY6NDgsNTg6MTIyLDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTg6WzEsNTNdfSx7MTpbMiw2Nl0sNjpbMiw2Nl0sMjU6WzIsNjZdLDI2OlsyLDY2XSwzNzpbMiw2Nl0sNDY6WzIsNjZdLDUxOlsyLDY2XSw1NDpbMiw2Nl0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDY2XSw3MDpbMiw2Nl0sNzE6WzIsNjZdLDc1OlsyLDY2XSw3NzpbMSwxMjZdLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsNjZdLDg4OlsyLDY2XSw5MDpbMiw2Nl0sOTk6WzIsNjZdLDEwMTpbMiw2Nl0sMTAyOlsyLDY2XSwxMDM6WzIsNjZdLDEwNzpbMiw2Nl0sMTE1OlsyLDY2XSwxMjM6WzIsNjZdLDEyNTpbMiw2Nl0sMTI2OlsyLDY2XSwxMjc6WzEsMTIzXSwxMjg6WzEsMTI0XSwxMjk6WzIsNjZdLDEzMDpbMiw2Nl0sMTMxOlsyLDY2XSwxMzI6WzIsNjZdLDEzMzpbMiw2Nl0sMTM0OlsyLDY2XSwxMzU6WzEsMTI1XX0sezE6WzIsMTczXSw2OlsyLDE3M10sMjU6WzIsMTczXSwyNjpbMiwxNzNdLDQ2OlsyLDE3M10sNTE6WzIsMTczXSw1NDpbMiwxNzNdLDY5OlsyLDE3M10sNzU6WzIsMTczXSw4MzpbMiwxNzNdLDg4OlsyLDE3M10sOTA6WzIsMTczXSw5OTpbMiwxNzNdLDEwMTpbMiwxNzNdLDEwMjpbMiwxNzNdLDEwMzpbMiwxNzNdLDEwNzpbMiwxNzNdLDExNTpbMiwxNzNdLDExODpbMSwxMjddLDEyMzpbMiwxNzNdLDEyNTpbMiwxNzNdLDEyNjpbMiwxNzNdLDEyOTpbMiwxNzNdLDEzMDpbMiwxNzNdLDEzMTpbMiwxNzNdLDEzMjpbMiwxNzNdLDEzMzpbMiwxNzNdLDEzNDpbMiwxNzNdfSx7NToxMjgsMjU6WzEsNV19LHs1OjEyOSwyNTpbMSw1XX0sezE6WzIsMTQxXSw2OlsyLDE0MV0sMjU6WzIsMTQxXSwyNjpbMiwxNDFdLDQ2OlsyLDE0MV0sNTE6WzIsMTQxXSw1NDpbMiwxNDFdLDY5OlsyLDE0MV0sNzU6WzIsMTQxXSw4MzpbMiwxNDFdLDg4OlsyLDE0MV0sOTA6WzIsMTQxXSw5OTpbMiwxNDFdLDEwMTpbMiwxNDFdLDEwMjpbMiwxNDFdLDEwMzpbMiwxNDFdLDEwNzpbMiwxNDFdLDExNTpbMiwxNDFdLDEyMzpbMiwxNDFdLDEyNTpbMiwxNDFdLDEyNjpbMiwxNDFdLDEyOTpbMiwxNDFdLDEzMDpbMiwxNDFdLDEzMTpbMiwxNDFdLDEzMjpbMiwxNDFdLDEzMzpbMiwxNDFdLDEzNDpbMiwxNDFdfSx7NToxMzAsMjU6WzEsNV19LHs4OjEzMSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDEzMl0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsOTBdLDU6MTMzLDY6WzIsOTBdLDE0OjExOSwxNToxMjAsMjU6WzEsNV0sMjY6WzIsOTBdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjEyMSw0MTo2MCw0NjpbMiw5MF0sNTE6WzIsOTBdLDU0OlsyLDkwXSw1NTo0Nyw1Njo0OCw1ODoxMzUsNjA6MjUsNjE6MjYsNjI6MjcsNjk6WzIsOTBdLDczOlsxLDY3XSw3NTpbMiw5MF0sNzc6WzEsMTM0XSw4MDpbMSwyOF0sODM6WzIsOTBdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDg4OlsyLDkwXSw5MDpbMiw5MF0sOTg6WzEsNTNdLDk5OlsyLDkwXSwxMDE6WzIsOTBdLDEwMjpbMiw5MF0sMTAzOlsyLDkwXSwxMDc6WzIsOTBdLDExNTpbMiw5MF0sMTIzOlsyLDkwXSwxMjU6WzIsOTBdLDEyNjpbMiw5MF0sMTI5OlsyLDkwXSwxMzA6WzIsOTBdLDEzMTpbMiw5MF0sMTMyOlsyLDkwXSwxMzM6WzIsOTBdLDEzNDpbMiw5MF19LHsxOlsyLDQzXSw2OlsyLDQzXSw4OjEzNiw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI2OlsyLDQzXSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDk5OlsyLDQzXSwxMDA6MzksMTAxOlsyLDQzXSwxMDM6WzIsNDNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzIsNDNdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyMzpbMiw0M10sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxMzcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiw0NF0sNjpbMiw0NF0sMjU6WzIsNDRdLDI2OlsyLDQ0XSw1MTpbMiw0NF0sNzU6WzIsNDRdLDk5OlsyLDQ0XSwxMDE6WzIsNDRdLDEwMzpbMiw0NF0sMTA3OlsyLDQ0XSwxMjM6WzIsNDRdfSx7MTpbMiw2N10sNjpbMiw2N10sMjU6WzIsNjddLDI2OlsyLDY3XSwzNzpbMiw2N10sNDY6WzIsNjddLDUxOlsyLDY3XSw1NDpbMiw2N10sNjM6WzIsNjddLDY0OlsyLDY3XSw2NTpbMiw2N10sNjc6WzIsNjddLDY5OlsyLDY3XSw3MDpbMiw2N10sNzE6WzIsNjddLDc1OlsyLDY3XSw4MTpbMiw2N10sODI6WzIsNjddLDgzOlsyLDY3XSw4ODpbMiw2N10sOTA6WzIsNjddLDk5OlsyLDY3XSwxMDE6WzIsNjddLDEwMjpbMiw2N10sMTAzOlsyLDY3XSwxMDc6WzIsNjddLDExNTpbMiw2N10sMTIzOlsyLDY3XSwxMjU6WzIsNjddLDEyNjpbMiw2N10sMTI5OlsyLDY3XSwxMzA6WzIsNjddLDEzMTpbMiw2N10sMTMyOlsyLDY3XSwxMzM6WzIsNjddLDEzNDpbMiw2N119LHsxOlsyLDY4XSw2OlsyLDY4XSwyNTpbMiw2OF0sMjY6WzIsNjhdLDM3OlsyLDY4XSw0NjpbMiw2OF0sNTE6WzIsNjhdLDU0OlsyLDY4XSw2MzpbMiw2OF0sNjQ6WzIsNjhdLDY1OlsyLDY4XSw2NzpbMiw2OF0sNjk6WzIsNjhdLDcwOlsyLDY4XSw3MTpbMiw2OF0sNzU6WzIsNjhdLDgxOlsyLDY4XSw4MjpbMiw2OF0sODM6WzIsNjhdLDg4OlsyLDY4XSw5MDpbMiw2OF0sOTk6WzIsNjhdLDEwMTpbMiw2OF0sMTAyOlsyLDY4XSwxMDM6WzIsNjhdLDEwNzpbMiw2OF0sMTE1OlsyLDY4XSwxMjM6WzIsNjhdLDEyNTpbMiw2OF0sMTI2OlsyLDY4XSwxMjk6WzIsNjhdLDEzMDpbMiw2OF0sMTMxOlsyLDY4XSwxMzI6WzIsNjhdLDEzMzpbMiw2OF0sMTM0OlsyLDY4XX0sezE6WzIsMjldLDY6WzIsMjldLDI1OlsyLDI5XSwyNjpbMiwyOV0sNDY6WzIsMjldLDUxOlsyLDI5XSw1NDpbMiwyOV0sNjM6WzIsMjldLDY0OlsyLDI5XSw2NTpbMiwyOV0sNjc6WzIsMjldLDY5OlsyLDI5XSw3MDpbMiwyOV0sNzE6WzIsMjldLDc1OlsyLDI5XSw4MTpbMiwyOV0sODI6WzIsMjldLDgzOlsyLDI5XSw4ODpbMiwyOV0sOTA6WzIsMjldLDk5OlsyLDI5XSwxMDE6WzIsMjldLDEwMjpbMiwyOV0sMTAzOlsyLDI5XSwxMDc6WzIsMjldLDExNTpbMiwyOV0sMTIzOlsyLDI5XSwxMjU6WzIsMjldLDEyNjpbMiwyOV0sMTI5OlsyLDI5XSwxMzA6WzIsMjldLDEzMTpbMiwyOV0sMTMyOlsyLDI5XSwxMzM6WzIsMjldLDEzNDpbMiwyOV19LHsxOlsyLDMwXSw2OlsyLDMwXSwyNTpbMiwzMF0sMjY6WzIsMzBdLDQ2OlsyLDMwXSw1MTpbMiwzMF0sNTQ6WzIsMzBdLDYzOlsyLDMwXSw2NDpbMiwzMF0sNjU6WzIsMzBdLDY3OlsyLDMwXSw2OTpbMiwzMF0sNzA6WzIsMzBdLDcxOlsyLDMwXSw3NTpbMiwzMF0sODE6WzIsMzBdLDgyOlsyLDMwXSw4MzpbMiwzMF0sODg6WzIsMzBdLDkwOlsyLDMwXSw5OTpbMiwzMF0sMTAxOlsyLDMwXSwxMDI6WzIsMzBdLDEwMzpbMiwzMF0sMTA3OlsyLDMwXSwxMTU6WzIsMzBdLDEyMzpbMiwzMF0sMTI1OlsyLDMwXSwxMjY6WzIsMzBdLDEyOTpbMiwzMF0sMTMwOlsyLDMwXSwxMzE6WzIsMzBdLDEzMjpbMiwzMF0sMTMzOlsyLDMwXSwxMzQ6WzIsMzBdfSx7MTpbMiwzMV0sNjpbMiwzMV0sMjU6WzIsMzFdLDI2OlsyLDMxXSw0NjpbMiwzMV0sNTE6WzIsMzFdLDU0OlsyLDMxXSw2MzpbMiwzMV0sNjQ6WzIsMzFdLDY1OlsyLDMxXSw2NzpbMiwzMV0sNjk6WzIsMzFdLDcwOlsyLDMxXSw3MTpbMiwzMV0sNzU6WzIsMzFdLDgxOlsyLDMxXSw4MjpbMiwzMV0sODM6WzIsMzFdLDg4OlsyLDMxXSw5MDpbMiwzMV0sOTk6WzIsMzFdLDEwMTpbMiwzMV0sMTAyOlsyLDMxXSwxMDM6WzIsMzFdLDEwNzpbMiwzMV0sMTE1OlsyLDMxXSwxMjM6WzIsMzFdLDEyNTpbMiwzMV0sMTI2OlsyLDMxXSwxMjk6WzIsMzFdLDEzMDpbMiwzMV0sMTMxOlsyLDMxXSwxMzI6WzIsMzFdLDEzMzpbMiwzMV0sMTM0OlsyLDMxXX0sezE6WzIsMzJdLDY6WzIsMzJdLDI1OlsyLDMyXSwyNjpbMiwzMl0sNDY6WzIsMzJdLDUxOlsyLDMyXSw1NDpbMiwzMl0sNjM6WzIsMzJdLDY0OlsyLDMyXSw2NTpbMiwzMl0sNjc6WzIsMzJdLDY5OlsyLDMyXSw3MDpbMiwzMl0sNzE6WzIsMzJdLDc1OlsyLDMyXSw4MTpbMiwzMl0sODI6WzIsMzJdLDgzOlsyLDMyXSw4ODpbMiwzMl0sOTA6WzIsMzJdLDk5OlsyLDMyXSwxMDE6WzIsMzJdLDEwMjpbMiwzMl0sMTAzOlsyLDMyXSwxMDc6WzIsMzJdLDExNTpbMiwzMl0sMTIzOlsyLDMyXSwxMjU6WzIsMzJdLDEyNjpbMiwzMl0sMTI5OlsyLDMyXSwxMzA6WzIsMzJdLDEzMTpbMiwzMl0sMTMyOlsyLDMyXSwxMzM6WzIsMzJdLDEzNDpbMiwzMl19LHs0OjEzOCw3OjQsODo2LDk6NywxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDEzOV0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTQwLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoxNDIsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sODg6WzEsMTQxXSw5MToxNDMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEwNl0sNjpbMiwxMDZdLDI1OlsyLDEwNl0sMjY6WzIsMTA2XSw0NjpbMiwxMDZdLDUxOlsyLDEwNl0sNTQ6WzIsMTA2XSw2MzpbMiwxMDZdLDY0OlsyLDEwNl0sNjU6WzIsMTA2XSw2NzpbMiwxMDZdLDY5OlsyLDEwNl0sNzA6WzIsMTA2XSw3MTpbMiwxMDZdLDc1OlsyLDEwNl0sODE6WzIsMTA2XSw4MjpbMiwxMDZdLDgzOlsyLDEwNl0sODg6WzIsMTA2XSw5MDpbMiwxMDZdLDk5OlsyLDEwNl0sMTAxOlsyLDEwNl0sMTAyOlsyLDEwNl0sMTAzOlsyLDEwNl0sMTA3OlsyLDEwNl0sMTE1OlsyLDEwNl0sMTIzOlsyLDEwNl0sMTI1OlsyLDEwNl0sMTI2OlsyLDEwNl0sMTI5OlsyLDEwNl0sMTMwOlsyLDEwNl0sMTMxOlsyLDEwNl0sMTMyOlsyLDEwNl0sMTMzOlsyLDEwNl0sMTM0OlsyLDEwNl19LHsxOlsyLDEwN10sNjpbMiwxMDddLDI1OlsyLDEwN10sMjY6WzIsMTA3XSwyNzoxNDYsMjg6WzEsNzBdLDQ2OlsyLDEwN10sNTE6WzIsMTA3XSw1NDpbMiwxMDddLDYzOlsyLDEwN10sNjQ6WzIsMTA3XSw2NTpbMiwxMDddLDY3OlsyLDEwN10sNjk6WzIsMTA3XSw3MDpbMiwxMDddLDcxOlsyLDEwN10sNzU6WzIsMTA3XSw4MTpbMiwxMDddLDgyOlsyLDEwN10sODM6WzIsMTA3XSw4ODpbMiwxMDddLDkwOlsyLDEwN10sOTk6WzIsMTA3XSwxMDE6WzIsMTA3XSwxMDI6WzIsMTA3XSwxMDM6WzIsMTA3XSwxMDc6WzIsMTA3XSwxMTU6WzIsMTA3XSwxMjM6WzIsMTA3XSwxMjU6WzIsMTA3XSwxMjY6WzIsMTA3XSwxMjk6WzIsMTA3XSwxMzA6WzIsMTA3XSwxMzE6WzIsMTA3XSwxMzI6WzIsMTA3XSwxMzM6WzIsMTA3XSwxMzQ6WzIsMTA3XX0sezI1OlsyLDQ3XX0sezI1OlsyLDQ4XX0sezE6WzIsNjJdLDY6WzIsNjJdLDI1OlsyLDYyXSwyNjpbMiw2Ml0sMzc6WzIsNjJdLDQ2OlsyLDYyXSw1MTpbMiw2Ml0sNTQ6WzIsNjJdLDYzOlsyLDYyXSw2NDpbMiw2Ml0sNjU6WzIsNjJdLDY3OlsyLDYyXSw2OTpbMiw2Ml0sNzA6WzIsNjJdLDcxOlsyLDYyXSw3NTpbMiw2Ml0sNzc6WzIsNjJdLDgxOlsyLDYyXSw4MjpbMiw2Ml0sODM6WzIsNjJdLDg4OlsyLDYyXSw5MDpbMiw2Ml0sOTk6WzIsNjJdLDEwMTpbMiw2Ml0sMTAyOlsyLDYyXSwxMDM6WzIsNjJdLDEwNzpbMiw2Ml0sMTE1OlsyLDYyXSwxMjM6WzIsNjJdLDEyNTpbMiw2Ml0sMTI2OlsyLDYyXSwxMjc6WzIsNjJdLDEyODpbMiw2Ml0sMTI5OlsyLDYyXSwxMzA6WzIsNjJdLDEzMTpbMiw2Ml0sMTMyOlsyLDYyXSwxMzM6WzIsNjJdLDEzNDpbMiw2Ml0sMTM1OlsyLDYyXX0sezE6WzIsNjVdLDY6WzIsNjVdLDI1OlsyLDY1XSwyNjpbMiw2NV0sMzc6WzIsNjVdLDQ2OlsyLDY1XSw1MTpbMiw2NV0sNTQ6WzIsNjVdLDYzOlsyLDY1XSw2NDpbMiw2NV0sNjU6WzIsNjVdLDY3OlsyLDY1XSw2OTpbMiw2NV0sNzA6WzIsNjVdLDcxOlsyLDY1XSw3NTpbMiw2NV0sNzc6WzIsNjVdLDgxOlsyLDY1XSw4MjpbMiw2NV0sODM6WzIsNjVdLDg4OlsyLDY1XSw5MDpbMiw2NV0sOTk6WzIsNjVdLDEwMTpbMiw2NV0sMTAyOlsyLDY1XSwxMDM6WzIsNjVdLDEwNzpbMiw2NV0sMTE1OlsyLDY1XSwxMjM6WzIsNjVdLDEyNTpbMiw2NV0sMTI2OlsyLDY1XSwxMjc6WzIsNjVdLDEyODpbMiw2NV0sMTI5OlsyLDY1XSwxMzA6WzIsNjVdLDEzMTpbMiw2NV0sMTMyOlsyLDY1XSwxMzM6WzIsNjVdLDEzNDpbMiw2NV0sMTM1OlsyLDY1XX0sezg6MTQ3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTQ4LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTQ5LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezU6MTUwLDg6MTUxLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsNV0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezI3OjE1NiwyODpbMSw3MF0sNTU6MTU3LDU2OjE1OCw2MToxNTIsNzM6WzEsNjddLDg3OlsxLDU0XSwxMTA6MTUzLDExMTpbMSwxNTRdLDExMjoxNTV9LHsxMDk6MTU5LDExMzpbMSwxNjBdLDExNDpbMSwxNjFdfSx7NjpbMiw4NV0sMTI6MTY1LDI1OlsyLDg1XSwyNzoxNjYsMjg6WzEsNzBdLDI5OjE2NywzMDpbMSw2OF0sMzE6WzEsNjldLDM4OjE2MywzOToxNjQsNDE6MTY4LDQzOlsxLDQ2XSw1MTpbMiw4NV0sNzQ6MTYyLDc1OlsyLDg1XSw4NjpbMSwxMTFdfSx7MTpbMiwyN10sNjpbMiwyN10sMjU6WzIsMjddLDI2OlsyLDI3XSw0MDpbMiwyN10sNDY6WzIsMjddLDUxOlsyLDI3XSw1NDpbMiwyN10sNjM6WzIsMjddLDY0OlsyLDI3XSw2NTpbMiwyN10sNjc6WzIsMjddLDY5OlsyLDI3XSw3MDpbMiwyN10sNzE6WzIsMjddLDc1OlsyLDI3XSw4MTpbMiwyN10sODI6WzIsMjddLDgzOlsyLDI3XSw4ODpbMiwyN10sOTA6WzIsMjddLDk5OlsyLDI3XSwxMDE6WzIsMjddLDEwMjpbMiwyN10sMTAzOlsyLDI3XSwxMDc6WzIsMjddLDExNTpbMiwyN10sMTIzOlsyLDI3XSwxMjU6WzIsMjddLDEyNjpbMiwyN10sMTI5OlsyLDI3XSwxMzA6WzIsMjddLDEzMTpbMiwyN10sMTMyOlsyLDI3XSwxMzM6WzIsMjddLDEzNDpbMiwyN119LHsxOlsyLDI4XSw2OlsyLDI4XSwyNTpbMiwyOF0sMjY6WzIsMjhdLDQwOlsyLDI4XSw0NjpbMiwyOF0sNTE6WzIsMjhdLDU0OlsyLDI4XSw2MzpbMiwyOF0sNjQ6WzIsMjhdLDY1OlsyLDI4XSw2NzpbMiwyOF0sNjk6WzIsMjhdLDcwOlsyLDI4XSw3MTpbMiwyOF0sNzU6WzIsMjhdLDgxOlsyLDI4XSw4MjpbMiwyOF0sODM6WzIsMjhdLDg4OlsyLDI4XSw5MDpbMiwyOF0sOTk6WzIsMjhdLDEwMTpbMiwyOF0sMTAyOlsyLDI4XSwxMDM6WzIsMjhdLDEwNzpbMiwyOF0sMTE1OlsyLDI4XSwxMjM6WzIsMjhdLDEyNTpbMiwyOF0sMTI2OlsyLDI4XSwxMjk6WzIsMjhdLDEzMDpbMiwyOF0sMTMxOlsyLDI4XSwxMzI6WzIsMjhdLDEzMzpbMiwyOF0sMTM0OlsyLDI4XX0sezE6WzIsMjZdLDY6WzIsMjZdLDI1OlsyLDI2XSwyNjpbMiwyNl0sMzc6WzIsMjZdLDQwOlsyLDI2XSw0NjpbMiwyNl0sNTE6WzIsMjZdLDU0OlsyLDI2XSw2MzpbMiwyNl0sNjQ6WzIsMjZdLDY1OlsyLDI2XSw2NzpbMiwyNl0sNjk6WzIsMjZdLDcwOlsyLDI2XSw3MTpbMiwyNl0sNzU6WzIsMjZdLDc3OlsyLDI2XSw4MTpbMiwyNl0sODI6WzIsMjZdLDgzOlsyLDI2XSw4ODpbMiwyNl0sOTA6WzIsMjZdLDk5OlsyLDI2XSwxMDE6WzIsMjZdLDEwMjpbMiwyNl0sMTAzOlsyLDI2XSwxMDc6WzIsMjZdLDExMzpbMiwyNl0sMTE0OlsyLDI2XSwxMTU6WzIsMjZdLDEyMzpbMiwyNl0sMTI1OlsyLDI2XSwxMjY6WzIsMjZdLDEyNzpbMiwyNl0sMTI4OlsyLDI2XSwxMjk6WzIsMjZdLDEzMDpbMiwyNl0sMTMxOlsyLDI2XSwxMzI6WzIsMjZdLDEzMzpbMiwyNl0sMTM0OlsyLDI2XSwxMzU6WzIsMjZdfSx7MTpbMiw2XSw2OlsyLDZdLDc6MTY5LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNjpbMiw2XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDk5OlsyLDZdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwzXX0sezE6WzIsMjRdLDY6WzIsMjRdLDI1OlsyLDI0XSwyNjpbMiwyNF0sNDY6WzIsMjRdLDUxOlsyLDI0XSw1NDpbMiwyNF0sNjk6WzIsMjRdLDc1OlsyLDI0XSw4MzpbMiwyNF0sODg6WzIsMjRdLDkwOlsyLDI0XSw5NTpbMiwyNF0sOTY6WzIsMjRdLDk5OlsyLDI0XSwxMDE6WzIsMjRdLDEwMjpbMiwyNF0sMTAzOlsyLDI0XSwxMDc6WzIsMjRdLDExNTpbMiwyNF0sMTE4OlsyLDI0XSwxMjA6WzIsMjRdLDEyMzpbMiwyNF0sMTI1OlsyLDI0XSwxMjY6WzIsMjRdLDEyOTpbMiwyNF0sMTMwOlsyLDI0XSwxMzE6WzIsMjRdLDEzMjpbMiwyNF0sMTMzOlsyLDI0XSwxMzQ6WzIsMjRdfSx7NjpbMSw3MV0sMjY6WzEsMTcwXX0sezE6WzIsMTg0XSw2OlsyLDE4NF0sMjU6WzIsMTg0XSwyNjpbMiwxODRdLDQ2OlsyLDE4NF0sNTE6WzIsMTg0XSw1NDpbMiwxODRdLDY5OlsyLDE4NF0sNzU6WzIsMTg0XSw4MzpbMiwxODRdLDg4OlsyLDE4NF0sOTA6WzIsMTg0XSw5OTpbMiwxODRdLDEwMTpbMiwxODRdLDEwMjpbMiwxODRdLDEwMzpbMiwxODRdLDEwNzpbMiwxODRdLDExNTpbMiwxODRdLDEyMzpbMiwxODRdLDEyNTpbMiwxODRdLDEyNjpbMiwxODRdLDEyOTpbMiwxODRdLDEzMDpbMiwxODRdLDEzMTpbMiwxODRdLDEzMjpbMiwxODRdLDEzMzpbMiwxODRdLDEzNDpbMiwxODRdfSx7ODoxNzEsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzIsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzMsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzUsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoxNzgsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxNDBdLDY6WzIsMTQwXSwyNTpbMiwxNDBdLDI2OlsyLDE0MF0sNDY6WzIsMTQwXSw1MTpbMiwxNDBdLDU0OlsyLDE0MF0sNjk6WzIsMTQwXSw3NTpbMiwxNDBdLDgzOlsyLDE0MF0sODg6WzIsMTQwXSw5MDpbMiwxNDBdLDk5OlsyLDE0MF0sMTAxOlsyLDE0MF0sMTAyOlsyLDE0MF0sMTAzOlsyLDE0MF0sMTA3OlsyLDE0MF0sMTE1OlsyLDE0MF0sMTIzOlsyLDE0MF0sMTI1OlsyLDE0MF0sMTI2OlsyLDE0MF0sMTI5OlsyLDE0MF0sMTMwOlsyLDE0MF0sMTMxOlsyLDE0MF0sMTMyOlsyLDE0MF0sMTMzOlsyLDE0MF0sMTM0OlsyLDE0MF19LHsxOlsyLDE0NV0sNjpbMiwxNDVdLDI1OlsyLDE0NV0sMjY6WzIsMTQ1XSw0NjpbMiwxNDVdLDUxOlsyLDE0NV0sNTQ6WzIsMTQ1XSw2OTpbMiwxNDVdLDc1OlsyLDE0NV0sODM6WzIsMTQ1XSw4ODpbMiwxNDVdLDkwOlsyLDE0NV0sOTk6WzIsMTQ1XSwxMDE6WzIsMTQ1XSwxMDI6WzIsMTQ1XSwxMDM6WzIsMTQ1XSwxMDc6WzIsMTQ1XSwxMTU6WzIsMTQ1XSwxMjM6WzIsMTQ1XSwxMjU6WzIsMTQ1XSwxMjY6WzIsMTQ1XSwxMjk6WzIsMTQ1XSwxMzA6WzIsMTQ1XSwxMzE6WzIsMTQ1XSwxMzI6WzIsMTQ1XSwxMzM6WzIsMTQ1XSwxMzQ6WzIsMTQ1XX0sezg6MTc5LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsMTM5XSw2OlsyLDEzOV0sMjU6WzIsMTM5XSwyNjpbMiwxMzldLDQ2OlsyLDEzOV0sNTE6WzIsMTM5XSw1NDpbMiwxMzldLDY5OlsyLDEzOV0sNzU6WzIsMTM5XSw4MzpbMiwxMzldLDg4OlsyLDEzOV0sOTA6WzIsMTM5XSw5OTpbMiwxMzldLDEwMTpbMiwxMzldLDEwMjpbMiwxMzldLDEwMzpbMiwxMzldLDEwNzpbMiwxMzldLDExNTpbMiwxMzldLDEyMzpbMiwxMzldLDEyNTpbMiwxMzldLDEyNjpbMiwxMzldLDEyOTpbMiwxMzldLDEzMDpbMiwxMzldLDEzMTpbMiwxMzldLDEzMjpbMiwxMzldLDEzMzpbMiwxMzldLDEzNDpbMiwxMzldfSx7MTpbMiwxNDRdLDY6WzIsMTQ0XSwyNTpbMiwxNDRdLDI2OlsyLDE0NF0sNDY6WzIsMTQ0XSw1MTpbMiwxNDRdLDU0OlsyLDE0NF0sNjk6WzIsMTQ0XSw3NTpbMiwxNDRdLDgzOlsyLDE0NF0sODg6WzIsMTQ0XSw5MDpbMiwxNDRdLDk5OlsyLDE0NF0sMTAxOlsyLDE0NF0sMTAyOlsyLDE0NF0sMTAzOlsyLDE0NF0sMTA3OlsyLDE0NF0sMTE1OlsyLDE0NF0sMTIzOlsyLDE0NF0sMTI1OlsyLDE0NF0sMTI2OlsyLDE0NF0sMTI5OlsyLDE0NF0sMTMwOlsyLDE0NF0sMTMxOlsyLDE0NF0sMTMyOlsyLDE0NF0sMTMzOlsyLDE0NF0sMTM0OlsyLDE0NF19LHs3OToxODAsODI6WzEsMTAzXX0sezE6WzIsNjNdLDY6WzIsNjNdLDI1OlsyLDYzXSwyNjpbMiw2M10sMzc6WzIsNjNdLDQ2OlsyLDYzXSw1MTpbMiw2M10sNTQ6WzIsNjNdLDYzOlsyLDYzXSw2NDpbMiw2M10sNjU6WzIsNjNdLDY3OlsyLDYzXSw2OTpbMiw2M10sNzA6WzIsNjNdLDcxOlsyLDYzXSw3NTpbMiw2M10sNzc6WzIsNjNdLDgxOlsyLDYzXSw4MjpbMiw2M10sODM6WzIsNjNdLDg4OlsyLDYzXSw5MDpbMiw2M10sOTk6WzIsNjNdLDEwMTpbMiw2M10sMTAyOlsyLDYzXSwxMDM6WzIsNjNdLDEwNzpbMiw2M10sMTE1OlsyLDYzXSwxMjM6WzIsNjNdLDEyNTpbMiw2M10sMTI2OlsyLDYzXSwxMjc6WzIsNjNdLDEyODpbMiw2M10sMTI5OlsyLDYzXSwxMzA6WzIsNjNdLDEzMTpbMiw2M10sMTMyOlsyLDYzXSwxMzM6WzIsNjNdLDEzNDpbMiw2M10sMTM1OlsyLDYzXX0sezgyOlsyLDEwM119LHsyNzoxODEsMjg6WzEsNzBdfSx7Mjc6MTgyLDI4OlsxLDcwXX0sezE6WzIsNzddLDY6WzIsNzddLDI1OlsyLDc3XSwyNjpbMiw3N10sMjc6MTgzLDI4OlsxLDcwXSwzNzpbMiw3N10sNDY6WzIsNzddLDUxOlsyLDc3XSw1NDpbMiw3N10sNjM6WzIsNzddLDY0OlsyLDc3XSw2NTpbMiw3N10sNjc6WzIsNzddLDY5OlsyLDc3XSw3MDpbMiw3N10sNzE6WzIsNzddLDc1OlsyLDc3XSw3NzpbMiw3N10sODE6WzIsNzddLDgyOlsyLDc3XSw4MzpbMiw3N10sODg6WzIsNzddLDkwOlsyLDc3XSw5OTpbMiw3N10sMTAxOlsyLDc3XSwxMDI6WzIsNzddLDEwMzpbMiw3N10sMTA3OlsyLDc3XSwxMTU6WzIsNzddLDEyMzpbMiw3N10sMTI1OlsyLDc3XSwxMjY6WzIsNzddLDEyNzpbMiw3N10sMTI4OlsyLDc3XSwxMjk6WzIsNzddLDEzMDpbMiw3N10sMTMxOlsyLDc3XSwxMzI6WzIsNzddLDEzMzpbMiw3N10sMTM0OlsyLDc3XSwxMzU6WzIsNzddfSx7MTpbMiw3OF0sNjpbMiw3OF0sMjU6WzIsNzhdLDI2OlsyLDc4XSwzNzpbMiw3OF0sNDY6WzIsNzhdLDUxOlsyLDc4XSw1NDpbMiw3OF0sNjM6WzIsNzhdLDY0OlsyLDc4XSw2NTpbMiw3OF0sNjc6WzIsNzhdLDY5OlsyLDc4XSw3MDpbMiw3OF0sNzE6WzIsNzhdLDc1OlsyLDc4XSw3NzpbMiw3OF0sODE6WzIsNzhdLDgyOlsyLDc4XSw4MzpbMiw3OF0sODg6WzIsNzhdLDkwOlsyLDc4XSw5OTpbMiw3OF0sMTAxOlsyLDc4XSwxMDI6WzIsNzhdLDEwMzpbMiw3OF0sMTA3OlsyLDc4XSwxMTU6WzIsNzhdLDEyMzpbMiw3OF0sMTI1OlsyLDc4XSwxMjY6WzIsNzhdLDEyNzpbMiw3OF0sMTI4OlsyLDc4XSwxMjk6WzIsNzhdLDEzMDpbMiw3OF0sMTMxOlsyLDc4XSwxMzI6WzIsNzhdLDEzMzpbMiw3OF0sMTM0OlsyLDc4XSwxMzU6WzIsNzhdfSx7ODoxODUsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU0OlsxLDE4OV0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNjg6MTg0LDcyOjE4Niw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw4OToxODcsOTA6WzEsMTg4XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY2OjE5MCw2NzpbMSw5Nl0sNzA6WzEsOTddLDcxOlsxLDk4XX0sezY2OjE5MSw2NzpbMSw5Nl0sNzA6WzEsOTddLDcxOlsxLDk4XX0sezc5OjE5Miw4MjpbMSwxMDNdfSx7MTpbMiw2NF0sNjpbMiw2NF0sMjU6WzIsNjRdLDI2OlsyLDY0XSwzNzpbMiw2NF0sNDY6WzIsNjRdLDUxOlsyLDY0XSw1NDpbMiw2NF0sNjM6WzIsNjRdLDY0OlsyLDY0XSw2NTpbMiw2NF0sNjc6WzIsNjRdLDY5OlsyLDY0XSw3MDpbMiw2NF0sNzE6WzIsNjRdLDc1OlsyLDY0XSw3NzpbMiw2NF0sODE6WzIsNjRdLDgyOlsyLDY0XSw4MzpbMiw2NF0sODg6WzIsNjRdLDkwOlsyLDY0XSw5OTpbMiw2NF0sMTAxOlsyLDY0XSwxMDI6WzIsNjRdLDEwMzpbMiw2NF0sMTA3OlsyLDY0XSwxMTU6WzIsNjRdLDEyMzpbMiw2NF0sMTI1OlsyLDY0XSwxMjY6WzIsNjRdLDEyNzpbMiw2NF0sMTI4OlsyLDY0XSwxMjk6WzIsNjRdLDEzMDpbMiw2NF0sMTMxOlsyLDY0XSwxMzI6WzIsNjRdLDEzMzpbMiw2NF0sMTM0OlsyLDY0XSwxMzU6WzIsNjRdfSx7ODoxOTMsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxOTRdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEwMV0sNjpbMiwxMDFdLDI1OlsyLDEwMV0sMjY6WzIsMTAxXSw0NjpbMiwxMDFdLDUxOlsyLDEwMV0sNTQ6WzIsMTAxXSw2MzpbMiwxMDFdLDY0OlsyLDEwMV0sNjU6WzIsMTAxXSw2NzpbMiwxMDFdLDY5OlsyLDEwMV0sNzA6WzIsMTAxXSw3MTpbMiwxMDFdLDc1OlsyLDEwMV0sODE6WzIsMTAxXSw4MjpbMiwxMDFdLDgzOlsyLDEwMV0sODg6WzIsMTAxXSw5MDpbMiwxMDFdLDk5OlsyLDEwMV0sMTAxOlsyLDEwMV0sMTAyOlsyLDEwMV0sMTAzOlsyLDEwMV0sMTA3OlsyLDEwMV0sMTE1OlsyLDEwMV0sMTIzOlsyLDEwMV0sMTI1OlsyLDEwMV0sMTI2OlsyLDEwMV0sMTI5OlsyLDEwMV0sMTMwOlsyLDEwMV0sMTMxOlsyLDEwMV0sMTMyOlsyLDEwMV0sMTMzOlsyLDEwMV0sMTM0OlsyLDEwMV19LHs4OjE5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDE0NF0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1NzoxNDUsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODM6WzEsMTk1XSw4NDoxOTYsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NDY6WzEsMTk4XSw1MTpbMSwxOTldfSx7NDY6WzIsNTJdLDUxOlsyLDUyXX0sezM3OlsxLDIwMV0sNDY6WzIsNTRdLDUxOlsyLDU0XSw1NDpbMSwyMDBdfSx7Mzc6WzIsNTddLDQ2OlsyLDU3XSw1MTpbMiw1N10sNTQ6WzIsNTddfSx7Mzc6WzIsNThdLDQ2OlsyLDU4XSw1MTpbMiw1OF0sNTQ6WzIsNThdfSx7Mzc6WzIsNTldLDQ2OlsyLDU5XSw1MTpbMiw1OV0sNTQ6WzIsNTldfSx7Mzc6WzIsNjBdLDQ2OlsyLDYwXSw1MTpbMiw2MF0sNTQ6WzIsNjBdfSx7Mjc6MTQ2LDI4OlsxLDcwXX0sezg6MTk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoxNDIsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sODg6WzEsMTQxXSw5MToxNDMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDQ2XSw2OlsyLDQ2XSwyNTpbMiw0Nl0sMjY6WzIsNDZdLDQ2OlsyLDQ2XSw1MTpbMiw0Nl0sNTQ6WzIsNDZdLDY5OlsyLDQ2XSw3NTpbMiw0Nl0sODM6WzIsNDZdLDg4OlsyLDQ2XSw5MDpbMiw0Nl0sOTk6WzIsNDZdLDEwMTpbMiw0Nl0sMTAyOlsyLDQ2XSwxMDM6WzIsNDZdLDEwNzpbMiw0Nl0sMTE1OlsyLDQ2XSwxMjM6WzIsNDZdLDEyNTpbMiw0Nl0sMTI2OlsyLDQ2XSwxMjk6WzIsNDZdLDEzMDpbMiw0Nl0sMTMxOlsyLDQ2XSwxMzI6WzIsNDZdLDEzMzpbMiw0Nl0sMTM0OlsyLDQ2XX0sezE6WzIsMTc3XSw2OlsyLDE3N10sMjU6WzIsMTc3XSwyNjpbMiwxNzddLDQ2OlsyLDE3N10sNTE6WzIsMTc3XSw1NDpbMiwxNzddLDY5OlsyLDE3N10sNzU6WzIsMTc3XSw4MzpbMiwxNzddLDg4OlsyLDE3N10sOTA6WzIsMTc3XSw5OTpbMiwxNzddLDEwMDo4NCwxMDE6WzIsMTc3XSwxMDI6WzIsMTc3XSwxMDM6WzIsMTc3XSwxMDY6ODUsMTA3OlsyLDE3N10sMTA4OjY2LDExNTpbMiwxNzddLDEyMzpbMiwxNzddLDEyNTpbMiwxNzddLDEyNjpbMiwxNzddLDEyOTpbMSw3NV0sMTMwOlsyLDE3N10sMTMxOlsyLDE3N10sMTMyOlsyLDE3N10sMTMzOlsyLDE3N10sMTM0OlsyLDE3N119LHsxMDA6ODcsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4OCwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODZdfSx7MTpbMiwxNzhdLDY6WzIsMTc4XSwyNTpbMiwxNzhdLDI2OlsyLDE3OF0sNDY6WzIsMTc4XSw1MTpbMiwxNzhdLDU0OlsyLDE3OF0sNjk6WzIsMTc4XSw3NTpbMiwxNzhdLDgzOlsyLDE3OF0sODg6WzIsMTc4XSw5MDpbMiwxNzhdLDk5OlsyLDE3OF0sMTAwOjg0LDEwMTpbMiwxNzhdLDEwMjpbMiwxNzhdLDEwMzpbMiwxNzhdLDEwNjo4NSwxMDc6WzIsMTc4XSwxMDg6NjYsMTE1OlsyLDE3OF0sMTIzOlsyLDE3OF0sMTI1OlsyLDE3OF0sMTI2OlsyLDE3OF0sMTI5OlsxLDc1XSwxMzA6WzIsMTc4XSwxMzE6WzIsMTc4XSwxMzI6WzIsMTc4XSwxMzM6WzIsMTc4XSwxMzQ6WzIsMTc4XX0sezE6WzIsMTc5XSw2OlsyLDE3OV0sMjU6WzIsMTc5XSwyNjpbMiwxNzldLDQ2OlsyLDE3OV0sNTE6WzIsMTc5XSw1NDpbMiwxNzldLDY5OlsyLDE3OV0sNzU6WzIsMTc5XSw4MzpbMiwxNzldLDg4OlsyLDE3OV0sOTA6WzIsMTc5XSw5OTpbMiwxNzldLDEwMDo4NCwxMDE6WzIsMTc5XSwxMDI6WzIsMTc5XSwxMDM6WzIsMTc5XSwxMDY6ODUsMTA3OlsyLDE3OV0sMTA4OjY2LDExNTpbMiwxNzldLDEyMzpbMiwxNzldLDEyNTpbMiwxNzldLDEyNjpbMiwxNzldLDEyOTpbMSw3NV0sMTMwOlsyLDE3OV0sMTMxOlsyLDE3OV0sMTMyOlsyLDE3OV0sMTMzOlsyLDE3OV0sMTM0OlsyLDE3OV19LHsxOlsyLDE4MF0sNjpbMiwxODBdLDI1OlsyLDE4MF0sMjY6WzIsMTgwXSw0NjpbMiwxODBdLDUxOlsyLDE4MF0sNTQ6WzIsMTgwXSw2MzpbMiw2Nl0sNjQ6WzIsNjZdLDY1OlsyLDY2XSw2NzpbMiw2Nl0sNjk6WzIsMTgwXSw3MDpbMiw2Nl0sNzE6WzIsNjZdLDc1OlsyLDE4MF0sODE6WzIsNjZdLDgyOlsyLDY2XSw4MzpbMiwxODBdLDg4OlsyLDE4MF0sOTA6WzIsMTgwXSw5OTpbMiwxODBdLDEwMTpbMiwxODBdLDEwMjpbMiwxODBdLDEwMzpbMiwxODBdLDEwNzpbMiwxODBdLDExNTpbMiwxODBdLDEyMzpbMiwxODBdLDEyNTpbMiwxODBdLDEyNjpbMiwxODBdLDEyOTpbMiwxODBdLDEzMDpbMiwxODBdLDEzMTpbMiwxODBdLDEzMjpbMiwxODBdLDEzMzpbMiwxODBdLDEzNDpbMiwxODBdfSx7NTk6OTAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzg6ODksODE6WzEsOTFdLDgyOlsyLDEwMl19LHs1OToxMDAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzg6OTksODE6WzEsOTFdLDgyOlsyLDEwMl19LHsxOlsyLDY5XSw2OlsyLDY5XSwyNTpbMiw2OV0sMjY6WzIsNjldLDQ2OlsyLDY5XSw1MTpbMiw2OV0sNTQ6WzIsNjldLDYzOlsyLDY5XSw2NDpbMiw2OV0sNjU6WzIsNjldLDY3OlsyLDY5XSw2OTpbMiw2OV0sNzA6WzIsNjldLDcxOlsyLDY5XSw3NTpbMiw2OV0sODE6WzIsNjldLDgyOlsyLDY5XSw4MzpbMiw2OV0sODg6WzIsNjldLDkwOlsyLDY5XSw5OTpbMiw2OV0sMTAxOlsyLDY5XSwxMDI6WzIsNjldLDEwMzpbMiw2OV0sMTA3OlsyLDY5XSwxMTU6WzIsNjldLDEyMzpbMiw2OV0sMTI1OlsyLDY5XSwxMjY6WzIsNjldLDEyOTpbMiw2OV0sMTMwOlsyLDY5XSwxMzE6WzIsNjldLDEzMjpbMiw2OV0sMTMzOlsyLDY5XSwxMzQ6WzIsNjldfSx7MTpbMiwxODFdLDY6WzIsMTgxXSwyNTpbMiwxODFdLDI2OlsyLDE4MV0sNDY6WzIsMTgxXSw1MTpbMiwxODFdLDU0OlsyLDE4MV0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDE4MV0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiwxODFdLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsMTgxXSw4ODpbMiwxODFdLDkwOlsyLDE4MV0sOTk6WzIsMTgxXSwxMDE6WzIsMTgxXSwxMDI6WzIsMTgxXSwxMDM6WzIsMTgxXSwxMDc6WzIsMTgxXSwxMTU6WzIsMTgxXSwxMjM6WzIsMTgxXSwxMjU6WzIsMTgxXSwxMjY6WzIsMTgxXSwxMjk6WzIsMTgxXSwxMzA6WzIsMTgxXSwxMzE6WzIsMTgxXSwxMzI6WzIsMTgxXSwxMzM6WzIsMTgxXSwxMzQ6WzIsMTgxXX0sezE6WzIsMTgyXSw2OlsyLDE4Ml0sMjU6WzIsMTgyXSwyNjpbMiwxODJdLDQ2OlsyLDE4Ml0sNTE6WzIsMTgyXSw1NDpbMiwxODJdLDY5OlsyLDE4Ml0sNzU6WzIsMTgyXSw4MzpbMiwxODJdLDg4OlsyLDE4Ml0sOTA6WzIsMTgyXSw5OTpbMiwxODJdLDEwMTpbMiwxODJdLDEwMjpbMiwxODJdLDEwMzpbMiwxODJdLDEwNzpbMiwxODJdLDExNTpbMiwxODJdLDEyMzpbMiwxODJdLDEyNTpbMiwxODJdLDEyNjpbMiwxODJdLDEyOTpbMiwxODJdLDEzMDpbMiwxODJdLDEzMTpbMiwxODJdLDEzMjpbMiwxODJdLDEzMzpbMiwxODJdLDEzNDpbMiwxODJdfSx7MTpbMiwxODNdLDY6WzIsMTgzXSwyNTpbMiwxODNdLDI2OlsyLDE4M10sNDY6WzIsMTgzXSw1MTpbMiwxODNdLDU0OlsyLDE4M10sNjk6WzIsMTgzXSw3NTpbMiwxODNdLDgzOlsyLDE4M10sODg6WzIsMTgzXSw5MDpbMiwxODNdLDk5OlsyLDE4M10sMTAxOlsyLDE4M10sMTAyOlsyLDE4M10sMTAzOlsyLDE4M10sMTA3OlsyLDE4M10sMTE1OlsyLDE4M10sMTIzOlsyLDE4M10sMTI1OlsyLDE4M10sMTI2OlsyLDE4M10sMTI5OlsyLDE4M10sMTMwOlsyLDE4M10sMTMxOlsyLDE4M10sMTMyOlsyLDE4M10sMTMzOlsyLDE4M10sMTM0OlsyLDE4M119LHs4OjIwMiw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDIwM10sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MjA0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezU6MjA1LDI1OlsxLDVdLDEyMjpbMSwyMDZdfSx7MTpbMiwxMjZdLDY6WzIsMTI2XSwyNTpbMiwxMjZdLDI2OlsyLDEyNl0sNDY6WzIsMTI2XSw1MTpbMiwxMjZdLDU0OlsyLDEyNl0sNjk6WzIsMTI2XSw3NTpbMiwxMjZdLDgzOlsyLDEyNl0sODg6WzIsMTI2XSw5MDpbMiwxMjZdLDk0OjIwNyw5NTpbMSwyMDhdLDk2OlsxLDIwOV0sOTk6WzIsMTI2XSwxMDE6WzIsMTI2XSwxMDI6WzIsMTI2XSwxMDM6WzIsMTI2XSwxMDc6WzIsMTI2XSwxMTU6WzIsMTI2XSwxMjM6WzIsMTI2XSwxMjU6WzIsMTI2XSwxMjY6WzIsMTI2XSwxMjk6WzIsMTI2XSwxMzA6WzIsMTI2XSwxMzE6WzIsMTI2XSwxMzI6WzIsMTI2XSwxMzM6WzIsMTI2XSwxMzQ6WzIsMTI2XX0sezE6WzIsMTM4XSw2OlsyLDEzOF0sMjU6WzIsMTM4XSwyNjpbMiwxMzhdLDQ2OlsyLDEzOF0sNTE6WzIsMTM4XSw1NDpbMiwxMzhdLDY5OlsyLDEzOF0sNzU6WzIsMTM4XSw4MzpbMiwxMzhdLDg4OlsyLDEzOF0sOTA6WzIsMTM4XSw5OTpbMiwxMzhdLDEwMTpbMiwxMzhdLDEwMjpbMiwxMzhdLDEwMzpbMiwxMzhdLDEwNzpbMiwxMzhdLDExNTpbMiwxMzhdLDEyMzpbMiwxMzhdLDEyNTpbMiwxMzhdLDEyNjpbMiwxMzhdLDEyOTpbMiwxMzhdLDEzMDpbMiwxMzhdLDEzMTpbMiwxMzhdLDEzMjpbMiwxMzhdLDEzMzpbMiwxMzhdLDEzNDpbMiwxMzhdfSx7MTpbMiwxNDZdLDY6WzIsMTQ2XSwyNTpbMiwxNDZdLDI2OlsyLDE0Nl0sNDY6WzIsMTQ2XSw1MTpbMiwxNDZdLDU0OlsyLDE0Nl0sNjk6WzIsMTQ2XSw3NTpbMiwxNDZdLDgzOlsyLDE0Nl0sODg6WzIsMTQ2XSw5MDpbMiwxNDZdLDk5OlsyLDE0Nl0sMTAxOlsyLDE0Nl0sMTAyOlsyLDE0Nl0sMTAzOlsyLDE0Nl0sMTA3OlsyLDE0Nl0sMTE1OlsyLDE0Nl0sMTIzOlsyLDE0Nl0sMTI1OlsyLDE0Nl0sMTI2OlsyLDE0Nl0sMTI5OlsyLDE0Nl0sMTMwOlsyLDE0Nl0sMTMxOlsyLDE0Nl0sMTMyOlsyLDE0Nl0sMTMzOlsyLDE0Nl0sMTM0OlsyLDE0Nl19LHsyNTpbMSwyMTBdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTE3OjIxMSwxMTk6MjEyLDEyMDpbMSwyMTNdfSx7MTpbMiw5MV0sNjpbMiw5MV0sMjU6WzIsOTFdLDI2OlsyLDkxXSw0NjpbMiw5MV0sNTE6WzIsOTFdLDU0OlsyLDkxXSw2OTpbMiw5MV0sNzU6WzIsOTFdLDgzOlsyLDkxXSw4ODpbMiw5MV0sOTA6WzIsOTFdLDk5OlsyLDkxXSwxMDE6WzIsOTFdLDEwMjpbMiw5MV0sMTAzOlsyLDkxXSwxMDc6WzIsOTFdLDExNTpbMiw5MV0sMTIzOlsyLDkxXSwxMjU6WzIsOTFdLDEyNjpbMiw5MV0sMTI5OlsyLDkxXSwxMzA6WzIsOTFdLDEzMTpbMiw5MV0sMTMyOlsyLDkxXSwxMzM6WzIsOTFdLDEzNDpbMiw5MV19LHsxNDoyMTQsMTU6MTIwLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjEyMSw0MTo2MCw1NTo0Nyw1Njo0OCw1ODoyMTUsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5ODpbMSw1M119LHsxOlsyLDk0XSw1OjIxNiw2OlsyLDk0XSwyNTpbMSw1XSwyNjpbMiw5NF0sNDY6WzIsOTRdLDUxOlsyLDk0XSw1NDpbMiw5NF0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDk0XSw3MDpbMiw2Nl0sNzE6WzIsNjZdLDc1OlsyLDk0XSw3NzpbMSwyMTddLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsOTRdLDg4OlsyLDk0XSw5MDpbMiw5NF0sOTk6WzIsOTRdLDEwMTpbMiw5NF0sMTAyOlsyLDk0XSwxMDM6WzIsOTRdLDEwNzpbMiw5NF0sMTE1OlsyLDk0XSwxMjM6WzIsOTRdLDEyNTpbMiw5NF0sMTI2OlsyLDk0XSwxMjk6WzIsOTRdLDEzMDpbMiw5NF0sMTMxOlsyLDk0XSwxMzI6WzIsOTRdLDEzMzpbMiw5NF0sMTM0OlsyLDk0XX0sezE6WzIsNDJdLDY6WzIsNDJdLDI2OlsyLDQyXSw5OTpbMiw0Ml0sMTAwOjg0LDEwMTpbMiw0Ml0sMTAzOlsyLDQyXSwxMDY6ODUsMTA3OlsyLDQyXSwxMDg6NjYsMTIzOlsyLDQyXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzMV0sNjpbMiwxMzFdLDI2OlsyLDEzMV0sOTk6WzIsMTMxXSwxMDA6ODQsMTAxOlsyLDEzMV0sMTAzOlsyLDEzMV0sMTA2Ojg1LDEwNzpbMiwxMzFdLDEwODo2NiwxMjM6WzIsMTMxXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs2OlsxLDcxXSw5OTpbMSwyMThdfSx7NDoyMTksNzo0LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiwxMjJdLDI1OlsyLDEyMl0sNTE6WzIsMTIyXSw1NDpbMSwyMjFdLDg4OlsyLDEyMl0sODk6MjIwLDkwOlsxLDE4OF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEwOV0sNjpbMiwxMDldLDI1OlsyLDEwOV0sMjY6WzIsMTA5XSwzNzpbMiwxMDldLDQ2OlsyLDEwOV0sNTE6WzIsMTA5XSw1NDpbMiwxMDldLDYzOlsyLDEwOV0sNjQ6WzIsMTA5XSw2NTpbMiwxMDldLDY3OlsyLDEwOV0sNjk6WzIsMTA5XSw3MDpbMiwxMDldLDcxOlsyLDEwOV0sNzU6WzIsMTA5XSw4MTpbMiwxMDldLDgyOlsyLDEwOV0sODM6WzIsMTA5XSw4ODpbMiwxMDldLDkwOlsyLDEwOV0sOTk6WzIsMTA5XSwxMDE6WzIsMTA5XSwxMDI6WzIsMTA5XSwxMDM6WzIsMTA5XSwxMDc6WzIsMTA5XSwxMTM6WzIsMTA5XSwxMTQ6WzIsMTA5XSwxMTU6WzIsMTA5XSwxMjM6WzIsMTA5XSwxMjU6WzIsMTA5XSwxMjY6WzIsMTA5XSwxMjk6WzIsMTA5XSwxMzA6WzIsMTA5XSwxMzE6WzIsMTA5XSwxMzI6WzIsMTA5XSwxMzM6WzIsMTA5XSwxMzQ6WzIsMTA5XX0sezY6WzIsNDldLDI1OlsyLDQ5XSw1MDoyMjIsNTE6WzEsMjIzXSw4ODpbMiw0OV19LHs2OlsyLDExN10sMjU6WzIsMTE3XSwyNjpbMiwxMTddLDUxOlsyLDExN10sODM6WzIsMTE3XSw4ODpbMiwxMTddfSx7ODoxOTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxNDRdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg0OjIyNCw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MToxNDMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs2OlsyLDEyM10sMjU6WzIsMTIzXSwyNjpbMiwxMjNdLDUxOlsyLDEyM10sODM6WzIsMTIzXSw4ODpbMiwxMjNdfSx7MTpbMiwxMDhdLDY6WzIsMTA4XSwyNTpbMiwxMDhdLDI2OlsyLDEwOF0sMzc6WzIsMTA4XSw0MDpbMiwxMDhdLDQ2OlsyLDEwOF0sNTE6WzIsMTA4XSw1NDpbMiwxMDhdLDYzOlsyLDEwOF0sNjQ6WzIsMTA4XSw2NTpbMiwxMDhdLDY3OlsyLDEwOF0sNjk6WzIsMTA4XSw3MDpbMiwxMDhdLDcxOlsyLDEwOF0sNzU6WzIsMTA4XSw3NzpbMiwxMDhdLDgxOlsyLDEwOF0sODI6WzIsMTA4XSw4MzpbMiwxMDhdLDg4OlsyLDEwOF0sOTA6WzIsMTA4XSw5OTpbMiwxMDhdLDEwMTpbMiwxMDhdLDEwMjpbMiwxMDhdLDEwMzpbMiwxMDhdLDEwNzpbMiwxMDhdLDExNTpbMiwxMDhdLDEyMzpbMiwxMDhdLDEyNTpbMiwxMDhdLDEyNjpbMiwxMDhdLDEyNzpbMiwxMDhdLDEyODpbMiwxMDhdLDEyOTpbMiwxMDhdLDEzMDpbMiwxMDhdLDEzMTpbMiwxMDhdLDEzMjpbMiwxMDhdLDEzMzpbMiwxMDhdLDEzNDpbMiwxMDhdLDEzNTpbMiwxMDhdfSx7NToyMjUsMjU6WzEsNV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzNF0sNjpbMiwxMzRdLDI1OlsyLDEzNF0sMjY6WzIsMTM0XSw0NjpbMiwxMzRdLDUxOlsyLDEzNF0sNTQ6WzIsMTM0XSw2OTpbMiwxMzRdLDc1OlsyLDEzNF0sODM6WzIsMTM0XSw4ODpbMiwxMzRdLDkwOlsyLDEzNF0sOTk6WzIsMTM0XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzEsMjI2XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM0XSwxMjM6WzIsMTM0XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzNl0sNjpbMiwxMzZdLDI1OlsyLDEzNl0sMjY6WzIsMTM2XSw0NjpbMiwxMzZdLDUxOlsyLDEzNl0sNTQ6WzIsMTM2XSw2OTpbMiwxMzZdLDc1OlsyLDEzNl0sODM6WzIsMTM2XSw4ODpbMiwxMzZdLDkwOlsyLDEzNl0sOTk6WzIsMTM2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzEsMjI3XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM2XSwxMjM6WzIsMTM2XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE0Ml0sNjpbMiwxNDJdLDI1OlsyLDE0Ml0sMjY6WzIsMTQyXSw0NjpbMiwxNDJdLDUxOlsyLDE0Ml0sNTQ6WzIsMTQyXSw2OTpbMiwxNDJdLDc1OlsyLDE0Ml0sODM6WzIsMTQyXSw4ODpbMiwxNDJdLDkwOlsyLDE0Ml0sOTk6WzIsMTQyXSwxMDE6WzIsMTQyXSwxMDI6WzIsMTQyXSwxMDM6WzIsMTQyXSwxMDc6WzIsMTQyXSwxMTU6WzIsMTQyXSwxMjM6WzIsMTQyXSwxMjU6WzIsMTQyXSwxMjY6WzIsMTQyXSwxMjk6WzIsMTQyXSwxMzA6WzIsMTQyXSwxMzE6WzIsMTQyXSwxMzI6WzIsMTQyXSwxMzM6WzIsMTQyXSwxMzQ6WzIsMTQyXX0sezE6WzIsMTQzXSw2OlsyLDE0M10sMjU6WzIsMTQzXSwyNjpbMiwxNDNdLDQ2OlsyLDE0M10sNTE6WzIsMTQzXSw1NDpbMiwxNDNdLDY5OlsyLDE0M10sNzU6WzIsMTQzXSw4MzpbMiwxNDNdLDg4OlsyLDE0M10sOTA6WzIsMTQzXSw5OTpbMiwxNDNdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMjpbMiwxNDNdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDExNTpbMiwxNDNdLDEyMzpbMiwxNDNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTQ3XSw2OlsyLDE0N10sMjU6WzIsMTQ3XSwyNjpbMiwxNDddLDQ2OlsyLDE0N10sNTE6WzIsMTQ3XSw1NDpbMiwxNDddLDY5OlsyLDE0N10sNzU6WzIsMTQ3XSw4MzpbMiwxNDddLDg4OlsyLDE0N10sOTA6WzIsMTQ3XSw5OTpbMiwxNDddLDEwMTpbMiwxNDddLDEwMjpbMiwxNDddLDEwMzpbMiwxNDddLDEwNzpbMiwxNDddLDExNTpbMiwxNDddLDEyMzpbMiwxNDddLDEyNTpbMiwxNDddLDEyNjpbMiwxNDddLDEyOTpbMiwxNDddLDEzMDpbMiwxNDddLDEzMTpbMiwxNDddLDEzMjpbMiwxNDddLDEzMzpbMiwxNDddLDEzNDpbMiwxNDddfSx7MTEzOlsyLDE0OV0sMTE0OlsyLDE0OV19LHsyNzoxNTYsMjg6WzEsNzBdLDU1OjE1Nyw1NjoxNTgsNzM6WzEsNjddLDg3OlsxLDExMl0sMTEwOjIyOCwxMTI6MTU1fSx7NTE6WzEsMjI5XSwxMTM6WzIsMTU0XSwxMTQ6WzIsMTU0XX0sezUxOlsyLDE1MV0sMTEzOlsyLDE1MV0sMTE0OlsyLDE1MV19LHs1MTpbMiwxNTJdLDExMzpbMiwxNTJdLDExNDpbMiwxNTJdfSx7NTE6WzIsMTUzXSwxMTM6WzIsMTUzXSwxMTQ6WzIsMTUzXX0sezE6WzIsMTQ4XSw2OlsyLDE0OF0sMjU6WzIsMTQ4XSwyNjpbMiwxNDhdLDQ2OlsyLDE0OF0sNTE6WzIsMTQ4XSw1NDpbMiwxNDhdLDY5OlsyLDE0OF0sNzU6WzIsMTQ4XSw4MzpbMiwxNDhdLDg4OlsyLDE0OF0sOTA6WzIsMTQ4XSw5OTpbMiwxNDhdLDEwMTpbMiwxNDhdLDEwMjpbMiwxNDhdLDEwMzpbMiwxNDhdLDEwNzpbMiwxNDhdLDExNTpbMiwxNDhdLDEyMzpbMiwxNDhdLDEyNTpbMiwxNDhdLDEyNjpbMiwxNDhdLDEyOTpbMiwxNDhdLDEzMDpbMiwxNDhdLDEzMTpbMiwxNDhdLDEzMjpbMiwxNDhdLDEzMzpbMiwxNDhdLDEzNDpbMiwxNDhdfSx7ODoyMzAsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoyMzEsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDUwOjIzMiw1MTpbMSwyMzNdLDc1OlsyLDQ5XX0sezY6WzIsODZdLDI1OlsyLDg2XSwyNjpbMiw4Nl0sNTE6WzIsODZdLDc1OlsyLDg2XX0sezY6WzIsMzVdLDI1OlsyLDM1XSwyNjpbMiwzNV0sNDA6WzEsMjM0XSw1MTpbMiwzNV0sNzU6WzIsMzVdfSx7NjpbMiwzOF0sMjU6WzIsMzhdLDI2OlsyLDM4XSw1MTpbMiwzOF0sNzU6WzIsMzhdfSx7NjpbMiwzOV0sMjU6WzIsMzldLDI2OlsyLDM5XSw0MDpbMiwzOV0sNTE6WzIsMzldLDc1OlsyLDM5XX0sezY6WzIsNDBdLDI1OlsyLDQwXSwyNjpbMiw0MF0sNDA6WzIsNDBdLDUxOlsyLDQwXSw3NTpbMiw0MF19LHs2OlsyLDQxXSwyNTpbMiw0MV0sMjY6WzIsNDFdLDQwOlsyLDQxXSw1MTpbMiw0MV0sNzU6WzIsNDFdfSx7MTpbMiw1XSw2OlsyLDVdLDI2OlsyLDVdLDk5OlsyLDVdfSx7MTpbMiwyNV0sNjpbMiwyNV0sMjU6WzIsMjVdLDI2OlsyLDI1XSw0NjpbMiwyNV0sNTE6WzIsMjVdLDU0OlsyLDI1XSw2OTpbMiwyNV0sNzU6WzIsMjVdLDgzOlsyLDI1XSw4ODpbMiwyNV0sOTA6WzIsMjVdLDk1OlsyLDI1XSw5NjpbMiwyNV0sOTk6WzIsMjVdLDEwMTpbMiwyNV0sMTAyOlsyLDI1XSwxMDM6WzIsMjVdLDEwNzpbMiwyNV0sMTE1OlsyLDI1XSwxMTg6WzIsMjVdLDEyMDpbMiwyNV0sMTIzOlsyLDI1XSwxMjU6WzIsMjVdLDEyNjpbMiwyNV0sMTI5OlsyLDI1XSwxMzA6WzIsMjVdLDEzMTpbMiwyNV0sMTMyOlsyLDI1XSwxMzM6WzIsMjVdLDEzNDpbMiwyNV19LHsxOlsyLDE4NV0sNjpbMiwxODVdLDI1OlsyLDE4NV0sMjY6WzIsMTg1XSw0NjpbMiwxODVdLDUxOlsyLDE4NV0sNTQ6WzIsMTg1XSw2OTpbMiwxODVdLDc1OlsyLDE4NV0sODM6WzIsMTg1XSw4ODpbMiwxODVdLDkwOlsyLDE4NV0sOTk6WzIsMTg1XSwxMDA6ODQsMTAxOlsyLDE4NV0sMTAyOlsyLDE4NV0sMTAzOlsyLDE4NV0sMTA2Ojg1LDEwNzpbMiwxODVdLDEwODo2NiwxMTU6WzIsMTg1XSwxMjM6WzIsMTg1XSwxMjU6WzIsMTg1XSwxMjY6WzIsMTg1XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsyLDE4NV0sMTMyOlsyLDE4NV0sMTMzOlsyLDE4NV0sMTM0OlsyLDE4NV19LHsxOlsyLDE4Nl0sNjpbMiwxODZdLDI1OlsyLDE4Nl0sMjY6WzIsMTg2XSw0NjpbMiwxODZdLDUxOlsyLDE4Nl0sNTQ6WzIsMTg2XSw2OTpbMiwxODZdLDc1OlsyLDE4Nl0sODM6WzIsMTg2XSw4ODpbMiwxODZdLDkwOlsyLDE4Nl0sOTk6WzIsMTg2XSwxMDA6ODQsMTAxOlsyLDE4Nl0sMTAyOlsyLDE4Nl0sMTAzOlsyLDE4Nl0sMTA2Ojg1LDEwNzpbMiwxODZdLDEwODo2NiwxMTU6WzIsMTg2XSwxMjM6WzIsMTg2XSwxMjU6WzIsMTg2XSwxMjY6WzIsMTg2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsyLDE4Nl0sMTMyOlsyLDE4Nl0sMTMzOlsyLDE4Nl0sMTM0OlsyLDE4Nl19LHsxOlsyLDE4N10sNjpbMiwxODddLDI1OlsyLDE4N10sMjY6WzIsMTg3XSw0NjpbMiwxODddLDUxOlsyLDE4N10sNTQ6WzIsMTg3XSw2OTpbMiwxODddLDc1OlsyLDE4N10sODM6WzIsMTg3XSw4ODpbMiwxODddLDkwOlsyLDE4N10sOTk6WzIsMTg3XSwxMDA6ODQsMTAxOlsyLDE4N10sMTAyOlsyLDE4N10sMTAzOlsyLDE4N10sMTA2Ojg1LDEwNzpbMiwxODddLDEwODo2NiwxMTU6WzIsMTg3XSwxMjM6WzIsMTg3XSwxMjU6WzIsMTg3XSwxMjY6WzIsMTg3XSwxMjk6WzEsNzVdLDEzMDpbMiwxODddLDEzMTpbMiwxODddLDEzMjpbMiwxODddLDEzMzpbMiwxODddLDEzNDpbMiwxODddfSx7MTpbMiwxODhdLDY6WzIsMTg4XSwyNTpbMiwxODhdLDI2OlsyLDE4OF0sNDY6WzIsMTg4XSw1MTpbMiwxODhdLDU0OlsyLDE4OF0sNjk6WzIsMTg4XSw3NTpbMiwxODhdLDgzOlsyLDE4OF0sODg6WzIsMTg4XSw5MDpbMiwxODhdLDk5OlsyLDE4OF0sMTAwOjg0LDEwMTpbMiwxODhdLDEwMjpbMiwxODhdLDEwMzpbMiwxODhdLDEwNjo4NSwxMDc6WzIsMTg4XSwxMDg6NjYsMTE1OlsyLDE4OF0sMTIzOlsyLDE4OF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzIsMTg4XSwxMzI6WzIsMTg4XSwxMzM6WzIsMTg4XSwxMzQ6WzIsMTg4XX0sezE6WzIsMTg5XSw2OlsyLDE4OV0sMjU6WzIsMTg5XSwyNjpbMiwxODldLDQ2OlsyLDE4OV0sNTE6WzIsMTg5XSw1NDpbMiwxODldLDY5OlsyLDE4OV0sNzU6WzIsMTg5XSw4MzpbMiwxODldLDg4OlsyLDE4OV0sOTA6WzIsMTg5XSw5OTpbMiwxODldLDEwMDo4NCwxMDE6WzIsMTg5XSwxMDI6WzIsMTg5XSwxMDM6WzIsMTg5XSwxMDY6ODUsMTA3OlsyLDE4OV0sMTA4OjY2LDExNTpbMiwxODldLDEyMzpbMiwxODldLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzIsMTg5XSwxMzM6WzIsMTg5XSwxMzQ6WzEsODJdfSx7MTpbMiwxOTBdLDY6WzIsMTkwXSwyNTpbMiwxOTBdLDI2OlsyLDE5MF0sNDY6WzIsMTkwXSw1MTpbMiwxOTBdLDU0OlsyLDE5MF0sNjk6WzIsMTkwXSw3NTpbMiwxOTBdLDgzOlsyLDE5MF0sODg6WzIsMTkwXSw5MDpbMiwxOTBdLDk5OlsyLDE5MF0sMTAwOjg0LDEwMTpbMiwxOTBdLDEwMjpbMiwxOTBdLDEwMzpbMiwxOTBdLDEwNjo4NSwxMDc6WzIsMTkwXSwxMDg6NjYsMTE1OlsyLDE5MF0sMTIzOlsyLDE5MF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsyLDE5MF0sMTM0OlsxLDgyXX0sezE6WzIsMTkxXSw2OlsyLDE5MV0sMjU6WzIsMTkxXSwyNjpbMiwxOTFdLDQ2OlsyLDE5MV0sNTE6WzIsMTkxXSw1NDpbMiwxOTFdLDY5OlsyLDE5MV0sNzU6WzIsMTkxXSw4MzpbMiwxOTFdLDg4OlsyLDE5MV0sOTA6WzIsMTkxXSw5OTpbMiwxOTFdLDEwMDo4NCwxMDE6WzIsMTkxXSwxMDI6WzIsMTkxXSwxMDM6WzIsMTkxXSwxMDY6ODUsMTA3OlsyLDE5MV0sMTA4OjY2LDExNTpbMiwxOTFdLDEyMzpbMiwxOTFdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzIsMTkxXSwxMzM6WzIsMTkxXSwxMzQ6WzIsMTkxXX0sezE6WzIsMTc2XSw2OlsyLDE3Nl0sMjU6WzIsMTc2XSwyNjpbMiwxNzZdLDQ2OlsyLDE3Nl0sNTE6WzIsMTc2XSw1NDpbMiwxNzZdLDY5OlsyLDE3Nl0sNzU6WzIsMTc2XSw4MzpbMiwxNzZdLDg4OlsyLDE3Nl0sOTA6WzIsMTc2XSw5OTpbMiwxNzZdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMjpbMiwxNzZdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDExNTpbMiwxNzZdLDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNzVdLDY6WzIsMTc1XSwyNTpbMiwxNzVdLDI2OlsyLDE3NV0sNDY6WzIsMTc1XSw1MTpbMiwxNzVdLDU0OlsyLDE3NV0sNjk6WzIsMTc1XSw3NTpbMiwxNzVdLDgzOlsyLDE3NV0sODg6WzIsMTc1XSw5MDpbMiwxNzVdLDk5OlsyLDE3NV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAyOlsyLDE3NV0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTE1OlsyLDE3NV0sMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDk4XSw2OlsyLDk4XSwyNTpbMiw5OF0sMjY6WzIsOThdLDQ2OlsyLDk4XSw1MTpbMiw5OF0sNTQ6WzIsOThdLDYzOlsyLDk4XSw2NDpbMiw5OF0sNjU6WzIsOThdLDY3OlsyLDk4XSw2OTpbMiw5OF0sNzA6WzIsOThdLDcxOlsyLDk4XSw3NTpbMiw5OF0sODE6WzIsOThdLDgyOlsyLDk4XSw4MzpbMiw5OF0sODg6WzIsOThdLDkwOlsyLDk4XSw5OTpbMiw5OF0sMTAxOlsyLDk4XSwxMDI6WzIsOThdLDEwMzpbMiw5OF0sMTA3OlsyLDk4XSwxMTU6WzIsOThdLDEyMzpbMiw5OF0sMTI1OlsyLDk4XSwxMjY6WzIsOThdLDEyOTpbMiw5OF0sMTMwOlsyLDk4XSwxMzE6WzIsOThdLDEzMjpbMiw5OF0sMTMzOlsyLDk4XSwxMzQ6WzIsOThdfSx7MTpbMiw3NF0sNjpbMiw3NF0sMjU6WzIsNzRdLDI2OlsyLDc0XSwzNzpbMiw3NF0sNDY6WzIsNzRdLDUxOlsyLDc0XSw1NDpbMiw3NF0sNjM6WzIsNzRdLDY0OlsyLDc0XSw2NTpbMiw3NF0sNjc6WzIsNzRdLDY5OlsyLDc0XSw3MDpbMiw3NF0sNzE6WzIsNzRdLDc1OlsyLDc0XSw3NzpbMiw3NF0sODE6WzIsNzRdLDgyOlsyLDc0XSw4MzpbMiw3NF0sODg6WzIsNzRdLDkwOlsyLDc0XSw5OTpbMiw3NF0sMTAxOlsyLDc0XSwxMDI6WzIsNzRdLDEwMzpbMiw3NF0sMTA3OlsyLDc0XSwxMTU6WzIsNzRdLDEyMzpbMiw3NF0sMTI1OlsyLDc0XSwxMjY6WzIsNzRdLDEyNzpbMiw3NF0sMTI4OlsyLDc0XSwxMjk6WzIsNzRdLDEzMDpbMiw3NF0sMTMxOlsyLDc0XSwxMzI6WzIsNzRdLDEzMzpbMiw3NF0sMTM0OlsyLDc0XSwxMzU6WzIsNzRdfSx7MTpbMiw3NV0sNjpbMiw3NV0sMjU6WzIsNzVdLDI2OlsyLDc1XSwzNzpbMiw3NV0sNDY6WzIsNzVdLDUxOlsyLDc1XSw1NDpbMiw3NV0sNjM6WzIsNzVdLDY0OlsyLDc1XSw2NTpbMiw3NV0sNjc6WzIsNzVdLDY5OlsyLDc1XSw3MDpbMiw3NV0sNzE6WzIsNzVdLDc1OlsyLDc1XSw3NzpbMiw3NV0sODE6WzIsNzVdLDgyOlsyLDc1XSw4MzpbMiw3NV0sODg6WzIsNzVdLDkwOlsyLDc1XSw5OTpbMiw3NV0sMTAxOlsyLDc1XSwxMDI6WzIsNzVdLDEwMzpbMiw3NV0sMTA3OlsyLDc1XSwxMTU6WzIsNzVdLDEyMzpbMiw3NV0sMTI1OlsyLDc1XSwxMjY6WzIsNzVdLDEyNzpbMiw3NV0sMTI4OlsyLDc1XSwxMjk6WzIsNzVdLDEzMDpbMiw3NV0sMTMxOlsyLDc1XSwxMzI6WzIsNzVdLDEzMzpbMiw3NV0sMTM0OlsyLDc1XSwxMzU6WzIsNzVdfSx7MTpbMiw3Nl0sNjpbMiw3Nl0sMjU6WzIsNzZdLDI2OlsyLDc2XSwzNzpbMiw3Nl0sNDY6WzIsNzZdLDUxOlsyLDc2XSw1NDpbMiw3Nl0sNjM6WzIsNzZdLDY0OlsyLDc2XSw2NTpbMiw3Nl0sNjc6WzIsNzZdLDY5OlsyLDc2XSw3MDpbMiw3Nl0sNzE6WzIsNzZdLDc1OlsyLDc2XSw3NzpbMiw3Nl0sODE6WzIsNzZdLDgyOlsyLDc2XSw4MzpbMiw3Nl0sODg6WzIsNzZdLDkwOlsyLDc2XSw5OTpbMiw3Nl0sMTAxOlsyLDc2XSwxMDI6WzIsNzZdLDEwMzpbMiw3Nl0sMTA3OlsyLDc2XSwxMTU6WzIsNzZdLDEyMzpbMiw3Nl0sMTI1OlsyLDc2XSwxMjY6WzIsNzZdLDEyNzpbMiw3Nl0sMTI4OlsyLDc2XSwxMjk6WzIsNzZdLDEzMDpbMiw3Nl0sMTMxOlsyLDc2XSwxMzI6WzIsNzZdLDEzMzpbMiw3Nl0sMTM0OlsyLDc2XSwxMzU6WzIsNzZdfSx7Njk6WzEsMjM1XX0sezU0OlsxLDE4OV0sNjk6WzIsODJdLDg5OjIzNiw5MDpbMSwxODhdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7Njk6WzIsODNdfSx7ODoyMzcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTM6WzIsMTExXSwyODpbMiwxMTFdLDMwOlsyLDExMV0sMzE6WzIsMTExXSwzMzpbMiwxMTFdLDM0OlsyLDExMV0sMzU6WzIsMTExXSw0MjpbMiwxMTFdLDQzOlsyLDExMV0sNDQ6WzIsMTExXSw0ODpbMiwxMTFdLDQ5OlsyLDExMV0sNjk6WzIsMTExXSw3MzpbMiwxMTFdLDc2OlsyLDExMV0sODA6WzIsMTExXSw4NTpbMiwxMTFdLDg2OlsyLDExMV0sODc6WzIsMTExXSw5MzpbMiwxMTFdLDk3OlsyLDExMV0sOTg6WzIsMTExXSwxMDE6WzIsMTExXSwxMDM6WzIsMTExXSwxMDU6WzIsMTExXSwxMDc6WzIsMTExXSwxMTY6WzIsMTExXSwxMjI6WzIsMTExXSwxMjQ6WzIsMTExXSwxMjU6WzIsMTExXSwxMjY6WzIsMTExXSwxMjc6WzIsMTExXSwxMjg6WzIsMTExXX0sezEzOlsyLDExMl0sMjg6WzIsMTEyXSwzMDpbMiwxMTJdLDMxOlsyLDExMl0sMzM6WzIsMTEyXSwzNDpbMiwxMTJdLDM1OlsyLDExMl0sNDI6WzIsMTEyXSw0MzpbMiwxMTJdLDQ0OlsyLDExMl0sNDg6WzIsMTEyXSw0OTpbMiwxMTJdLDY5OlsyLDExMl0sNzM6WzIsMTEyXSw3NjpbMiwxMTJdLDgwOlsyLDExMl0sODU6WzIsMTEyXSw4NjpbMiwxMTJdLDg3OlsyLDExMl0sOTM6WzIsMTEyXSw5NzpbMiwxMTJdLDk4OlsyLDExMl0sMTAxOlsyLDExMl0sMTAzOlsyLDExMl0sMTA1OlsyLDExMl0sMTA3OlsyLDExMl0sMTE2OlsyLDExMl0sMTIyOlsyLDExMl0sMTI0OlsyLDExMl0sMTI1OlsyLDExMl0sMTI2OlsyLDExMl0sMTI3OlsyLDExMl0sMTI4OlsyLDExMl19LHsxOlsyLDgwXSw2OlsyLDgwXSwyNTpbMiw4MF0sMjY6WzIsODBdLDM3OlsyLDgwXSw0NjpbMiw4MF0sNTE6WzIsODBdLDU0OlsyLDgwXSw2MzpbMiw4MF0sNjQ6WzIsODBdLDY1OlsyLDgwXSw2NzpbMiw4MF0sNjk6WzIsODBdLDcwOlsyLDgwXSw3MTpbMiw4MF0sNzU6WzIsODBdLDc3OlsyLDgwXSw4MTpbMiw4MF0sODI6WzIsODBdLDgzOlsyLDgwXSw4ODpbMiw4MF0sOTA6WzIsODBdLDk5OlsyLDgwXSwxMDE6WzIsODBdLDEwMjpbMiw4MF0sMTAzOlsyLDgwXSwxMDc6WzIsODBdLDExNTpbMiw4MF0sMTIzOlsyLDgwXSwxMjU6WzIsODBdLDEyNjpbMiw4MF0sMTI3OlsyLDgwXSwxMjg6WzIsODBdLDEyOTpbMiw4MF0sMTMwOlsyLDgwXSwxMzE6WzIsODBdLDEzMjpbMiw4MF0sMTMzOlsyLDgwXSwxMzQ6WzIsODBdLDEzNTpbMiw4MF19LHsxOlsyLDgxXSw2OlsyLDgxXSwyNTpbMiw4MV0sMjY6WzIsODFdLDM3OlsyLDgxXSw0NjpbMiw4MV0sNTE6WzIsODFdLDU0OlsyLDgxXSw2MzpbMiw4MV0sNjQ6WzIsODFdLDY1OlsyLDgxXSw2NzpbMiw4MV0sNjk6WzIsODFdLDcwOlsyLDgxXSw3MTpbMiw4MV0sNzU6WzIsODFdLDc3OlsyLDgxXSw4MTpbMiw4MV0sODI6WzIsODFdLDgzOlsyLDgxXSw4ODpbMiw4MV0sOTA6WzIsODFdLDk5OlsyLDgxXSwxMDE6WzIsODFdLDEwMjpbMiw4MV0sMTAzOlsyLDgxXSwxMDc6WzIsODFdLDExNTpbMiw4MV0sMTIzOlsyLDgxXSwxMjU6WzIsODFdLDEyNjpbMiw4MV0sMTI3OlsyLDgxXSwxMjg6WzIsODFdLDEyOTpbMiw4MV0sMTMwOlsyLDgxXSwxMzE6WzIsODFdLDEzMjpbMiw4MV0sMTMzOlsyLDgxXSwxMzQ6WzIsODFdLDEzNTpbMiw4MV19LHsxOlsyLDk5XSw2OlsyLDk5XSwyNTpbMiw5OV0sMjY6WzIsOTldLDQ2OlsyLDk5XSw1MTpbMiw5OV0sNTQ6WzIsOTldLDYzOlsyLDk5XSw2NDpbMiw5OV0sNjU6WzIsOTldLDY3OlsyLDk5XSw2OTpbMiw5OV0sNzA6WzIsOTldLDcxOlsyLDk5XSw3NTpbMiw5OV0sODE6WzIsOTldLDgyOlsyLDk5XSw4MzpbMiw5OV0sODg6WzIsOTldLDkwOlsyLDk5XSw5OTpbMiw5OV0sMTAxOlsyLDk5XSwxMDI6WzIsOTldLDEwMzpbMiw5OV0sMTA3OlsyLDk5XSwxMTU6WzIsOTldLDEyMzpbMiw5OV0sMTI1OlsyLDk5XSwxMjY6WzIsOTldLDEyOTpbMiw5OV0sMTMwOlsyLDk5XSwxMzE6WzIsOTldLDEzMjpbMiw5OV0sMTMzOlsyLDk5XSwxMzQ6WzIsOTldfSx7MTpbMiwzM10sNjpbMiwzM10sMjU6WzIsMzNdLDI2OlsyLDMzXSw0NjpbMiwzM10sNTE6WzIsMzNdLDU0OlsyLDMzXSw2OTpbMiwzM10sNzU6WzIsMzNdLDgzOlsyLDMzXSw4ODpbMiwzM10sOTA6WzIsMzNdLDk5OlsyLDMzXSwxMDA6ODQsMTAxOlsyLDMzXSwxMDI6WzIsMzNdLDEwMzpbMiwzM10sMTA2Ojg1LDEwNzpbMiwzM10sMTA4OjY2LDExNTpbMiwzM10sMTIzOlsyLDMzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs4OjIzOCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEwNF0sNjpbMiwxMDRdLDI1OlsyLDEwNF0sMjY6WzIsMTA0XSw0NjpbMiwxMDRdLDUxOlsyLDEwNF0sNTQ6WzIsMTA0XSw2MzpbMiwxMDRdLDY0OlsyLDEwNF0sNjU6WzIsMTA0XSw2NzpbMiwxMDRdLDY5OlsyLDEwNF0sNzA6WzIsMTA0XSw3MTpbMiwxMDRdLDc1OlsyLDEwNF0sODE6WzIsMTA0XSw4MjpbMiwxMDRdLDgzOlsyLDEwNF0sODg6WzIsMTA0XSw5MDpbMiwxMDRdLDk5OlsyLDEwNF0sMTAxOlsyLDEwNF0sMTAyOlsyLDEwNF0sMTAzOlsyLDEwNF0sMTA3OlsyLDEwNF0sMTE1OlsyLDEwNF0sMTIzOlsyLDEwNF0sMTI1OlsyLDEwNF0sMTI2OlsyLDEwNF0sMTI5OlsyLDEwNF0sMTMwOlsyLDEwNF0sMTMxOlsyLDEwNF0sMTMyOlsyLDEwNF0sMTMzOlsyLDEwNF0sMTM0OlsyLDEwNF19LHs2OlsyLDQ5XSwyNTpbMiw0OV0sNTA6MjM5LDUxOlsxLDIyM10sODM6WzIsNDldfSx7NjpbMiwxMjJdLDI1OlsyLDEyMl0sMjY6WzIsMTIyXSw1MTpbMiwxMjJdLDU0OlsxLDI0MF0sODM6WzIsMTIyXSw4ODpbMiwxMjJdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NDc6MjQxLDQ4OlsxLDU3XSw0OTpbMSw1OF19LHsyNzoxMDcsMjg6WzEsNzBdLDQxOjEwOCw1MjoyNDIsNTM6MTA2LDU1OjEwOSw1NjoxMTAsNzM6WzEsNjddLDg2OlsxLDExMV0sODc6WzEsMTEyXX0sezQ2OlsyLDU1XSw1MTpbMiw1NV19LHs4OjI0Myw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDE5Ml0sNjpbMiwxOTJdLDI1OlsyLDE5Ml0sMjY6WzIsMTkyXSw0NjpbMiwxOTJdLDUxOlsyLDE5Ml0sNTQ6WzIsMTkyXSw2OTpbMiwxOTJdLDc1OlsyLDE5Ml0sODM6WzIsMTkyXSw4ODpbMiwxOTJdLDkwOlsyLDE5Ml0sOTk6WzIsMTkyXSwxMDA6ODQsMTAxOlsyLDE5Ml0sMTAyOlsyLDE5Ml0sMTAzOlsyLDE5Ml0sMTA2Ojg1LDEwNzpbMiwxOTJdLDEwODo2NiwxMTU6WzIsMTkyXSwxMjM6WzIsMTkyXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs4OjI0NCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDE5NF0sNjpbMiwxOTRdLDI1OlsyLDE5NF0sMjY6WzIsMTk0XSw0NjpbMiwxOTRdLDUxOlsyLDE5NF0sNTQ6WzIsMTk0XSw2OTpbMiwxOTRdLDc1OlsyLDE5NF0sODM6WzIsMTk0XSw4ODpbMiwxOTRdLDkwOlsyLDE5NF0sOTk6WzIsMTk0XSwxMDA6ODQsMTAxOlsyLDE5NF0sMTAyOlsyLDE5NF0sMTAzOlsyLDE5NF0sMTA2Ojg1LDEwNzpbMiwxOTRdLDEwODo2NiwxMTU6WzIsMTk0XSwxMjM6WzIsMTk0XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE3NF0sNjpbMiwxNzRdLDI1OlsyLDE3NF0sMjY6WzIsMTc0XSw0NjpbMiwxNzRdLDUxOlsyLDE3NF0sNTQ6WzIsMTc0XSw2OTpbMiwxNzRdLDc1OlsyLDE3NF0sODM6WzIsMTc0XSw4ODpbMiwxNzRdLDkwOlsyLDE3NF0sOTk6WzIsMTc0XSwxMDE6WzIsMTc0XSwxMDI6WzIsMTc0XSwxMDM6WzIsMTc0XSwxMDc6WzIsMTc0XSwxMTU6WzIsMTc0XSwxMjM6WzIsMTc0XSwxMjU6WzIsMTc0XSwxMjY6WzIsMTc0XSwxMjk6WzIsMTc0XSwxMzA6WzIsMTc0XSwxMzE6WzIsMTc0XSwxMzI6WzIsMTc0XSwxMzM6WzIsMTc0XSwxMzQ6WzIsMTc0XX0sezg6MjQ1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsMTI3XSw2OlsyLDEyN10sMjU6WzIsMTI3XSwyNjpbMiwxMjddLDQ2OlsyLDEyN10sNTE6WzIsMTI3XSw1NDpbMiwxMjddLDY5OlsyLDEyN10sNzU6WzIsMTI3XSw4MzpbMiwxMjddLDg4OlsyLDEyN10sOTA6WzIsMTI3XSw5NTpbMSwyNDZdLDk5OlsyLDEyN10sMTAxOlsyLDEyN10sMTAyOlsyLDEyN10sMTAzOlsyLDEyN10sMTA3OlsyLDEyN10sMTE1OlsyLDEyN10sMTIzOlsyLDEyN10sMTI1OlsyLDEyN10sMTI2OlsyLDEyN10sMTI5OlsyLDEyN10sMTMwOlsyLDEyN10sMTMxOlsyLDEyN10sMTMyOlsyLDEyN10sMTMzOlsyLDEyN10sMTM0OlsyLDEyN119LHs1OjI0NywyNTpbMSw1XX0sezI3OjI0OCwyODpbMSw3MF19LHsxMTc6MjQ5LDExOToyMTIsMTIwOlsxLDIxM119LHsyNjpbMSwyNTBdLDExODpbMSwyNTFdLDExOToyNTIsMTIwOlsxLDIxM119LHsyNjpbMiwxNjddLDExODpbMiwxNjddLDEyMDpbMiwxNjddfSx7ODoyNTQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkyOjI1Myw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsOTJdLDU6MjU1LDY6WzIsOTJdLDI1OlsxLDVdLDI2OlsyLDkyXSw0NjpbMiw5Ml0sNTE6WzIsOTJdLDU0OlsyLDkyXSw1OTo5MCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsOTJdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsOTJdLDc4Ojg5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDkyXSw4ODpbMiw5Ml0sOTA6WzIsOTJdLDk5OlsyLDkyXSwxMDE6WzIsOTJdLDEwMjpbMiw5Ml0sMTAzOlsyLDkyXSwxMDc6WzIsOTJdLDExNTpbMiw5Ml0sMTIzOlsyLDkyXSwxMjU6WzIsOTJdLDEyNjpbMiw5Ml0sMTI5OlsyLDkyXSwxMzA6WzIsOTJdLDEzMTpbMiw5Ml0sMTMyOlsyLDkyXSwxMzM6WzIsOTJdLDEzNDpbMiw5Ml19LHsxOlsyLDY2XSw2OlsyLDY2XSwyNTpbMiw2Nl0sMjY6WzIsNjZdLDQ2OlsyLDY2XSw1MTpbMiw2Nl0sNTQ6WzIsNjZdLDYzOlsyLDY2XSw2NDpbMiw2Nl0sNjU6WzIsNjZdLDY3OlsyLDY2XSw2OTpbMiw2Nl0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiw2Nl0sODE6WzIsNjZdLDgyOlsyLDY2XSw4MzpbMiw2Nl0sODg6WzIsNjZdLDkwOlsyLDY2XSw5OTpbMiw2Nl0sMTAxOlsyLDY2XSwxMDI6WzIsNjZdLDEwMzpbMiw2Nl0sMTA3OlsyLDY2XSwxMTU6WzIsNjZdLDEyMzpbMiw2Nl0sMTI1OlsyLDY2XSwxMjY6WzIsNjZdLDEyOTpbMiw2Nl0sMTMwOlsyLDY2XSwxMzE6WzIsNjZdLDEzMjpbMiw2Nl0sMTMzOlsyLDY2XSwxMzQ6WzIsNjZdfSx7MTpbMiw5NV0sNjpbMiw5NV0sMjU6WzIsOTVdLDI2OlsyLDk1XSw0NjpbMiw5NV0sNTE6WzIsOTVdLDU0OlsyLDk1XSw2OTpbMiw5NV0sNzU6WzIsOTVdLDgzOlsyLDk1XSw4ODpbMiw5NV0sOTA6WzIsOTVdLDk5OlsyLDk1XSwxMDE6WzIsOTVdLDEwMjpbMiw5NV0sMTAzOlsyLDk1XSwxMDc6WzIsOTVdLDExNTpbMiw5NV0sMTIzOlsyLDk1XSwxMjU6WzIsOTVdLDEyNjpbMiw5NV0sMTI5OlsyLDk1XSwxMzA6WzIsOTVdLDEzMTpbMiw5NV0sMTMyOlsyLDk1XSwxMzM6WzIsOTVdLDEzNDpbMiw5NV19LHsxNDoyNTYsMTU6MTIwLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjEyMSw0MTo2MCw1NTo0Nyw1Njo0OCw1ODoyMTUsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5ODpbMSw1M119LHsxOlsyLDEzMl0sNjpbMiwxMzJdLDI1OlsyLDEzMl0sMjY6WzIsMTMyXSw0NjpbMiwxMzJdLDUxOlsyLDEzMl0sNTQ6WzIsMTMyXSw2MzpbMiwxMzJdLDY0OlsyLDEzMl0sNjU6WzIsMTMyXSw2NzpbMiwxMzJdLDY5OlsyLDEzMl0sNzA6WzIsMTMyXSw3MTpbMiwxMzJdLDc1OlsyLDEzMl0sODE6WzIsMTMyXSw4MjpbMiwxMzJdLDgzOlsyLDEzMl0sODg6WzIsMTMyXSw5MDpbMiwxMzJdLDk5OlsyLDEzMl0sMTAxOlsyLDEzMl0sMTAyOlsyLDEzMl0sMTAzOlsyLDEzMl0sMTA3OlsyLDEzMl0sMTE1OlsyLDEzMl0sMTIzOlsyLDEzMl0sMTI1OlsyLDEzMl0sMTI2OlsyLDEzMl0sMTI5OlsyLDEzMl0sMTMwOlsyLDEzMl0sMTMxOlsyLDEzMl0sMTMyOlsyLDEzMl0sMTMzOlsyLDEzMl0sMTM0OlsyLDEzMl19LHs2OlsxLDcxXSwyNjpbMSwyNTddfSx7ODoyNTgsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiw2MV0sMTM6WzIsMTEyXSwyNTpbMiw2MV0sMjg6WzIsMTEyXSwzMDpbMiwxMTJdLDMxOlsyLDExMl0sMzM6WzIsMTEyXSwzNDpbMiwxMTJdLDM1OlsyLDExMl0sNDI6WzIsMTEyXSw0MzpbMiwxMTJdLDQ0OlsyLDExMl0sNDg6WzIsMTEyXSw0OTpbMiwxMTJdLDUxOlsyLDYxXSw3MzpbMiwxMTJdLDc2OlsyLDExMl0sODA6WzIsMTEyXSw4NTpbMiwxMTJdLDg2OlsyLDExMl0sODc6WzIsMTEyXSw4ODpbMiw2MV0sOTM6WzIsMTEyXSw5NzpbMiwxMTJdLDk4OlsyLDExMl0sMTAxOlsyLDExMl0sMTAzOlsyLDExMl0sMTA1OlsyLDExMl0sMTA3OlsyLDExMl0sMTE2OlsyLDExMl0sMTIyOlsyLDExMl0sMTI0OlsyLDExMl0sMTI1OlsyLDExMl0sMTI2OlsyLDExMl0sMTI3OlsyLDExMl0sMTI4OlsyLDExMl19LHs2OlsxLDI2MF0sMjU6WzEsMjYxXSw4ODpbMSwyNTldfSx7NjpbMiw1MF0sODoxOTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMiw1MF0sMjY6WzIsNTBdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDgzOlsyLDUwXSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw4ODpbMiw1MF0sOTE6MjYyLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDI2OlsyLDQ5XSw1MDoyNjMsNTE6WzEsMjIzXX0sezE6WzIsMTcxXSw2OlsyLDE3MV0sMjU6WzIsMTcxXSwyNjpbMiwxNzFdLDQ2OlsyLDE3MV0sNTE6WzIsMTcxXSw1NDpbMiwxNzFdLDY5OlsyLDE3MV0sNzU6WzIsMTcxXSw4MzpbMiwxNzFdLDg4OlsyLDE3MV0sOTA6WzIsMTcxXSw5OTpbMiwxNzFdLDEwMTpbMiwxNzFdLDEwMjpbMiwxNzFdLDEwMzpbMiwxNzFdLDEwNzpbMiwxNzFdLDExNTpbMiwxNzFdLDExODpbMiwxNzFdLDEyMzpbMiwxNzFdLDEyNTpbMiwxNzFdLDEyNjpbMiwxNzFdLDEyOTpbMiwxNzFdLDEzMDpbMiwxNzFdLDEzMTpbMiwxNzFdLDEzMjpbMiwxNzFdLDEzMzpbMiwxNzFdLDEzNDpbMiwxNzFdfSx7ODoyNjQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7ODoyNjUsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTEzOlsyLDE1MF0sMTE0OlsyLDE1MF19LHsyNzoxNTYsMjg6WzEsNzBdLDU1OjE1Nyw1NjoxNTgsNzM6WzEsNjddLDg3OlsxLDExMl0sMTEyOjI2Nn0sezE6WzIsMTU2XSw2OlsyLDE1Nl0sMjU6WzIsMTU2XSwyNjpbMiwxNTZdLDQ2OlsyLDE1Nl0sNTE6WzIsMTU2XSw1NDpbMiwxNTZdLDY5OlsyLDE1Nl0sNzU6WzIsMTU2XSw4MzpbMiwxNTZdLDg4OlsyLDE1Nl0sOTA6WzIsMTU2XSw5OTpbMiwxNTZdLDEwMDo4NCwxMDE6WzIsMTU2XSwxMDI6WzEsMjY3XSwxMDM6WzIsMTU2XSwxMDY6ODUsMTA3OlsyLDE1Nl0sMTA4OjY2LDExNTpbMSwyNjhdLDEyMzpbMiwxNTZdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTU3XSw2OlsyLDE1N10sMjU6WzIsMTU3XSwyNjpbMiwxNTddLDQ2OlsyLDE1N10sNTE6WzIsMTU3XSw1NDpbMiwxNTddLDY5OlsyLDE1N10sNzU6WzIsMTU3XSw4MzpbMiwxNTddLDg4OlsyLDE1N10sOTA6WzIsMTU3XSw5OTpbMiwxNTddLDEwMDo4NCwxMDE6WzIsMTU3XSwxMDI6WzEsMjY5XSwxMDM6WzIsMTU3XSwxMDY6ODUsMTA3OlsyLDE1N10sMTA4OjY2LDExNTpbMiwxNTddLDEyMzpbMiwxNTddLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY6WzEsMjcxXSwyNTpbMSwyNzJdLDc1OlsxLDI3MF19LHs2OlsyLDUwXSwxMjoxNjUsMjU6WzIsNTBdLDI2OlsyLDUwXSwyNzoxNjYsMjg6WzEsNzBdLDI5OjE2NywzMDpbMSw2OF0sMzE6WzEsNjldLDM4OjI3MywzOToxNjQsNDE6MTY4LDQzOlsxLDQ2XSw3NTpbMiw1MF0sODY6WzEsMTExXX0sezg6Mjc0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMjc1XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiw3OV0sNjpbMiw3OV0sMjU6WzIsNzldLDI2OlsyLDc5XSwzNzpbMiw3OV0sNDY6WzIsNzldLDUxOlsyLDc5XSw1NDpbMiw3OV0sNjM6WzIsNzldLDY0OlsyLDc5XSw2NTpbMiw3OV0sNjc6WzIsNzldLDY5OlsyLDc5XSw3MDpbMiw3OV0sNzE6WzIsNzldLDc1OlsyLDc5XSw3NzpbMiw3OV0sODE6WzIsNzldLDgyOlsyLDc5XSw4MzpbMiw3OV0sODg6WzIsNzldLDkwOlsyLDc5XSw5OTpbMiw3OV0sMTAxOlsyLDc5XSwxMDI6WzIsNzldLDEwMzpbMiw3OV0sMTA3OlsyLDc5XSwxMTU6WzIsNzldLDEyMzpbMiw3OV0sMTI1OlsyLDc5XSwxMjY6WzIsNzldLDEyNzpbMiw3OV0sMTI4OlsyLDc5XSwxMjk6WzIsNzldLDEzMDpbMiw3OV0sMTMxOlsyLDc5XSwxMzI6WzIsNzldLDEzMzpbMiw3OV0sMTM0OlsyLDc5XSwxMzU6WzIsNzldfSx7ODoyNzYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDY5OlsyLDExNV0sNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs2OTpbMiwxMTZdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MjY6WzEsMjc3XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY6WzEsMjYwXSwyNTpbMSwyNjFdLDgzOlsxLDI3OF19LHs2OlsyLDYxXSwyNTpbMiw2MV0sMjY6WzIsNjFdLDUxOlsyLDYxXSw4MzpbMiw2MV0sODg6WzIsNjFdfSx7NToyNzksMjU6WzEsNV19LHs0NjpbMiw1M10sNTE6WzIsNTNdfSx7NDY6WzIsNTZdLDUxOlsyLDU2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezI2OlsxLDI4MF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs1OjI4MSwyNTpbMSw1XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezU6MjgyLDI1OlsxLDVdfSx7MTpbMiwxMjhdLDY6WzIsMTI4XSwyNTpbMiwxMjhdLDI2OlsyLDEyOF0sNDY6WzIsMTI4XSw1MTpbMiwxMjhdLDU0OlsyLDEyOF0sNjk6WzIsMTI4XSw3NTpbMiwxMjhdLDgzOlsyLDEyOF0sODg6WzIsMTI4XSw5MDpbMiwxMjhdLDk5OlsyLDEyOF0sMTAxOlsyLDEyOF0sMTAyOlsyLDEyOF0sMTAzOlsyLDEyOF0sMTA3OlsyLDEyOF0sMTE1OlsyLDEyOF0sMTIzOlsyLDEyOF0sMTI1OlsyLDEyOF0sMTI2OlsyLDEyOF0sMTI5OlsyLDEyOF0sMTMwOlsyLDEyOF0sMTMxOlsyLDEyOF0sMTMyOlsyLDEyOF0sMTMzOlsyLDEyOF0sMTM0OlsyLDEyOF19LHs1OjI4MywyNTpbMSw1XX0sezI2OlsxLDI4NF0sMTE4OlsxLDI4NV0sMTE5OjI1MiwxMjA6WzEsMjEzXX0sezE6WzIsMTY1XSw2OlsyLDE2NV0sMjU6WzIsMTY1XSwyNjpbMiwxNjVdLDQ2OlsyLDE2NV0sNTE6WzIsMTY1XSw1NDpbMiwxNjVdLDY5OlsyLDE2NV0sNzU6WzIsMTY1XSw4MzpbMiwxNjVdLDg4OlsyLDE2NV0sOTA6WzIsMTY1XSw5OTpbMiwxNjVdLDEwMTpbMiwxNjVdLDEwMjpbMiwxNjVdLDEwMzpbMiwxNjVdLDEwNzpbMiwxNjVdLDExNTpbMiwxNjVdLDEyMzpbMiwxNjVdLDEyNTpbMiwxNjVdLDEyNjpbMiwxNjVdLDEyOTpbMiwxNjVdLDEzMDpbMiwxNjVdLDEzMTpbMiwxNjVdLDEzMjpbMiwxNjVdLDEzMzpbMiwxNjVdLDEzNDpbMiwxNjVdfSx7NToyODYsMjU6WzEsNV19LHsyNjpbMiwxNjhdLDExODpbMiwxNjhdLDEyMDpbMiwxNjhdfSx7NToyODcsMjU6WzEsNV0sNTE6WzEsMjg4XX0sezI1OlsyLDEyNF0sNTE6WzIsMTI0XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsOTNdLDY6WzIsOTNdLDI1OlsyLDkzXSwyNjpbMiw5M10sNDY6WzIsOTNdLDUxOlsyLDkzXSw1NDpbMiw5M10sNjk6WzIsOTNdLDc1OlsyLDkzXSw4MzpbMiw5M10sODg6WzIsOTNdLDkwOlsyLDkzXSw5OTpbMiw5M10sMTAxOlsyLDkzXSwxMDI6WzIsOTNdLDEwMzpbMiw5M10sMTA3OlsyLDkzXSwxMTU6WzIsOTNdLDEyMzpbMiw5M10sMTI1OlsyLDkzXSwxMjY6WzIsOTNdLDEyOTpbMiw5M10sMTMwOlsyLDkzXSwxMzE6WzIsOTNdLDEzMjpbMiw5M10sMTMzOlsyLDkzXSwxMzQ6WzIsOTNdfSx7MTpbMiw5Nl0sNToyODksNjpbMiw5Nl0sMjU6WzEsNV0sMjY6WzIsOTZdLDQ2OlsyLDk2XSw1MTpbMiw5Nl0sNTQ6WzIsOTZdLDU5OjkwLDYzOlsxLDkyXSw2NDpbMSw5M10sNjU6WzEsOTRdLDY2Ojk1LDY3OlsxLDk2XSw2OTpbMiw5Nl0sNzA6WzEsOTddLDcxOlsxLDk4XSw3NTpbMiw5Nl0sNzg6ODksODE6WzEsOTFdLDgyOlsyLDEwMl0sODM6WzIsOTZdLDg4OlsyLDk2XSw5MDpbMiw5Nl0sOTk6WzIsOTZdLDEwMTpbMiw5Nl0sMTAyOlsyLDk2XSwxMDM6WzIsOTZdLDEwNzpbMiw5Nl0sMTE1OlsyLDk2XSwxMjM6WzIsOTZdLDEyNTpbMiw5Nl0sMTI2OlsyLDk2XSwxMjk6WzIsOTZdLDEzMDpbMiw5Nl0sMTMxOlsyLDk2XSwxMzI6WzIsOTZdLDEzMzpbMiw5Nl0sMTM0OlsyLDk2XX0sezk5OlsxLDI5MF19LHs4ODpbMSwyOTFdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMTBdLDY6WzIsMTEwXSwyNTpbMiwxMTBdLDI2OlsyLDExMF0sMzc6WzIsMTEwXSw0NjpbMiwxMTBdLDUxOlsyLDExMF0sNTQ6WzIsMTEwXSw2MzpbMiwxMTBdLDY0OlsyLDExMF0sNjU6WzIsMTEwXSw2NzpbMiwxMTBdLDY5OlsyLDExMF0sNzA6WzIsMTEwXSw3MTpbMiwxMTBdLDc1OlsyLDExMF0sODE6WzIsMTEwXSw4MjpbMiwxMTBdLDgzOlsyLDExMF0sODg6WzIsMTEwXSw5MDpbMiwxMTBdLDk5OlsyLDExMF0sMTAxOlsyLDExMF0sMTAyOlsyLDExMF0sMTAzOlsyLDExMF0sMTA3OlsyLDExMF0sMTEzOlsyLDExMF0sMTE0OlsyLDExMF0sMTE1OlsyLDExMF0sMTIzOlsyLDExMF0sMTI1OlsyLDExMF0sMTI2OlsyLDExMF0sMTI5OlsyLDExMF0sMTMwOlsyLDExMF0sMTMxOlsyLDExMF0sMTMyOlsyLDExMF0sMTMzOlsyLDExMF0sMTM0OlsyLDExMF19LHs4OjE5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkxOjI5Miw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoyOTMsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiwxMThdLDI1OlsyLDExOF0sMjY6WzIsMTE4XSw1MTpbMiwxMThdLDgzOlsyLDExOF0sODg6WzIsMTE4XX0sezY6WzEsMjYwXSwyNTpbMSwyNjFdLDI2OlsxLDI5NF19LHsxOlsyLDEzNV0sNjpbMiwxMzVdLDI1OlsyLDEzNV0sMjY6WzIsMTM1XSw0NjpbMiwxMzVdLDUxOlsyLDEzNV0sNTQ6WzIsMTM1XSw2OTpbMiwxMzVdLDc1OlsyLDEzNV0sODM6WzIsMTM1XSw4ODpbMiwxMzVdLDkwOlsyLDEzNV0sOTk6WzIsMTM1XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzIsMTM1XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM1XSwxMjM6WzIsMTM1XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDEzN10sNjpbMiwxMzddLDI1OlsyLDEzN10sMjY6WzIsMTM3XSw0NjpbMiwxMzddLDUxOlsyLDEzN10sNTQ6WzIsMTM3XSw2OTpbMiwxMzddLDc1OlsyLDEzN10sODM6WzIsMTM3XSw4ODpbMiwxMzddLDkwOlsyLDEzN10sOTk6WzIsMTM3XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzIsMTM3XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTM3XSwxMjM6WzIsMTM3XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxMTM6WzIsMTU1XSwxMTQ6WzIsMTU1XX0sezg6Mjk1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6Mjk2LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6Mjk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsODRdLDY6WzIsODRdLDI1OlsyLDg0XSwyNjpbMiw4NF0sMzc6WzIsODRdLDQ2OlsyLDg0XSw1MTpbMiw4NF0sNTQ6WzIsODRdLDYzOlsyLDg0XSw2NDpbMiw4NF0sNjU6WzIsODRdLDY3OlsyLDg0XSw2OTpbMiw4NF0sNzA6WzIsODRdLDcxOlsyLDg0XSw3NTpbMiw4NF0sODE6WzIsODRdLDgyOlsyLDg0XSw4MzpbMiw4NF0sODg6WzIsODRdLDkwOlsyLDg0XSw5OTpbMiw4NF0sMTAxOlsyLDg0XSwxMDI6WzIsODRdLDEwMzpbMiw4NF0sMTA3OlsyLDg0XSwxMTM6WzIsODRdLDExNDpbMiw4NF0sMTE1OlsyLDg0XSwxMjM6WzIsODRdLDEyNTpbMiw4NF0sMTI2OlsyLDg0XSwxMjk6WzIsODRdLDEzMDpbMiw4NF0sMTMxOlsyLDg0XSwxMzI6WzIsODRdLDEzMzpbMiw4NF0sMTM0OlsyLDg0XX0sezEyOjE2NSwyNzoxNjYsMjg6WzEsNzBdLDI5OjE2NywzMDpbMSw2OF0sMzE6WzEsNjldLDM4OjI5OCwzOToxNjQsNDE6MTY4LDQzOlsxLDQ2XSw4NjpbMSwxMTFdfSx7NjpbMiw4NV0sMTI6MTY1LDI1OlsyLDg1XSwyNjpbMiw4NV0sMjc6MTY2LDI4OlsxLDcwXSwyOToxNjcsMzA6WzEsNjhdLDMxOlsxLDY5XSwzODoxNjMsMzk6MTY0LDQxOjE2OCw0MzpbMSw0Nl0sNTE6WzIsODVdLDc0OjI5OSw4NjpbMSwxMTFdfSx7NjpbMiw4N10sMjU6WzIsODddLDI2OlsyLDg3XSw1MTpbMiw4N10sNzU6WzIsODddfSx7NjpbMiwzNl0sMjU6WzIsMzZdLDI2OlsyLDM2XSw1MTpbMiwzNl0sNzU6WzIsMzZdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7ODozMDAsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7Njk6WzIsMTE0XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMzRdLDY6WzIsMzRdLDI1OlsyLDM0XSwyNjpbMiwzNF0sNDY6WzIsMzRdLDUxOlsyLDM0XSw1NDpbMiwzNF0sNjk6WzIsMzRdLDc1OlsyLDM0XSw4MzpbMiwzNF0sODg6WzIsMzRdLDkwOlsyLDM0XSw5OTpbMiwzNF0sMTAxOlsyLDM0XSwxMDI6WzIsMzRdLDEwMzpbMiwzNF0sMTA3OlsyLDM0XSwxMTU6WzIsMzRdLDEyMzpbMiwzNF0sMTI1OlsyLDM0XSwxMjY6WzIsMzRdLDEyOTpbMiwzNF0sMTMwOlsyLDM0XSwxMzE6WzIsMzRdLDEzMjpbMiwzNF0sMTMzOlsyLDM0XSwxMzQ6WzIsMzRdfSx7MTpbMiwxMDVdLDY6WzIsMTA1XSwyNTpbMiwxMDVdLDI2OlsyLDEwNV0sNDY6WzIsMTA1XSw1MTpbMiwxMDVdLDU0OlsyLDEwNV0sNjM6WzIsMTA1XSw2NDpbMiwxMDVdLDY1OlsyLDEwNV0sNjc6WzIsMTA1XSw2OTpbMiwxMDVdLDcwOlsyLDEwNV0sNzE6WzIsMTA1XSw3NTpbMiwxMDVdLDgxOlsyLDEwNV0sODI6WzIsMTA1XSw4MzpbMiwxMDVdLDg4OlsyLDEwNV0sOTA6WzIsMTA1XSw5OTpbMiwxMDVdLDEwMTpbMiwxMDVdLDEwMjpbMiwxMDVdLDEwMzpbMiwxMDVdLDEwNzpbMiwxMDVdLDExNTpbMiwxMDVdLDEyMzpbMiwxMDVdLDEyNTpbMiwxMDVdLDEyNjpbMiwxMDVdLDEyOTpbMiwxMDVdLDEzMDpbMiwxMDVdLDEzMTpbMiwxMDVdLDEzMjpbMiwxMDVdLDEzMzpbMiwxMDVdLDEzNDpbMiwxMDVdfSx7MTpbMiw0NV0sNjpbMiw0NV0sMjU6WzIsNDVdLDI2OlsyLDQ1XSw0NjpbMiw0NV0sNTE6WzIsNDVdLDU0OlsyLDQ1XSw2OTpbMiw0NV0sNzU6WzIsNDVdLDgzOlsyLDQ1XSw4ODpbMiw0NV0sOTA6WzIsNDVdLDk5OlsyLDQ1XSwxMDE6WzIsNDVdLDEwMjpbMiw0NV0sMTAzOlsyLDQ1XSwxMDc6WzIsNDVdLDExNTpbMiw0NV0sMTIzOlsyLDQ1XSwxMjU6WzIsNDVdLDEyNjpbMiw0NV0sMTI5OlsyLDQ1XSwxMzA6WzIsNDVdLDEzMTpbMiw0NV0sMTMyOlsyLDQ1XSwxMzM6WzIsNDVdLDEzNDpbMiw0NV19LHsxOlsyLDE5M10sNjpbMiwxOTNdLDI1OlsyLDE5M10sMjY6WzIsMTkzXSw0NjpbMiwxOTNdLDUxOlsyLDE5M10sNTQ6WzIsMTkzXSw2OTpbMiwxOTNdLDc1OlsyLDE5M10sODM6WzIsMTkzXSw4ODpbMiwxOTNdLDkwOlsyLDE5M10sOTk6WzIsMTkzXSwxMDE6WzIsMTkzXSwxMDI6WzIsMTkzXSwxMDM6WzIsMTkzXSwxMDc6WzIsMTkzXSwxMTU6WzIsMTkzXSwxMjM6WzIsMTkzXSwxMjU6WzIsMTkzXSwxMjY6WzIsMTkzXSwxMjk6WzIsMTkzXSwxMzA6WzIsMTkzXSwxMzE6WzIsMTkzXSwxMzI6WzIsMTkzXSwxMzM6WzIsMTkzXSwxMzQ6WzIsMTkzXX0sezE6WzIsMTcyXSw2OlsyLDE3Ml0sMjU6WzIsMTcyXSwyNjpbMiwxNzJdLDQ2OlsyLDE3Ml0sNTE6WzIsMTcyXSw1NDpbMiwxNzJdLDY5OlsyLDE3Ml0sNzU6WzIsMTcyXSw4MzpbMiwxNzJdLDg4OlsyLDE3Ml0sOTA6WzIsMTcyXSw5OTpbMiwxNzJdLDEwMTpbMiwxNzJdLDEwMjpbMiwxNzJdLDEwMzpbMiwxNzJdLDEwNzpbMiwxNzJdLDExNTpbMiwxNzJdLDExODpbMiwxNzJdLDEyMzpbMiwxNzJdLDEyNTpbMiwxNzJdLDEyNjpbMiwxNzJdLDEyOTpbMiwxNzJdLDEzMDpbMiwxNzJdLDEzMTpbMiwxNzJdLDEzMjpbMiwxNzJdLDEzMzpbMiwxNzJdLDEzNDpbMiwxNzJdfSx7MTpbMiwxMjldLDY6WzIsMTI5XSwyNTpbMiwxMjldLDI2OlsyLDEyOV0sNDY6WzIsMTI5XSw1MTpbMiwxMjldLDU0OlsyLDEyOV0sNjk6WzIsMTI5XSw3NTpbMiwxMjldLDgzOlsyLDEyOV0sODg6WzIsMTI5XSw5MDpbMiwxMjldLDk5OlsyLDEyOV0sMTAxOlsyLDEyOV0sMTAyOlsyLDEyOV0sMTAzOlsyLDEyOV0sMTA3OlsyLDEyOV0sMTE1OlsyLDEyOV0sMTIzOlsyLDEyOV0sMTI1OlsyLDEyOV0sMTI2OlsyLDEyOV0sMTI5OlsyLDEyOV0sMTMwOlsyLDEyOV0sMTMxOlsyLDEyOV0sMTMyOlsyLDEyOV0sMTMzOlsyLDEyOV0sMTM0OlsyLDEyOV19LHsxOlsyLDEzMF0sNjpbMiwxMzBdLDI1OlsyLDEzMF0sMjY6WzIsMTMwXSw0NjpbMiwxMzBdLDUxOlsyLDEzMF0sNTQ6WzIsMTMwXSw2OTpbMiwxMzBdLDc1OlsyLDEzMF0sODM6WzIsMTMwXSw4ODpbMiwxMzBdLDkwOlsyLDEzMF0sOTU6WzIsMTMwXSw5OTpbMiwxMzBdLDEwMTpbMiwxMzBdLDEwMjpbMiwxMzBdLDEwMzpbMiwxMzBdLDEwNzpbMiwxMzBdLDExNTpbMiwxMzBdLDEyMzpbMiwxMzBdLDEyNTpbMiwxMzBdLDEyNjpbMiwxMzBdLDEyOTpbMiwxMzBdLDEzMDpbMiwxMzBdLDEzMTpbMiwxMzBdLDEzMjpbMiwxMzBdLDEzMzpbMiwxMzBdLDEzNDpbMiwxMzBdfSx7MTpbMiwxNjNdLDY6WzIsMTYzXSwyNTpbMiwxNjNdLDI2OlsyLDE2M10sNDY6WzIsMTYzXSw1MTpbMiwxNjNdLDU0OlsyLDE2M10sNjk6WzIsMTYzXSw3NTpbMiwxNjNdLDgzOlsyLDE2M10sODg6WzIsMTYzXSw5MDpbMiwxNjNdLDk5OlsyLDE2M10sMTAxOlsyLDE2M10sMTAyOlsyLDE2M10sMTAzOlsyLDE2M10sMTA3OlsyLDE2M10sMTE1OlsyLDE2M10sMTIzOlsyLDE2M10sMTI1OlsyLDE2M10sMTI2OlsyLDE2M10sMTI5OlsyLDE2M10sMTMwOlsyLDE2M10sMTMxOlsyLDE2M10sMTMyOlsyLDE2M10sMTMzOlsyLDE2M10sMTM0OlsyLDE2M119LHs1OjMwMSwyNTpbMSw1XX0sezI2OlsxLDMwMl19LHs2OlsxLDMwM10sMjY6WzIsMTY5XSwxMTg6WzIsMTY5XSwxMjA6WzIsMTY5XX0sezg6MzA0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsOTddLDY6WzIsOTddLDI1OlsyLDk3XSwyNjpbMiw5N10sNDY6WzIsOTddLDUxOlsyLDk3XSw1NDpbMiw5N10sNjk6WzIsOTddLDc1OlsyLDk3XSw4MzpbMiw5N10sODg6WzIsOTddLDkwOlsyLDk3XSw5OTpbMiw5N10sMTAxOlsyLDk3XSwxMDI6WzIsOTddLDEwMzpbMiw5N10sMTA3OlsyLDk3XSwxMTU6WzIsOTddLDEyMzpbMiw5N10sMTI1OlsyLDk3XSwxMjY6WzIsOTddLDEyOTpbMiw5N10sMTMwOlsyLDk3XSwxMzE6WzIsOTddLDEzMjpbMiw5N10sMTMzOlsyLDk3XSwxMzQ6WzIsOTddfSx7MTpbMiwxMzNdLDY6WzIsMTMzXSwyNTpbMiwxMzNdLDI2OlsyLDEzM10sNDY6WzIsMTMzXSw1MTpbMiwxMzNdLDU0OlsyLDEzM10sNjM6WzIsMTMzXSw2NDpbMiwxMzNdLDY1OlsyLDEzM10sNjc6WzIsMTMzXSw2OTpbMiwxMzNdLDcwOlsyLDEzM10sNzE6WzIsMTMzXSw3NTpbMiwxMzNdLDgxOlsyLDEzM10sODI6WzIsMTMzXSw4MzpbMiwxMzNdLDg4OlsyLDEzM10sOTA6WzIsMTMzXSw5OTpbMiwxMzNdLDEwMTpbMiwxMzNdLDEwMjpbMiwxMzNdLDEwMzpbMiwxMzNdLDEwNzpbMiwxMzNdLDExNTpbMiwxMzNdLDEyMzpbMiwxMzNdLDEyNTpbMiwxMzNdLDEyNjpbMiwxMzNdLDEyOTpbMiwxMzNdLDEzMDpbMiwxMzNdLDEzMTpbMiwxMzNdLDEzMjpbMiwxMzNdLDEzMzpbMiwxMzNdLDEzNDpbMiwxMzNdfSx7MTpbMiwxMTNdLDY6WzIsMTEzXSwyNTpbMiwxMTNdLDI2OlsyLDExM10sNDY6WzIsMTEzXSw1MTpbMiwxMTNdLDU0OlsyLDExM10sNjM6WzIsMTEzXSw2NDpbMiwxMTNdLDY1OlsyLDExM10sNjc6WzIsMTEzXSw2OTpbMiwxMTNdLDcwOlsyLDExM10sNzE6WzIsMTEzXSw3NTpbMiwxMTNdLDgxOlsyLDExM10sODI6WzIsMTEzXSw4MzpbMiwxMTNdLDg4OlsyLDExM10sOTA6WzIsMTEzXSw5OTpbMiwxMTNdLDEwMTpbMiwxMTNdLDEwMjpbMiwxMTNdLDEwMzpbMiwxMTNdLDEwNzpbMiwxMTNdLDExNTpbMiwxMTNdLDEyMzpbMiwxMTNdLDEyNTpbMiwxMTNdLDEyNjpbMiwxMTNdLDEyOTpbMiwxMTNdLDEzMDpbMiwxMTNdLDEzMTpbMiwxMTNdLDEzMjpbMiwxMTNdLDEzMzpbMiwxMTNdLDEzNDpbMiwxMTNdfSx7NjpbMiwxMTldLDI1OlsyLDExOV0sMjY6WzIsMTE5XSw1MTpbMiwxMTldLDgzOlsyLDExOV0sODg6WzIsMTE5XX0sezY6WzIsNDldLDI1OlsyLDQ5XSwyNjpbMiw0OV0sNTA6MzA1LDUxOlsxLDIyM119LHs2OlsyLDEyMF0sMjU6WzIsMTIwXSwyNjpbMiwxMjBdLDUxOlsyLDEyMF0sODM6WzIsMTIwXSw4ODpbMiwxMjBdfSx7MTpbMiwxNThdLDY6WzIsMTU4XSwyNTpbMiwxNThdLDI2OlsyLDE1OF0sNDY6WzIsMTU4XSw1MTpbMiwxNThdLDU0OlsyLDE1OF0sNjk6WzIsMTU4XSw3NTpbMiwxNThdLDgzOlsyLDE1OF0sODg6WzIsMTU4XSw5MDpbMiwxNThdLDk5OlsyLDE1OF0sMTAwOjg0LDEwMTpbMiwxNThdLDEwMjpbMiwxNThdLDEwMzpbMiwxNThdLDEwNjo4NSwxMDc6WzIsMTU4XSwxMDg6NjYsMTE1OlsxLDMwNl0sMTIzOlsyLDE1OF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNjBdLDY6WzIsMTYwXSwyNTpbMiwxNjBdLDI2OlsyLDE2MF0sNDY6WzIsMTYwXSw1MTpbMiwxNjBdLDU0OlsyLDE2MF0sNjk6WzIsMTYwXSw3NTpbMiwxNjBdLDgzOlsyLDE2MF0sODg6WzIsMTYwXSw5MDpbMiwxNjBdLDk5OlsyLDE2MF0sMTAwOjg0LDEwMTpbMiwxNjBdLDEwMjpbMSwzMDddLDEwMzpbMiwxNjBdLDEwNjo4NSwxMDc6WzIsMTYwXSwxMDg6NjYsMTE1OlsyLDE2MF0sMTIzOlsyLDE2MF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNTldLDY6WzIsMTU5XSwyNTpbMiwxNTldLDI2OlsyLDE1OV0sNDY6WzIsMTU5XSw1MTpbMiwxNTldLDU0OlsyLDE1OV0sNjk6WzIsMTU5XSw3NTpbMiwxNTldLDgzOlsyLDE1OV0sODg6WzIsMTU5XSw5MDpbMiwxNTldLDk5OlsyLDE1OV0sMTAwOjg0LDEwMTpbMiwxNTldLDEwMjpbMiwxNTldLDEwMzpbMiwxNTldLDEwNjo4NSwxMDc6WzIsMTU5XSwxMDg6NjYsMTE1OlsyLDE1OV0sMTIzOlsyLDE1OV0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NjpbMiw4OF0sMjU6WzIsODhdLDI2OlsyLDg4XSw1MTpbMiw4OF0sNzU6WzIsODhdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDI2OlsyLDQ5XSw1MDozMDgsNTE6WzEsMjMzXX0sezI2OlsxLDMwOV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsyNjpbMSwzMTBdfSx7MTpbMiwxNjZdLDY6WzIsMTY2XSwyNTpbMiwxNjZdLDI2OlsyLDE2Nl0sNDY6WzIsMTY2XSw1MTpbMiwxNjZdLDU0OlsyLDE2Nl0sNjk6WzIsMTY2XSw3NTpbMiwxNjZdLDgzOlsyLDE2Nl0sODg6WzIsMTY2XSw5MDpbMiwxNjZdLDk5OlsyLDE2Nl0sMTAxOlsyLDE2Nl0sMTAyOlsyLDE2Nl0sMTAzOlsyLDE2Nl0sMTA3OlsyLDE2Nl0sMTE1OlsyLDE2Nl0sMTIzOlsyLDE2Nl0sMTI1OlsyLDE2Nl0sMTI2OlsyLDE2Nl0sMTI5OlsyLDE2Nl0sMTMwOlsyLDE2Nl0sMTMxOlsyLDE2Nl0sMTMyOlsyLDE2Nl0sMTMzOlsyLDE2Nl0sMTM0OlsyLDE2Nl19LHsyNjpbMiwxNzBdLDExODpbMiwxNzBdLDEyMDpbMiwxNzBdfSx7MjU6WzIsMTI1XSw1MTpbMiwxMjVdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NjpbMSwyNjBdLDI1OlsxLDI2MV0sMjY6WzEsMzExXX0sezg6MzEyLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MzEzLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzEsMjcxXSwyNTpbMSwyNzJdLDI2OlsxLDMxNF19LHs2OlsyLDM3XSwyNTpbMiwzN10sMjY6WzIsMzddLDUxOlsyLDM3XSw3NTpbMiwzN119LHsxOlsyLDE2NF0sNjpbMiwxNjRdLDI1OlsyLDE2NF0sMjY6WzIsMTY0XSw0NjpbMiwxNjRdLDUxOlsyLDE2NF0sNTQ6WzIsMTY0XSw2OTpbMiwxNjRdLDc1OlsyLDE2NF0sODM6WzIsMTY0XSw4ODpbMiwxNjRdLDkwOlsyLDE2NF0sOTk6WzIsMTY0XSwxMDE6WzIsMTY0XSwxMDI6WzIsMTY0XSwxMDM6WzIsMTY0XSwxMDc6WzIsMTY0XSwxMTU6WzIsMTY0XSwxMjM6WzIsMTY0XSwxMjU6WzIsMTY0XSwxMjY6WzIsMTY0XSwxMjk6WzIsMTY0XSwxMzA6WzIsMTY0XSwxMzE6WzIsMTY0XSwxMzI6WzIsMTY0XSwxMzM6WzIsMTY0XSwxMzQ6WzIsMTY0XX0sezY6WzIsMTIxXSwyNTpbMiwxMjFdLDI2OlsyLDEyMV0sNTE6WzIsMTIxXSw4MzpbMiwxMjFdLDg4OlsyLDEyMV19LHsxOlsyLDE2MV0sNjpbMiwxNjFdLDI1OlsyLDE2MV0sMjY6WzIsMTYxXSw0NjpbMiwxNjFdLDUxOlsyLDE2MV0sNTQ6WzIsMTYxXSw2OTpbMiwxNjFdLDc1OlsyLDE2MV0sODM6WzIsMTYxXSw4ODpbMiwxNjFdLDkwOlsyLDE2MV0sOTk6WzIsMTYxXSwxMDA6ODQsMTAxOlsyLDE2MV0sMTAyOlsyLDE2MV0sMTAzOlsyLDE2MV0sMTA2Ojg1LDEwNzpbMiwxNjFdLDEwODo2NiwxMTU6WzIsMTYxXSwxMjM6WzIsMTYxXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE2Ml0sNjpbMiwxNjJdLDI1OlsyLDE2Ml0sMjY6WzIsMTYyXSw0NjpbMiwxNjJdLDUxOlsyLDE2Ml0sNTQ6WzIsMTYyXSw2OTpbMiwxNjJdLDc1OlsyLDE2Ml0sODM6WzIsMTYyXSw4ODpbMiwxNjJdLDkwOlsyLDE2Ml0sOTk6WzIsMTYyXSwxMDA6ODQsMTAxOlsyLDE2Ml0sMTAyOlsyLDE2Ml0sMTAzOlsyLDE2Ml0sMTA2Ojg1LDEwNzpbMiwxNjJdLDEwODo2NiwxMTU6WzIsMTYyXSwxMjM6WzIsMTYyXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs2OlsyLDg5XSwyNTpbMiw4OV0sMjY6WzIsODldLDUxOlsyLDg5XSw3NTpbMiw4OV19XSwNCmRlZmF1bHRBY3Rpb25zOiB7NTc6WzIsNDddLDU4OlsyLDQ4XSw3MjpbMiwzXSw5MTpbMiwxMDNdLDE4NjpbMiw4M119LA0KcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsNCiAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTsNCn0sDQpwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsNCiAgICB2YXIgc2VsZiA9IHRoaXMsDQogICAgICAgIHN0YWNrID0gWzBdLA0KICAgICAgICB2c3RhY2sgPSBbbnVsbF0sIC8vIHNlbWFudGljIHZhbHVlIHN0YWNrDQogICAgICAgIGxzdGFjayA9IFtdLCAvLyBsb2NhdGlvbiBzdGFjaw0KICAgICAgICB0YWJsZSA9IHRoaXMudGFibGUsDQogICAgICAgIHl5dGV4dCA9ICcnLA0KICAgICAgICB5eWxpbmVubyA9IDAsDQogICAgICAgIHl5bGVuZyA9IDAsDQogICAgICAgIHJlY292ZXJpbmcgPSAwLA0KICAgICAgICBURVJST1IgPSAyLA0KICAgICAgICBFT0YgPSAxOw0KDQogICAgLy90aGlzLnJlZHVjdGlvbkNvdW50ID0gdGhpcy5zaGlmdENvdW50ID0gMDsNCg0KICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOw0KICAgIHRoaXMubGV4ZXIueXkgPSB0aGlzLnl5Ow0KICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyOw0KICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gJ3VuZGVmaW5lZCcpDQogICAgICAgIHRoaXMubGV4ZXIueXlsbG9jID0ge307DQogICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7DQogICAgbHN0YWNrLnB1c2goeXlsb2MpOw0KDQogICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbicpDQogICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRoaXMueXkucGFyc2VFcnJvcjsNCg0KICAgIGZ1bmN0aW9uIHBvcFN0YWNrIChuKSB7DQogICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIqbjsNCiAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOw0KICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbGV4KCkgew0KICAgICAgICB2YXIgdG9rZW47DQogICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxOyAvLyAkZW5kID0gMQ0KICAgICAgICAvLyBpZiB0b2tlbiBpc24ndCBpdHMgbnVtZXJpYyB2YWx1ZSwgY29udmVydA0KICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAnbnVtYmVyJykgew0KICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdG9rZW47DQogICAgfTsNCg0KICAgIHZhciBzeW1ib2wsIHByZUVycm9yU3ltYm9sLCBzdGF0ZSwgYWN0aW9uLCBhLCByLCB5eXZhbD17fSxwLGxlbixuZXdTdGF0ZSwgZXhwZWN0ZWQ7DQogICAgd2hpbGUgKHRydWUpIHsNCiAgICAgICAgLy8gcmV0cmVpdmUgc3RhdGUgbnVtYmVyIGZyb20gdG9wIG9mIHN0YWNrDQogICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOw0KDQogICAgICAgIC8vIHVzZSBkZWZhdWx0IGFjdGlvbnMgaWYgYXZhaWxhYmxlDQogICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgew0KICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoc3ltYm9sID09IG51bGwpDQogICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7DQogICAgICAgICAgICAvLyByZWFkIGFjdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgZmlyc3QgaW5wdXQNCiAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGhhbmRsZSBwYXJzZSBlcnJvcg0KICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgew0KDQogICAgICAgICAgICBpZiAoIXJlY292ZXJpbmcpIHsNCiAgICAgICAgICAgICAgICAvLyBSZXBvcnQgZXJyb3INCiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdOw0KICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaCgiJyIrdGhpcy50ZXJtaW5hbHNfW3BdKyInIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJysoeXlsaW5lbm8rMSkrIjpcbiIrdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKSsnXG5FeHBlY3RpbmcgJytleHBlY3RlZC5qb2luKCcsICcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcrKHl5bGluZW5vKzEpKyI6IFVuZXhwZWN0ZWQgIiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbCA9PSAxIC8qRU9GKi8gPyAiZW5kIG9mIGlucHV0IiA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCInIisodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSsiJyIpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwNCiAgICAgICAgICAgICAgICAgICAge3RleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZH0pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBqdXN0IHJlY292ZXJlZCBmcm9tIGFub3RoZXIgZXJyb3INCiAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID09IDMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sID09IEVPRikgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyU3RyIHx8ICdQYXJzaW5nIGhhbHRlZC4nKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGN1cnJlbnQgbG9va2FoZWFkIGFuZCBncmFiIGFub3RoZXINCiAgICAgICAgICAgICAgICB5eWxlbmcgPSB0aGlzLmxleGVyLnl5bGVuZzsNCiAgICAgICAgICAgICAgICB5eXRleHQgPSB0aGlzLmxleGVyLnl5dGV4dDsNCiAgICAgICAgICAgICAgICB5eWxpbmVubyA9IHRoaXMubGV4ZXIueXlsaW5lbm87DQogICAgICAgICAgICAgICAgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsNCiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gdHJ5IHRvIHJlY292ZXIgZnJvbSBlcnJvcg0KICAgICAgICAgICAgd2hpbGUgKDEpIHsNCiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgZXJyb3IgcmVjb3ZlcnkgcnVsZSBpbiB0aGlzIHN0YXRlDQogICAgICAgICAgICAgICAgaWYgKChURVJST1IudG9TdHJpbmcoKSkgaW4gdGFibGVbc3RhdGVdKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyU3RyIHx8ICdQYXJzaW5nIGhhbHRlZC4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcG9wU3RhY2soMSk7DQogICAgICAgICAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gc3ltYm9sOyAvLyBzYXZlIHRoZSBsb29rYWhlYWQgdG9rZW4NCiAgICAgICAgICAgIHN5bWJvbCA9IFRFUlJPUjsgICAgICAgICAvLyBpbnNlcnQgZ2VuZXJpYyBlcnJvciBzeW1ib2wgYXMgbmV3IGxvb2thaGVhZA0KICAgICAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07DQogICAgICAgICAgICBhY3Rpb24gPSB0YWJsZVtzdGF0ZV0gJiYgdGFibGVbc3RhdGVdW1RFUlJPUl07DQogICAgICAgICAgICByZWNvdmVyaW5nID0gMzsgLy8gYWxsb3cgMyByZWFsIHN5bWJvbHMgdG8gYmUgc2hpZnRlZCBiZWZvcmUgcmVwb3J0aW5nIGEgbmV3IGVycm9yDQogICAgICAgIH0NCg0KICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyByZXNvbHZlIGRlZmF1bHRzIGFyZSBvZmYNCiAgICAgICAgaWYgKGFjdGlvblswXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGlvbi5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiAnK3N0YXRlKycsIHRva2VuOiAnK3N5bWJvbCk7DQogICAgICAgIH0NCg0KICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgew0KDQogICAgICAgICAgICBjYXNlIDE6IC8vIHNoaWZ0DQogICAgICAgICAgICAgICAgLy90aGlzLnNoaWZ0Q291bnQrKzsNCg0KICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTsNCiAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7DQogICAgICAgICAgICAgICAgbHN0YWNrLnB1c2godGhpcy5sZXhlci55eWxsb2MpOw0KICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTsgLy8gcHVzaCBzdGF0ZQ0KICAgICAgICAgICAgICAgIHN5bWJvbCA9IG51bGw7DQogICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgeyAvLyBub3JtYWwgZXhlY3V0aW9uL25vIGVycm9yDQogICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOw0KICAgICAgICAgICAgICAgICAgICB5eXRleHQgPSB0aGlzLmxleGVyLnl5dGV4dDsNCiAgICAgICAgICAgICAgICAgICAgeXlsaW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vOw0KICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3ZlcmluZyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyaW5nLS07DQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZXJyb3IganVzdCBvY2N1cnJlZCwgcmVzdW1lIG9sZCBsb29rYWhlYWQgZi8gYmVmb3JlIGVycm9yDQogICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOw0KICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlIDI6IC8vIHJlZHVjZQ0KICAgICAgICAgICAgICAgIC8vdGhpcy5yZWR1Y3Rpb25Db3VudCsrOw0KDQogICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsNCg0KICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gc2VtYW50aWMgYWN0aW9uDQogICAgICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoLWxlbl07IC8vIGRlZmF1bHQgdG8gJCQgPSAkMQ0KICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbG9jYXRpb24sIHVzZXMgZmlyc3QgdG9rZW4gZm9yIGZpcnN0cywgbGFzdCBmb3IgbGFzdHMNCiAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsNCiAgICAgICAgICAgICAgICAgICAgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGgtKGxlbnx8MSldLmZpcnN0X2xpbmUsDQogICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGgtMV0ubGFzdF9saW5lLA0KICAgICAgICAgICAgICAgICAgICBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoLShsZW58fDEpXS5maXJzdF9jb2x1bW4sDQogICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aC0xXS5sYXN0X2NvbHVtbg0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOw0KDQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwb3Agb2ZmIHN0YWNrDQogICAgICAgICAgICAgICAgaWYgKGxlbikgew0KICAgICAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsLTEqbGVuKjIpOw0KICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEqbGVuKTsNCiAgICAgICAgICAgICAgICAgICAgbHN0YWNrID0gbHN0YWNrLnNsaWNlKDAsIC0xKmxlbik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTsgICAgLy8gcHVzaCBub250ZXJtaW5hbCAocmVkdWNlKQ0KICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpOw0KICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8kKTsNCiAgICAgICAgICAgICAgICAvLyBnb3RvIG5ldyBzdGF0ZSA9IHRhYmxlW1NUQVRFXVtOT05URVJNSU5BTF0NCiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aC0yXV1bc3RhY2tbc3RhY2subGVuZ3RoLTFdXTsNCiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAzOiAvLyBhY2NlcHQNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQogICAgcmV0dXJuIHRydWU7DQp9fTsNCg0KbW9kdWxlLmV4cG9ydHMgPSBwYXJzZXI7DQp9KTsvKioNCiAqIENvcHlyaWdodCAoYykgMjAxMSBKZXJlbXkgQXNoa2VuYXMNCiAqDQogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbg0KICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24NCiAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQNCiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLA0KICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQ0KICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcNCiAqIGNvbmRpdGlvbnM6DQogKiANCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqIA0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMNCiAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EDQogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVA0KICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksDQogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcNCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1INCiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiAqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZS9ub2RlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL21vZGUvY29mZmVlL3Njb3BlJywgJ2FjZS9tb2RlL2NvZmZlZS9oZWxwZXJzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICB2YXIgQWNjZXNzLCBBcnIsIEFzc2lnbiwgQmFzZSwgQmxvY2ssIENhbGwsIENsYXNzLCBDbG9zdXJlLCBDb2RlLCBDb21tZW50LCBFeGlzdGVuY2UsIEV4dGVuZHMsIEZvciwgSURFTlRJRklFUiwgSVNfU1RSSU5HLCBJZiwgSW4sIEluZGV4LCBMRVZFTF9BQ0NFU1MsIExFVkVMX0NPTkQsIExFVkVMX0xJU1QsIExFVkVMX09QLCBMRVZFTF9QQVJFTiwgTEVWRUxfVE9QLCBMaXRlcmFsLCBNRVRIT0RfREVGLCBORUdBVEUsIE5PLCBPYmosIE9wLCBQYXJhbSwgUGFyZW5zLCBQdXNoLCBSYW5nZSwgUmV0dXJuLCBTSU1QTEVOVU0sIFNjb3BlLCBTbGljZSwgU3BsYXQsIFN3aXRjaCwgVEFCLCBUSElTLCBUaHJvdywgVHJ5LCBVVElMSVRJRVMsIFZhbHVlLCBXaGlsZSwgWUVTLCBjb21wYWN0LCBkZWwsIGVuZHMsIGV4dGVuZCwgZmxhdHRlbiwgbGFzdCwgbWVyZ2UsIG11bHRpZGVudCwgc3RhcnRzLCB1bmZvbGRTb2FrLCB1dGlsaXR5LCBfcmVmOw0KICB2YXIgX19oYXNQcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwgX19leHRlbmRzID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgew0KICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9DQogICAgZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9DQogICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOw0KICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yOw0KICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7DQogICAgcmV0dXJuIGNoaWxkOw0KICB9LCBfX2JpbmQgPSBmdW5jdGlvbihmbiwgbWUpeyByZXR1cm4gZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KG1lLCBhcmd1bWVudHMpOyB9OyB9LCBfX2luZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7DQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOw0KICAgIH0NCiAgICByZXR1cm4gLTE7DQogIH07DQogIFNjb3BlID0gcmVxdWlyZSgnLi9zY29wZScpLlNjb3BlOw0KICBfcmVmID0gcmVxdWlyZSgnLi9oZWxwZXJzJyksIGNvbXBhY3QgPSBfcmVmLmNvbXBhY3QsIGZsYXR0ZW4gPSBfcmVmLmZsYXR0ZW4sIGV4dGVuZCA9IF9yZWYuZXh0ZW5kLCBtZXJnZSA9IF9yZWYubWVyZ2UsIGRlbCA9IF9yZWYuZGVsLCBzdGFydHMgPSBfcmVmLnN0YXJ0cywgZW5kcyA9IF9yZWYuZW5kcywgbGFzdCA9IF9yZWYubGFzdDsNCiAgZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7DQogIFlFUyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0cnVlOw0KICB9Ow0KICBOTyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBmYWxzZTsNCiAgfTsNCiAgVEhJUyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzOw0KICB9Ow0KICBORUdBVEUgPSBmdW5jdGlvbigpIHsNCiAgICB0aGlzLm5lZ2F0ZWQgPSAhdGhpcy5uZWdhdGVkOw0KICAgIHJldHVybiB0aGlzOw0KICB9Ow0KICBleHBvcnRzLkJhc2UgPSBCYXNlID0gKGZ1bmN0aW9uKCkgew0KICAgIGZ1bmN0aW9uIEJhc2UoKSB7fQ0KICAgIEJhc2UucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvLCBsdmwpIHsNCiAgICAgIHZhciBub2RlOw0KICAgICAgbyA9IGV4dGVuZCh7fSwgbyk7DQogICAgICBpZiAobHZsKSB7DQogICAgICAgIG8ubGV2ZWwgPSBsdmw7DQogICAgICB9DQogICAgICBub2RlID0gdGhpcy51bmZvbGRTb2FrKG8pIHx8IHRoaXM7DQogICAgICBub2RlLnRhYiA9IG8uaW5kZW50Ow0KICAgICAgaWYgKG8ubGV2ZWwgPT09IExFVkVMX1RPUCB8fCAhbm9kZS5pc1N0YXRlbWVudChvKSkgew0KICAgICAgICByZXR1cm4gbm9kZS5jb21waWxlTm9kZShvKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBub2RlLmNvbXBpbGVDbG9zdXJlKG8pOw0KICAgICAgfQ0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuY29tcGlsZUNsb3N1cmUgPSBmdW5jdGlvbihvKSB7DQogICAgICBpZiAodGhpcy5qdW1wcygpIHx8IHRoaXMgaW5zdGFuY2VvZiBUaHJvdykgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignY2Fubm90IHVzZSBhIHB1cmUgc3RhdGVtZW50IGluIGFuIGV4cHJlc3Npb24uJyk7DQogICAgICB9DQogICAgICBvLnNoYXJlZFNjb3BlID0gdHJ1ZTsNCiAgICAgIHJldHVybiBDbG9zdXJlLndyYXAodGhpcykuY29tcGlsZU5vZGUobyk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5jYWNoZSA9IGZ1bmN0aW9uKG8sIGxldmVsLCByZXVzZWQpIHsNCiAgICAgIHZhciByZWYsIHN1YjsNCiAgICAgIGlmICghdGhpcy5pc0NvbXBsZXgoKSkgew0KICAgICAgICByZWYgPSBsZXZlbCA/IHRoaXMuY29tcGlsZShvLCBsZXZlbCkgOiB0aGlzOw0KICAgICAgICByZXR1cm4gW3JlZiwgcmVmXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJlZiA9IG5ldyBMaXRlcmFsKHJldXNlZCB8fCBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVmJykpOw0KICAgICAgICBzdWIgPSBuZXcgQXNzaWduKHJlZiwgdGhpcyk7DQogICAgICAgIGlmIChsZXZlbCkgew0KICAgICAgICAgIHJldHVybiBbc3ViLmNvbXBpbGUobywgbGV2ZWwpLCByZWYudmFsdWVdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJldHVybiBbc3ViLCByZWZdOw0KICAgICAgICB9DQogICAgICB9DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5jb21waWxlTG9vcFJlZmVyZW5jZSA9IGZ1bmN0aW9uKG8sIG5hbWUpIHsNCiAgICAgIHZhciBzcmMsIHRtcDsNCiAgICAgIHNyYyA9IHRtcCA9IHRoaXMuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGlmICghKCgtSW5maW5pdHkgPCArc3JjICYmICtzcmMgPCBJbmZpbml0eSkgfHwgSURFTlRJRklFUi50ZXN0KHNyYykgJiYgby5zY29wZS5jaGVjayhzcmMsIHRydWUpKSkgew0KICAgICAgICBzcmMgPSAiIiArICh0bXAgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZShuYW1lKSkgKyAiID0gIiArIHNyYzsNCiAgICAgIH0NCiAgICAgIHJldHVybiBbc3JjLCB0bXBdOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIG5ldyBSZXR1cm4odGhpcyk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHByZWQpIHsNCiAgICAgIHZhciBjb250YWluczsNCiAgICAgIGNvbnRhaW5zID0gZmFsc2U7DQogICAgICB0aGlzLnRyYXZlcnNlQ2hpbGRyZW4oZmFsc2UsIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgaWYgKHByZWQobm9kZSkpIHsNCiAgICAgICAgICBjb250YWlucyA9IHRydWU7DQogICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIHJldHVybiBjb250YWluczsNCiAgICB9Ow0KICAgIEJhc2UucHJvdG90eXBlLmNvbnRhaW5zVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgdHlwZSB8fCB0aGlzLmNvbnRhaW5zKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiB0eXBlOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS5sYXN0Tm9uQ29tbWVudCA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgIHZhciBpOw0KICAgICAgaSA9IGxpc3QubGVuZ3RoOw0KICAgICAgd2hpbGUgKGktLSkgew0KICAgICAgICBpZiAoIShsaXN0W2ldIGluc3RhbmNlb2YgQ29tbWVudCkpIHsNCiAgICAgICAgICByZXR1cm4gbGlzdFtpXTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGlkdCwgbmFtZSkgew0KICAgICAgdmFyIHRyZWU7DQogICAgICBpZiAoaWR0ID09IG51bGwpIHsNCiAgICAgICAgaWR0ID0gJyc7DQogICAgICB9DQogICAgICBpZiAobmFtZSA9PSBudWxsKSB7DQogICAgICAgIG5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7DQogICAgICB9DQogICAgICB0cmVlID0gJ1xuJyArIGlkdCArIG5hbWU7DQogICAgICBpZiAodGhpcy5zb2FrKSB7DQogICAgICAgIHRyZWUgKz0gJz8nOw0KICAgICAgfQ0KICAgICAgdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24obm9kZSkgew0KICAgICAgICByZXR1cm4gdHJlZSArPSBub2RlLnRvU3RyaW5nKGlkdCArIFRBQik7DQogICAgICB9KTsNCiAgICAgIHJldHVybiB0cmVlOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24oZnVuYykgew0KICAgICAgdmFyIGF0dHIsIGNoaWxkLCBfaSwgX2osIF9sZW4sIF9sZW4yLCBfcmVmMiwgX3JlZjM7DQogICAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9DQogICAgICBfcmVmMiA9IHRoaXMuY2hpbGRyZW47DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIGF0dHIgPSBfcmVmMltfaV07DQogICAgICAgIGlmICh0aGlzW2F0dHJdKSB7DQogICAgICAgICAgX3JlZjMgPSBmbGF0dGVuKFt0aGlzW2F0dHJdXSk7DQogICAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4yID0gX3JlZjMubGVuZ3RoOyBfaiA8IF9sZW4yOyBfaisrKSB7DQogICAgICAgICAgICBjaGlsZCA9IF9yZWYzW19qXTsNCiAgICAgICAgICAgIGlmIChmdW5jKGNoaWxkKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEJhc2UucHJvdG90eXBlLnRyYXZlcnNlQ2hpbGRyZW4gPSBmdW5jdGlvbihjcm9zc1Njb3BlLCBmdW5jKSB7DQogICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24oY2hpbGQpIHsNCiAgICAgICAgaWYgKGZ1bmMoY2hpbGQpID09PSBmYWxzZSkgew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gY2hpbGQudHJhdmVyc2VDaGlsZHJlbihjcm9zc1Njb3BlLCBmdW5jKTsNCiAgICAgIH0pOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuaW52ZXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gbmV3IE9wKCchJywgdGhpcyk7DQogICAgfTsNCiAgICBCYXNlLnByb3RvdHlwZS51bndyYXBBbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBub2RlOw0KICAgICAgbm9kZSA9IHRoaXM7DQogICAgICB3aGlsZSAobm9kZSAhPT0gKG5vZGUgPSBub2RlLnVud3JhcCgpKSkgew0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBub2RlOw0KICAgIH07DQogICAgQmFzZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbXTsNCiAgICBCYXNlLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IE5POw0KICAgIEJhc2UucHJvdG90eXBlLmp1bXBzID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUuaXNDb21wbGV4ID0gWUVTOw0KICAgIEJhc2UucHJvdG90eXBlLmlzQ2hhaW5hYmxlID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUudW53cmFwID0gVEhJUzsNCiAgICBCYXNlLnByb3RvdHlwZS51bmZvbGRTb2FrID0gTk87DQogICAgQmFzZS5wcm90b3R5cGUuYXNzaWducyA9IE5POw0KICAgIHJldHVybiBCYXNlOw0KICB9KSgpOw0KICBleHBvcnRzLkJsb2NrID0gQmxvY2sgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEJsb2NrLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBCbG9jayhub2Rlcykgew0KICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGNvbXBhY3QoZmxhdHRlbihub2RlcyB8fCBbXSkpOw0KICAgIH0NCiAgICBCbG9jay5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2V4cHJlc3Npb25zJ107DQogICAgQmxvY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihub2RlKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb25zLnB1c2gobm9kZSk7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25zLnBvcCgpOw0KICAgIH07DQogICAgQmxvY2sucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbihub2RlKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb25zLnVuc2hpZnQobm9kZSk7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS51bndyYXAgPSBmdW5jdGlvbigpIHsNCiAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgew0KICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uc1swXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgfQ0KICAgIH07DQogICAgQmxvY2sucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7DQogICAgfTsNCiAgICBCbG9jay5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgZXhwLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMuZXhwcmVzc2lvbnM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIGV4cCA9IF9yZWYyW19pXTsNCiAgICAgICAgaWYgKGV4cC5pc1N0YXRlbWVudChvKSkgew0KICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCiAgICBCbG9jay5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgZXhwLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMuZXhwcmVzc2lvbnM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIGV4cCA9IF9yZWYyW19pXTsNCiAgICAgICAgaWYgKGV4cC5qdW1wcyhvKSkgew0KICAgICAgICAgIHJldHVybiBleHA7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZXhwciwgbGVuOw0KICAgICAgbGVuID0gdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7DQogICAgICB3aGlsZSAobGVuLS0pIHsNCiAgICAgICAgZXhwciA9IHRoaXMuZXhwcmVzc2lvbnNbbGVuXTsNCiAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIENvbW1lbnQpKSB7DQogICAgICAgICAgdGhpcy5leHByZXNzaW9uc1tsZW5dID0gZXhwci5tYWtlUmV0dXJuKCk7DQogICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBSZXR1cm4gJiYgIWV4cHIuZXhwcmVzc2lvbikgew0KICAgICAgICAgICAgdGhpcy5leHByZXNzaW9ucy5zcGxpY2UobGVuLCAxKTsNCiAgICAgICAgICB9DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgQmxvY2sucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvLCBsZXZlbCkgew0KICAgICAgaWYgKG8gPT0gbnVsbCkgew0KICAgICAgICBvID0ge307DQogICAgICB9DQogICAgICBpZiAoby5zY29wZSkgew0KICAgICAgICByZXR1cm4gQmxvY2suX19zdXBlcl9fLmNvbXBpbGUuY2FsbCh0aGlzLCBvLCBsZXZlbCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlUm9vdChvKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCBjb2Rlcywgbm9kZSwgdG9wLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICB0aGlzLnRhYiA9IG8uaW5kZW50Ow0KICAgICAgdG9wID0gby5sZXZlbCA9PT0gTEVWRUxfVE9QOw0KICAgICAgY29kZXMgPSBbXTsNCiAgICAgIF9yZWYyID0gdGhpcy5leHByZXNzaW9uczsNCiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgbm9kZSA9IF9yZWYyW19pXTsNCiAgICAgICAgbm9kZSA9IG5vZGUudW53cmFwQWxsKCk7DQogICAgICAgIG5vZGUgPSBub2RlLnVuZm9sZFNvYWsobykgfHwgbm9kZTsNCiAgICAgICAgaWYgKHRvcCkgew0KICAgICAgICAgIG5vZGUuZnJvbnQgPSB0cnVlOw0KICAgICAgICAgIGNvZGUgPSBub2RlLmNvbXBpbGUobyk7DQogICAgICAgICAgY29kZXMucHVzaChub2RlLmlzU3RhdGVtZW50KG8pID8gY29kZSA6IHRoaXMudGFiICsgY29kZSArICc7Jyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY29kZXMucHVzaChub2RlLmNvbXBpbGUobywgTEVWRUxfTElTVCkpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAodG9wKSB7DQogICAgICAgIHJldHVybiBjb2Rlcy5qb2luKCdcbicpOw0KICAgICAgfQ0KICAgICAgY29kZSA9IGNvZGVzLmpvaW4oJywgJykgfHwgJ3ZvaWQgMCc7DQogICAgICBpZiAoY29kZXMubGVuZ3RoID4gMSAmJiBvLmxldmVsID49IExFVkVMX0xJU1QpIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIEJsb2NrLnByb3RvdHlwZS5jb21waWxlUm9vdCA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlOw0KICAgICAgby5pbmRlbnQgPSB0aGlzLnRhYiA9IG8uYmFyZSA/ICcnIDogVEFCOw0KICAgICAgby5zY29wZSA9IG5ldyBTY29wZShudWxsLCB0aGlzLCBudWxsKTsNCiAgICAgIG8ubGV2ZWwgPSBMRVZFTF9UT1A7DQogICAgICBjb2RlID0gdGhpcy5jb21waWxlV2l0aERlY2xhcmF0aW9ucyhvKTsNCiAgICAgIGlmIChvLmJhcmUpIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIihmdW5jdGlvbigpIHtcbiIgKyBjb2RlICsgIlxufSkuY2FsbCh0aGlzKTtcbiI7DQogICAgICB9DQogICAgfTsNCiAgICBCbG9jay5wcm90b3R5cGUuY29tcGlsZVdpdGhEZWNsYXJhdGlvbnMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYXNzaWducywgY29kZSwgZGVjbGFycywgZXhwLCBpLCBwb3N0LCByZXN0LCBzY29wZSwgX2xlbiwgX3JlZjI7DQogICAgICBjb2RlID0gcG9zdCA9ICcnOw0KICAgICAgX3JlZjIgPSB0aGlzLmV4cHJlc3Npb25zOw0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICBleHAgPSBfcmVmMltpXTsNCiAgICAgICAgZXhwID0gZXhwLnVud3JhcCgpOw0KICAgICAgICBpZiAoIShleHAgaW5zdGFuY2VvZiBDb21tZW50IHx8IGV4cCBpbnN0YW5jZW9mIExpdGVyYWwpKSB7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIG8gPSBtZXJnZShvLCB7DQogICAgICAgIGxldmVsOiBMRVZFTF9UT1ANCiAgICAgIH0pOw0KICAgICAgaWYgKGkpIHsNCiAgICAgICAgcmVzdCA9IHRoaXMuZXhwcmVzc2lvbnMuc3BsaWNlKGksIHRoaXMuZXhwcmVzc2lvbnMubGVuZ3RoKTsNCiAgICAgICAgY29kZSA9IHRoaXMuY29tcGlsZU5vZGUobyk7DQogICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSByZXN0Ow0KICAgICAgfQ0KICAgICAgcG9zdCA9IHRoaXMuY29tcGlsZU5vZGUobyk7DQogICAgICBzY29wZSA9IG8uc2NvcGU7DQogICAgICBpZiAoc2NvcGUuZXhwcmVzc2lvbnMgPT09IHRoaXMpIHsNCiAgICAgICAgZGVjbGFycyA9IG8uc2NvcGUuaGFzRGVjbGFyYXRpb25zKCk7DQogICAgICAgIGFzc2lnbnMgPSBzY29wZS5oYXNBc3NpZ25tZW50czsNCiAgICAgICAgaWYgKChkZWNsYXJzIHx8IGFzc2lnbnMpICYmIGkpIHsNCiAgICAgICAgICBjb2RlICs9ICdcbic7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRlY2xhcnMpIHsNCiAgICAgICAgICBjb2RlICs9ICIiICsgdGhpcy50YWIgKyAidmFyICIgKyAoc2NvcGUuZGVjbGFyZWRWYXJpYWJsZXMoKS5qb2luKCcsICcpKSArICI7XG4iOw0KICAgICAgICB9DQogICAgICAgIGlmIChhc3NpZ25zKSB7DQogICAgICAgICAgY29kZSArPSAiIiArIHRoaXMudGFiICsgInZhciAiICsgKG11bHRpZGVudChzY29wZS5hc3NpZ25lZFZhcmlhYmxlcygpLmpvaW4oJywgJyksIHRoaXMudGFiKSkgKyAiO1xuIjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIGNvZGUgKyBwb3N0Ow0KICAgIH07DQogICAgQmxvY2sud3JhcCA9IGZ1bmN0aW9uKG5vZGVzKSB7DQogICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAxICYmIG5vZGVzWzBdIGluc3RhbmNlb2YgQmxvY2spIHsNCiAgICAgICAgcmV0dXJuIG5vZGVzWzBdOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG5ldyBCbG9jayhub2Rlcyk7DQogICAgfTsNCiAgICByZXR1cm4gQmxvY2s7DQogIH0pKCk7DQogIGV4cG9ydHMuTGl0ZXJhbCA9IExpdGVyYWwgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKExpdGVyYWwsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIExpdGVyYWwodmFsdWUpIHsNCiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCiAgICB9DQogICAgTGl0ZXJhbC5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKHRoaXMuaXNTdGF0ZW1lbnQoKSkgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBuZXcgUmV0dXJuKHRoaXMpOw0KICAgICAgfQ0KICAgIH07DQogICAgTGl0ZXJhbC5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gSURFTlRJRklFUi50ZXN0KHRoaXMudmFsdWUpOw0KICAgIH07DQogICAgTGl0ZXJhbC5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBfcmVmMjsNCiAgICAgIHJldHVybiAoX3JlZjIgPSB0aGlzLnZhbHVlKSA9PT0gJ2JyZWFrJyB8fCBfcmVmMiA9PT0gJ2NvbnRpbnVlJyB8fCBfcmVmMiA9PT0gJ2RlYnVnZ2VyJzsNCiAgICB9Ow0KICAgIExpdGVyYWwucHJvdG90eXBlLmlzQ29tcGxleCA9IE5POw0KICAgIExpdGVyYWwucHJvdG90eXBlLmFzc2lnbnMgPSBmdW5jdGlvbihuYW1lKSB7DQogICAgICByZXR1cm4gbmFtZSA9PT0gdGhpcy52YWx1ZTsNCiAgICB9Ow0KICAgIExpdGVyYWwucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgew0KICAgICAgaWYgKCF0aGlzLmlzU3RhdGVtZW50KCkpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgfQ0KICAgICAgaWYgKCEobyAmJiAoby5sb29wIHx8IG8uYmxvY2sgJiYgKHRoaXMudmFsdWUgIT09ICdjb250aW51ZScpKSkpIHsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgfTsNCiAgICBMaXRlcmFsLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlOw0KICAgICAgY29kZSA9IHRoaXMuaXNVbmRlZmluZWQgPyBvLmxldmVsID49IExFVkVMX0FDQ0VTUyA/ICcodm9pZCAwKScgOiAndm9pZCAwJyA6IHRoaXMudmFsdWUucmVzZXJ2ZWQgPyAiXCIiICsgdGhpcy52YWx1ZSArICJcIiIgOiB0aGlzLnZhbHVlOw0KICAgICAgaWYgKHRoaXMuaXNTdGF0ZW1lbnQoKSkgew0KICAgICAgICByZXR1cm4gIiIgKyB0aGlzLnRhYiArIGNvZGUgKyAiOyI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIExpdGVyYWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gJyAiJyArIHRoaXMudmFsdWUgKyAnIic7DQogICAgfTsNCiAgICByZXR1cm4gTGl0ZXJhbDsNCiAgfSkoKTsNCiAgZXhwb3J0cy5SZXR1cm4gPSBSZXR1cm4gPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFJldHVybiwgQmFzZSk7DQogICAgZnVuY3Rpb24gUmV0dXJuKGV4cHIpIHsNCiAgICAgIGlmIChleHByICYmICFleHByLnVud3JhcCgpLmlzVW5kZWZpbmVkKSB7DQogICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHI7DQogICAgICB9DQogICAgfQ0KICAgIFJldHVybi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2V4cHJlc3Npb24nXTsNCiAgICBSZXR1cm4ucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIFJldHVybi5wcm90b3R5cGUubWFrZVJldHVybiA9IFRISVM7DQogICAgUmV0dXJuLnByb3RvdHlwZS5qdW1wcyA9IFRISVM7DQogICAgUmV0dXJuLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obywgbGV2ZWwpIHsNCiAgICAgIHZhciBleHByLCBfcmVmMjsNCiAgICAgIGV4cHIgPSAoX3JlZjIgPSB0aGlzLmV4cHJlc3Npb24pICE9IG51bGwgPyBfcmVmMi5tYWtlUmV0dXJuKCkgOiB2b2lkIDA7DQogICAgICBpZiAoZXhwciAmJiAhKGV4cHIgaW5zdGFuY2VvZiBSZXR1cm4pKSB7DQogICAgICAgIHJldHVybiBleHByLmNvbXBpbGUobywgbGV2ZWwpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIFJldHVybi5fX3N1cGVyX18uY29tcGlsZS5jYWxsKHRoaXMsIG8sIGxldmVsKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIFJldHVybi5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICByZXR1cm4gdGhpcy50YWIgKyAoInJldHVybiIgKyAodGhpcy5leHByZXNzaW9uID8gJyAnICsgdGhpcy5leHByZXNzaW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pIDogJycpICsgIjsiKTsNCiAgICB9Ow0KICAgIHJldHVybiBSZXR1cm47DQogIH0pKCk7DQogIGV4cG9ydHMuVmFsdWUgPSBWYWx1ZSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoVmFsdWUsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIFZhbHVlKGJhc2UsIHByb3BzLCB0YWcpIHsNCiAgICAgIGlmICghcHJvcHMgJiYgYmFzZSBpbnN0YW5jZW9mIFZhbHVlKSB7DQogICAgICAgIHJldHVybiBiYXNlOw0KICAgICAgfQ0KICAgICAgdGhpcy5iYXNlID0gYmFzZTsNCiAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BzIHx8IFtdOw0KICAgICAgaWYgKHRhZykgew0KICAgICAgICB0aGlzW3RhZ10gPSB0cnVlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfQ0KICAgIFZhbHVlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYmFzZScsICdwcm9wZXJ0aWVzJ107DQogICAgVmFsdWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihwcm9wKSB7DQogICAgICB0aGlzLnByb3BlcnRpZXMucHVzaChwcm9wKTsNCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmhhc1Byb3BlcnRpZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhIXRoaXMucHJvcGVydGllcy5sZW5ndGg7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUuaXNBcnJheSA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZSBpbnN0YW5jZW9mIEFycjsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5pc0NvbXBsZXggPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLmhhc1Byb3BlcnRpZXMoKSB8fCB0aGlzLmJhc2UuaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5oYXNQcm9wZXJ0aWVzKCkgfHwgdGhpcy5iYXNlLmlzQXNzaWduYWJsZSgpOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmlzU2ltcGxlTnVtYmVyID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5iYXNlIGluc3RhbmNlb2YgTGl0ZXJhbCAmJiBTSU1QTEVOVU0udGVzdCh0aGlzLmJhc2UudmFsdWUpOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmlzQXRvbWljID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgbm9kZSwgX2ksIF9sZW4sIF9yZWYyOw0KICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXMuY29uY2F0KHRoaXMuYmFzZSk7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIG5vZGUgPSBfcmVmMltfaV07DQogICAgICAgIGlmIChub2RlLnNvYWsgfHwgbm9kZSBpbnN0YW5jZW9mIENhbGwpIHsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZS5pc1N0YXRlbWVudChvKTsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZS5hc3NpZ25zKG5hbWUpOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuICF0aGlzLnByb3BlcnRpZXMubGVuZ3RoICYmIHRoaXMuYmFzZS5qdW1wcyhvKTsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5pc09iamVjdCA9IGZ1bmN0aW9uKG9ubHlHZW5lcmF0ZWQpIHsNCiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubGVuZ3RoKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiAodGhpcy5iYXNlIGluc3RhbmNlb2YgT2JqKSAmJiAoIW9ubHlHZW5lcmF0ZWQgfHwgdGhpcy5iYXNlLmdlbmVyYXRlZCk7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUuaXNTcGxpY2UgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiBsYXN0KHRoaXMucHJvcGVydGllcykgaW5zdGFuY2VvZiBTbGljZTsNCiAgICB9Ow0KICAgIFZhbHVlLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmxlbmd0aCkgew0KICAgICAgICByZXR1cm4gVmFsdWUuX19zdXBlcl9fLm1ha2VSZXR1cm4uY2FsbCh0aGlzKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLmJhc2UubWFrZVJldHVybigpOw0KICAgICAgfQ0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLnVud3JhcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5iYXNlOw0KICAgICAgfQ0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmNhY2hlUmVmZXJlbmNlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGJhc2UsIGJyZWYsIG5hbWUsIG5yZWY7DQogICAgICBuYW1lID0gbGFzdCh0aGlzLnByb3BlcnRpZXMpOw0KICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sZW5ndGggPCAyICYmICF0aGlzLmJhc2UuaXNDb21wbGV4KCkgJiYgIShuYW1lICE9IG51bGwgPyBuYW1lLmlzQ29tcGxleCgpIDogdm9pZCAwKSkgew0KICAgICAgICByZXR1cm4gW3RoaXMsIHRoaXNdOw0KICAgICAgfQ0KICAgICAgYmFzZSA9IG5ldyBWYWx1ZSh0aGlzLmJhc2UsIHRoaXMucHJvcGVydGllcy5zbGljZSgwLCAtMSkpOw0KICAgICAgaWYgKGJhc2UuaXNDb21wbGV4KCkpIHsNCiAgICAgICAgYnJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdiYXNlJykpOw0KICAgICAgICBiYXNlID0gbmV3IFZhbHVlKG5ldyBQYXJlbnMobmV3IEFzc2lnbihicmVmLCBiYXNlKSkpOw0KICAgICAgfQ0KICAgICAgaWYgKCFuYW1lKSB7DQogICAgICAgIHJldHVybiBbYmFzZSwgYnJlZl07DQogICAgICB9DQogICAgICBpZiAobmFtZS5pc0NvbXBsZXgoKSkgew0KICAgICAgICBucmVmID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ25hbWUnKSk7DQogICAgICAgIG5hbWUgPSBuZXcgSW5kZXgobmV3IEFzc2lnbihucmVmLCBuYW1lLmluZGV4KSk7DQogICAgICAgIG5yZWYgPSBuZXcgSW5kZXgobnJlZik7DQogICAgICB9DQogICAgICByZXR1cm4gW2Jhc2UucHVzaChuYW1lKSwgbmV3IFZhbHVlKGJyZWYgfHwgYmFzZS5iYXNlLCBbbnJlZiB8fCBuYW1lXSldOw0KICAgIH07DQogICAgVmFsdWUucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGNvZGUsIHByb3AsIHByb3BzLCBfaSwgX2xlbjsNCiAgICAgIHRoaXMuYmFzZS5mcm9udCA9IHRoaXMuZnJvbnQ7DQogICAgICBwcm9wcyA9IHRoaXMucHJvcGVydGllczsNCiAgICAgIGNvZGUgPSB0aGlzLmJhc2UuY29tcGlsZShvLCBwcm9wcy5sZW5ndGggPyBMRVZFTF9BQ0NFU1MgOiBudWxsKTsNCiAgICAgIGlmIChwcm9wc1swXSBpbnN0YW5jZW9mIEFjY2VzcyAmJiB0aGlzLmlzU2ltcGxlTnVtYmVyKCkpIHsNCiAgICAgICAgY29kZSA9ICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHByb3BzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHByb3AgPSBwcm9wc1tfaV07DQogICAgICAgIGNvZGUgKz0gcHJvcC5jb21waWxlKG8pOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGNvZGU7DQogICAgfTsNCiAgICBWYWx1ZS5wcm90b3R5cGUudW5mb2xkU29hayA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciByZXN1bHQ7DQogICAgICBpZiAodGhpcy51bmZvbGRlZFNvYWsgIT0gbnVsbCkgew0KICAgICAgICByZXR1cm4gdGhpcy51bmZvbGRlZFNvYWs7DQogICAgICB9DQogICAgICByZXN1bHQgPSBfX2JpbmQoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBmc3QsIGksIGlmbiwgcHJvcCwgcmVmLCBzbmQsIF9sZW4sIF9yZWYyOw0KICAgICAgICBpZiAoaWZuID0gdGhpcy5iYXNlLnVuZm9sZFNvYWsobykpIHsNCiAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShpZm4uYm9keS5wcm9wZXJ0aWVzLCB0aGlzLnByb3BlcnRpZXMpOw0KICAgICAgICAgIHJldHVybiBpZm47DQogICAgICAgIH0NCiAgICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXM7DQogICAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgICBwcm9wID0gX3JlZjJbaV07DQogICAgICAgICAgaWYgKHByb3Auc29haykgew0KICAgICAgICAgICAgcHJvcC5zb2FrID0gZmFsc2U7DQogICAgICAgICAgICBmc3QgPSBuZXcgVmFsdWUodGhpcy5iYXNlLCB0aGlzLnByb3BlcnRpZXMuc2xpY2UoMCwgaSkpOw0KICAgICAgICAgICAgc25kID0gbmV3IFZhbHVlKHRoaXMuYmFzZSwgdGhpcy5wcm9wZXJ0aWVzLnNsaWNlKGkpKTsNCiAgICAgICAgICAgIGlmIChmc3QuaXNDb21wbGV4KCkpIHsNCiAgICAgICAgICAgICAgcmVmID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ3JlZicpKTsNCiAgICAgICAgICAgICAgZnN0ID0gbmV3IFBhcmVucyhuZXcgQXNzaWduKHJlZiwgZnN0KSk7DQogICAgICAgICAgICAgIHNuZC5iYXNlID0gcmVmOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBJZihuZXcgRXhpc3RlbmNlKGZzdCksIHNuZCwgew0KICAgICAgICAgICAgICBzb2FrOiB0cnVlDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9LCB0aGlzKSgpOw0KICAgICAgcmV0dXJuIHRoaXMudW5mb2xkZWRTb2FrID0gcmVzdWx0IHx8IGZhbHNlOw0KICAgIH07DQogICAgcmV0dXJuIFZhbHVlOw0KICB9KSgpOw0KICBleHBvcnRzLkNvbW1lbnQgPSBDb21tZW50ID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhDb21tZW50LCBCYXNlKTsNCiAgICBmdW5jdGlvbiBDb21tZW50KGNvbW1lbnQpIHsNCiAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7DQogICAgfQ0KICAgIENvbW1lbnQucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIENvbW1lbnQucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBUSElTOw0KICAgIENvbW1lbnQucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obywgbGV2ZWwpIHsNCiAgICAgIHZhciBjb2RlOw0KICAgICAgY29kZSA9ICcvKicgKyBtdWx0aWRlbnQodGhpcy5jb21tZW50LCB0aGlzLnRhYikgKyAnKi8nOw0KICAgICAgaWYgKChsZXZlbCB8fCBvLmxldmVsKSA9PT0gTEVWRUxfVE9QKSB7DQogICAgICAgIGNvZGUgPSBvLmluZGVudCArIGNvZGU7DQogICAgICB9DQogICAgICByZXR1cm4gY29kZTsNCiAgICB9Ow0KICAgIHJldHVybiBDb21tZW50Ow0KICB9KSgpOw0KICBleHBvcnRzLkNhbGwgPSBDYWxsID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhDYWxsLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBDYWxsKHZhcmlhYmxlLCBhcmdzLCBzb2FrKSB7DQogICAgICB0aGlzLmFyZ3MgPSBhcmdzICE9IG51bGwgPyBhcmdzIDogW107DQogICAgICB0aGlzLnNvYWsgPSBzb2FrOw0KICAgICAgdGhpcy5pc05ldyA9IGZhbHNlOw0KICAgICAgdGhpcy5pc1N1cGVyID0gdmFyaWFibGUgPT09ICdzdXBlcic7DQogICAgICB0aGlzLnZhcmlhYmxlID0gdGhpcy5pc1N1cGVyID8gbnVsbCA6IHZhcmlhYmxlOw0KICAgIH0NCiAgICBDYWxsLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsndmFyaWFibGUnLCAnYXJncyddOw0KICAgIENhbGwucHJvdG90eXBlLm5ld0luc3RhbmNlID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYmFzZTsNCiAgICAgIGJhc2UgPSB0aGlzLnZhcmlhYmxlLmJhc2UgfHwgdGhpcy52YXJpYWJsZTsNCiAgICAgIGlmIChiYXNlIGluc3RhbmNlb2YgQ2FsbCkgew0KICAgICAgICBiYXNlLm5ld0luc3RhbmNlKCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmlzTmV3ID0gdHJ1ZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgQ2FsbC5wcm90b3R5cGUuc3VwZXJSZWZlcmVuY2UgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgbWV0aG9kLCBuYW1lOw0KICAgICAgbWV0aG9kID0gby5zY29wZS5tZXRob2Q7DQogICAgICBpZiAoIW1ldGhvZCkgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignY2Fubm90IGNhbGwgc3VwZXIgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uLicpOw0KICAgICAgfQ0KICAgICAgbmFtZSA9IG1ldGhvZC5uYW1lOw0KICAgICAgaWYgKCFuYW1lKSB7DQogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdjYW5ub3QgY2FsbCBzdXBlciBvbiBhbiBhbm9ueW1vdXMgZnVuY3Rpb24uJyk7DQogICAgICB9DQogICAgICBpZiAobWV0aG9kLmtsYXNzKSB7DQogICAgICAgIHJldHVybiAiIiArIG1ldGhvZC5rbGFzcyArICIuX19zdXBlcl9fLiIgKyBuYW1lOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICIiICsgbmFtZSArICIuX19zdXBlcl9fLmNvbnN0cnVjdG9yIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlLnVuZm9sZFNvYWsgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY2FsbCwgaWZuLCBsZWZ0LCBsaXN0LCByaXRlLCBfaSwgX2xlbiwgX3JlZjIsIF9yZWYzOw0KICAgICAgaWYgKHRoaXMuc29haykgew0KICAgICAgICBpZiAodGhpcy52YXJpYWJsZSkgew0KICAgICAgICAgIGlmIChpZm4gPSB1bmZvbGRTb2FrKG8sIHRoaXMsICd2YXJpYWJsZScpKSB7DQogICAgICAgICAgICByZXR1cm4gaWZuOw0KICAgICAgICAgIH0NCiAgICAgICAgICBfcmVmMiA9IG5ldyBWYWx1ZSh0aGlzLnZhcmlhYmxlKS5jYWNoZVJlZmVyZW5jZShvKSwgbGVmdCA9IF9yZWYyWzBdLCByaXRlID0gX3JlZjJbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgbGVmdCA9IG5ldyBMaXRlcmFsKHRoaXMuc3VwZXJSZWZlcmVuY2UobykpOw0KICAgICAgICAgIHJpdGUgPSBuZXcgVmFsdWUobGVmdCk7DQogICAgICAgIH0NCiAgICAgICAgcml0ZSA9IG5ldyBDYWxsKHJpdGUsIHRoaXMuYXJncyk7DQogICAgICAgIHJpdGUuaXNOZXcgPSB0aGlzLmlzTmV3Ow0KICAgICAgICBsZWZ0ID0gbmV3IExpdGVyYWwoInR5cGVvZiAiICsgKGxlZnQuY29tcGlsZShvKSkgKyAiID09PSBcImZ1bmN0aW9uXCIiKTsNCiAgICAgICAgcmV0dXJuIG5ldyBJZihsZWZ0LCBuZXcgVmFsdWUocml0ZSksIHsNCiAgICAgICAgICBzb2FrOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgY2FsbCA9IHRoaXM7DQogICAgICBsaXN0ID0gW107DQogICAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgICBpZiAoY2FsbC52YXJpYWJsZSBpbnN0YW5jZW9mIENhbGwpIHsNCiAgICAgICAgICBsaXN0LnB1c2goY2FsbCk7DQogICAgICAgICAgY2FsbCA9IGNhbGwudmFyaWFibGU7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEoY2FsbC52YXJpYWJsZSBpbnN0YW5jZW9mIFZhbHVlKSkgew0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGxpc3QucHVzaChjYWxsKTsNCiAgICAgICAgaWYgKCEoKGNhbGwgPSBjYWxsLnZhcmlhYmxlLmJhc2UpIGluc3RhbmNlb2YgQ2FsbCkpIHsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgX3JlZjMgPSBsaXN0LnJldmVyc2UoKTsNCiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgY2FsbCA9IF9yZWYzW19pXTsNCiAgICAgICAgaWYgKGlmbikgew0KICAgICAgICAgIGlmIChjYWxsLnZhcmlhYmxlIGluc3RhbmNlb2YgQ2FsbCkgew0KICAgICAgICAgICAgY2FsbC52YXJpYWJsZSA9IGlmbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY2FsbC52YXJpYWJsZS5iYXNlID0gaWZuOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZm4gPSB1bmZvbGRTb2FrKG8sIGNhbGwsICd2YXJpYWJsZScpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGlmbjsNCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlLmZpbHRlckltcGxpY2l0T2JqZWN0cyA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgIHZhciBub2RlLCBub2Rlcywgb2JqLCBwcm9wLCBwcm9wZXJ0aWVzLCBfaSwgX2osIF9sZW4sIF9sZW4yLCBfcmVmMjsNCiAgICAgIG5vZGVzID0gW107DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGxpc3QubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgbm9kZSA9IGxpc3RbX2ldOw0KICAgICAgICBpZiAoISgodHlwZW9mIG5vZGUuaXNPYmplY3QgPT09ICJmdW5jdGlvbiIgPyBub2RlLmlzT2JqZWN0KCkgOiB2b2lkIDApICYmIG5vZGUuYmFzZS5nZW5lcmF0ZWQpKSB7DQogICAgICAgICAgbm9kZXMucHVzaChub2RlKTsNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBvYmogPSBudWxsOw0KICAgICAgICBfcmVmMiA9IG5vZGUuYmFzZS5wcm9wZXJ0aWVzOw0KICAgICAgICBmb3IgKF9qID0gMCwgX2xlbjIgPSBfcmVmMi5sZW5ndGg7IF9qIDwgX2xlbjI7IF9qKyspIHsNCiAgICAgICAgICBwcm9wID0gX3JlZjJbX2pdOw0KICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgQXNzaWduKSB7DQogICAgICAgICAgICBpZiAoIW9iaikgew0KICAgICAgICAgICAgICBub2Rlcy5wdXNoKG9iaiA9IG5ldyBPYmoocHJvcGVydGllcyA9IFtdLCB0cnVlKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcCk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG5vZGVzLnB1c2gocHJvcCk7DQogICAgICAgICAgICBvYmogPSBudWxsOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIG5vZGVzOw0KICAgIH07DQogICAgQ2FsbC5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYXJnLCBhcmdzLCBjb2RlLCBfcmVmMjsNCiAgICAgIGlmICgoX3JlZjIgPSB0aGlzLnZhcmlhYmxlKSAhPSBudWxsKSB7DQogICAgICAgIF9yZWYyLmZyb250ID0gdGhpcy5mcm9udDsNCiAgICAgIH0NCiAgICAgIGlmIChjb2RlID0gU3BsYXQuY29tcGlsZVNwbGF0dGVkQXJyYXkobywgdGhpcy5hcmdzLCB0cnVlKSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlU3BsYXQobywgY29kZSk7DQogICAgICB9DQogICAgICBhcmdzID0gdGhpcy5maWx0ZXJJbXBsaWNpdE9iamVjdHModGhpcy5hcmdzKTsNCiAgICAgIGFyZ3MgPSAoKGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgX2ksIF9sZW4sIF9yZXN1bHRzOw0KICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFyZ3MubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBhcmcgPSBhcmdzW19pXTsNCiAgICAgICAgICBfcmVzdWx0cy5wdXNoKGFyZy5jb21waWxlKG8sIExFVkVMX0xJU1QpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7DQogICAgICB9KSgpKS5qb2luKCcsICcpOw0KICAgICAgaWYgKHRoaXMuaXNTdXBlcikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdXBlclJlZmVyZW5jZShvKSArICgiLmNhbGwodGhpcyIgKyAoYXJncyAmJiAnLCAnICsgYXJncykgKyAiKSIpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLmlzTmV3ID8gJ25ldyAnIDogJycpICsgdGhpcy52YXJpYWJsZS5jb21waWxlKG8sIExFVkVMX0FDQ0VTUykgKyAoIigiICsgYXJncyArICIpIik7DQogICAgICB9DQogICAgfTsNCiAgICBDYWxsLnByb3RvdHlwZS5jb21waWxlU3VwZXIgPSBmdW5jdGlvbihhcmdzLCBvKSB7DQogICAgICByZXR1cm4gIiIgKyAodGhpcy5zdXBlclJlZmVyZW5jZShvKSkgKyAiLmNhbGwodGhpcyIgKyAoYXJncy5sZW5ndGggPyAnLCAnIDogJycpICsgYXJncyArICIpIjsNCiAgICB9Ow0KICAgIENhbGwucHJvdG90eXBlLmNvbXBpbGVTcGxhdCA9IGZ1bmN0aW9uKG8sIHNwbGF0QXJncykgew0KICAgICAgdmFyIGJhc2UsIGZ1biwgaWR0LCBuYW1lLCByZWY7DQogICAgICBpZiAodGhpcy5pc1N1cGVyKSB7DQogICAgICAgIHJldHVybiAiIiArICh0aGlzLnN1cGVyUmVmZXJlbmNlKG8pKSArICIuYXBwbHkodGhpcywgIiArIHNwbGF0QXJncyArICIpIjsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmlzTmV3KSB7DQogICAgICAgIGlkdCA9IHRoaXMudGFiICsgVEFCOw0KICAgICAgICByZXR1cm4gIihmdW5jdGlvbihmdW5jLCBhcmdzLCBjdG9yKSB7XG4iICsgaWR0ICsgImN0b3IucHJvdG90eXBlID0gZnVuYy5wcm90b3R5cGU7XG4iICsgaWR0ICsgInZhciBjaGlsZCA9IG5ldyBjdG9yLCByZXN1bHQgPSBmdW5jLmFwcGx5KGNoaWxkLCBhcmdzKTtcbiIgKyBpZHQgKyAicmV0dXJuIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgPyByZXN1bHQgOiBjaGlsZDtcbiIgKyB0aGlzLnRhYiArICJ9KSgiICsgKHRoaXMudmFyaWFibGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKSkgKyAiLCAiICsgc3BsYXRBcmdzICsgIiwgZnVuY3Rpb24oKSB7fSkiOw0KICAgICAgfQ0KICAgICAgYmFzZSA9IG5ldyBWYWx1ZSh0aGlzLnZhcmlhYmxlKTsNCiAgICAgIGlmICgobmFtZSA9IGJhc2UucHJvcGVydGllcy5wb3AoKSkgJiYgYmFzZS5pc0NvbXBsZXgoKSkgew0KICAgICAgICByZWYgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVmJyk7DQogICAgICAgIGZ1biA9ICIoIiArIHJlZiArICIgPSAiICsgKGJhc2UuY29tcGlsZShvLCBMRVZFTF9MSVNUKSkgKyAiKSIgKyAobmFtZS5jb21waWxlKG8pKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZ1biA9IGJhc2UuY29tcGlsZShvLCBMRVZFTF9BQ0NFU1MpOw0KICAgICAgICBpZiAoU0lNUExFTlVNLnRlc3QoZnVuKSkgew0KICAgICAgICAgIGZ1biA9ICIoIiArIGZ1biArICIpIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobmFtZSkgew0KICAgICAgICAgIHJlZiA9IGZ1bjsNCiAgICAgICAgICBmdW4gKz0gbmFtZS5jb21waWxlKG8pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlZiA9ICdudWxsJzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuICIiICsgZnVuICsgIi5hcHBseSgiICsgcmVmICsgIiwgIiArIHNwbGF0QXJncyArICIpIjsNCiAgICB9Ow0KICAgIHJldHVybiBDYWxsOw0KICB9KSgpOw0KICBleHBvcnRzLkV4dGVuZHMgPSBFeHRlbmRzID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhFeHRlbmRzLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBFeHRlbmRzKGNoaWxkLCBwYXJlbnQpIHsNCiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsNCiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50Ow0KICAgIH0NCiAgICBFeHRlbmRzLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnY2hpbGQnLCAncGFyZW50J107DQogICAgRXh0ZW5kcy5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHV0aWxpdHkoJ2hhc1Byb3AnKTsNCiAgICAgIHJldHVybiBuZXcgQ2FsbChuZXcgVmFsdWUobmV3IExpdGVyYWwodXRpbGl0eSgnZXh0ZW5kcycpKSksIFt0aGlzLmNoaWxkLCB0aGlzLnBhcmVudF0pLmNvbXBpbGUobyk7DQogICAgfTsNCiAgICByZXR1cm4gRXh0ZW5kczsNCiAgfSkoKTsNCiAgZXhwb3J0cy5BY2Nlc3MgPSBBY2Nlc3MgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEFjY2VzcywgQmFzZSk7DQogICAgZnVuY3Rpb24gQWNjZXNzKG5hbWUsIHRhZykgew0KICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCiAgICAgIHRoaXMubmFtZS5hc0tleSA9IHRydWU7DQogICAgICB0aGlzLnByb3RvID0gdGFnID09PSAncHJvdG8nID8gJy5wcm90b3R5cGUnIDogJyc7DQogICAgICB0aGlzLnNvYWsgPSB0YWcgPT09ICdzb2FrJzsNCiAgICB9DQogICAgQWNjZXNzLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnbmFtZSddOw0KICAgIEFjY2Vzcy5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBuYW1lOw0KICAgICAgbmFtZSA9IHRoaXMubmFtZS5jb21waWxlKG8pOw0KICAgICAgcmV0dXJuIHRoaXMucHJvdG8gKyAoSVNfU1RSSU5HLnRlc3QobmFtZSkgPyAiWyIgKyBuYW1lICsgIl0iIDogIi4iICsgbmFtZSk7DQogICAgfTsNCiAgICBBY2Nlc3MucHJvdG90eXBlLmlzQ29tcGxleCA9IE5POw0KICAgIHJldHVybiBBY2Nlc3M7DQogIH0pKCk7DQogIGV4cG9ydHMuSW5kZXggPSBJbmRleCA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoSW5kZXgsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEluZGV4KGluZGV4KSB7DQogICAgICB0aGlzLmluZGV4ID0gaW5kZXg7DQogICAgfQ0KICAgIEluZGV4LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnaW5kZXgnXTsNCiAgICBJbmRleC5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHJldHVybiAodGhpcy5wcm90byA/ICcucHJvdG90eXBlJyA6ICcnKSArICgiWyIgKyAodGhpcy5pbmRleC5jb21waWxlKG8sIExFVkVMX1BBUkVOKSkgKyAiXSIpOw0KICAgIH07DQogICAgSW5kZXgucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuaW5kZXguaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICByZXR1cm4gSW5kZXg7DQogIH0pKCk7DQogIGV4cG9ydHMuUmFuZ2UgPSBSYW5nZSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoUmFuZ2UsIEJhc2UpOw0KICAgIFJhbmdlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZnJvbScsICd0byddOw0KICAgIGZ1bmN0aW9uIFJhbmdlKGZyb20sIHRvLCB0YWcpIHsNCiAgICAgIHRoaXMuZnJvbSA9IGZyb207DQogICAgICB0aGlzLnRvID0gdG87DQogICAgICB0aGlzLmV4Y2x1c2l2ZSA9IHRhZyA9PT0gJ2V4Y2x1c2l2ZSc7DQogICAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXhjbHVzaXZlID8gJycgOiAnPSc7DQogICAgfQ0KICAgIFJhbmdlLnByb3RvdHlwZS5jb21waWxlVmFyaWFibGVzID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIHN0ZXAsIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgbyA9IG1lcmdlKG8sIHsNCiAgICAgICAgdG9wOiB0cnVlDQogICAgICB9KTsNCiAgICAgIF9yZWYyID0gdGhpcy5mcm9tLmNhY2hlKG8sIExFVkVMX0xJU1QpLCB0aGlzLmZyb20gPSBfcmVmMlswXSwgdGhpcy5mcm9tVmFyID0gX3JlZjJbMV07DQogICAgICBfcmVmMyA9IHRoaXMudG8uY2FjaGUobywgTEVWRUxfTElTVCksIHRoaXMudG8gPSBfcmVmM1swXSwgdGhpcy50b1ZhciA9IF9yZWYzWzFdOw0KICAgICAgaWYgKHN0ZXAgPSBkZWwobywgJ3N0ZXAnKSkgew0KICAgICAgICBfcmVmNCA9IHN0ZXAuY2FjaGUobywgTEVWRUxfTElTVCksIHRoaXMuc3RlcCA9IF9yZWY0WzBdLCB0aGlzLnN0ZXBWYXIgPSBfcmVmNFsxXTsNCiAgICAgIH0NCiAgICAgIF9yZWY1ID0gW3RoaXMuZnJvbVZhci5tYXRjaChTSU1QTEVOVU0pLCB0aGlzLnRvVmFyLm1hdGNoKFNJTVBMRU5VTSldLCB0aGlzLmZyb21OdW0gPSBfcmVmNVswXSwgdGhpcy50b051bSA9IF9yZWY1WzFdOw0KICAgICAgaWYgKHRoaXMuc3RlcFZhcikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGVwTnVtID0gdGhpcy5zdGVwVmFyLm1hdGNoKFNJTVBMRU5VTSk7DQogICAgICB9DQogICAgfTsNCiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29uZCwgY29uZFBhcnQsIGZyb20sIGd0LCBpZHgsIGtub3duLCBsdCwgc3RlcFBhcnQsIHRvLCB2YXJQYXJ0LCBfcmVmMiwgX3JlZjM7DQogICAgICBpZiAoIXRoaXMuZnJvbVZhcikgew0KICAgICAgICB0aGlzLmNvbXBpbGVWYXJpYWJsZXMobyk7DQogICAgICB9DQogICAgICBpZiAoIW8uaW5kZXgpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUFycmF5KG8pOw0KICAgICAgfQ0KICAgICAga25vd24gPSB0aGlzLmZyb21OdW0gJiYgdGhpcy50b051bTsNCiAgICAgIGlkeCA9IGRlbChvLCAnaW5kZXgnKTsNCiAgICAgIHZhclBhcnQgPSAiIiArIGlkeCArICIgPSAiICsgdGhpcy5mcm9tOw0KICAgICAgaWYgKHRoaXMudG8gIT09IHRoaXMudG9WYXIpIHsNCiAgICAgICAgdmFyUGFydCArPSAiLCAiICsgdGhpcy50bzsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLnN0ZXAgIT09IHRoaXMuc3RlcFZhcikgew0KICAgICAgICB2YXJQYXJ0ICs9ICIsICIgKyB0aGlzLnN0ZXA7DQogICAgICB9DQogICAgICBfcmVmMiA9IFsiIiArIGlkeCArICIgPCIgKyB0aGlzLmVxdWFscywgIiIgKyBpZHggKyAiID4iICsgdGhpcy5lcXVhbHNdLCBsdCA9IF9yZWYyWzBdLCBndCA9IF9yZWYyWzFdOw0KICAgICAgY29uZFBhcnQgPSB0aGlzLnN0ZXBOdW0gPyBjb25kUGFydCA9ICt0aGlzLnN0ZXBOdW0gPiAwID8gIiIgKyBsdCArICIgIiArIHRoaXMudG9WYXIgOiAiIiArIGd0ICsgIiAiICsgdGhpcy50b1ZhciA6IGtub3duID8gKChfcmVmMyA9IFsrdGhpcy5mcm9tTnVtLCArdGhpcy50b051bV0sIGZyb20gPSBfcmVmM1swXSwgdG8gPSBfcmVmM1sxXSwgX3JlZjMpLCBjb25kUGFydCA9IGZyb20gPD0gdG8gPyAiIiArIGx0ICsgIiAiICsgdG8gOiAiIiArIGd0ICsgIiAiICsgdG8pIDogKGNvbmQgPSAiIiArIHRoaXMuZnJvbVZhciArICIgPD0gIiArIHRoaXMudG9WYXIsIGNvbmRQYXJ0ID0gIiIgKyBjb25kICsgIiA/ICIgKyBsdCArICIgIiArIHRoaXMudG9WYXIgKyAiIDogIiArIGd0ICsgIiAiICsgdGhpcy50b1Zhcik7DQogICAgICBzdGVwUGFydCA9IHRoaXMuc3RlcFZhciA/ICIiICsgaWR4ICsgIiArPSAiICsgdGhpcy5zdGVwVmFyIDoga25vd24gPyBmcm9tIDw9IHRvID8gIiIgKyBpZHggKyAiKysiIDogIiIgKyBpZHggKyAiLS0iIDogIiIgKyBjb25kICsgIiA/ICIgKyBpZHggKyAiKysgOiAiICsgaWR4ICsgIi0tIjsNCiAgICAgIHJldHVybiAiIiArIHZhclBhcnQgKyAiOyAiICsgY29uZFBhcnQgKyAiOyAiICsgc3RlcFBhcnQ7DQogICAgfTsNCiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGlsZUFycmF5ID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGJvZHksIGNvbmQsIGksIGlkdCwgcG9zdCwgcHJlLCByYW5nZSwgcmVzdWx0LCB2YXJzLCBfaSwgX3JlZjIsIF9yZWYzLCBfcmVzdWx0czsNCiAgICAgIGlmICh0aGlzLmZyb21OdW0gJiYgdGhpcy50b051bSAmJiBNYXRoLmFicyh0aGlzLmZyb21OdW0gLSB0aGlzLnRvTnVtKSA8PSAyMCkgew0KICAgICAgICByYW5nZSA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICAgIGZvciAodmFyIF9pID0gX3JlZjIgPSArdGhpcy5mcm9tTnVtLCBfcmVmMyA9ICt0aGlzLnRvTnVtOyBfcmVmMiA8PSBfcmVmMyA/IF9pIDw9IF9yZWYzIDogX2kgPj0gX3JlZjM7IF9yZWYyIDw9IF9yZWYzID8gX2krKyA6IF9pLS0peyBfcmVzdWx0cy5wdXNoKF9pKTsgfQ0KICAgICAgICAgIHJldHVybiBfcmVzdWx0czsNCiAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgaWYgKHRoaXMuZXhjbHVzaXZlKSB7DQogICAgICAgICAgcmFuZ2UucG9wKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICJbIiArIChyYW5nZS5qb2luKCcsICcpKSArICJdIjsNCiAgICAgIH0NCiAgICAgIGlkdCA9IHRoaXMudGFiICsgVEFCOw0KICAgICAgaSA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdpJyk7DQogICAgICByZXN1bHQgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVzdWx0cycpOw0KICAgICAgcHJlID0gIlxuIiArIGlkdCArIHJlc3VsdCArICIgPSBbXTsiOw0KICAgICAgaWYgKHRoaXMuZnJvbU51bSAmJiB0aGlzLnRvTnVtKSB7DQogICAgICAgIG8uaW5kZXggPSBpOw0KICAgICAgICBib2R5ID0gdGhpcy5jb21waWxlTm9kZShvKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhcnMgPSAoIiIgKyBpICsgIiA9ICIgKyB0aGlzLmZyb20pICsgKHRoaXMudG8gIT09IHRoaXMudG9WYXIgPyAiLCAiICsgdGhpcy50byA6ICcnKTsNCiAgICAgICAgY29uZCA9ICIiICsgdGhpcy5mcm9tVmFyICsgIiA8PSAiICsgdGhpcy50b1ZhcjsNCiAgICAgICAgYm9keSA9ICJ2YXIgIiArIHZhcnMgKyAiOyAiICsgY29uZCArICIgPyAiICsgaSArICIgPCIgKyB0aGlzLmVxdWFscyArICIgIiArIHRoaXMudG9WYXIgKyAiIDogIiArIGkgKyAiID4iICsgdGhpcy5lcXVhbHMgKyAiICIgKyB0aGlzLnRvVmFyICsgIjsgIiArIGNvbmQgKyAiID8gIiArIGkgKyAiKysgOiAiICsgaSArICItLSI7DQogICAgICB9DQogICAgICBwb3N0ID0gInsgIiArIHJlc3VsdCArICIucHVzaCgiICsgaSArICIpOyB9XG4iICsgaWR0ICsgInJldHVybiAiICsgcmVzdWx0ICsgIjtcbiIgKyBvLmluZGVudDsNCiAgICAgIHJldHVybiAiKGZ1bmN0aW9uKCkgeyIgKyBwcmUgKyAiXG4iICsgaWR0ICsgImZvciAoIiArIGJvZHkgKyAiKSIgKyBwb3N0ICsgIn0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiOw0KICAgIH07DQogICAgcmV0dXJuIFJhbmdlOw0KICB9KSgpOw0KICBleHBvcnRzLlNsaWNlID0gU2xpY2UgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFNsaWNlLCBCYXNlKTsNCiAgICBTbGljZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3JhbmdlJ107DQogICAgZnVuY3Rpb24gU2xpY2UocmFuZ2UpIHsNCiAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsNCiAgICAgIFNsaWNlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KICAgIH0NCiAgICBTbGljZS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29tcGlsZWQsIGZyb20sIGZyb21TdHIsIHRvLCB0b1N0ciwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMucmFuZ2UsIHRvID0gX3JlZjIudG8sIGZyb20gPSBfcmVmMi5mcm9tOw0KICAgICAgZnJvbVN0ciA9IGZyb20gJiYgZnJvbS5jb21waWxlKG8sIExFVkVMX1BBUkVOKSB8fCAnMCc7DQogICAgICBjb21waWxlZCA9IHRvICYmIHRvLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOw0KICAgICAgaWYgKHRvICYmICEoIXRoaXMucmFuZ2UuZXhjbHVzaXZlICYmICtjb21waWxlZCA9PT0gLTEpKSB7DQogICAgICAgIHRvU3RyID0gJywgJyArICh0aGlzLnJhbmdlLmV4Y2x1c2l2ZSA/IGNvbXBpbGVkIDogU0lNUExFTlVNLnRlc3QoY29tcGlsZWQpID8gKCtjb21waWxlZCArIDEpLnRvU3RyaW5nKCkgOiAiKCIgKyBjb21waWxlZCArICIgKyAxKSB8fCA5ZTkiKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiAiLnNsaWNlKCIgKyBmcm9tU3RyICsgKHRvU3RyIHx8ICcnKSArICIpIjsNCiAgICB9Ow0KICAgIHJldHVybiBTbGljZTsNCiAgfSkoKTsNCiAgZXhwb3J0cy5PYmogPSBPYmogPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKE9iaiwgQmFzZSk7DQogICAgZnVuY3Rpb24gT2JqKHByb3BzLCBnZW5lcmF0ZWQpIHsNCiAgICAgIHRoaXMuZ2VuZXJhdGVkID0gZ2VuZXJhdGVkICE9IG51bGwgPyBnZW5lcmF0ZWQgOiBmYWxzZTsNCiAgICAgIHRoaXMub2JqZWN0cyA9IHRoaXMucHJvcGVydGllcyA9IHByb3BzIHx8IFtdOw0KICAgIH0NCiAgICBPYmoucHJvdG90eXBlLmNoaWxkcmVuID0gWydwcm9wZXJ0aWVzJ107DQogICAgT2JqLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBpLCBpZHQsIGluZGVudCwgam9pbiwgbGFzdE5vbmNvbSwgbm9kZSwgb2JqLCBwcm9wLCBwcm9wcywgX2ksIF9sZW47DQogICAgICBwcm9wcyA9IHRoaXMucHJvcGVydGllczsNCiAgICAgIGlmICghcHJvcHMubGVuZ3RoKSB7DQogICAgICAgIGlmICh0aGlzLmZyb250KSB7DQogICAgICAgICAgcmV0dXJuICcoe30pJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gJ3t9JzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVkKSB7DQogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gcHJvcHMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBub2RlID0gcHJvcHNbX2ldOw0KICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFsdWUpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGhhdmUgYW4gaW1wbGljaXQgdmFsdWUgaW4gYW4gaW1wbGljaXQgb2JqZWN0Jyk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZHQgPSBvLmluZGVudCArPSBUQUI7DQogICAgICBsYXN0Tm9uY29tID0gdGhpcy5sYXN0Tm9uQ29tbWVudCh0aGlzLnByb3BlcnRpZXMpOw0KICAgICAgcHJvcHMgPSAoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBfbGVuMiwgX3Jlc3VsdHM7DQogICAgICAgIF9yZXN1bHRzID0gW107DQogICAgICAgIGZvciAoaSA9IDAsIF9sZW4yID0gcHJvcHMubGVuZ3RoOyBpIDwgX2xlbjI7IGkrKykgew0KICAgICAgICAgIHByb3AgPSBwcm9wc1tpXTsNCiAgICAgICAgICBqb2luID0gaSA9PT0gcHJvcHMubGVuZ3RoIC0gMSA/ICcnIDogcHJvcCA9PT0gbGFzdE5vbmNvbSB8fCBwcm9wIGluc3RhbmNlb2YgQ29tbWVudCA/ICdcbicgOiAnLFxuJzsNCiAgICAgICAgICBpbmRlbnQgPSBwcm9wIGluc3RhbmNlb2YgQ29tbWVudCA/ICcnIDogaWR0Ow0KICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgVmFsdWUgJiYgcHJvcFsidGhpcyJdKSB7DQogICAgICAgICAgICBwcm9wID0gbmV3IEFzc2lnbihwcm9wLnByb3BlcnRpZXNbMF0ubmFtZSwgcHJvcCwgJ29iamVjdCcpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAoIShwcm9wIGluc3RhbmNlb2YgQ29tbWVudCkpIHsNCiAgICAgICAgICAgIGlmICghKHByb3AgaW5zdGFuY2VvZiBBc3NpZ24pKSB7DQogICAgICAgICAgICAgIHByb3AgPSBuZXcgQXNzaWduKHByb3AsIHByb3AsICdvYmplY3QnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIChwcm9wLnZhcmlhYmxlLmJhc2UgfHwgcHJvcC52YXJpYWJsZSkuYXNLZXkgPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBfcmVzdWx0cy5wdXNoKGluZGVudCArIHByb3AuY29tcGlsZShvLCBMRVZFTF9UT1ApICsgam9pbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkoKTsNCiAgICAgIHByb3BzID0gcHJvcHMuam9pbignJyk7DQogICAgICBvYmogPSAieyIgKyAocHJvcHMgJiYgJ1xuJyArIHByb3BzICsgJ1xuJyArIHRoaXMudGFiKSArICJ9IjsNCiAgICAgIGlmICh0aGlzLmZyb250KSB7DQogICAgICAgIHJldHVybiAiKCIgKyBvYmogKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gb2JqOw0KICAgICAgfQ0KICAgIH07DQogICAgT2JqLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgdmFyIHByb3AsIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIF9yZWYyID0gdGhpcy5wcm9wZXJ0aWVzOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICBwcm9wID0gX3JlZjJbX2ldOw0KICAgICAgICBpZiAocHJvcC5hc3NpZ25zKG5hbWUpKSB7DQogICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KICAgIHJldHVybiBPYmo7DQogIH0pKCk7DQogIGV4cG9ydHMuQXJyID0gQXJyID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhBcnIsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEFycihvYmpzKSB7DQogICAgICB0aGlzLm9iamVjdHMgPSBvYmpzIHx8IFtdOw0KICAgIH0NCiAgICBBcnIucHJvdG90eXBlLmNoaWxkcmVuID0gWydvYmplY3RzJ107DQogICAgQXJyLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHMgPSBDYWxsLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHM7DQogICAgQXJyLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCBvYmosIG9ianM7DQogICAgICBpZiAoIXRoaXMub2JqZWN0cy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuICdbXSc7DQogICAgICB9DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBvYmpzID0gdGhpcy5maWx0ZXJJbXBsaWNpdE9iamVjdHModGhpcy5vYmplY3RzKTsNCiAgICAgIGlmIChjb2RlID0gU3BsYXQuY29tcGlsZVNwbGF0dGVkQXJyYXkobywgb2JqcykpIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9DQogICAgICBjb2RlID0gKChmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVzdWx0czsNCiAgICAgICAgX3Jlc3VsdHMgPSBbXTsNCiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBvYmpzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgICAgb2JqID0gb2Jqc1tfaV07DQogICAgICAgICAgX3Jlc3VsdHMucHVzaChvYmouY29tcGlsZShvLCBMRVZFTF9MSVNUKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkoKSkuam9pbignLCAnKTsNCiAgICAgIGlmIChjb2RlLmluZGV4T2YoJ1xuJykgPj0gMCkgew0KICAgICAgICByZXR1cm4gIltcbiIgKyBvLmluZGVudCArIGNvZGUgKyAiXG4iICsgdGhpcy50YWIgKyAiXSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIlsiICsgY29kZSArICJdIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIEFyci5wcm90b3R5cGUuYXNzaWducyA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHZhciBvYmosIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIF9yZWYyID0gdGhpcy5vYmplY3RzOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICBvYmogPSBfcmVmMltfaV07DQogICAgICAgIGlmIChvYmouYXNzaWducyhuYW1lKSkgew0KICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCiAgICByZXR1cm4gQXJyOw0KICB9KSgpOw0KICBleHBvcnRzLkNsYXNzID0gQ2xhc3MgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKENsYXNzLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBDbGFzcyh2YXJpYWJsZSwgcGFyZW50LCBib2R5KSB7DQogICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7DQogICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsNCiAgICAgIHRoaXMuYm9keSA9IGJvZHkgIT0gbnVsbCA/IGJvZHkgOiBuZXcgQmxvY2s7DQogICAgICB0aGlzLmJvdW5kRnVuY3MgPSBbXTsNCiAgICAgIHRoaXMuYm9keS5jbGFzc0JvZHkgPSB0cnVlOw0KICAgIH0NCiAgICBDbGFzcy5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3ZhcmlhYmxlJywgJ3BhcmVudCcsICdib2R5J107DQogICAgQ2xhc3MucHJvdG90eXBlLmRldGVybWluZU5hbWUgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBkZWNsLCB0YWlsOw0KICAgICAgaWYgKCF0aGlzLnZhcmlhYmxlKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgICAgfQ0KICAgICAgZGVjbCA9ICh0YWlsID0gbGFzdCh0aGlzLnZhcmlhYmxlLnByb3BlcnRpZXMpKSA/IHRhaWwgaW5zdGFuY2VvZiBBY2Nlc3MgJiYgdGFpbC5uYW1lLnZhbHVlIDogdGhpcy52YXJpYWJsZS5iYXNlLnZhbHVlOw0KICAgICAgcmV0dXJuIGRlY2wgJiYgKGRlY2wgPSBJREVOVElGSUVSLnRlc3QoZGVjbCkgJiYgZGVjbCk7DQogICAgfTsNCiAgICBDbGFzcy5wcm90b3R5cGUuc2V0Q29udGV4dCA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHJldHVybiB0aGlzLmJvZHkudHJhdmVyc2VDaGlsZHJlbihmYWxzZSwgZnVuY3Rpb24obm9kZSkgew0KICAgICAgICBpZiAobm9kZS5jbGFzc0JvZHkpIHsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBMaXRlcmFsICYmIG5vZGUudmFsdWUgPT09ICd0aGlzJykgew0KICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlID0gbmFtZTsNCiAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29kZSkgew0KICAgICAgICAgIG5vZGUua2xhc3MgPSBuYW1lOw0KICAgICAgICAgIGlmIChub2RlLmJvdW5kKSB7DQogICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZXh0ID0gbmFtZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH07DQogICAgQ2xhc3MucHJvdG90eXBlLmFkZEJvdW5kRnVuY3Rpb25zID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGJuYW1lLCBidmFyLCBfaSwgX2xlbiwgX3JlZjIsIF9yZXN1bHRzOw0KICAgICAgaWYgKHRoaXMuYm91bmRGdW5jcy5sZW5ndGgpIHsNCiAgICAgICAgX3JlZjIgPSB0aGlzLmJvdW5kRnVuY3M7DQogICAgICAgIF9yZXN1bHRzID0gW107DQogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBidmFyID0gX3JlZjJbX2ldOw0KICAgICAgICAgIGJuYW1lID0gYnZhci5jb21waWxlKG8pOw0KICAgICAgICAgIF9yZXN1bHRzLnB1c2godGhpcy5jdG9yLmJvZHkudW5zaGlmdChuZXcgTGl0ZXJhbCgidGhpcy4iICsgYm5hbWUgKyAiID0gIiArICh1dGlsaXR5KCdiaW5kJykpICsgIih0aGlzLiIgKyBibmFtZSArICIsIHRoaXMpIikpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7DQogICAgICB9DQogICAgfTsNCiAgICBDbGFzcy5wcm90b3R5cGUuYWRkUHJvcGVydGllcyA9IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIG8pIHsNCiAgICAgIHZhciBhc3NpZ24sIGJhc2UsIGV4cHJzLCBmdW5jLCBwcm9wczsNCiAgICAgIHByb3BzID0gbm9kZS5iYXNlLnByb3BlcnRpZXMuc2xpY2UoMCk7DQogICAgICBleHBycyA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIF9yZXN1bHRzOw0KICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICB3aGlsZSAoYXNzaWduID0gcHJvcHMuc2hpZnQoKSkgew0KICAgICAgICAgIGlmIChhc3NpZ24gaW5zdGFuY2VvZiBBc3NpZ24pIHsNCiAgICAgICAgICAgIGJhc2UgPSBhc3NpZ24udmFyaWFibGUuYmFzZTsNCiAgICAgICAgICAgIGRlbGV0ZSBhc3NpZ24uY29udGV4dDsNCiAgICAgICAgICAgIGZ1bmMgPSBhc3NpZ24udmFsdWU7DQogICAgICAgICAgICBpZiAoYmFzZS52YWx1ZSA9PT0gJ2NvbnN0cnVjdG9yJykgew0KICAgICAgICAgICAgICBpZiAodGhpcy5jdG9yKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IgaW4gYSBjbGFzcycpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmIChmdW5jLmJvdW5kKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZGVmaW5lIGEgY29uc3RydWN0b3IgYXMgYSBib3VuZCBmdW5jdGlvbicpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmIChmdW5jIGluc3RhbmNlb2YgQ29kZSkgew0KICAgICAgICAgICAgICAgIGFzc2lnbiA9IHRoaXMuY3RvciA9IGZ1bmM7DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5leHRlcm5hbEN0b3IgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgnY2xhc3MnKTsNCiAgICAgICAgICAgICAgICBhc3NpZ24gPSBuZXcgQXNzaWduKG5ldyBMaXRlcmFsKHRoaXMuZXh0ZXJuYWxDdG9yKSwgZnVuYyk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmICghYXNzaWduLnZhcmlhYmxlWyJ0aGlzIl0pIHsNCiAgICAgICAgICAgICAgICBhc3NpZ24udmFyaWFibGUgPSBuZXcgVmFsdWUobmV3IExpdGVyYWwobmFtZSksIFtuZXcgQWNjZXNzKGJhc2UsICdwcm90bycpXSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKGZ1bmMgaW5zdGFuY2VvZiBDb2RlICYmIGZ1bmMuYm91bmQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kRnVuY3MucHVzaChiYXNlKTsNCiAgICAgICAgICAgICAgICBmdW5jLmJvdW5kID0gZmFsc2U7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgX3Jlc3VsdHMucHVzaChhc3NpZ24pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBfcmVzdWx0czsNCiAgICAgIH0pLmNhbGwodGhpcyk7DQogICAgICByZXR1cm4gY29tcGFjdChleHBycyk7DQogICAgfTsNCiAgICBDbGFzcy5wcm90b3R5cGUud2Fsa0JvZHkgPSBmdW5jdGlvbihuYW1lLCBvKSB7DQogICAgICByZXR1cm4gdGhpcy50cmF2ZXJzZUNoaWxkcmVuKGZhbHNlLCBfX2JpbmQoZnVuY3Rpb24oY2hpbGQpIHsNCiAgICAgICAgdmFyIGV4cHMsIGksIG5vZGUsIF9sZW4sIF9yZWYyOw0KICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDbGFzcykgew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCbG9jaykgew0KICAgICAgICAgIF9yZWYyID0gZXhwcyA9IGNoaWxkLmV4cHJlc3Npb25zOw0KICAgICAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgICAgIG5vZGUgPSBfcmVmMltpXTsNCiAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFsdWUgJiYgbm9kZS5pc09iamVjdCh0cnVlKSkgew0KICAgICAgICAgICAgICBleHBzW2ldID0gdGhpcy5hZGRQcm9wZXJ0aWVzKG5vZGUsIG5hbWUsIG8pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICByZXR1cm4gY2hpbGQuZXhwcmVzc2lvbnMgPSBleHBzID0gZmxhdHRlbihleHBzKTsNCiAgICAgICAgfQ0KICAgICAgfSwgdGhpcykpOw0KICAgIH07DQogICAgQ2xhc3MucHJvdG90eXBlLmVuc3VyZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgaWYgKCF0aGlzLmN0b3IpIHsNCiAgICAgICAgdGhpcy5jdG9yID0gbmV3IENvZGU7DQogICAgICAgIGlmICh0aGlzLnBhcmVudCkgew0KICAgICAgICAgIHRoaXMuY3Rvci5ib2R5LnB1c2gobmV3IExpdGVyYWwoIiIgKyBuYW1lICsgIi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSIpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5leHRlcm5hbEN0b3IpIHsNCiAgICAgICAgICB0aGlzLmN0b3IuYm9keS5wdXNoKG5ldyBMaXRlcmFsKCIiICsgdGhpcy5leHRlcm5hbEN0b3IgKyAiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5ib2R5LmV4cHJlc3Npb25zLnVuc2hpZnQodGhpcy5jdG9yKTsNCiAgICAgIH0NCiAgICAgIHRoaXMuY3Rvci5jdG9yID0gdGhpcy5jdG9yLm5hbWUgPSBuYW1lOw0KICAgICAgdGhpcy5jdG9yLmtsYXNzID0gbnVsbDsNCiAgICAgIHJldHVybiB0aGlzLmN0b3Iubm9SZXR1cm4gPSB0cnVlOw0KICAgIH07DQogICAgQ2xhc3MucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGRlY2wsIGtsYXNzLCBsbmFtZSwgbmFtZTsNCiAgICAgIGRlY2wgPSB0aGlzLmRldGVybWluZU5hbWUoKTsNCiAgICAgIG5hbWUgPSBkZWNsIHx8IHRoaXMubmFtZSB8fCAnX0NsYXNzJzsNCiAgICAgIGxuYW1lID0gbmV3IExpdGVyYWwobmFtZSk7DQogICAgICB0aGlzLnNldENvbnRleHQobmFtZSk7DQogICAgICB0aGlzLndhbGtCb2R5KG5hbWUsIG8pOw0KICAgICAgdGhpcy5lbnN1cmVDb25zdHJ1Y3RvcihuYW1lKTsNCiAgICAgIGlmICh0aGlzLnBhcmVudCkgew0KICAgICAgICB0aGlzLmJvZHkuZXhwcmVzc2lvbnMudW5zaGlmdChuZXcgRXh0ZW5kcyhsbmFtZSwgdGhpcy5wYXJlbnQpKTsNCiAgICAgIH0NCiAgICAgIGlmICghKHRoaXMuY3RvciBpbnN0YW5jZW9mIENvZGUpKSB7DQogICAgICAgIHRoaXMuYm9keS5leHByZXNzaW9ucy51bnNoaWZ0KHRoaXMuY3Rvcik7DQogICAgICB9DQogICAgICB0aGlzLmJvZHkuZXhwcmVzc2lvbnMucHVzaChsbmFtZSk7DQogICAgICB0aGlzLmFkZEJvdW5kRnVuY3Rpb25zKG8pOw0KICAgICAga2xhc3MgPSBuZXcgUGFyZW5zKENsb3N1cmUud3JhcCh0aGlzLmJvZHkpLCB0cnVlKTsNCiAgICAgIGlmICh0aGlzLnZhcmlhYmxlKSB7DQogICAgICAgIGtsYXNzID0gbmV3IEFzc2lnbih0aGlzLnZhcmlhYmxlLCBrbGFzcyk7DQogICAgICB9DQogICAgICByZXR1cm4ga2xhc3MuY29tcGlsZShvKTsNCiAgICB9Ow0KICAgIHJldHVybiBDbGFzczsNCiAgfSkoKTsNCiAgZXhwb3J0cy5Bc3NpZ24gPSBBc3NpZ24gPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEFzc2lnbiwgQmFzZSk7DQogICAgZnVuY3Rpb24gQXNzaWduKHZhcmlhYmxlLCB2YWx1ZSwgY29udGV4dCwgb3B0aW9ucykgew0KICAgICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlOw0KICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsNCiAgICAgIHRoaXMucGFyYW0gPSBvcHRpb25zICYmIG9wdGlvbnMucGFyYW07DQogICAgfQ0KICAgIEFzc2lnbi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3ZhcmlhYmxlJywgJ3ZhbHVlJ107DQogICAgQXNzaWduLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgcmV0dXJuIHRoaXNbdGhpcy5jb250ZXh0ID09PSAnb2JqZWN0JyA/ICd2YWx1ZScgOiAndmFyaWFibGUnXS5hc3NpZ25zKG5hbWUpOw0KICAgIH07DQogICAgQXNzaWduLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuIHVuZm9sZFNvYWsobywgdGhpcywgJ3ZhcmlhYmxlJyk7DQogICAgfTsNCiAgICBBc3NpZ24ucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGlzVmFsdWUsIG1hdGNoLCBuYW1lLCB2YWwsIF9yZWYyOw0KICAgICAgaWYgKGlzVmFsdWUgPSB0aGlzLnZhcmlhYmxlIGluc3RhbmNlb2YgVmFsdWUpIHsNCiAgICAgICAgaWYgKHRoaXMudmFyaWFibGUuaXNBcnJheSgpIHx8IHRoaXMudmFyaWFibGUuaXNPYmplY3QoKSkgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVQYXR0ZXJuTWF0Y2gobyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMudmFyaWFibGUuaXNTcGxpY2UoKSkgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTcGxpY2Uobyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKChfcmVmMiA9IHRoaXMuY29udGV4dCkgPT09ICd8fD0nIHx8IF9yZWYyID09PSAnJiY9JyB8fCBfcmVmMiA9PT0gJz89Jykgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVDb25kaXRpb25hbChvKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgbmFtZSA9IHRoaXMudmFyaWFibGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGlmICghKHRoaXMuY29udGV4dCB8fCB0aGlzLnZhcmlhYmxlLmlzQXNzaWduYWJsZSgpKSkgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcigiXCIiICsgKHRoaXMudmFyaWFibGUuY29tcGlsZShvKSkgKyAiXCIgY2Fubm90IGJlIGFzc2lnbmVkLiIpOw0KICAgICAgfQ0KICAgICAgaWYgKCEodGhpcy5jb250ZXh0IHx8IGlzVmFsdWUgJiYgKHRoaXMudmFyaWFibGUubmFtZXNwYWNlZCB8fCB0aGlzLnZhcmlhYmxlLmhhc1Byb3BlcnRpZXMoKSkpKSB7DQogICAgICAgIGlmICh0aGlzLnBhcmFtKSB7DQogICAgICAgICAgby5zY29wZS5hZGQobmFtZSwgJ3ZhcicpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG8uc2NvcGUuZmluZChuYW1lKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBDb2RlICYmIChtYXRjaCA9IE1FVEhPRF9ERUYuZXhlYyhuYW1lKSkpIHsNCiAgICAgICAgdGhpcy52YWx1ZS5uYW1lID0gbWF0Y2hbMl07DQogICAgICAgIGlmIChtYXRjaFsxXSkgew0KICAgICAgICAgIHRoaXMudmFsdWUua2xhc3MgPSBtYXRjaFsxXTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdmFsID0gdGhpcy52YWx1ZS5jb21waWxlKG8sIExFVkVMX0xJU1QpOw0KICAgICAgaWYgKHRoaXMuY29udGV4dCA9PT0gJ29iamVjdCcpIHsNCiAgICAgICAgcmV0dXJuICIiICsgbmFtZSArICI6ICIgKyB2YWw7DQogICAgICB9DQogICAgICB2YWwgPSBuYW1lICsgKCIgIiArICh0aGlzLmNvbnRleHQgfHwgJz0nKSArICIgIikgKyB2YWw7DQogICAgICBpZiAoby5sZXZlbCA8PSBMRVZFTF9MSVNUKSB7DQogICAgICAgIHJldHVybiB2YWw7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIigiICsgdmFsICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgQXNzaWduLnByb3RvdHlwZS5jb21waWxlUGF0dGVybk1hdGNoID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGFjYywgYXNzaWducywgY29kZSwgaSwgaWR4LCBpc09iamVjdCwgaXZhciwgb2JqLCBvYmplY3RzLCBvbGVuLCByZWYsIHJlc3QsIHNwbGF0LCB0b3AsIHZhbCwgdmFsdWUsIHZ2YXIsIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgdG9wID0gby5sZXZlbCA9PT0gTEVWRUxfVE9QOw0KICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlOw0KICAgICAgb2JqZWN0cyA9IHRoaXMudmFyaWFibGUuYmFzZS5vYmplY3RzOw0KICAgICAgaWYgKCEob2xlbiA9IG9iamVjdHMubGVuZ3RoKSkgew0KICAgICAgICBjb2RlID0gdmFsdWUuY29tcGlsZShvKTsNCiAgICAgICAgaWYgKG8ubGV2ZWwgPj0gTEVWRUxfT1ApIHsNCiAgICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaXNPYmplY3QgPSB0aGlzLnZhcmlhYmxlLmlzT2JqZWN0KCk7DQogICAgICBpZiAodG9wICYmIG9sZW4gPT09IDEgJiYgISgob2JqID0gb2JqZWN0c1swXSkgaW5zdGFuY2VvZiBTcGxhdCkpIHsNCiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFzc2lnbikgew0KICAgICAgICAgIF9yZWYyID0gb2JqLCBpZHggPSBfcmVmMi52YXJpYWJsZS5iYXNlLCBvYmogPSBfcmVmMi52YWx1ZTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpZiAob2JqLmJhc2UgaW5zdGFuY2VvZiBQYXJlbnMpIHsNCiAgICAgICAgICAgIF9yZWYzID0gbmV3IFZhbHVlKG9iai51bndyYXBBbGwoKSkuY2FjaGVSZWZlcmVuY2UobyksIG9iaiA9IF9yZWYzWzBdLCBpZHggPSBfcmVmM1sxXTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWR4ID0gaXNPYmplY3QgPyBvYmpbInRoaXMiXSA/IG9iai5wcm9wZXJ0aWVzWzBdLm5hbWUgOiBvYmogOiBuZXcgTGl0ZXJhbCgwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgYWNjID0gSURFTlRJRklFUi50ZXN0KGlkeC51bndyYXAoKS52YWx1ZSB8fCAwKTsNCiAgICAgICAgdmFsdWUgPSBuZXcgVmFsdWUodmFsdWUpOw0KICAgICAgICB2YWx1ZS5wcm9wZXJ0aWVzLnB1c2gobmV3IChhY2MgPyBBY2Nlc3MgOiBJbmRleCkoaWR4KSk7DQogICAgICAgIHJldHVybiBuZXcgQXNzaWduKG9iaiwgdmFsdWUsIG51bGwsIHsNCiAgICAgICAgICBwYXJhbTogdGhpcy5wYXJhbQ0KICAgICAgICB9KS5jb21waWxlKG8sIExFVkVMX1RPUCk7DQogICAgICB9DQogICAgICB2dmFyID0gdmFsdWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGFzc2lnbnMgPSBbXTsNCiAgICAgIHNwbGF0ID0gZmFsc2U7DQogICAgICBpZiAoIUlERU5USUZJRVIudGVzdCh2dmFyKSB8fCB0aGlzLnZhcmlhYmxlLmFzc2lnbnModnZhcikpIHsNCiAgICAgICAgYXNzaWducy5wdXNoKCIiICsgKHJlZiA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSkgKyAiID0gIiArIHZ2YXIpOw0KICAgICAgICB2dmFyID0gcmVmOw0KICAgICAgfQ0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IG9iamVjdHMubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7DQogICAgICAgIG9iaiA9IG9iamVjdHNbaV07DQogICAgICAgIGlkeCA9IGk7DQogICAgICAgIGlmIChpc09iamVjdCkgew0KICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBc3NpZ24pIHsNCiAgICAgICAgICAgIF9yZWY0ID0gb2JqLCBpZHggPSBfcmVmNC52YXJpYWJsZS5iYXNlLCBvYmogPSBfcmVmNC52YWx1ZTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKG9iai5iYXNlIGluc3RhbmNlb2YgUGFyZW5zKSB7DQogICAgICAgICAgICAgIF9yZWY1ID0gbmV3IFZhbHVlKG9iai51bndyYXBBbGwoKSkuY2FjaGVSZWZlcmVuY2UobyksIG9iaiA9IF9yZWY1WzBdLCBpZHggPSBfcmVmNVsxXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlkeCA9IG9ialsidGhpcyJdID8gb2JqLnByb3BlcnRpZXNbMF0ubmFtZSA6IG9iajsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFzcGxhdCAmJiBvYmogaW5zdGFuY2VvZiBTcGxhdCkgew0KICAgICAgICAgIHZhbCA9ICIiICsgb2xlbiArICIgPD0gIiArIHZ2YXIgKyAiLmxlbmd0aCA/ICIgKyAodXRpbGl0eSgnc2xpY2UnKSkgKyAiLmNhbGwoIiArIHZ2YXIgKyAiLCAiICsgaTsNCiAgICAgICAgICBpZiAocmVzdCA9IG9sZW4gLSBpIC0gMSkgew0KICAgICAgICAgICAgaXZhciA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdpJyk7DQogICAgICAgICAgICB2YWwgKz0gIiwgIiArIGl2YXIgKyAiID0gIiArIHZ2YXIgKyAiLmxlbmd0aCAtICIgKyByZXN0ICsgIikgOiAoIiArIGl2YXIgKyAiID0gIiArIGkgKyAiLCBbXSkiOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YWwgKz0gIikgOiBbXSI7DQogICAgICAgICAgfQ0KICAgICAgICAgIHZhbCA9IG5ldyBMaXRlcmFsKHZhbCk7DQogICAgICAgICAgc3BsYXQgPSAiIiArIGl2YXIgKyAiKysiOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTcGxhdCkgew0KICAgICAgICAgICAgb2JqID0gb2JqLm5hbWUuY29tcGlsZShvKTsNCiAgICAgICAgICAgIHRocm93IFN5bnRheEVycm9yKCJtdWx0aXBsZSBzcGxhdHMgYXJlIGRpc2FsbG93ZWQgaW4gYW4gYXNzaWdubWVudDogIiArIG9iaiArICIgLi4uIik7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0eXBlb2YgaWR4ID09PSAnbnVtYmVyJykgew0KICAgICAgICAgICAgaWR4ID0gbmV3IExpdGVyYWwoc3BsYXQgfHwgaWR4KTsNCiAgICAgICAgICAgIGFjYyA9IGZhbHNlOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBhY2MgPSBpc09iamVjdCAmJiBJREVOVElGSUVSLnRlc3QoaWR4LnVud3JhcCgpLnZhbHVlIHx8IDApOw0KICAgICAgICAgIH0NCiAgICAgICAgICB2YWwgPSBuZXcgVmFsdWUobmV3IExpdGVyYWwodnZhciksIFtuZXcgKGFjYyA/IEFjY2VzcyA6IEluZGV4KShpZHgpXSk7DQogICAgICAgIH0NCiAgICAgICAgYXNzaWducy5wdXNoKG5ldyBBc3NpZ24ob2JqLCB2YWwsIG51bGwsIHsNCiAgICAgICAgICBwYXJhbTogdGhpcy5wYXJhbQ0KICAgICAgICB9KS5jb21waWxlKG8sIExFVkVMX1RPUCkpOw0KICAgICAgfQ0KICAgICAgaWYgKCF0b3ApIHsNCiAgICAgICAgYXNzaWducy5wdXNoKHZ2YXIpOw0KICAgICAgfQ0KICAgICAgY29kZSA9IGFzc2lnbnMuam9pbignLCAnKTsNCiAgICAgIGlmIChvLmxldmVsIDwgTEVWRUxfTElTVCkgew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAiKCIgKyBjb2RlICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgQXNzaWduLnByb3RvdHlwZS5jb21waWxlQ29uZGl0aW9uYWwgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgbGVmdCwgcml0ZSwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMudmFyaWFibGUuY2FjaGVSZWZlcmVuY2UobyksIGxlZnQgPSBfcmVmMlswXSwgcml0ZSA9IF9yZWYyWzFdOw0KICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKHRoaXMuY29udGV4dCwgIj8iKSA+PSAwKSB7DQogICAgICAgIG8uaXNFeGlzdGVudGlhbEVxdWFscyA9IHRydWU7DQogICAgICB9DQogICAgICByZXR1cm4gbmV3IE9wKHRoaXMuY29udGV4dC5zbGljZSgwLCAtMSksIGxlZnQsIG5ldyBBc3NpZ24ocml0ZSwgdGhpcy52YWx1ZSwgJz0nKSkuY29tcGlsZShvKTsNCiAgICB9Ow0KICAgIEFzc2lnbi5wcm90b3R5cGUuY29tcGlsZVNwbGljZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCBleGNsdXNpdmUsIGZyb20sIGZyb21EZWNsLCBmcm9tUmVmLCBuYW1lLCB0bywgdmFsRGVmLCB2YWxSZWYsIF9yZWYyLCBfcmVmMywgX3JlZjQ7DQogICAgICBfcmVmMiA9IHRoaXMudmFyaWFibGUucHJvcGVydGllcy5wb3AoKS5yYW5nZSwgZnJvbSA9IF9yZWYyLmZyb20sIHRvID0gX3JlZjIudG8sIGV4Y2x1c2l2ZSA9IF9yZWYyLmV4Y2x1c2l2ZTsNCiAgICAgIG5hbWUgPSB0aGlzLnZhcmlhYmxlLmNvbXBpbGUobyk7DQogICAgICBfcmVmMyA9IChmcm9tICE9IG51bGwgPyBmcm9tLmNhY2hlKG8sIExFVkVMX09QKSA6IHZvaWQgMCkgfHwgWycwJywgJzAnXSwgZnJvbURlY2wgPSBfcmVmM1swXSwgZnJvbVJlZiA9IF9yZWYzWzFdOw0KICAgICAgaWYgKHRvKSB7DQogICAgICAgIGlmICgoZnJvbSAhPSBudWxsID8gZnJvbS5pc1NpbXBsZU51bWJlcigpIDogdm9pZCAwKSAmJiB0by5pc1NpbXBsZU51bWJlcigpKSB7DQogICAgICAgICAgdG8gPSArdG8uY29tcGlsZShvKSAtICtmcm9tUmVmOw0KICAgICAgICAgIGlmICghZXhjbHVzaXZlKSB7DQogICAgICAgICAgICB0byArPSAxOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0byA9IHRvLmNvbXBpbGUobykgKyAnIC0gJyArIGZyb21SZWY7DQogICAgICAgICAgaWYgKCFleGNsdXNpdmUpIHsNCiAgICAgICAgICAgIHRvICs9ICcgKyAxJzsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRvID0gIjllOSI7DQogICAgICB9DQogICAgICBfcmVmNCA9IHRoaXMudmFsdWUuY2FjaGUobywgTEVWRUxfTElTVCksIHZhbERlZiA9IF9yZWY0WzBdLCB2YWxSZWYgPSBfcmVmNFsxXTsNCiAgICAgIGNvZGUgPSAiW10uc3BsaWNlLmFwcGx5KCIgKyBuYW1lICsgIiwgWyIgKyBmcm9tRGVjbCArICIsICIgKyB0byArICJdLmNvbmNhdCgiICsgdmFsRGVmICsgIikpLCAiICsgdmFsUmVmOw0KICAgICAgaWYgKG8ubGV2ZWwgPiBMRVZFTF9UT1ApIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIHJldHVybiBBc3NpZ247DQogIH0pKCk7DQogIGV4cG9ydHMuQ29kZSA9IENvZGUgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKENvZGUsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIENvZGUocGFyYW1zLCBib2R5LCB0YWcpIHsNCiAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdOw0KICAgICAgdGhpcy5ib2R5ID0gYm9keSB8fCBuZXcgQmxvY2s7DQogICAgICB0aGlzLmJvdW5kID0gdGFnID09PSAnYm91bmRmdW5jJzsNCiAgICAgIGlmICh0aGlzLmJvdW5kKSB7DQogICAgICAgIHRoaXMuY29udGV4dCA9ICd0aGlzJzsNCiAgICAgIH0NCiAgICB9DQogICAgQ29kZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3BhcmFtcycsICdib2R5J107DQogICAgQ29kZS5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhIXRoaXMuY3RvcjsNCiAgICB9Ow0KICAgIENvZGUucHJvdG90eXBlLmp1bXBzID0gTk87DQogICAgQ29kZS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29kZSwgZXhwcnMsIGksIGlkdCwgbGl0LCBwLCBwYXJhbSwgcmVmLCBzcGxhdHMsIHYsIHZhbCwgdmFycywgd2FzRW1wdHksIF9pLCBfaiwgX2ssIF9sZW4sIF9sZW4yLCBfbGVuMywgX2xlbjQsIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1Ow0KICAgICAgby5zY29wZSA9IG5ldyBTY29wZShvLnNjb3BlLCB0aGlzLmJvZHksIHRoaXMpOw0KICAgICAgby5zY29wZS5zaGFyZWQgPSBkZWwobywgJ3NoYXJlZFNjb3BlJyk7DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBkZWxldGUgby5iYXJlOw0KICAgICAgdmFycyA9IFtdOw0KICAgICAgZXhwcnMgPSBbXTsNCiAgICAgIF9yZWYyID0gdGhpcy5wYXJhbXM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHBhcmFtID0gX3JlZjJbX2ldOw0KICAgICAgICBpZiAocGFyYW0uc3BsYXQpIHsNCiAgICAgICAgICBfcmVmMyA9IHRoaXMucGFyYW1zOw0KICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMjsgX2orKykgew0KICAgICAgICAgICAgcCA9IF9yZWYzW19qXTsNCiAgICAgICAgICAgIGlmIChwLm5hbWUudmFsdWUpIHsNCiAgICAgICAgICAgICAgby5zY29wZS5hZGQocC5uYW1lLnZhbHVlLCAndmFyJywgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIHNwbGF0cyA9IG5ldyBBc3NpZ24obmV3IFZhbHVlKG5ldyBBcnIoKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdmFyIF9rLCBfbGVuMywgX3JlZjQsIF9yZXN1bHRzOw0KICAgICAgICAgICAgX3JlZjQgPSB0aGlzLnBhcmFtczsNCiAgICAgICAgICAgIF9yZXN1bHRzID0gW107DQogICAgICAgICAgICBmb3IgKF9rID0gMCwgX2xlbjMgPSBfcmVmNC5sZW5ndGg7IF9rIDwgX2xlbjM7IF9rKyspIHsNCiAgICAgICAgICAgICAgcCA9IF9yZWY0W19rXTsNCiAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChwLmFzUmVmZXJlbmNlKG8pKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0czsNCiAgICAgICAgICB9KS5jYWxsKHRoaXMpKSksIG5ldyBWYWx1ZShuZXcgTGl0ZXJhbCgnYXJndW1lbnRzJykpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgX3JlZjQgPSB0aGlzLnBhcmFtczsNCiAgICAgIGZvciAoX2sgPSAwLCBfbGVuMyA9IF9yZWY0Lmxlbmd0aDsgX2sgPCBfbGVuMzsgX2srKykgew0KICAgICAgICBwYXJhbSA9IF9yZWY0W19rXTsNCiAgICAgICAgaWYgKHBhcmFtLmlzQ29tcGxleCgpKSB7DQogICAgICAgICAgdmFsID0gcmVmID0gcGFyYW0uYXNSZWZlcmVuY2Uobyk7DQogICAgICAgICAgaWYgKHBhcmFtLnZhbHVlKSB7DQogICAgICAgICAgICB2YWwgPSBuZXcgT3AoJz8nLCByZWYsIHBhcmFtLnZhbHVlKTsNCiAgICAgICAgICB9DQogICAgICAgICAgZXhwcnMucHVzaChuZXcgQXNzaWduKG5ldyBWYWx1ZShwYXJhbS5uYW1lKSwgdmFsLCAnPScsIHsNCiAgICAgICAgICAgIHBhcmFtOiB0cnVlDQogICAgICAgICAgfSkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlZiA9IHBhcmFtOw0KICAgICAgICAgIGlmIChwYXJhbS52YWx1ZSkgew0KICAgICAgICAgICAgbGl0ID0gbmV3IExpdGVyYWwocmVmLm5hbWUudmFsdWUgKyAnID09IG51bGwnKTsNCiAgICAgICAgICAgIHZhbCA9IG5ldyBBc3NpZ24obmV3IFZhbHVlKHBhcmFtLm5hbWUpLCBwYXJhbS52YWx1ZSwgJz0nKTsNCiAgICAgICAgICAgIGV4cHJzLnB1c2gobmV3IElmKGxpdCwgdmFsKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghc3BsYXRzKSB7DQogICAgICAgICAgdmFycy5wdXNoKHJlZik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHdhc0VtcHR5ID0gdGhpcy5ib2R5LmlzRW1wdHkoKTsNCiAgICAgIGlmIChzcGxhdHMpIHsNCiAgICAgICAgZXhwcnMudW5zaGlmdChzcGxhdHMpOw0KICAgICAgfQ0KICAgICAgaWYgKGV4cHJzLmxlbmd0aCkgew0KICAgICAgICAoX3JlZjUgPSB0aGlzLmJvZHkuZXhwcmVzc2lvbnMpLnVuc2hpZnQuYXBwbHkoX3JlZjUsIGV4cHJzKTsNCiAgICAgIH0NCiAgICAgIGlmICghc3BsYXRzKSB7DQogICAgICAgIGZvciAoaSA9IDAsIF9sZW40ID0gdmFycy5sZW5ndGg7IGkgPCBfbGVuNDsgaSsrKSB7DQogICAgICAgICAgdiA9IHZhcnNbaV07DQogICAgICAgICAgby5zY29wZS5wYXJhbWV0ZXIodmFyc1tpXSA9IHYuY29tcGlsZShvKSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmICghKHdhc0VtcHR5IHx8IHRoaXMubm9SZXR1cm4pKSB7DQogICAgICAgIHRoaXMuYm9keS5tYWtlUmV0dXJuKCk7DQogICAgICB9DQogICAgICBpZHQgPSBvLmluZGVudDsNCiAgICAgIGNvZGUgPSAnZnVuY3Rpb24nOw0KICAgICAgaWYgKHRoaXMuY3Rvcikgew0KICAgICAgICBjb2RlICs9ICcgJyArIHRoaXMubmFtZTsNCiAgICAgIH0NCiAgICAgIGNvZGUgKz0gJygnICsgdmFycy5qb2luKCcsICcpICsgJykgeyc7DQogICAgICBpZiAoIXRoaXMuYm9keS5pc0VtcHR5KCkpIHsNCiAgICAgICAgY29kZSArPSAiXG4iICsgKHRoaXMuYm9keS5jb21waWxlV2l0aERlY2xhcmF0aW9ucyhvKSkgKyAiXG4iICsgdGhpcy50YWI7DQogICAgICB9DQogICAgICBjb2RlICs9ICd9JzsNCiAgICAgIGlmICh0aGlzLmN0b3IpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMudGFiICsgY29kZTsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmJvdW5kKSB7DQogICAgICAgIHJldHVybiB1dGlsaXR5KCdiaW5kJykgKyAoIigiICsgY29kZSArICIsICIgKyB0aGlzLmNvbnRleHQgKyAiKSIpOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZnJvbnQgfHwgKG8ubGV2ZWwgPj0gTEVWRUxfQUNDRVNTKSkgew0KICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBjb2RlOw0KICAgICAgfQ0KICAgIH07DQogICAgQ29kZS5wcm90b3R5cGUudHJhdmVyc2VDaGlsZHJlbiA9IGZ1bmN0aW9uKGNyb3NzU2NvcGUsIGZ1bmMpIHsNCiAgICAgIGlmIChjcm9zc1Njb3BlKSB7DQogICAgICAgIHJldHVybiBDb2RlLl9fc3VwZXJfXy50cmF2ZXJzZUNoaWxkcmVuLmNhbGwodGhpcywgY3Jvc3NTY29wZSwgZnVuYyk7DQogICAgICB9DQogICAgfTsNCiAgICByZXR1cm4gQ29kZTsNCiAgfSkoKTsNCiAgZXhwb3J0cy5QYXJhbSA9IFBhcmFtID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhQYXJhbSwgQmFzZSk7DQogICAgZnVuY3Rpb24gUGFyYW0obmFtZSwgdmFsdWUsIHNwbGF0KSB7DQogICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICAgICAgdGhpcy5zcGxhdCA9IHNwbGF0Ow0KICAgIH0NCiAgICBQYXJhbS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ25hbWUnLCAndmFsdWUnXTsNCiAgICBQYXJhbS5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHJldHVybiB0aGlzLm5hbWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICB9Ow0KICAgIFBhcmFtLnByb3RvdHlwZS5hc1JlZmVyZW5jZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBub2RlOw0KICAgICAgaWYgKHRoaXMucmVmZXJlbmNlKSB7DQogICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZTsNCiAgICAgIH0NCiAgICAgIG5vZGUgPSB0aGlzLm5hbWU7DQogICAgICBpZiAobm9kZVsidGhpcyJdKSB7DQogICAgICAgIG5vZGUgPSBub2RlLnByb3BlcnRpZXNbMF0ubmFtZTsNCiAgICAgICAgaWYgKG5vZGUudmFsdWUucmVzZXJ2ZWQpIHsNCiAgICAgICAgICBub2RlID0gbmV3IExpdGVyYWwoJ18nICsgbm9kZS52YWx1ZSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAobm9kZS5pc0NvbXBsZXgoKSkgew0KICAgICAgICBub2RlID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ2FyZycpKTsNCiAgICAgIH0NCiAgICAgIG5vZGUgPSBuZXcgVmFsdWUobm9kZSk7DQogICAgICBpZiAodGhpcy5zcGxhdCkgew0KICAgICAgICBub2RlID0gbmV3IFNwbGF0KG5vZGUpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlID0gbm9kZTsNCiAgICB9Ow0KICAgIFBhcmFtLnByb3RvdHlwZS5pc0NvbXBsZXggPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLm5hbWUuaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICByZXR1cm4gUGFyYW07DQogIH0pKCk7DQogIGV4cG9ydHMuU3BsYXQgPSBTcGxhdCA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoU3BsYXQsIEJhc2UpOw0KICAgIFNwbGF0LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnbmFtZSddOw0KICAgIFNwbGF0LnByb3RvdHlwZS5pc0Fzc2lnbmFibGUgPSBZRVM7DQogICAgZnVuY3Rpb24gU3BsYXQobmFtZSkgew0KICAgICAgdGhpcy5uYW1lID0gbmFtZS5jb21waWxlID8gbmFtZSA6IG5ldyBMaXRlcmFsKG5hbWUpOw0KICAgIH0NCiAgICBTcGxhdC5wcm90b3R5cGUuYXNzaWducyA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHJldHVybiB0aGlzLm5hbWUuYXNzaWducyhuYW1lKTsNCiAgICB9Ow0KICAgIFNwbGF0LnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obykgew0KICAgICAgaWYgKHRoaXMuaW5kZXggIT0gbnVsbCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlUGFyYW0obyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5uYW1lLmNvbXBpbGUobyk7DQogICAgICB9DQogICAgfTsNCiAgICBTcGxhdC5jb21waWxlU3BsYXR0ZWRBcnJheSA9IGZ1bmN0aW9uKG8sIGxpc3QsIGFwcGx5KSB7DQogICAgICB2YXIgYXJncywgYmFzZSwgY29kZSwgaSwgaW5kZXgsIG5vZGUsIF9sZW47DQogICAgICBpbmRleCA9IC0xOw0KICAgICAgd2hpbGUgKChub2RlID0gbGlzdFsrK2luZGV4XSkgJiYgIShub2RlIGluc3RhbmNlb2YgU3BsYXQpKSB7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgaWYgKGluZGV4ID49IGxpc3QubGVuZ3RoKSB7DQogICAgICAgIHJldHVybiAnJzsNCiAgICAgIH0NCiAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkgew0KICAgICAgICBjb2RlID0gbGlzdFswXS5jb21waWxlKG8sIExFVkVMX0xJU1QpOw0KICAgICAgICBpZiAoYXBwbHkpIHsNCiAgICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gIiIgKyAodXRpbGl0eSgnc2xpY2UnKSkgKyAiLmNhbGwoIiArIGNvZGUgKyAiKSI7DQogICAgICB9DQogICAgICBhcmdzID0gbGlzdC5zbGljZShpbmRleCk7DQogICAgICBmb3IgKGkgPSAwLCBfbGVuID0gYXJncy5sZW5ndGg7IGkgPCBfbGVuOyBpKyspIHsNCiAgICAgICAgbm9kZSA9IGFyZ3NbaV07DQogICAgICAgIGNvZGUgPSBub2RlLmNvbXBpbGUobywgTEVWRUxfTElTVCk7DQogICAgICAgIGFyZ3NbaV0gPSBub2RlIGluc3RhbmNlb2YgU3BsYXQgPyAiIiArICh1dGlsaXR5KCdzbGljZScpKSArICIuY2FsbCgiICsgY29kZSArICIpIiA6ICJbIiArIGNvZGUgKyAiXSI7DQogICAgICB9DQogICAgICBpZiAoaW5kZXggPT09IDApIHsNCiAgICAgICAgcmV0dXJuIGFyZ3NbMF0gKyAoIi5jb25jYXQoIiArIChhcmdzLnNsaWNlKDEpLmpvaW4oJywgJykpICsgIikiKTsNCiAgICAgIH0NCiAgICAgIGJhc2UgPSAoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBfaSwgX2xlbjIsIF9yZWYyLCBfcmVzdWx0czsNCiAgICAgICAgX3JlZjIgPSBsaXN0LnNsaWNlKDAsIGluZGV4KTsNCiAgICAgICAgX3Jlc3VsdHMgPSBbXTsNCiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4yID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW4yOyBfaSsrKSB7DQogICAgICAgICAgbm9kZSA9IF9yZWYyW19pXTsNCiAgICAgICAgICBfcmVzdWx0cy5wdXNoKG5vZGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkoKTsNCiAgICAgIHJldHVybiAiWyIgKyAoYmFzZS5qb2luKCcsICcpKSArICJdLmNvbmNhdCgiICsgKGFyZ3Muam9pbignLCAnKSkgKyAiKSI7DQogICAgfTsNCiAgICByZXR1cm4gU3BsYXQ7DQogIH0pKCk7DQogIGV4cG9ydHMuV2hpbGUgPSBXaGlsZSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoV2hpbGUsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIFdoaWxlKGNvbmRpdGlvbiwgb3B0aW9ucykgew0KICAgICAgdGhpcy5jb25kaXRpb24gPSAob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5pbnZlcnQgOiB2b2lkIDApID8gY29uZGl0aW9uLmludmVydCgpIDogY29uZGl0aW9uOw0KICAgICAgdGhpcy5ndWFyZCA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZ3VhcmQgOiB2b2lkIDA7DQogICAgfQ0KICAgIFdoaWxlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnY29uZGl0aW9uJywgJ2d1YXJkJywgJ2JvZHknXTsNCiAgICBXaGlsZS5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBZRVM7DQogICAgV2hpbGUucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHRoaXMucmV0dXJucyA9IHRydWU7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIFdoaWxlLnByb3RvdHlwZS5hZGRCb2R5ID0gZnVuY3Rpb24oYm9keSkgew0KICAgICAgdGhpcy5ib2R5ID0gYm9keTsNCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgV2hpbGUucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZXhwcmVzc2lvbnMsIG5vZGUsIF9pLCBfbGVuOw0KICAgICAgZXhwcmVzc2lvbnMgPSB0aGlzLmJvZHkuZXhwcmVzc2lvbnM7DQogICAgICBpZiAoIWV4cHJlc3Npb25zLmxlbmd0aCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGV4cHJlc3Npb25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIG5vZGUgPSBleHByZXNzaW9uc1tfaV07DQogICAgICAgIGlmIChub2RlLmp1bXBzKHsNCiAgICAgICAgICBsb29wOiB0cnVlDQogICAgICAgIH0pKSB7DQogICAgICAgICAgcmV0dXJuIG5vZGU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KICAgIFdoaWxlLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBib2R5LCBjb2RlLCBydmFyLCBzZXQ7DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBzZXQgPSAnJzsNCiAgICAgIGJvZHkgPSB0aGlzLmJvZHk7DQogICAgICBpZiAoYm9keS5pc0VtcHR5KCkpIHsNCiAgICAgICAgYm9keSA9ICcnOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKG8ubGV2ZWwgPiBMRVZFTF9UT1AgfHwgdGhpcy5yZXR1cm5zKSB7DQogICAgICAgICAgcnZhciA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZXN1bHRzJyk7DQogICAgICAgICAgc2V0ID0gIiIgKyB0aGlzLnRhYiArIHJ2YXIgKyAiID0gW107XG4iOw0KICAgICAgICAgIGlmIChib2R5KSB7DQogICAgICAgICAgICBib2R5ID0gUHVzaC53cmFwKHJ2YXIsIGJvZHkpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5ndWFyZCkgew0KICAgICAgICAgIGJvZHkgPSBCbG9jay53cmFwKFtuZXcgSWYodGhpcy5ndWFyZCwgYm9keSldKTsNCiAgICAgICAgfQ0KICAgICAgICBib2R5ID0gIlxuIiArIChib2R5LmNvbXBpbGUobywgTEVWRUxfVE9QKSkgKyAiXG4iICsgdGhpcy50YWI7DQogICAgICB9DQogICAgICBjb2RlID0gc2V0ICsgdGhpcy50YWIgKyAoIndoaWxlICgiICsgKHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pKSArICIpIHsiICsgYm9keSArICJ9Iik7DQogICAgICBpZiAodGhpcy5yZXR1cm5zKSB7DQogICAgICAgIGNvZGUgKz0gIlxuIiArIHRoaXMudGFiICsgInJldHVybiAiICsgcnZhciArICI7IjsNCiAgICAgIH0NCiAgICAgIHJldHVybiBjb2RlOw0KICAgIH07DQogICAgcmV0dXJuIFdoaWxlOw0KICB9KSgpOw0KICBleHBvcnRzLk9wID0gT3AgPSAoZnVuY3Rpb24oKSB7DQogICAgdmFyIENPTlZFUlNJT05TLCBJTlZFUlNJT05TOw0KICAgIF9fZXh0ZW5kcyhPcCwgQmFzZSk7DQogICAgZnVuY3Rpb24gT3Aob3AsIGZpcnN0LCBzZWNvbmQsIGZsaXApIHsNCiAgICAgIHZhciBjYWxsOw0KICAgICAgaWYgKG9wID09PSAnaW4nKSB7DQogICAgICAgIHJldHVybiBuZXcgSW4oZmlyc3QsIHNlY29uZCk7DQogICAgICB9DQogICAgICBpZiAob3AgPT09ICdkbycpIHsNCiAgICAgICAgY2FsbCA9IG5ldyBDYWxsKGZpcnN0LCBmaXJzdC5wYXJhbXMgfHwgW10pOw0KICAgICAgICBjYWxsWyJkbyJdID0gdHJ1ZTsNCiAgICAgICAgcmV0dXJuIGNhbGw7DQogICAgICB9DQogICAgICBpZiAob3AgPT09ICduZXcnKSB7DQogICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIENhbGwgJiYgIWZpcnN0WyJkbyJdKSB7DQogICAgICAgICAgcmV0dXJuIGZpcnN0Lm5ld0luc3RhbmNlKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQ29kZSAmJiBmaXJzdC5ib3VuZCB8fCBmaXJzdFsiZG8iXSkgew0KICAgICAgICAgIGZpcnN0ID0gbmV3IFBhcmVucyhmaXJzdCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHRoaXMub3BlcmF0b3IgPSBDT05WRVJTSU9OU1tvcF0gfHwgb3A7DQogICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7DQogICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsNCiAgICAgIHRoaXMuZmxpcCA9ICEhZmxpcDsNCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH0NCiAgICBDT05WRVJTSU9OUyA9IHsNCiAgICAgICc9PSc6ICc9PT0nLA0KICAgICAgJyE9JzogJyE9PScsDQogICAgICAnb2YnOiAnaW4nDQogICAgfTsNCiAgICBJTlZFUlNJT05TID0gew0KICAgICAgJyE9PSc6ICc9PT0nLA0KICAgICAgJz09PSc6ICchPT0nDQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2ZpcnN0JywgJ3NlY29uZCddOw0KICAgIE9wLnByb3RvdHlwZS5pc1NpbXBsZU51bWJlciA9IE5POw0KICAgIE9wLnByb3RvdHlwZS5pc1VuYXJ5ID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gIXRoaXMuc2Vjb25kOw0KICAgIH07DQogICAgT3AucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIF9yZWYyOw0KICAgICAgcmV0dXJuICEodGhpcy5pc1VuYXJ5KCkgJiYgKChfcmVmMiA9IHRoaXMub3BlcmF0b3IpID09PSAnKycgfHwgX3JlZjIgPT09ICctJykpIHx8IHRoaXMuZmlyc3QuaXNDb21wbGV4KCk7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuaXNDaGFpbmFibGUgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBfcmVmMjsNCiAgICAgIHJldHVybiAoX3JlZjIgPSB0aGlzLm9wZXJhdG9yKSA9PT0gJzwnIHx8IF9yZWYyID09PSAnPicgfHwgX3JlZjIgPT09ICc+PScgfHwgX3JlZjIgPT09ICc8PScgfHwgX3JlZjIgPT09ICc9PT0nIHx8IF9yZWYyID09PSAnIT09JzsNCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhbGxJbnZlcnRhYmxlLCBjdXJyLCBmc3QsIG9wLCBfcmVmMjsNCiAgICAgIGlmICh0aGlzLmlzQ2hhaW5hYmxlKCkgJiYgdGhpcy5maXJzdC5pc0NoYWluYWJsZSgpKSB7DQogICAgICAgIGFsbEludmVydGFibGUgPSB0cnVlOw0KICAgICAgICBjdXJyID0gdGhpczsNCiAgICAgICAgd2hpbGUgKGN1cnIgJiYgY3Vyci5vcGVyYXRvcikgew0KICAgICAgICAgIGFsbEludmVydGFibGUgJiYgKGFsbEludmVydGFibGUgPSBjdXJyLm9wZXJhdG9yIGluIElOVkVSU0lPTlMpOw0KICAgICAgICAgIGN1cnIgPSBjdXJyLmZpcnN0Ow0KICAgICAgICB9DQogICAgICAgIGlmICghYWxsSW52ZXJ0YWJsZSkgew0KICAgICAgICAgIHJldHVybiBuZXcgUGFyZW5zKHRoaXMpLmludmVydCgpOw0KICAgICAgICB9DQogICAgICAgIGN1cnIgPSB0aGlzOw0KICAgICAgICB3aGlsZSAoY3VyciAmJiBjdXJyLm9wZXJhdG9yKSB7DQogICAgICAgICAgY3Vyci5pbnZlcnQgPSAhY3Vyci5pbnZlcnQ7DQogICAgICAgICAgY3Vyci5vcGVyYXRvciA9IElOVkVSU0lPTlNbY3Vyci5vcGVyYXRvcl07DQogICAgICAgICAgY3VyciA9IGN1cnIuZmlyc3Q7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICB9IGVsc2UgaWYgKG9wID0gSU5WRVJTSU9OU1t0aGlzLm9wZXJhdG9yXSkgew0KICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3A7DQogICAgICAgIGlmICh0aGlzLmZpcnN0LnVud3JhcCgpIGluc3RhbmNlb2YgT3ApIHsNCiAgICAgICAgICB0aGlzLmZpcnN0LmludmVydCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgfSBlbHNlIGlmICh0aGlzLnNlY29uZCkgew0KICAgICAgICByZXR1cm4gbmV3IFBhcmVucyh0aGlzKS5pbnZlcnQoKTsNCiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVyYXRvciA9PT0gJyEnICYmIChmc3QgPSB0aGlzLmZpcnN0LnVud3JhcCgpKSBpbnN0YW5jZW9mIE9wICYmICgoX3JlZjIgPSBmc3Qub3BlcmF0b3IpID09PSAnIScgfHwgX3JlZjIgPT09ICdpbicgfHwgX3JlZjIgPT09ICdpbnN0YW5jZW9mJykpIHsNCiAgICAgICAgcmV0dXJuIGZzdDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBuZXcgT3AoJyEnLCB0aGlzKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIF9yZWYyOw0KICAgICAgcmV0dXJuICgoX3JlZjIgPSB0aGlzLm9wZXJhdG9yKSA9PT0gJysrJyB8fCBfcmVmMiA9PT0gJy0tJyB8fCBfcmVmMiA9PT0gJ2RlbGV0ZScpICYmIHVuZm9sZFNvYWsobywgdGhpcywgJ2ZpcnN0Jyk7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29kZTsNCiAgICAgIGlmICh0aGlzLmlzVW5hcnkoKSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlVW5hcnkobyk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5pc0NoYWluYWJsZSgpICYmIHRoaXMuZmlyc3QuaXNDaGFpbmFibGUoKSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlQ2hhaW4obyk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz8nKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVFeGlzdGVuY2Uobyk7DQogICAgICB9DQogICAgICB0aGlzLmZpcnN0LmZyb250ID0gdGhpcy5mcm9udDsNCiAgICAgIGNvZGUgPSB0aGlzLmZpcnN0LmNvbXBpbGUobywgTEVWRUxfT1ApICsgJyAnICsgdGhpcy5vcGVyYXRvciArICcgJyArIHRoaXMuc2Vjb25kLmNvbXBpbGUobywgTEVWRUxfT1ApOw0KICAgICAgaWYgKG8ubGV2ZWwgPD0gTEVWRUxfT1ApIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS5jb21waWxlQ2hhaW4gPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29kZSwgZnN0LCBzaGFyZWQsIF9yZWYyOw0KICAgICAgX3JlZjIgPSB0aGlzLmZpcnN0LnNlY29uZC5jYWNoZShvKSwgdGhpcy5maXJzdC5zZWNvbmQgPSBfcmVmMlswXSwgc2hhcmVkID0gX3JlZjJbMV07DQogICAgICBmc3QgPSB0aGlzLmZpcnN0LmNvbXBpbGUobywgTEVWRUxfT1ApOw0KICAgICAgY29kZSA9ICIiICsgZnN0ICsgIiAiICsgKHRoaXMuaW52ZXJ0ID8gJyYmJyA6ICd8fCcpICsgIiAiICsgKHNoYXJlZC5jb21waWxlKG8pKSArICIgIiArIHRoaXMub3BlcmF0b3IgKyAiICIgKyAodGhpcy5zZWNvbmQuY29tcGlsZShvLCBMRVZFTF9PUCkpOw0KICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUuY29tcGlsZUV4aXN0ZW5jZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBmc3QsIHJlZjsNCiAgICAgIGlmICh0aGlzLmZpcnN0LmlzQ29tcGxleCgpKSB7DQogICAgICAgIHJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSk7DQogICAgICAgIGZzdCA9IG5ldyBQYXJlbnMobmV3IEFzc2lnbihyZWYsIHRoaXMuZmlyc3QpKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZzdCA9IHRoaXMuZmlyc3Q7DQogICAgICAgIHJlZiA9IGZzdDsNCiAgICAgIH0NCiAgICAgIHJldHVybiBuZXcgSWYobmV3IEV4aXN0ZW5jZShmc3QpLCByZWYsIHsNCiAgICAgICAgdHlwZTogJ2lmJw0KICAgICAgfSkuYWRkRWxzZSh0aGlzLnNlY29uZCkuY29tcGlsZShvKTsNCiAgICB9Ow0KICAgIE9wLnByb3RvdHlwZS5jb21waWxlVW5hcnkgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgb3AsIHBhcnRzOw0KICAgICAgcGFydHMgPSBbb3AgPSB0aGlzLm9wZXJhdG9yXTsNCiAgICAgIGlmICgob3AgPT09ICduZXcnIHx8IG9wID09PSAndHlwZW9mJyB8fCBvcCA9PT0gJ2RlbGV0ZScpIHx8IChvcCA9PT0gJysnIHx8IG9wID09PSAnLScpICYmIHRoaXMuZmlyc3QgaW5zdGFuY2VvZiBPcCAmJiB0aGlzLmZpcnN0Lm9wZXJhdG9yID09PSBvcCkgew0KICAgICAgICBwYXJ0cy5wdXNoKCcgJyk7DQogICAgICB9DQogICAgICBpZiAob3AgPT09ICduZXcnICYmIHRoaXMuZmlyc3QuaXNTdGF0ZW1lbnQobykpIHsNCiAgICAgICAgdGhpcy5maXJzdCA9IG5ldyBQYXJlbnModGhpcy5maXJzdCk7DQogICAgICB9DQogICAgICBwYXJ0cy5wdXNoKHRoaXMuZmlyc3QuY29tcGlsZShvLCBMRVZFTF9PUCkpOw0KICAgICAgaWYgKHRoaXMuZmxpcCkgew0KICAgICAgICBwYXJ0cy5yZXZlcnNlKCk7DQogICAgICB9DQogICAgICByZXR1cm4gcGFydHMuam9pbignJyk7DQogICAgfTsNCiAgICBPcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpZHQpIHsNCiAgICAgIHJldHVybiBPcC5fX3N1cGVyX18udG9TdHJpbmcuY2FsbCh0aGlzLCBpZHQsIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgJyArIHRoaXMub3BlcmF0b3IpOw0KICAgIH07DQogICAgcmV0dXJuIE9wOw0KICB9KSgpOw0KICBleHBvcnRzLkluID0gSW4gPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKEluLCBCYXNlKTsNCiAgICBmdW5jdGlvbiBJbihvYmplY3QsIGFycmF5KSB7DQogICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsNCiAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsNCiAgICB9DQogICAgSW4ucHJvdG90eXBlLmNoaWxkcmVuID0gWydvYmplY3QnLCAnYXJyYXknXTsNCiAgICBJbi5wcm90b3R5cGUuaW52ZXJ0ID0gTkVHQVRFOw0KICAgIEluLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBoYXNTcGxhdCwgb2JqLCBfaSwgX2xlbiwgX3JlZjI7DQogICAgICBpZiAodGhpcy5hcnJheSBpbnN0YW5jZW9mIFZhbHVlICYmIHRoaXMuYXJyYXkuaXNBcnJheSgpKSB7DQogICAgICAgIF9yZWYyID0gdGhpcy5hcnJheS5iYXNlLm9iamVjdHM7DQogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgICBvYmogPSBfcmVmMltfaV07DQogICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNwbGF0KSB7DQogICAgICAgICAgICBoYXNTcGxhdCA9IHRydWU7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFoYXNTcGxhdCkgew0KICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVPclRlc3Qobyk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVMb29wVGVzdChvKTsNCiAgICB9Ow0KICAgIEluLnByb3RvdHlwZS5jb21waWxlT3JUZXN0ID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIGNtcCwgY25qLCBpLCBpdGVtLCByZWYsIHN1YiwgdGVzdHMsIF9yZWYyLCBfcmVmMzsNCiAgICAgIF9yZWYyID0gdGhpcy5vYmplY3QuY2FjaGUobywgTEVWRUxfT1ApLCBzdWIgPSBfcmVmMlswXSwgcmVmID0gX3JlZjJbMV07DQogICAgICBfcmVmMyA9IHRoaXMubmVnYXRlZCA/IFsnICE9PSAnLCAnICYmICddIDogWycgPT09ICcsICcgfHwgJ10sIGNtcCA9IF9yZWYzWzBdLCBjbmogPSBfcmVmM1sxXTsNCiAgICAgIHRlc3RzID0gKGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgX2xlbiwgX3JlZjQsIF9yZXN1bHRzOw0KICAgICAgICBfcmVmNCA9IHRoaXMuYXJyYXkuYmFzZS5vYmplY3RzOw0KICAgICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgICBmb3IgKGkgPSAwLCBfbGVuID0gX3JlZjQubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7DQogICAgICAgICAgaXRlbSA9IF9yZWY0W2ldOw0KICAgICAgICAgIF9yZXN1bHRzLnB1c2goKGkgPyByZWYgOiBzdWIpICsgY21wICsgaXRlbS5jb21waWxlKG8sIExFVkVMX09QKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgICAgfSkuY2FsbCh0aGlzKTsNCiAgICAgIGlmICh0ZXN0cy5sZW5ndGggPT09IDApIHsNCiAgICAgICAgcmV0dXJuICdmYWxzZSc7DQogICAgICB9DQogICAgICB0ZXN0cyA9IHRlc3RzLmpvaW4oY25qKTsNCiAgICAgIGlmIChvLmxldmVsIDwgTEVWRUxfT1ApIHsNCiAgICAgICAgcmV0dXJuIHRlc3RzOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICIoIiArIHRlc3RzICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgSW4ucHJvdG90eXBlLmNvbXBpbGVMb29wVGVzdCA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb2RlLCByZWYsIHN1YiwgX3JlZjI7DQogICAgICBfcmVmMiA9IHRoaXMub2JqZWN0LmNhY2hlKG8sIExFVkVMX0xJU1QpLCBzdWIgPSBfcmVmMlswXSwgcmVmID0gX3JlZjJbMV07DQogICAgICBjb2RlID0gdXRpbGl0eSgnaW5kZXhPZicpICsgKCIuY2FsbCgiICsgKHRoaXMuYXJyYXkuY29tcGlsZShvLCBMRVZFTF9MSVNUKSkgKyAiLCAiICsgcmVmICsgIikgIikgKyAodGhpcy5uZWdhdGVkID8gJzwgMCcgOiAnPj0gMCcpOw0KICAgICAgaWYgKHN1YiA9PT0gcmVmKSB7DQogICAgICAgIHJldHVybiBjb2RlOw0KICAgICAgfQ0KICAgICAgY29kZSA9IHN1YiArICcsICcgKyBjb2RlOw0KICAgICAgaWYgKG8ubGV2ZWwgPCBMRVZFTF9MSVNUKSB7DQogICAgICAgIHJldHVybiBjb2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9DQogICAgfTsNCiAgICBJbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpZHQpIHsNCiAgICAgIHJldHVybiBJbi5fX3N1cGVyX18udG9TdHJpbmcuY2FsbCh0aGlzLCBpZHQsIHRoaXMuY29uc3RydWN0b3IubmFtZSArICh0aGlzLm5lZ2F0ZWQgPyAnIScgOiAnJykpOw0KICAgIH07DQogICAgcmV0dXJuIEluOw0KICB9KSgpOw0KICBleHBvcnRzLlRyeSA9IFRyeSA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoVHJ5LCBCYXNlKTsNCiAgICBmdW5jdGlvbiBUcnkoYXR0ZW1wdCwgZXJyb3IsIHJlY292ZXJ5LCBlbnN1cmUpIHsNCiAgICAgIHRoaXMuYXR0ZW1wdCA9IGF0dGVtcHQ7DQogICAgICB0aGlzLmVycm9yID0gZXJyb3I7DQogICAgICB0aGlzLnJlY292ZXJ5ID0gcmVjb3Zlcnk7DQogICAgICB0aGlzLmVuc3VyZSA9IGVuc3VyZTsNCiAgICB9DQogICAgVHJ5LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYXR0ZW1wdCcsICdyZWNvdmVyeScsICdlbnN1cmUnXTsNCiAgICBUcnkucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIFRyeS5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gdGhpcy5hdHRlbXB0Lmp1bXBzKG8pIHx8ICgoX3JlZjIgPSB0aGlzLnJlY292ZXJ5KSAhPSBudWxsID8gX3JlZjIuanVtcHMobykgOiB2b2lkIDApOw0KICAgIH07DQogICAgVHJ5LnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy5hdHRlbXB0KSB7DQogICAgICAgIHRoaXMuYXR0ZW1wdCA9IHRoaXMuYXR0ZW1wdC5tYWtlUmV0dXJuKCk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5yZWNvdmVyeSkgew0KICAgICAgICB0aGlzLnJlY292ZXJ5ID0gdGhpcy5yZWNvdmVyeS5tYWtlUmV0dXJuKCk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIFRyeS5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY2F0Y2hQYXJ0LCBlcnJvclBhcnQ7DQogICAgICBvLmluZGVudCArPSBUQUI7DQogICAgICBlcnJvclBhcnQgPSB0aGlzLmVycm9yID8gIiAoIiArICh0aGlzLmVycm9yLmNvbXBpbGUobykpICsgIikgIiA6ICcgJzsNCiAgICAgIGNhdGNoUGFydCA9IHRoaXMucmVjb3ZlcnkgPyAiIGNhdGNoIiArIGVycm9yUGFydCArICJ7XG4iICsgKHRoaXMucmVjb3ZlcnkuY29tcGlsZShvLCBMRVZFTF9UT1ApKSArICJcbiIgKyB0aGlzLnRhYiArICJ9IiA6ICEodGhpcy5lbnN1cmUgfHwgdGhpcy5yZWNvdmVyeSkgPyAnIGNhdGNoIChfZSkge30nIDogdm9pZCAwOw0KICAgICAgcmV0dXJuICgiIiArIHRoaXMudGFiICsgInRyeSB7XG4iICsgKHRoaXMuYXR0ZW1wdC5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIiArIHRoaXMudGFiICsgIn0iICsgKGNhdGNoUGFydCB8fCAnJykpICsgKHRoaXMuZW5zdXJlID8gIiBmaW5hbGx5IHtcbiIgKyAodGhpcy5lbnN1cmUuY29tcGlsZShvLCBMRVZFTF9UT1ApKSArICJcbiIgKyB0aGlzLnRhYiArICJ9IiA6ICcnKTsNCiAgICB9Ow0KICAgIHJldHVybiBUcnk7DQogIH0pKCk7DQogIGV4cG9ydHMuVGhyb3cgPSBUaHJvdyA9IChmdW5jdGlvbigpIHsNCiAgICBfX2V4dGVuZHMoVGhyb3csIEJhc2UpOw0KICAgIGZ1bmN0aW9uIFRocm93KGV4cHJlc3Npb24pIHsNCiAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247DQogICAgfQ0KICAgIFRocm93LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZXhwcmVzc2lvbiddOw0KICAgIFRocm93LnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IFlFUzsNCiAgICBUaHJvdy5wcm90b3R5cGUuanVtcHMgPSBOTzsNCiAgICBUaHJvdy5wcm90b3R5cGUubWFrZVJldHVybiA9IFRISVM7DQogICAgVGhyb3cucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuIHRoaXMudGFiICsgKCJ0aHJvdyAiICsgKHRoaXMuZXhwcmVzc2lvbi5jb21waWxlKG8pKSArICI7Iik7DQogICAgfTsNCiAgICByZXR1cm4gVGhyb3c7DQogIH0pKCk7DQogIGV4cG9ydHMuRXhpc3RlbmNlID0gRXhpc3RlbmNlID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhFeGlzdGVuY2UsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEV4aXN0ZW5jZShleHByZXNzaW9uKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOw0KICAgIH0NCiAgICBFeGlzdGVuY2UucHJvdG90eXBlLmNoaWxkcmVuID0gWydleHByZXNzaW9uJ107DQogICAgRXhpc3RlbmNlLnByb3RvdHlwZS5pbnZlcnQgPSBORUdBVEU7DQogICAgRXhpc3RlbmNlLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjbXAsIGNuaiwgY29kZSwgX3JlZjI7DQogICAgICBjb2RlID0gdGhpcy5leHByZXNzaW9uLmNvbXBpbGUobywgTEVWRUxfT1ApOw0KICAgICAgY29kZSA9IElERU5USUZJRVIudGVzdChjb2RlKSAmJiAhby5zY29wZS5jaGVjayhjb2RlKSA/ICgoX3JlZjIgPSB0aGlzLm5lZ2F0ZWQgPyBbJz09PScsICd8fCddIDogWychPT0nLCAnJiYnXSwgY21wID0gX3JlZjJbMF0sIGNuaiA9IF9yZWYyWzFdLCBfcmVmMiksICJ0eXBlb2YgIiArIGNvZGUgKyAiICIgKyBjbXAgKyAiIFwidW5kZWZpbmVkXCIgIiArIGNuaiArICIgIiArIGNvZGUgKyAiICIgKyBjbXAgKyAiIG51bGwiKSA6ICIiICsgY29kZSArICIgIiArICh0aGlzLm5lZ2F0ZWQgPyAnPT0nIDogJyE9JykgKyAiIG51bGwiOw0KICAgICAgaWYgKG8ubGV2ZWwgPD0gTEVWRUxfQ09ORCkgew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAiKCIgKyBjb2RlICsgIikiOw0KICAgICAgfQ0KICAgIH07DQogICAgcmV0dXJuIEV4aXN0ZW5jZTsNCiAgfSkoKTsNCiAgZXhwb3J0cy5QYXJlbnMgPSBQYXJlbnMgPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFBhcmVucywgQmFzZSk7DQogICAgZnVuY3Rpb24gUGFyZW5zKGJvZHkpIHsNCiAgICAgIHRoaXMuYm9keSA9IGJvZHk7DQogICAgfQ0KICAgIFBhcmVucy5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2JvZHknXTsNCiAgICBQYXJlbnMucHJvdG90eXBlLnVud3JhcCA9IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuYm9keTsNCiAgICB9Ow0KICAgIFBhcmVucy5wcm90b3R5cGUuaXNDb21wbGV4ID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5ib2R5LmlzQ29tcGxleCgpOw0KICAgIH07DQogICAgUGFyZW5zLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5ib2R5Lm1ha2VSZXR1cm4oKTsNCiAgICB9Ow0KICAgIFBhcmVucy5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYmFyZSwgY29kZSwgZXhwcjsNCiAgICAgIGV4cHIgPSB0aGlzLmJvZHkudW53cmFwKCk7DQogICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFZhbHVlICYmIGV4cHIuaXNBdG9taWMoKSkgew0KICAgICAgICBleHByLmZyb250ID0gdGhpcy5mcm9udDsNCiAgICAgICAgcmV0dXJuIGV4cHIuY29tcGlsZShvKTsNCiAgICAgIH0NCiAgICAgIGNvZGUgPSBleHByLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOw0KICAgICAgYmFyZSA9IG8ubGV2ZWwgPCBMRVZFTF9PUCAmJiAoZXhwciBpbnN0YW5jZW9mIE9wIHx8IGV4cHIgaW5zdGFuY2VvZiBDYWxsIHx8IChleHByIGluc3RhbmNlb2YgRm9yICYmIGV4cHIucmV0dXJucykpOw0KICAgICAgaWYgKGJhcmUpIHsNCiAgICAgICAgcmV0dXJuIGNvZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsNCiAgICAgIH0NCiAgICB9Ow0KICAgIHJldHVybiBQYXJlbnM7DQogIH0pKCk7DQogIGV4cG9ydHMuRm9yID0gRm9yID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhGb3IsIEJhc2UpOw0KICAgIGZ1bmN0aW9uIEZvcihib2R5LCBzb3VyY2UpIHsNCiAgICAgIHZhciBfcmVmMjsNCiAgICAgIHRoaXMuc291cmNlID0gc291cmNlLnNvdXJjZSwgdGhpcy5ndWFyZCA9IHNvdXJjZS5ndWFyZCwgdGhpcy5zdGVwID0gc291cmNlLnN0ZXAsIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lLCB0aGlzLmluZGV4ID0gc291cmNlLmluZGV4Ow0KICAgICAgdGhpcy5ib2R5ID0gQmxvY2sud3JhcChbYm9keV0pOw0KICAgICAgdGhpcy5vd24gPSAhIXNvdXJjZS5vd247DQogICAgICB0aGlzLm9iamVjdCA9ICEhc291cmNlLm9iamVjdDsNCiAgICAgIGlmICh0aGlzLm9iamVjdCkgew0KICAgICAgICBfcmVmMiA9IFt0aGlzLmluZGV4LCB0aGlzLm5hbWVdLCB0aGlzLm5hbWUgPSBfcmVmMlswXSwgdGhpcy5pbmRleCA9IF9yZWYyWzFdOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuaW5kZXggaW5zdGFuY2VvZiBWYWx1ZSkgew0KICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignaW5kZXggY2Fubm90IGJlIGEgcGF0dGVybiBtYXRjaGluZyBleHByZXNzaW9uJyk7DQogICAgICB9DQogICAgICB0aGlzLnJhbmdlID0gdGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBWYWx1ZSAmJiB0aGlzLnNvdXJjZS5iYXNlIGluc3RhbmNlb2YgUmFuZ2UgJiYgIXRoaXMuc291cmNlLnByb3BlcnRpZXMubGVuZ3RoOw0KICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5uYW1lIGluc3RhbmNlb2YgVmFsdWU7DQogICAgICBpZiAodGhpcy5yYW5nZSAmJiB0aGlzLmluZGV4KSB7DQogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdpbmRleGVzIGRvIG5vdCBhcHBseSB0byByYW5nZSBsb29wcycpOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMucmFuZ2UgJiYgdGhpcy5wYXR0ZXJuKSB7DQogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdjYW5ub3QgcGF0dGVybiBtYXRjaCBvdmVyIHJhbmdlIGxvb3BzJyk7DQogICAgICB9DQogICAgICB0aGlzLnJldHVybnMgPSBmYWxzZTsNCiAgICB9DQogICAgRm9yLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYm9keScsICdzb3VyY2UnLCAnZ3VhcmQnLCAnc3RlcCddOw0KICAgIEZvci5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBZRVM7DQogICAgRm9yLnByb3RvdHlwZS5qdW1wcyA9IFdoaWxlLnByb3RvdHlwZS5qdW1wczsNCiAgICBGb3IucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsNCiAgICAgIHRoaXMucmV0dXJucyA9IHRydWU7DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9Ow0KICAgIEZvci5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYm9keSwgZGVmUGFydCwgZm9yUGFydCwgZm9yVmFyUGFydCwgZ3VhcmRQYXJ0LCBpZHQxLCBpbmRleCwgaXZhciwgbGFzdEp1bXBzLCBsdmFyLCBuYW1lLCBuYW1lUGFydCwgcmVmLCByZXN1bHRQYXJ0LCByZXR1cm5SZXN1bHQsIHJ2YXIsIHNjb3BlLCBzb3VyY2UsIHN0ZXBQYXJ0LCBzdGVwdmFyLCBzdmFyLCB2YXJQYXJ0LCBfcmVmMjsNCiAgICAgIGJvZHkgPSBCbG9jay53cmFwKFt0aGlzLmJvZHldKTsNCiAgICAgIGxhc3RKdW1wcyA9IChfcmVmMiA9IGxhc3QoYm9keS5leHByZXNzaW9ucykpICE9IG51bGwgPyBfcmVmMi5qdW1wcygpIDogdm9pZCAwOw0KICAgICAgaWYgKGxhc3RKdW1wcyAmJiBsYXN0SnVtcHMgaW5zdGFuY2VvZiBSZXR1cm4pIHsNCiAgICAgICAgdGhpcy5yZXR1cm5zID0gZmFsc2U7DQogICAgICB9DQogICAgICBzb3VyY2UgPSB0aGlzLnJhbmdlID8gdGhpcy5zb3VyY2UuYmFzZSA6IHRoaXMuc291cmNlOw0KICAgICAgc2NvcGUgPSBvLnNjb3BlOw0KICAgICAgbmFtZSA9IHRoaXMubmFtZSAmJiB0aGlzLm5hbWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGluZGV4ID0gdGhpcy5pbmRleCAmJiB0aGlzLmluZGV4LmNvbXBpbGUobywgTEVWRUxfTElTVCk7DQogICAgICBpZiAobmFtZSAmJiAhdGhpcy5wYXR0ZXJuKSB7DQogICAgICAgIHNjb3BlLmZpbmQobmFtZSwgew0KICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQ0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIGlmIChpbmRleCkgew0KICAgICAgICBzY29wZS5maW5kKGluZGV4LCB7DQogICAgICAgICAgaW1tZWRpYXRlOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMucmV0dXJucykgew0KICAgICAgICBydmFyID0gc2NvcGUuZnJlZVZhcmlhYmxlKCdyZXN1bHRzJyk7DQogICAgICB9DQogICAgICBpdmFyID0gKHRoaXMucmFuZ2UgPyBuYW1lIDogaW5kZXgpIHx8IHNjb3BlLmZyZWVWYXJpYWJsZSgnaScpOw0KICAgICAgaWYgKHRoaXMuc3RlcCAmJiAhdGhpcy5yYW5nZSkgew0KICAgICAgICBzdGVwdmFyID0gc2NvcGUuZnJlZVZhcmlhYmxlKCJzdGVwIik7DQogICAgICB9DQogICAgICBpZiAodGhpcy5wYXR0ZXJuKSB7DQogICAgICAgIG5hbWUgPSBpdmFyOw0KICAgICAgfQ0KICAgICAgdmFyUGFydCA9ICcnOw0KICAgICAgZ3VhcmRQYXJ0ID0gJyc7DQogICAgICBkZWZQYXJ0ID0gJyc7DQogICAgICBpZHQxID0gdGhpcy50YWIgKyBUQUI7DQogICAgICBpZiAodGhpcy5yYW5nZSkgew0KICAgICAgICBmb3JQYXJ0ID0gc291cmNlLmNvbXBpbGUobWVyZ2Uobywgew0KICAgICAgICAgIGluZGV4OiBpdmFyLA0KICAgICAgICAgIHN0ZXA6IHRoaXMuc3RlcA0KICAgICAgICB9KSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBzdmFyID0gdGhpcy5zb3VyY2UuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgICAgaWYgKChuYW1lIHx8IHRoaXMub3duKSAmJiAhSURFTlRJRklFUi50ZXN0KHN2YXIpKSB7DQogICAgICAgICAgZGVmUGFydCA9ICIiICsgdGhpcy50YWIgKyAocmVmID0gc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSkgKyAiID0gIiArIHN2YXIgKyAiO1xuIjsNCiAgICAgICAgICBzdmFyID0gcmVmOw0KICAgICAgICB9DQogICAgICAgIGlmIChuYW1lICYmICF0aGlzLnBhdHRlcm4pIHsNCiAgICAgICAgICBuYW1lUGFydCA9ICIiICsgbmFtZSArICIgPSAiICsgc3ZhciArICJbIiArIGl2YXIgKyAiXSI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCF0aGlzLm9iamVjdCkgew0KICAgICAgICAgIGx2YXIgPSBzY29wZS5mcmVlVmFyaWFibGUoJ2xlbicpOw0KICAgICAgICAgIGZvclZhclBhcnQgPSAoIiIgKyBpdmFyICsgIiA9IDAsICIgKyBsdmFyICsgIiA9ICIgKyBzdmFyICsgIi5sZW5ndGgiKSArICh0aGlzLnN0ZXAgPyAiLCAiICsgc3RlcHZhciArICIgPSAiICsgKHRoaXMuc3RlcC5jb21waWxlKG8sIExFVkVMX09QKSkgOiAnJyk7DQogICAgICAgICAgc3RlcFBhcnQgPSB0aGlzLnN0ZXAgPyAiIiArIGl2YXIgKyAiICs9ICIgKyBzdGVwdmFyIDogIiIgKyBpdmFyICsgIisrIjsNCiAgICAgICAgICBmb3JQYXJ0ID0gIiIgKyBmb3JWYXJQYXJ0ICsgIjsgIiArIGl2YXIgKyAiIDwgIiArIGx2YXIgKyAiOyAiICsgc3RlcFBhcnQ7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLnJldHVybnMpIHsNCiAgICAgICAgcmVzdWx0UGFydCA9ICIiICsgdGhpcy50YWIgKyBydmFyICsgIiA9IFtdO1xuIjsNCiAgICAgICAgcmV0dXJuUmVzdWx0ID0gIlxuIiArIHRoaXMudGFiICsgInJldHVybiAiICsgcnZhciArICI7IjsNCiAgICAgICAgYm9keSA9IFB1c2gud3JhcChydmFyLCBib2R5KTsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmd1YXJkKSB7DQogICAgICAgIGJvZHkgPSBCbG9jay53cmFwKFtuZXcgSWYodGhpcy5ndWFyZCwgYm9keSldKTsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLnBhdHRlcm4pIHsNCiAgICAgICAgYm9keS5leHByZXNzaW9ucy51bnNoaWZ0KG5ldyBBc3NpZ24odGhpcy5uYW1lLCBuZXcgTGl0ZXJhbCgiIiArIHN2YXIgKyAiWyIgKyBpdmFyICsgIl0iKSkpOw0KICAgICAgfQ0KICAgICAgZGVmUGFydCArPSB0aGlzLnBsdWNrRGlyZWN0Q2FsbChvLCBib2R5KTsNCiAgICAgIGlmIChuYW1lUGFydCkgew0KICAgICAgICB2YXJQYXJ0ID0gIlxuIiArIGlkdDEgKyBuYW1lUGFydCArICI7IjsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLm9iamVjdCkgew0KICAgICAgICBmb3JQYXJ0ID0gIiIgKyBpdmFyICsgIiBpbiAiICsgc3ZhcjsNCiAgICAgICAgaWYgKHRoaXMub3duKSB7DQogICAgICAgICAgZ3VhcmRQYXJ0ID0gIlxuIiArIGlkdDEgKyAiaWYgKCEiICsgKHV0aWxpdHkoJ2hhc1Byb3AnKSkgKyAiLmNhbGwoIiArIHN2YXIgKyAiLCAiICsgaXZhciArICIpKSBjb250aW51ZTsiOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBib2R5ID0gYm9keS5jb21waWxlKG1lcmdlKG8sIHsNCiAgICAgICAgaW5kZW50OiBpZHQxDQogICAgICB9KSwgTEVWRUxfVE9QKTsNCiAgICAgIGlmIChib2R5KSB7DQogICAgICAgIGJvZHkgPSAnXG4nICsgYm9keSArICdcbic7DQogICAgICB9DQogICAgICByZXR1cm4gIiIgKyBkZWZQYXJ0ICsgKHJlc3VsdFBhcnQgfHwgJycpICsgdGhpcy50YWIgKyAiZm9yICgiICsgZm9yUGFydCArICIpIHsiICsgZ3VhcmRQYXJ0ICsgdmFyUGFydCArIGJvZHkgKyB0aGlzLnRhYiArICJ9IiArIChyZXR1cm5SZXN1bHQgfHwgJycpOw0KICAgIH07DQogICAgRm9yLnByb3RvdHlwZS5wbHVja0RpcmVjdENhbGwgPSBmdW5jdGlvbihvLCBib2R5KSB7DQogICAgICB2YXIgYmFzZSwgZGVmcywgZXhwciwgZm4sIGlkeCwgcmVmLCB2YWwsIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1LCBfcmVmNiwgX3JlZjc7DQogICAgICBkZWZzID0gJyc7DQogICAgICBfcmVmMiA9IGJvZHkuZXhwcmVzc2lvbnM7DQogICAgICBmb3IgKGlkeCA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGlkeCA8IF9sZW47IGlkeCsrKSB7DQogICAgICAgIGV4cHIgPSBfcmVmMltpZHhdOw0KICAgICAgICBleHByID0gZXhwci51bndyYXBBbGwoKTsNCiAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIENhbGwpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgdmFsID0gZXhwci52YXJpYWJsZS51bndyYXBBbGwoKTsNCiAgICAgICAgaWYgKCEoKHZhbCBpbnN0YW5jZW9mIENvZGUpIHx8ICh2YWwgaW5zdGFuY2VvZiBWYWx1ZSAmJiAoKF9yZWYzID0gdmFsLmJhc2UpICE9IG51bGwgPyBfcmVmMy51bndyYXBBbGwoKSA6IHZvaWQgMCkgaW5zdGFuY2VvZiBDb2RlICYmIHZhbC5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSAmJiAoKF9yZWY0ID0gKF9yZWY1ID0gdmFsLnByb3BlcnRpZXNbMF0ubmFtZSkgIT0gbnVsbCA/IF9yZWY1LnZhbHVlIDogdm9pZCAwKSA9PT0gJ2NhbGwnIHx8IF9yZWY0ID09PSAnYXBwbHknKSkpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgZm4gPSAoKF9yZWY2ID0gdmFsLmJhc2UpICE9IG51bGwgPyBfcmVmNi51bndyYXBBbGwoKSA6IHZvaWQgMCkgfHwgdmFsOw0KICAgICAgICByZWYgPSBuZXcgTGl0ZXJhbChvLnNjb3BlLmZyZWVWYXJpYWJsZSgnZm4nKSk7DQogICAgICAgIGJhc2UgPSBuZXcgVmFsdWUocmVmKTsNCiAgICAgICAgaWYgKHZhbC5iYXNlKSB7DQogICAgICAgICAgX3JlZjcgPSBbYmFzZSwgdmFsXSwgdmFsLmJhc2UgPSBfcmVmN1swXSwgYmFzZSA9IF9yZWY3WzFdOw0KICAgICAgICAgIGFyZ3MudW5zaGlmdChuZXcgTGl0ZXJhbCgndGhpcycpKTsNCiAgICAgICAgfQ0KICAgICAgICBib2R5LmV4cHJlc3Npb25zW2lkeF0gPSBuZXcgQ2FsbChiYXNlLCBleHByLmFyZ3MpOw0KICAgICAgICBkZWZzICs9IHRoaXMudGFiICsgbmV3IEFzc2lnbihyZWYsIGZuKS5jb21waWxlKG8sIExFVkVMX1RPUCkgKyAnO1xuJzsNCiAgICAgIH0NCiAgICAgIHJldHVybiBkZWZzOw0KICAgIH07DQogICAgcmV0dXJuIEZvcjsNCiAgfSkoKTsNCiAgZXhwb3J0cy5Td2l0Y2ggPSBTd2l0Y2ggPSAoZnVuY3Rpb24oKSB7DQogICAgX19leHRlbmRzKFN3aXRjaCwgQmFzZSk7DQogICAgZnVuY3Rpb24gU3dpdGNoKHN1YmplY3QsIGNhc2VzLCBvdGhlcndpc2UpIHsNCiAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7DQogICAgICB0aGlzLmNhc2VzID0gY2FzZXM7DQogICAgICB0aGlzLm90aGVyd2lzZSA9IG90aGVyd2lzZTsNCiAgICB9DQogICAgU3dpdGNoLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnc3ViamVjdCcsICdjYXNlcycsICdvdGhlcndpc2UnXTsNCiAgICBTd2l0Y2gucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOw0KICAgIFN3aXRjaC5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYmxvY2ssIGNvbmRzLCBfaSwgX2xlbiwgX3JlZjIsIF9yZWYzLCBfcmVmNDsNCiAgICAgIGlmIChvID09IG51bGwpIHsNCiAgICAgICAgbyA9IHsNCiAgICAgICAgICBibG9jazogdHJ1ZQ0KICAgICAgICB9Ow0KICAgICAgfQ0KICAgICAgX3JlZjIgPSB0aGlzLmNhc2VzOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICBfcmVmMyA9IF9yZWYyW19pXSwgY29uZHMgPSBfcmVmM1swXSwgYmxvY2sgPSBfcmVmM1sxXTsNCiAgICAgICAgaWYgKGJsb2NrLmp1bXBzKG8pKSB7DQogICAgICAgICAgcmV0dXJuIGJsb2NrOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gKF9yZWY0ID0gdGhpcy5vdGhlcndpc2UpICE9IG51bGwgPyBfcmVmNC5qdW1wcyhvKSA6IHZvaWQgMDsNCiAgICB9Ow0KICAgIFN3aXRjaC5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHBhaXIsIF9pLCBfbGVuLCBfcmVmMiwgX3JlZjM7DQogICAgICBfcmVmMiA9IHRoaXMuY2FzZXM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHBhaXIgPSBfcmVmMltfaV07DQogICAgICAgIHBhaXJbMV0ubWFrZVJldHVybigpOw0KICAgICAgfQ0KICAgICAgaWYgKChfcmVmMyA9IHRoaXMub3RoZXJ3aXNlKSAhPSBudWxsKSB7DQogICAgICAgIF9yZWYzLm1ha2VSZXR1cm4oKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzOw0KICAgIH07DQogICAgU3dpdGNoLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBibG9jaywgYm9keSwgY29kZSwgY29uZCwgY29uZGl0aW9ucywgZXhwciwgaSwgaWR0MSwgaWR0MiwgX2ksIF9sZW4sIF9sZW4yLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNTsNCiAgICAgIGlkdDEgPSBvLmluZGVudCArIFRBQjsNCiAgICAgIGlkdDIgPSBvLmluZGVudCA9IGlkdDEgKyBUQUI7DQogICAgICBjb2RlID0gdGhpcy50YWIgKyAoInN3aXRjaCAoIiArICgoKF9yZWYyID0gdGhpcy5zdWJqZWN0KSAhPSBudWxsID8gX3JlZjIuY29tcGlsZShvLCBMRVZFTF9QQVJFTikgOiB2b2lkIDApIHx8IGZhbHNlKSArICIpIHtcbiIpOw0KICAgICAgX3JlZjMgPSB0aGlzLmNhc2VzOw0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYzLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICBfcmVmNCA9IF9yZWYzW2ldLCBjb25kaXRpb25zID0gX3JlZjRbMF0sIGJsb2NrID0gX3JlZjRbMV07DQogICAgICAgIF9yZWY1ID0gZmxhdHRlbihbY29uZGl0aW9uc10pOw0KICAgICAgICBmb3IgKF9pID0gMCwgX2xlbjIgPSBfcmVmNS5sZW5ndGg7IF9pIDwgX2xlbjI7IF9pKyspIHsNCiAgICAgICAgICBjb25kID0gX3JlZjVbX2ldOw0KICAgICAgICAgIGlmICghdGhpcy5zdWJqZWN0KSB7DQogICAgICAgICAgICBjb25kID0gY29uZC5pbnZlcnQoKTsNCiAgICAgICAgICB9DQogICAgICAgICAgY29kZSArPSBpZHQxICsgKCJjYXNlICIgKyAoY29uZC5jb21waWxlKG8sIExFVkVMX1BBUkVOKSkgKyAiOlxuIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGJvZHkgPSBibG9jay5jb21waWxlKG8sIExFVkVMX1RPUCkpIHsNCiAgICAgICAgICBjb2RlICs9IGJvZHkgKyAnXG4nOw0KICAgICAgICB9DQogICAgICAgIGlmIChpID09PSB0aGlzLmNhc2VzLmxlbmd0aCAtIDEgJiYgIXRoaXMub3RoZXJ3aXNlKSB7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgZXhwciA9IHRoaXMubGFzdE5vbkNvbW1lbnQoYmxvY2suZXhwcmVzc2lvbnMpOw0KICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFJldHVybiB8fCAoZXhwciBpbnN0YW5jZW9mIExpdGVyYWwgJiYgZXhwci5qdW1wcygpICYmIGV4cHIudmFsdWUgIT09ICdkZWJ1Z2dlcicpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgY29kZSArPSBpZHQyICsgJ2JyZWFrO1xuJzsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLm90aGVyd2lzZSAmJiB0aGlzLm90aGVyd2lzZS5leHByZXNzaW9ucy5sZW5ndGgpIHsNCiAgICAgICAgY29kZSArPSBpZHQxICsgKCJkZWZhdWx0OlxuIiArICh0aGlzLm90aGVyd2lzZS5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIik7DQogICAgICB9DQogICAgICByZXR1cm4gY29kZSArIHRoaXMudGFiICsgJ30nOw0KICAgIH07DQogICAgcmV0dXJuIFN3aXRjaDsNCiAgfSkoKTsNCiAgZXhwb3J0cy5JZiA9IElmID0gKGZ1bmN0aW9uKCkgew0KICAgIF9fZXh0ZW5kcyhJZiwgQmFzZSk7DQogICAgZnVuY3Rpb24gSWYoY29uZGl0aW9uLCBib2R5LCBvcHRpb25zKSB7DQogICAgICB0aGlzLmJvZHkgPSBib2R5Ow0KICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgew0KICAgICAgICBvcHRpb25zID0ge307DQogICAgICB9DQogICAgICB0aGlzLmNvbmRpdGlvbiA9IG9wdGlvbnMudHlwZSA9PT0gJ3VubGVzcycgPyBjb25kaXRpb24uaW52ZXJ0KCkgOiBjb25kaXRpb247DQogICAgICB0aGlzLmVsc2VCb2R5ID0gbnVsbDsNCiAgICAgIHRoaXMuaXNDaGFpbiA9IGZhbHNlOw0KICAgICAgdGhpcy5zb2FrID0gb3B0aW9ucy5zb2FrOw0KICAgIH0NCiAgICBJZi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2NvbmRpdGlvbicsICdib2R5JywgJ2Vsc2VCb2R5J107DQogICAgSWYucHJvdG90eXBlLmJvZHlOb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gKF9yZWYyID0gdGhpcy5ib2R5KSAhPSBudWxsID8gX3JlZjIudW53cmFwKCkgOiB2b2lkIDA7DQogICAgfTsNCiAgICBJZi5wcm90b3R5cGUuZWxzZUJvZHlOb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gKF9yZWYyID0gdGhpcy5lbHNlQm9keSkgIT0gbnVsbCA/IF9yZWYyLnVud3JhcCgpIDogdm9pZCAwOw0KICAgIH07DQogICAgSWYucHJvdG90eXBlLmFkZEVsc2UgPSBmdW5jdGlvbihlbHNlQm9keSkgew0KICAgICAgaWYgKHRoaXMuaXNDaGFpbikgew0KICAgICAgICB0aGlzLmVsc2VCb2R5Tm9kZSgpLmFkZEVsc2UoZWxzZUJvZHkpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5pc0NoYWluID0gZWxzZUJvZHkgaW5zdGFuY2VvZiBJZjsNCiAgICAgICAgdGhpcy5lbHNlQm9keSA9IHRoaXMuZW5zdXJlQmxvY2soZWxzZUJvZHkpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBJZi5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgX3JlZjI7DQogICAgICByZXR1cm4gKG8gIT0gbnVsbCA/IG8ubGV2ZWwgOiB2b2lkIDApID09PSBMRVZFTF9UT1AgfHwgdGhpcy5ib2R5Tm9kZSgpLmlzU3RhdGVtZW50KG8pIHx8ICgoX3JlZjIgPSB0aGlzLmVsc2VCb2R5Tm9kZSgpKSAhPSBudWxsID8gX3JlZjIuaXNTdGF0ZW1lbnQobykgOiB2b2lkIDApOw0KICAgIH07DQogICAgSWYucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgew0KICAgICAgdmFyIF9yZWYyOw0KICAgICAgcmV0dXJuIHRoaXMuYm9keS5qdW1wcyhvKSB8fCAoKF9yZWYyID0gdGhpcy5lbHNlQm9keSkgIT0gbnVsbCA/IF9yZWYyLmp1bXBzKG8pIDogdm9pZCAwKTsNCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIGlmICh0aGlzLmlzU3RhdGVtZW50KG8pKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTdGF0ZW1lbnQobyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlRXhwcmVzc2lvbihvKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7DQogICAgICB0aGlzLmJvZHkgJiYgKHRoaXMuYm9keSA9IG5ldyBCbG9jayhbdGhpcy5ib2R5Lm1ha2VSZXR1cm4oKV0pKTsNCiAgICAgIHRoaXMuZWxzZUJvZHkgJiYgKHRoaXMuZWxzZUJvZHkgPSBuZXcgQmxvY2soW3RoaXMuZWxzZUJvZHkubWFrZVJldHVybigpXSkpOw0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfTsNCiAgICBJZi5wcm90b3R5cGUuZW5zdXJlQmxvY2sgPSBmdW5jdGlvbihub2RlKSB7DQogICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJsb2NrKSB7DQogICAgICAgIHJldHVybiBub2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIG5ldyBCbG9jayhbbm9kZV0pOw0KICAgICAgfQ0KICAgIH07DQogICAgSWYucHJvdG90eXBlLmNvbXBpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgYm9keSwgY2hpbGQsIGNvbmQsIGV4ZXEsIGlmUGFydDsNCiAgICAgIGNoaWxkID0gZGVsKG8sICdjaGFpbkNoaWxkJyk7DQogICAgICBleGVxID0gZGVsKG8sICdpc0V4aXN0ZW50aWFsRXF1YWxzJyk7DQogICAgICBpZiAoZXhlcSkgew0KICAgICAgICByZXR1cm4gbmV3IElmKHRoaXMuY29uZGl0aW9uLmludmVydCgpLCB0aGlzLmVsc2VCb2R5Tm9kZSgpLCB7DQogICAgICAgICAgdHlwZTogJ2lmJw0KICAgICAgICB9KS5jb21waWxlKG8pOw0KICAgICAgfQ0KICAgICAgY29uZCA9IHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOw0KICAgICAgby5pbmRlbnQgKz0gVEFCOw0KICAgICAgYm9keSA9IHRoaXMuZW5zdXJlQmxvY2sodGhpcy5ib2R5KS5jb21waWxlKG8pOw0KICAgICAgaWYgKGJvZHkpIHsNCiAgICAgICAgYm9keSA9ICJcbiIgKyBib2R5ICsgIlxuIiArIHRoaXMudGFiOw0KICAgICAgfQ0KICAgICAgaWZQYXJ0ID0gImlmICgiICsgY29uZCArICIpIHsiICsgYm9keSArICJ9IjsNCiAgICAgIGlmICghY2hpbGQpIHsNCiAgICAgICAgaWZQYXJ0ID0gdGhpcy50YWIgKyBpZlBhcnQ7DQogICAgICB9DQogICAgICBpZiAoIXRoaXMuZWxzZUJvZHkpIHsNCiAgICAgICAgcmV0dXJuIGlmUGFydDsNCiAgICAgIH0NCiAgICAgIHJldHVybiBpZlBhcnQgKyAnIGVsc2UgJyArICh0aGlzLmlzQ2hhaW4gPyAoby5pbmRlbnQgPSB0aGlzLnRhYiwgby5jaGFpbkNoaWxkID0gdHJ1ZSwgdGhpcy5lbHNlQm9keS51bndyYXAoKS5jb21waWxlKG8sIExFVkVMX1RPUCkpIDogIntcbiIgKyAodGhpcy5lbHNlQm9keS5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIiArIHRoaXMudGFiICsgIn0iKTsNCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS5jb21waWxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBhbHQsIGJvZHksIGNvZGUsIGNvbmQ7DQogICAgICBjb25kID0gdGhpcy5jb25kaXRpb24uY29tcGlsZShvLCBMRVZFTF9DT05EKTsNCiAgICAgIGJvZHkgPSB0aGlzLmJvZHlOb2RlKCkuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsNCiAgICAgIGFsdCA9IHRoaXMuZWxzZUJvZHlOb2RlKCkgPyB0aGlzLmVsc2VCb2R5Tm9kZSgpLmNvbXBpbGUobywgTEVWRUxfTElTVCkgOiAndm9pZCAwJzsNCiAgICAgIGNvZGUgPSAiIiArIGNvbmQgKyAiID8gIiArIGJvZHkgKyAiIDogIiArIGFsdDsNCiAgICAgIGlmIChvLmxldmVsID49IExFVkVMX0NPTkQpIHsNCiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gY29kZTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIElmLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5zb2FrICYmIHRoaXM7DQogICAgfTsNCiAgICByZXR1cm4gSWY7DQogIH0pKCk7DQogIFB1c2ggPSB7DQogICAgd3JhcDogZnVuY3Rpb24obmFtZSwgZXhwcykgew0KICAgICAgaWYgKGV4cHMuaXNFbXB0eSgpIHx8IGxhc3QoZXhwcy5leHByZXNzaW9ucykuanVtcHMoKSkgew0KICAgICAgICByZXR1cm4gZXhwczsNCiAgICAgIH0NCiAgICAgIHJldHVybiBleHBzLnB1c2gobmV3IENhbGwobmV3IFZhbHVlKG5ldyBMaXRlcmFsKG5hbWUpLCBbbmV3IEFjY2VzcyhuZXcgTGl0ZXJhbCgncHVzaCcpKV0pLCBbZXhwcy5wb3AoKV0pKTsNCiAgICB9DQogIH07DQogIENsb3N1cmUgPSB7DQogICAgd3JhcDogZnVuY3Rpb24oZXhwcmVzc2lvbnMsIHN0YXRlbWVudCwgbm9SZXR1cm4pIHsNCiAgICAgIHZhciBhcmdzLCBjYWxsLCBmdW5jLCBtZW50aW9uc0FyZ3MsIG1ldGg7DQogICAgICBpZiAoZXhwcmVzc2lvbnMuanVtcHMoKSkgew0KICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7DQogICAgICB9DQogICAgICBmdW5jID0gbmV3IENvZGUoW10sIEJsb2NrLndyYXAoW2V4cHJlc3Npb25zXSkpOw0KICAgICAgYXJncyA9IFtdOw0KICAgICAgaWYgKChtZW50aW9uc0FyZ3MgPSBleHByZXNzaW9ucy5jb250YWlucyh0aGlzLmxpdGVyYWxBcmdzKSkgfHwgZXhwcmVzc2lvbnMuY29udGFpbnModGhpcy5saXRlcmFsVGhpcykpIHsNCiAgICAgICAgbWV0aCA9IG5ldyBMaXRlcmFsKG1lbnRpb25zQXJncyA/ICdhcHBseScgOiAnY2FsbCcpOw0KICAgICAgICBhcmdzID0gW25ldyBMaXRlcmFsKCd0aGlzJyldOw0KICAgICAgICBpZiAobWVudGlvbnNBcmdzKSB7DQogICAgICAgICAgYXJncy5wdXNoKG5ldyBMaXRlcmFsKCdhcmd1bWVudHMnKSk7DQogICAgICAgIH0NCiAgICAgICAgZnVuYyA9IG5ldyBWYWx1ZShmdW5jLCBbbmV3IEFjY2VzcyhtZXRoKV0pOw0KICAgICAgfQ0KICAgICAgZnVuYy5ub1JldHVybiA9IG5vUmV0dXJuOw0KICAgICAgY2FsbCA9IG5ldyBDYWxsKGZ1bmMsIGFyZ3MpOw0KICAgICAgaWYgKHN0YXRlbWVudCkgew0KICAgICAgICByZXR1cm4gQmxvY2sud3JhcChbY2FsbF0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIGNhbGw7DQogICAgICB9DQogICAgfSwNCiAgICBsaXRlcmFsQXJnczogZnVuY3Rpb24obm9kZSkgew0KICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBMaXRlcmFsICYmIG5vZGUudmFsdWUgPT09ICdhcmd1bWVudHMnICYmICFub2RlLmFzS2V5Ow0KICAgIH0sDQogICAgbGl0ZXJhbFRoaXM6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIHJldHVybiAobm9kZSBpbnN0YW5jZW9mIExpdGVyYWwgJiYgbm9kZS52YWx1ZSA9PT0gJ3RoaXMnICYmICFub2RlLmFzS2V5KSB8fCAobm9kZSBpbnN0YW5jZW9mIENvZGUgJiYgbm9kZS5ib3VuZCk7DQogICAgfQ0KICB9Ow0KICB1bmZvbGRTb2FrID0gZnVuY3Rpb24obywgcGFyZW50LCBuYW1lKSB7DQogICAgdmFyIGlmbjsNCiAgICBpZiAoIShpZm4gPSBwYXJlbnRbbmFtZV0udW5mb2xkU29hayhvKSkpIHsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgcGFyZW50W25hbWVdID0gaWZuLmJvZHk7DQogICAgaWZuLmJvZHkgPSBuZXcgVmFsdWUocGFyZW50KTsNCiAgICByZXR1cm4gaWZuOw0KICB9Ow0KICBVVElMSVRJRVMgPSB7DQogICAgImV4dGVuZHMiOiAnZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkge1xuICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfVxuICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcjtcbiAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuIGNoaWxkO1xufScsDQogICAgYmluZDogJ2Z1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0nLA0KICAgIGluZGV4T2Y6ICdBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufScsDQogICAgaGFzUHJvcDogJ09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHknLA0KICAgIHNsaWNlOiAnQXJyYXkucHJvdG90eXBlLnNsaWNlJw0KICB9Ow0KICBMRVZFTF9UT1AgPSAxOw0KICBMRVZFTF9QQVJFTiA9IDI7DQogIExFVkVMX0xJU1QgPSAzOw0KICBMRVZFTF9DT05EID0gNDsNCiAgTEVWRUxfT1AgPSA1Ow0KICBMRVZFTF9BQ0NFU1MgPSA2Ow0KICBUQUIgPSAnICAnOw0KICBJREVOVElGSUVSID0gL15bJEEtWmEtel9ceDdmLVx1ZmZmZl1bJFx3XHg3Zi1cdWZmZmZdKiQvOw0KICBTSU1QTEVOVU0gPSAvXlsrLV0/XGQrJC87DQogIE1FVEhPRF9ERUYgPSAvXig/OihbJEEtWmEtel9dWyRcd1x4N2YtXHVmZmZmXSopXC5wcm90b3R5cGVcLik/KFskQS1aYS16X11bJFx3XHg3Zi1cdWZmZmZdKikkLzsNCiAgSVNfU1RSSU5HID0gL15bJyJdLzsNCiAgdXRpbGl0eSA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICB2YXIgcmVmOw0KICAgIHJlZiA9ICJfXyIgKyBuYW1lOw0KICAgIFNjb3BlLnJvb3QuYXNzaWduKHJlZiwgVVRJTElUSUVTW25hbWVdKTsNCiAgICByZXR1cm4gcmVmOw0KICB9Ow0KICBtdWx0aWRlbnQgPSBmdW5jdGlvbihjb2RlLCB0YWIpIHsNCiAgICByZXR1cm4gY29kZS5yZXBsYWNlKC9cbi9nLCAnJCYnICsgdGFiKTsNCiAgfTsNCn0pOw0KLyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uDQogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0DQogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwNCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nDQogKiBjb25kaXRpb25zOg0KICogDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKiANCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTDQogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQNCiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLA0KICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKi8NCg0KZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUvc2NvcGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9tb2RlL2NvZmZlZS9oZWxwZXJzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KICB2YXIgU2NvcGUsIGV4dGVuZCwgbGFzdCwgX3JlZjsNCiAgX3JlZiA9IHJlcXVpcmUoJy4vaGVscGVycycpLCBleHRlbmQgPSBfcmVmLmV4dGVuZCwgbGFzdCA9IF9yZWYubGFzdDsNCiAgZXhwb3J0cy5TY29wZSA9IFNjb3BlID0gKGZ1bmN0aW9uKCkgew0KICAgIFNjb3BlLnJvb3QgPSBudWxsOw0KICAgIGZ1bmN0aW9uIFNjb3BlKHBhcmVudCwgZXhwcmVzc2lvbnMsIG1ldGhvZCkgew0KICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7DQogICAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7DQogICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsNCiAgICAgIHRoaXMudmFyaWFibGVzID0gWw0KICAgICAgICB7DQogICAgICAgICAgbmFtZTogJ2FyZ3VtZW50cycsDQogICAgICAgICAgdHlwZTogJ2FyZ3VtZW50cycNCiAgICAgICAgfQ0KICAgICAgXTsNCiAgICAgIHRoaXMucG9zaXRpb25zID0ge307DQogICAgICBpZiAoIXRoaXMucGFyZW50KSB7DQogICAgICAgIFNjb3BlLnJvb3QgPSB0aGlzOw0KICAgICAgfQ0KICAgIH0NCiAgICBTY29wZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaW1tZWRpYXRlKSB7DQogICAgICB2YXIgcG9zOw0KICAgICAgaWYgKHRoaXMuc2hhcmVkICYmICFpbW1lZGlhdGUpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmFkZChuYW1lLCB0eXBlLCBpbW1lZGlhdGUpOw0KICAgICAgfQ0KICAgICAgaWYgKHR5cGVvZiAocG9zID0gdGhpcy5wb3NpdGlvbnNbbmFtZV0pID09PSAnbnVtYmVyJykgew0KICAgICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNbcG9zXS50eXBlID0gdHlwZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uc1tuYW1lXSA9IHRoaXMudmFyaWFibGVzLnB1c2goew0KICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgdHlwZTogdHlwZQ0KICAgICAgICB9KSAtIDE7DQogICAgICB9DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsNCiAgICAgIGlmICh0aGlzLmNoZWNrKG5hbWUsIG9wdGlvbnMpKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KICAgICAgdGhpcy5hZGQobmFtZSwgJ3ZhcicpOw0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQogICAgU2NvcGUucHJvdG90eXBlLnBhcmFtZXRlciA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIGlmICh0aGlzLnNoYXJlZCAmJiB0aGlzLnBhcmVudC5jaGVjayhuYW1lLCB0cnVlKSkgew0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICByZXR1cm4gdGhpcy5hZGQobmFtZSwgJ3BhcmFtJyk7DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbihuYW1lLCBpbW1lZGlhdGUpIHsNCiAgICAgIHZhciBmb3VuZCwgX3JlZjI7DQogICAgICBmb3VuZCA9ICEhdGhpcy50eXBlKG5hbWUpOw0KICAgICAgaWYgKGZvdW5kIHx8IGltbWVkaWF0ZSkgew0KICAgICAgICByZXR1cm4gZm91bmQ7DQogICAgICB9DQogICAgICByZXR1cm4gISEoKF9yZWYyID0gdGhpcy5wYXJlbnQpICE9IG51bGwgPyBfcmVmMi5jaGVjayhuYW1lKSA6IHZvaWQgMCk7DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUudGVtcG9yYXJ5ID0gZnVuY3Rpb24obmFtZSwgaW5kZXgpIHsNCiAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgcmV0dXJuICdfJyArIG5hbWUgKyAoaW5kZXggPiAxID8gaW5kZXggOiAnJyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gJ18nICsgKGluZGV4ICsgcGFyc2VJbnQobmFtZSwgMzYpKS50b1N0cmluZygzNikucmVwbGFjZSgvXGQvZywgJ2EnKTsNCiAgICAgIH0NCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24obmFtZSkgew0KICAgICAgdmFyIHYsIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIF9yZWYyID0gdGhpcy52YXJpYWJsZXM7DQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQogICAgICAgIHYgPSBfcmVmMltfaV07DQogICAgICAgIGlmICh2Lm5hbWUgPT09IG5hbWUpIHsNCiAgICAgICAgICByZXR1cm4gdi50eXBlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS5mcmVlVmFyaWFibGUgPSBmdW5jdGlvbih0eXBlKSB7DQogICAgICB2YXIgaW5kZXgsIHRlbXA7DQogICAgICBpbmRleCA9IDA7DQogICAgICB3aGlsZSAodGhpcy5jaGVjaygodGVtcCA9IHRoaXMudGVtcG9yYXJ5KHR5cGUsIGluZGV4KSkpKSB7DQogICAgICAgIGluZGV4Kys7DQogICAgICB9DQogICAgICB0aGlzLmFkZCh0ZW1wLCAndmFyJywgdHJ1ZSk7DQogICAgICByZXR1cm4gdGVtcDsNCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS5hc3NpZ24gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICAgICAgdGhpcy5hZGQobmFtZSwgew0KICAgICAgICB2YWx1ZTogdmFsdWUsDQogICAgICAgIGFzc2lnbmVkOiB0cnVlDQogICAgICB9KTsNCiAgICAgIHJldHVybiB0aGlzLmhhc0Fzc2lnbm1lbnRzID0gdHJ1ZTsNCiAgICB9Ow0KICAgIFNjb3BlLnByb3RvdHlwZS5oYXNEZWNsYXJhdGlvbnMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAhIXRoaXMuZGVjbGFyZWRWYXJpYWJsZXMoKS5sZW5ndGg7DQogICAgfTsNCiAgICBTY29wZS5wcm90b3R5cGUuZGVjbGFyZWRWYXJpYWJsZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgIHZhciByZWFsVmFycywgdGVtcFZhcnMsIHYsIF9pLCBfbGVuLCBfcmVmMjsNCiAgICAgIHJlYWxWYXJzID0gW107DQogICAgICB0ZW1wVmFycyA9IFtdOw0KICAgICAgX3JlZjIgPSB0aGlzLnZhcmlhYmxlczsNCiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsNCiAgICAgICAgdiA9IF9yZWYyW19pXTsNCiAgICAgICAgaWYgKHYudHlwZSA9PT0gJ3ZhcicpIHsNCiAgICAgICAgICAodi5uYW1lLmNoYXJBdCgwKSA9PT0gJ18nID8gdGVtcFZhcnMgOiByZWFsVmFycykucHVzaCh2Lm5hbWUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gcmVhbFZhcnMuc29ydCgpLmNvbmNhdCh0ZW1wVmFycy5zb3J0KCkpOw0KICAgIH07DQogICAgU2NvcGUucHJvdG90eXBlLmFzc2lnbmVkVmFyaWFibGVzID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgdiwgX2ksIF9sZW4sIF9yZWYyLCBfcmVzdWx0czsNCiAgICAgIF9yZWYyID0gdGhpcy52YXJpYWJsZXM7DQogICAgICBfcmVzdWx0cyA9IFtdOw0KICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KICAgICAgICB2ID0gX3JlZjJbX2ldOw0KICAgICAgICBpZiAodi50eXBlLmFzc2lnbmVkKSB7DQogICAgICAgICAgX3Jlc3VsdHMucHVzaCgiIiArIHYubmFtZSArICIgPSAiICsgdi50eXBlLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIF9yZXN1bHRzOw0KICAgIH07DQogICAgcmV0dXJuIFNjb3BlOw0KICB9KSgpOw0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKCB0eXBlb2Yoc3RyKSA9PSAnc3RyaW5nJyAmJiBtYXRjaCkgew0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yDQogICAgICAgICAgICAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgew0KICAgICAgICAgICAgICAgIHIyID0gUmVnRXhwKHRoaXMuc291cmNlLCByZWFsLnJlcGxhY2UuY2FsbChnZXROYXRpdmVGbGFncyh0aGlzKSwgImciLCAiIikpOw0KICAgICAgICAgICAgICAgIC8vIFVzaW5nIGBzdHIuc2xpY2UobWF0Y2guaW5kZXgpYCByYXRoZXIgdGhhbiBgbWF0Y2hbMF1gIGluIGNhc2UgbG9va2FoZWFkIGFsbG93ZWQNCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaA0KICAgICAgICAgICAgICAgIHJlYWwucmVwbGFjZS5jYWxsKHN0ci5zbGljZShtYXRjaC5pbmRleCksIHIyLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW2ldID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBBdHRhY2ggbmFtZWQgY2FwdHVyZSBwcm9wZXJ0aWVzDQogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWF0Y2gubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2kgLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW25hbWVdID0gbWF0Y2hbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHRoYXQgaW5jcmVtZW50IGBsYXN0SW5kZXhgIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50ICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgIH07DQoNCiAgICAvLyBEb24ndCBvdmVycmlkZSBgdGVzdGAgaWYgaXQgd29uJ3QgY2hhbmdlIGFueXRoaW5nDQogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsNCiAgICAgICAgLy8gRml4IGJyb3dzZXIgYnVnIGluIG5hdGl2ZSBtZXRob2QNCiAgICAgICAgUmVnRXhwLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHN0cikgew0KICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuDQogICAgICAgICAgICAvLyBgZXhlY2Agd291bGQgdGFrZSBjYXJlIG9mIHRoZSBgbGFzdEluZGV4YCBmaXgNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlYWwuZXhlYy5jYWxsKHRoaXMsIHN0cik7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgZnVuY3Rpb24gZ2V0TmF0aXZlRmxhZ3MgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguaWdub3JlQ2FzZSA/ICJpIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXgubXVsdGlsaW5lICA/ICJtIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMw0KICAgICAgICAgICAgICAgKHJlZ2V4LnN0aWNreSAgICAgPyAieSIgOiAiIik7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGluZGV4T2YgKGFycmF5LCBpdGVtLCBmcm9tKSB7DQogICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgLy8gVXNlIHRoZSBuYXRpdmUgYXJyYXkgbWV0aG9kIGlmIGF2YWlsYWJsZQ0KICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7DQogICAgICAgIGZvciAodmFyIGkgPSBmcm9tIHx8IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KDQp9KTsNCi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQogDQpkZWZpbmUoJ2FjZS9tb2RlL2Nzc193b3JrZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS93b3JrZXIvbWlycm9yJywgJ2FjZS9tb2RlL2Nzcy9jc3NsaW50J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7DQp2YXIgQ1NTTGludCA9IHJlcXVpcmUoIi4vY3NzL2Nzc2xpbnQiKS5DU1NMaW50Ow0KDQp2YXIgV29ya2VyID0gZXhwb3J0cy5Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsNCiAgICBNaXJyb3IuY2FsbCh0aGlzLCBzZW5kZXIpOw0KICAgIHRoaXMuc2V0VGltZW91dCgyMDApOw0KfTsNCg0Kb29wLmluaGVyaXRzKFdvcmtlciwgTWlycm9yKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kb2MuZ2V0VmFsdWUoKTsNCiAgICAgICAgDQogICAgICAgIHZhciByZXN1bHQgPSBDU1NMaW50LnZlcmlmeSh2YWx1ZSk7DQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImNzc2xpbnQiLCByZXN1bHQubWVzc2FnZXMubWFwKGZ1bmN0aW9uKG1zZykgew0KICAgICAgICAgICAgZGVsZXRlIG1zZy5ydWxlOw0KICAgICAgICAgICAgcmV0dXJuIG1zZzsNCiAgICAgICAgfSkpOw0KICAgIH07DQogICAgDQp9KS5jYWxsKFdvcmtlci5wcm90b3R5cGUpOw0KDQp9KTtkZWZpbmUoJ2FjZS93b3JrZXIvbWlycm9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuLi9kb2N1bWVudCIpLkRvY3VtZW50Ow0KdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOw0KICAgIA0KdmFyIE1pcnJvciA9IGV4cG9ydHMuTWlycm9yID0gZnVuY3Rpb24oc2VuZGVyKSB7DQogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7DQogICAgdmFyIGRvYyA9IHRoaXMuZG9jID0gbmV3IERvY3VtZW50KCIiKTsNCiAgICANCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWZlcnJlZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsNCiAgICANCiAgICB2YXIgX3NlbGYgPSB0aGlzOw0KICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgew0KICAgICAgICBkb2MuYXBwbHlEZWx0YXMoW2UuZGF0YV0pOyAgICAgICAgDQogICAgICAgIGRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKF9zZWxmLiR0aW1lb3V0KTsNCiAgICB9KTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICANCiAgICB0aGlzLiR0aW1lb3V0ID0gNTAwOw0KICAgIA0KICAgIHRoaXMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsNCiAgICAgICAgdGhpcy4kdGltZW91dCA9IHRpbWVvdXQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOw0KICAgICAgICB0aGlzLmRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKHRoaXMuJHRpbWVvdXQpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrSWQpIHsNCiAgICAgICAgdGhpcy5zZW5kZXIuY2FsbGJhY2sodGhpcy5kb2MuZ2V0VmFsdWUoKSwgY2FsbGJhY2tJZCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uVXBkYXRlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIC8vIGFic3RyYWN0IG1ldGhvZA0KICAgIH07DQogICAgDQp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOw0KDQp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7DQp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7DQoNCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICB0aGlzLiRsaW5lcyA9IFtdOw0KDQogICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHsNCiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsNCiAgICB9DQogICAgLy8gVGhlcmUgaGFzIHRvIGJlIG9uZSBsaW5lIGF0IGxlYXN0IGluIHRoZSBkb2N1bWVudC4gSWYgeW91IHBhc3MgYW4gZW1wdHkNCiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4NCiAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuJGxpbmVzID0gWyIiXTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCg0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuLTEpLmxlbmd0aCkpOw0KICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOw0KICAgIH07DQoNCiAgICAvLyBjaGVjayBmb3IgSUUgc3BsaXQgYnVnDQogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApDQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHJcbnxcci9nLCAiXG4iKS5zcGxpdCgiXG4iKTsNCiAgICAgICAgfQ0KICAgIGVsc2UNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOw0KICAgICAgICB9Ow0KDQoNCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pOw0KICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyID0gZnVuY3Rpb24oKSB7DQogICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7DQogICAgICAgICAgY2FzZSAid2luZG93cyI6DQogICAgICAgICAgICAgIHJldHVybiAiXHJcbiI7DQoNCiAgICAgICAgICBjYXNlICJ1bml4IjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcbiI7DQoNCiAgICAgICAgICBjYXNlICJhdXRvIjoNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lOw0KICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7DQogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7DQogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7DQogICAgICAgIGlmICh0aGlzLiRuZXdMaW5lTW9kZSA9PT0gbmV3TGluZU1vZGUpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7DQogICAgfTsNCg0KICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudA0KICAgICAqLw0KICAgIHRoaXMuZ2V0TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcm93XSB8fCAiIjsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIGFsbCBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgc3RyaW5nIGFycmF5LiBXYXJuaW5nOiBUaGUgY2FsbGVyDQogICAgICogc2hvdWxkIG5vdCBtb2RpZnkgdGhpcyBhcnJheSENCiAgICAgKi8NCiAgICB0aGlzLmdldEFsbExpbmVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOw0KICAgIH07DQoNCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5nZXRMaW5lcyhyYW5nZS5zdGFydC5yb3crMSwgcmFuZ2UuZW5kLnJvdy0xKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7DQogICAgICAgICAgICByZXR1cm4gbGluZXMuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7DQogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBsZW5ndGggLSAxKTsNCiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQoNCiAgICAgICAgaWYgKHRoaXMuZ2V0TGVuZ3RoKCkgPD0gMSkNCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7DQoNCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kc3BsaXQodGV4dCk7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07DQogICAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IGxpbmVzLnNwbGljZShsaW5lcy5sZW5ndGggLSAxLCAxKVswXTsNCg0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOw0KICAgICAgICBpZiAobGFzdExpbmUgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnROZXdMaW5lKHBvc2l0aW9uKTsgLy8gdGVybWluYXRlIGZpcnN0IGxpbmUNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsNCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGxhc3RMaW5lIHx8ICIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7DQogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogMH07DQoNCiAgICAgICAgdmFyIGFyZ3MgPSBbcm93LCAwXTsNCiAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGxpbmVzKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3cgKyBsaW5lcy5sZW5ndGgsIDApOw0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBsaW5lczogbGluZXMNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbik7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShwb3NpdGlvbi5yb3cgKyAxLCAwLCBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4sIGxpbmUubGVuZ3RoKSk7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdyArIDEsDQogICAgICAgICAgICBjb2x1bW4gOiAwDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRJbkxpbmUgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsNCg0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7DQoNCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbikgKyB0ZXh0DQogICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4pOw0KDQogICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3csDQogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aA0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICAvLyBjbGlwIHRvIGRvY3VtZW50DQogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsNCiAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLmVuZCk7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgIHZhciBsYXN0Um93ID0gcmFuZ2UuZW5kLnJvdzsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgdmFyIGZpcnN0RnVsbFJvdyA9IHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSAwID8gZmlyc3RSb3cgOiBmaXJzdFJvdyArIDE7DQogICAgICAgICAgICB2YXIgbGFzdEZ1bGxSb3cgPSBsYXN0Um93IC0gMTsNCg0KICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPiAwKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGxhc3RSb3csIDAsIHJhbmdlLmVuZC5jb2x1bW4pOw0KDQogICAgICAgICAgICBpZiAobGFzdEZ1bGxSb3cgPj0gZmlyc3RGdWxsUm93KQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMoZmlyc3RGdWxsUm93LCBsYXN0RnVsbFJvdyk7DQoNCiAgICAgICAgICAgIGlmIChmaXJzdEZ1bGxSb3cgIT0gZmlyc3RSb3cpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCB0aGlzLmdldExpbmUoZmlyc3RSb3cpLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7DQogICAgICAgIGlmIChzdGFydENvbHVtbiA9PSBlbmRDb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgc3RhcnRDb2x1bW4sIHJvdywgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsNCiAgICAgICAgdmFyIG5ld0xpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4sIGxpbmUubGVuZ3RoKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMSwgbmV3TGluZSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICB0ZXh0OiByZW1vdmVkDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIHJhbmdlIG9mIGZ1bGwgbGluZXMNCiAgICAgKg0KICAgICAqIEBwYXJhbSBmaXJzdFJvdyB7SW50ZWdlcn0gVGhlIGZpcnN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHBhcmFtIGxhc3RSb3cge0ludGVnZXJ9IFRoZSBsYXN0IHJvdyB0byBiZSByZW1vdmVkDQogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzDQogICAgICovDQogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuJGxpbmVzLnNwbGljZShmaXJzdFJvdywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlTGluZXMiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLA0KICAgICAgICAgICAgbGluZXM6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgew0KICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBmaXJzdExpbmUubGVuZ3RoLCByb3crMSwgMCk7DQogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsNCg0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAyLCBsaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgfTsNCg0KICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCg0KICAgICAgICAvLyBTaG9ydGN1dDogSWYgdGhlIHRleHQgd2Ugd2FudCB0byBpbnNlcnQgaXMgdGhlIHNhbWUgYXMgaXQgaXMgYWxyZWFkeQ0KICAgICAgICAvLyBpbiB0aGUgZG9jdW1lbnQsIHdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSBhbnl0aGluZy4NCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsNCg0KICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIGlmICh0ZXh0KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmFwcGx5RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7DQogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KDQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOw0KDQogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOw0KICAgICAgICB9DQogICAgfTsNCg0KfSkuY2FsbChEb2N1bWVudC5wcm90b3R5cGUpOw0KDQpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9yYW5nZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsNCiAgICB0aGlzLnN0YXJ0ID0gew0KICAgICAgICByb3c6IHN0YXJ0Um93LA0KICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMuZW5kID0gew0KICAgICAgICByb3c6IGVuZFJvdywNCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4NCiAgICB9Ow0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmDQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmDQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbg0KICAgIH07DQoNCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAoIlJhbmdlOiBbIiArIHRoaXMuc3RhcnQucm93ICsgIi8iICsgdGhpcy5zdGFydC5jb2x1bW4gKw0KICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ29tcGFyZXMgdGhpcyByYW5nZSAoQSkgd2l0aCBhbm90aGVyIHJhbmdlIChCKSwgd2hlcmUgQiBpcyB0aGUgcGFzc2VkIGluDQogICAgICogcmFuZ2UuDQogICAgICoNCiAgICAgKiBSZXR1cm4gdmFsdWVzOg0KICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkNCiAgICAgKiAgIDA6IChCKSBpcyBjb21wbGV0bHkgaW5zaWRlIG9mIChBKSBPUiAoQSkgaXMgY29tcGxldHkgaW5zaWRlIG9mIChCKQ0KICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpDQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQ0KICAgICAqDQogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpDQogICAgICovDQogICAgdGhpcy5jb21wYXJlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICB2YXIgY21wLA0KICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLA0KICAgICAgICAgICAgc3RhcnQgPSByYW5nZS5zdGFydDsNCg0KICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7DQogICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIHJldHVybiAtMjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiA0MjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOw0KICAgIH0NCg0KICAgIHRoaXMuY29udGFpbnNSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7DQogICAgfQ0KDQogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW47DQogICAgfQ0KDQogICAgdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gY29sdW1uOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgew0KICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHJvdyA8IHRoaXMuc3RhcnQucm93KQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KDQogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpDQogICAgICAgICAgICByZXR1cm4gMTsNCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT09IHJvdykNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7DQoNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsNCg0KICAgICAgICByZXR1cm4gMDsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7DQogICAgICovDQogICAgdGhpcy5jb21wYXJlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc0VuZCBpcyB0cnVlLCByZXR1cm4gMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA+IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgIHJvdzogbGFzdFJvdysxLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5leHRlbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCg0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQ0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCg0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ICE9PSB0aGlzLmVuZC5yb3cpOw0KICAgIH07DQoNCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdy0xKSwgMCkNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQ0KICAgIH07DQoNCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7DQogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsNCiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9DQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7DQoNCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgNCiAgICAgICAgICAgIHNjcmVlblBvc1N0YXJ0LnJvdywgc2NyZWVuUG9zU3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbg0KICAgICAgICApOw0KICAgIH07DQoNCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsNCg0KDQpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnQucm93LCBzdGFydC5jb2x1bW4sIGVuZC5yb3csIGVuZC5jb2x1bW4pOw0KfTsNCg0KZXhwb3J0cy5SYW5nZSA9IFJhbmdlOw0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvYW5jaG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KDQovKioNCiAqIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yDQogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkDQogKi8NCnZhciBBbmNob3IgPSBleHBvcnRzLkFuY2hvciA9IGZ1bmN0aW9uKGRvYywgcm93LCBjb2x1bW4pIHsNCiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOw0KICAgIA0KICAgIGlmICh0eXBlb2YgY29sdW1uID09ICJ1bmRlZmluZWQiKQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOw0KICAgIGVsc2UNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbik7DQoNCiAgICB0aGlzLiRvbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTsNCiAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCn07DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICANCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LCB0aGlzLmNvbHVtbik7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldERvY3VtZW50ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOw0KICAgICAgICB2YXIgcmFuZ2UgPSBkZWx0YS5yYW5nZTsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7DQogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbjsNCiAgICAgICAgDQogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0Iikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8PSBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydExpbmVzIikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPCBjb2x1bW4pIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+PSBjb2x1bW4pDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIChyYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJvdyAtPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93IDw9IHJvdykNCiAgICAgICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uLCB0cnVlKTsNCiAgICB9Ow0KDQogICAgdGhpcy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBub0NsaXApIHsNCiAgICAgICAgdmFyIHBvczsNCiAgICAgICAgaWYgKG5vQ2xpcCkgew0KICAgICAgICAgICAgcG9zID0gew0KICAgICAgICAgICAgICAgIHJvdzogcm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICh0aGlzLnJvdyA9PSBwb3Mucm93ICYmIHRoaXMuY29sdW1uID09IHBvcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgdmFyIG9sZCA9IHsNCiAgICAgICAgICAgIHJvdzogdGhpcy5yb3csDQogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uDQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7DQogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgew0KICAgICAgICAgICAgb2xkOiBvbGQsDQogICAgICAgICAgICB2YWx1ZTogcG9zDQogICAgICAgIH0pOw0KICAgIH07DQogICAgDQogICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIHBvcyA9IHt9Ow0KICAgIA0KICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSBNYXRoLm1heCgwLCB0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7DQogICAgICAgICAgICBwb3Mucm93ID0gMDsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSBNYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoLCBNYXRoLm1heCgwLCBjb2x1bW4pKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKGNvbHVtbiA8IDApDQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gcG9zOw0KICAgIH07DQogICAgDQp9KS5jYWxsKEFuY2hvci5wcm90b3R5cGUpOw0KDQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCmV4cG9ydHMuc3RyaW5nUmV2ZXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsNCn07DQoNCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsNCiAgICAgcmV0dXJuIG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4oc3RyaW5nKTsNCn07DQoNCnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsNCnZhciB0cmltRW5kUmVnZXhwID0gL1xzXHMqJC87DQoNCmV4cG9ydHMuc3RyaW5nVHJpbUxlZnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsNCn07DQoNCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgew0KICAgIHZhciBjb3B5ID0ge307DQogICAgZm9yICh2YXIga2V5IGluIG9iaikgew0KICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmNvcHlBcnJheSA9IGZ1bmN0aW9uKGFycmF5KXsNCiAgICB2YXIgY29weSA9IFtdOw0KICAgIGZvciAodmFyIGk9MCwgbD1hcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7DQogICAgICAgIGlmIChhcnJheVtpXSAmJiB0eXBlb2YgYXJyYXlbaV0gPT0gIm9iamVjdCIpDQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KCBhcnJheVtpXSApOw0KICAgICAgICBlbHNlIA0KICAgICAgICAgICAgY29weVtpXSA9IGFycmF5W2ldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuZGVlcENvcHkgPSBmdW5jdGlvbiAob2JqKSB7DQogICAgaWYgKHR5cGVvZiBvYmogIT0gIm9iamVjdCIpIHsNCiAgICAgICAgcmV0dXJuIG9iajsNCiAgICB9DQogICAgDQogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIGNvcHlba2V5XSA9IHRoaXMuZGVlcENvcHkob2JqW2tleV0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmFycmF5VG9NYXAgPSBmdW5jdGlvbihhcnIpIHsNCiAgICB2YXIgbWFwID0ge307DQogICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgew0KICAgICAgICBtYXBbYXJyW2ldXSA9IDE7DQogICAgfQ0KICAgIHJldHVybiBtYXA7DQoNCn07DQoNCi8qKg0KICogc3BsaWNlIG91dCBvZiAnYXJyYXknIGFueXRoaW5nIHRoYXQgPT09ICd2YWx1ZScNCiAqLw0KZXhwb3J0cy5hcnJheVJlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgew0KICBmb3IgKHZhciBpID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgIGlmICh2YWx1ZSA9PT0gYXJyYXlbaV0pIHsNCiAgICAgIGFycmF5LnNwbGljZShpLCAxKTsNCiAgICB9DQogIH0NCn07DQoNCmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24oc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7DQp9Ow0KDQpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgew0KDQogICAgdmFyIHRpbWVyID0gbnVsbDsNCiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGltZXIgPSBudWxsOw0KICAgICAgICBmY24oKTsNCiAgICB9Ow0KDQogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24odGltZW91dCkgew0KICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsNCiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IDApOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7DQoNCiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuY2FuY2VsKCk7DQogICAgICAgIGZjbigpOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOw0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgcmV0dXJuIGRlZmVycmVkOw0KfTsNCg0KfSk7DQovKiANCkNTU0xpbnQNCkNvcHlyaWdodCAoYykgMjAxMSBOaWNvbGUgU3VsbGl2YW4gYW5kIE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NClRIRSBTT0ZUV0FSRS4NCg0KKi8NCmRlZmluZSgnYWNlL21vZGUvY3NzL2Nzc2xpbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KLyohDQpQYXJzZXItTGliDQpDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBOaWNob2xhcyBDLiBaYWthcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQpUSEUgU09GVFdBUkUuDQoNCiovDQovKiBCdWlsZCB0aW1lOiAxMy1KdWx5LTIwMTEgMDQ6MzU6MjggKi8NCnZhciBwYXJzZXJsaWIgPSB7fTsNCihmdW5jdGlvbigpew0KDQovKioNCiAqIEEgZ2VuZXJpYyBiYXNlIHRvIGluaGVyaXQgZnJvbSBmb3IgYW55IG9iamVjdA0KICogdGhhdCBuZWVkcyBldmVudCBoYW5kbGluZy4NCiAqIEBjbGFzcyBFdmVudFRhcmdldA0KICogQGNvbnN0cnVjdG9yDQogKi8NCmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCl7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgYXJyYXkgb2YgbGlzdGVuZXJzIGZvciB2YXJpb3VzIGV2ZW50cy4NCiAgICAgKiBAdHlwZSBPYmplY3QNCiAgICAgKiBAcHJvcGVydHkgX2xpc3RlbmVycw0KICAgICAqIEBwcml2YXRlDQogICAgICovDQogICAgdGhpcy5fbGlzdGVuZXJzID0ge307ICAgIA0KfQ0KDQpFdmVudFRhcmdldC5wcm90b3R5cGUgPSB7DQoNCiAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3INCiAgICBjb25zdHJ1Y3RvcjogRXZlbnRUYXJnZXQsDQoNCiAgICAvKioNCiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZS4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiBldmVudCB0byBhZGQgYSBsaXN0ZW5lciBmb3IuDQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgb2NjdXJzLg0KICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICogQG1ldGhvZCBhZGRMaXN0ZW5lcg0KICAgICAqLw0KICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7DQogICAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdKXsNCiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IFtdOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpOw0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogRmlyZXMgYW4gZXZlbnQgYmFzZWQgb24gdGhlIHBhc3NlZC1pbiBvYmplY3QuDQogICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBldmVudCBBbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhICd0eXBlJyBhdHRyaWJ1dGUNCiAgICAgKiAgICAgIG9yIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGV2ZW50IG5hbWUuDQogICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgKiBAbWV0aG9kIGZpcmUNCiAgICAgKi8gICAgDQogICAgZmlyZTogZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIGV2ZW50ID0geyB0eXBlOiBldmVudCB9Ow0KICAgICAgICB9DQogICAgICAgIGlmICghZXZlbnQudGFyZ2V0KXsNCiAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IHRoaXM7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICghZXZlbnQudHlwZSl7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkV2ZW50IG9iamVjdCBtaXNzaW5nICd0eXBlJyBwcm9wZXJ0eS4iKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tldmVudC50eXBlXSl7DQogICAgICAgIA0KICAgICAgICAgICAgLy9jcmVhdGUgYSBjb3B5IG9mIHRoZSBhcnJheSBhbmQgdXNlIHRoYXQgc28gbGlzdGVuZXJzIGNhbid0IGNoYW5lDQogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50LnR5cGVdLmNvbmNhdCgpOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49bGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uY2FsbCh0aGlzLCBldmVudCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gICAgICAgICAgICANCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbS4NCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50Lg0KICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICogQG1ldGhvZCByZW1vdmVMaXN0ZW5lcg0KICAgICAqLw0KICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7DQogICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pew0KICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXTsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpew0KICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgICAgICB9ICAgICAgICAgICAgDQogICAgfQ0KfTsNCi8qKg0KICogQ29udmVuaWVudCB3YXkgdG8gcmVhZCB0aHJvdWdoIHN0cmluZ3MuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi51dGlsDQogKiBAY2xhc3MgU3RyaW5nUmVhZGVyDQogKiBAY29uc3RydWN0b3INCiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIHJlYWQuDQogKi8NCmZ1bmN0aW9uIFN0cmluZ1JlYWRlcih0ZXh0KXsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBpbnB1dCB0ZXh0IHdpdGggbGluZSBlbmRpbmdzIG5vcm1hbGl6ZWQuDQogICAgICogQHByb3BlcnR5IF9pbnB1dA0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcml2YXRlDQogICAgICovDQogICAgdGhpcy5faW5wdXQgPSB0ZXh0LnJlcGxhY2UoL1xuXHI/L2csICJcbiIpOw0KDQoNCiAgICAvKioNCiAgICAgKiBUaGUgcm93IGZvciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAcHJvcGVydHkgX2xpbmUNCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2xpbmUgPSAxOw0KDQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAcHJvcGVydHkgX2NvbA0KICAgICAqIEB0eXBlIGludA0KICAgICAqIEBwcml2YXRlDQogICAgICovDQogICAgdGhpcy5fY29sID0gMTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCB0byBiZSByZWFkIG5leHQuDQogICAgICogQHByb3BlcnR5IF9jdXJzb3INCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2N1cnNvciA9IDA7DQp9DQoNClN0cmluZ1JlYWRlci5wcm90b3R5cGUgPSB7DQoNCiAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3INCiAgICBjb25zdHJ1Y3RvcjogU3RyaW5nUmVhZGVyLA0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gUG9zaXRpb24gaW5mbw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gYmUgcmVhZCBuZXh0Lg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIGNvbHVtbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAbWV0aG9kIGdldENvbA0KICAgICAqLw0KICAgIGdldENvbDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbDsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgcm93IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYmUgcmVhZCBuZXh0Lg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHJvdyBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4NCiAgICAgKiBAbWV0aG9kIGdldExpbmUNCiAgICAgKi8NCiAgICBnZXRMaW5lOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5fbGluZSA7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIERldGVybWluZXMgaWYgeW91J3JlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0Lg0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlcmUncyBubyBtb3JlIGlucHV0LCBmYWxzZSBvdGhlcndpc2UuDQogICAgICogQG1ldGhvZCBlb2YNCiAgICAgKi8NCiAgICBlb2Y6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiAodGhpcy5fY3Vyc29yID09IHRoaXMuX2lucHV0Lmxlbmd0aCk7DQogICAgfSwNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIEJhc2ljIHJlYWRpbmcNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIC8qKg0KICAgICAqIFJlYWRzIHRoZSBuZXh0IGNoYXJhY3RlciB3aXRob3V0IGFkdmFuY2luZyB0aGUgY3Vyc29yLg0KICAgICAqIEBwYXJhbSB7aW50fSBjb3VudCBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIGxvb2sgYWhlYWQgKGRlZmF1bHQgaXMgMSkuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgbmV4dCBjaGFyYWN0ZXIgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBuZXh0IGNoYXJhY3Rlci4NCiAgICAgKiBAbWV0aG9kIHBlZWsNCiAgICAgKi8NCiAgICBwZWVrOiBmdW5jdGlvbihjb3VudCl7DQogICAgICAgIHZhciBjID0gbnVsbDsNCiAgICAgICAgY291bnQgPSAodHlwZW9mIGNvdW50ID09ICJ1bmRlZmluZWQiID8gMSA6IGNvdW50KTsNCg0KICAgICAgICAvL2lmIHdlJ3JlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4uLg0KICAgICAgICBpZiAodGhpcy5fY3Vyc29yIDwgdGhpcy5faW5wdXQubGVuZ3RoKXsNCg0KICAgICAgICAgICAgLy9nZXQgY2hhcmFjdGVyIGFuZCBpbmNyZW1lbnQgY3Vyc29yIGFuZCBjb2x1bW4NCiAgICAgICAgICAgIGMgPSB0aGlzLl9pbnB1dC5jaGFyQXQodGhpcy5fY3Vyc29yICsgY291bnQgLSAxKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBjOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZWFkcyB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5wdXQgYW5kIGFkanVzdHMgdGhlIHJvdyBhbmQgY29sdW1uDQogICAgICogYWNjb3JkaW5nbHkuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgbmV4dCBjaGFyYWN0ZXIgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBuZXh0IGNoYXJhY3Rlci4NCiAgICAgKiBAbWV0aG9kIHJlYWQNCiAgICAgKi8NCiAgICByZWFkOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgYyA9IG51bGw7DQoNCiAgICAgICAgLy9pZiB3ZSdyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuLi4NCiAgICAgICAgaWYgKHRoaXMuX2N1cnNvciA8IHRoaXMuX2lucHV0Lmxlbmd0aCl7DQoNCiAgICAgICAgICAgIC8vaWYgdGhlIGxhc3QgY2hhcmFjdGVyIHdhcyBhIG5ld2xpbmUsIGluY3JlbWVudCByb3cgY291bnQNCiAgICAgICAgICAgIC8vYW5kIHJlc2V0IGNvbHVtbiBjb3VudA0KICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0LmNoYXJBdCh0aGlzLl9jdXJzb3IpID09ICJcbiIpew0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbmUrKzsNCiAgICAgICAgICAgICAgICB0aGlzLl9jb2w9MTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5fY29sKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vZ2V0IGNoYXJhY3RlciBhbmQgaW5jcmVtZW50IGN1cnNvciBhbmQgY29sdW1uDQogICAgICAgICAgICBjID0gdGhpcy5faW5wdXQuY2hhckF0KHRoaXMuX2N1cnNvcisrKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBjOw0KICAgIH0sDQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBNaXNjDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBTYXZlcyB0aGUgY3VycmVudCBsb2NhdGlvbiBzbyBpdCBjYW4gYmUgcmV0dXJuZWQgdG8gbGF0ZXIuDQogICAgICogQG1ldGhvZCBtYXJrDQogICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgKi8NCiAgICBtYXJrOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLl9ib29rbWFyayA9IHsNCiAgICAgICAgICAgIGN1cnNvcjogdGhpcy5fY3Vyc29yLA0KICAgICAgICAgICAgbGluZTogICB0aGlzLl9saW5lLA0KICAgICAgICAgICAgY29sOiAgICB0aGlzLl9jb2wNCiAgICAgICAgfTsNCiAgICB9LA0KDQogICAgcmVzZXQ6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmICh0aGlzLl9ib29rbWFyayl7DQogICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSB0aGlzLl9ib29rbWFyay5jdXJzb3I7DQogICAgICAgICAgICB0aGlzLl9saW5lID0gdGhpcy5fYm9va21hcmsubGluZTsNCiAgICAgICAgICAgIHRoaXMuX2NvbCA9IHRoaXMuX2Jvb2ttYXJrLmNvbDsNCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ib29rbWFyazsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBBZHZhbmNlZCByZWFkaW5nDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBSZWFkcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBnaXZlbiBzdHJpbmcuIFRocm93cyBhbiBlcnJvciBpZiB0aGF0DQogICAgICogc3RyaW5nIGlzIG5vdCBmb3VuZC4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiBUaGUgc3RyaW5nIHRvIHJlYWQuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIHdoZW4gaXQgaXMgZm91bmQuDQogICAgICogQHRocm93cyBFcnJvciB3aGVuIHRoZSBzdHJpbmcgcGF0dGVybiBpcyBub3QgZm91bmQuDQogICAgICogQG1ldGhvZCByZWFkVG8NCiAgICAgKi8NCiAgICByZWFkVG86IGZ1bmN0aW9uKHBhdHRlcm4pew0KDQogICAgICAgIHZhciBidWZmZXIgPSAiIiwNCiAgICAgICAgICAgIGM7DQoNCiAgICAgICAgLyoNCiAgICAgICAgICogRmlyc3QsIGJ1ZmZlciBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgcGF0dGVybi4NCiAgICAgICAgICogVGhlbiwgYnVmZmVyIG11c3QgZW5kIHdpdGggdGhlIHBhdHRlcm4gb3IgZWxzZSByZWFjaCB0aGUNCiAgICAgICAgICogZW5kIG9mIHRoZSBpbnB1dC4NCiAgICAgICAgICovDQogICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoIDwgcGF0dGVybi5sZW5ndGggfHwgYnVmZmVyLmxhc3RJbmRleE9mKHBhdHRlcm4pICE9IGJ1ZmZlci5sZW5ndGggLSBwYXR0ZXJuLmxlbmd0aCl7DQogICAgICAgICAgICBjID0gdGhpcy5yZWFkKCk7DQogICAgICAgICAgICBpZiAoYyl7DQogICAgICAgICAgICAgICAgYnVmZmVyICs9IGM7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgXCIiICsgcGF0dGVybiArICJcIiBhdCBsaW5lICIgKyB0aGlzLl9saW5lICArICIsIGNvbCAiICsgdGhpcy5fY29sICsgIi4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXI7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVhZHMgY2hhcmFjdGVycyB3aGlsZSBlYWNoIGNoYXJhY3RlciBjYXVzZXMgdGhlIGdpdmVuDQogICAgICogZmlsdGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0cnVlLiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkDQogICAgICogaW4gZWFjaCBjaGFyYWN0ZXIgYW5kIGVpdGhlciByZXR1cm5zIHRydWUgdG8gY29udGludWUNCiAgICAgKiByZWFkaW5nIG9yIGZhbHNlIHRvIHN0b3AuDQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyIFRoZSBmdW5jdGlvbiB0byByZWFkIG9uIGVhY2ggY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHN0cmluZyBtYWRlIHVwIG9mIGFsbCBjaGFyYWN0ZXJzIHRoYXQgcGFzc2VkIHRoZQ0KICAgICAqICAgICAgZmlsdGVyIGNoZWNrLg0KICAgICAqIEBtZXRob2QgcmVhZFdoaWxlDQogICAgICovDQogICAgcmVhZFdoaWxlOiBmdW5jdGlvbihmaWx0ZXIpew0KDQogICAgICAgIHZhciBidWZmZXIgPSAiIiwNCiAgICAgICAgICAgIGMgPSB0aGlzLnJlYWQoKTsNCg0KICAgICAgICB3aGlsZShjICE9PSBudWxsICYmIGZpbHRlcihjKSl7DQogICAgICAgICAgICBidWZmZXIgKz0gYzsNCiAgICAgICAgICAgIGMgPSB0aGlzLnJlYWQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXI7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVhZHMgY2hhcmFjdGVycyB0aGF0IG1hdGNoIGVpdGhlciB0ZXh0IG9yIGEgcmVndWxhciBleHByZXNzaW9uIGFuZA0KICAgICAqIHJldHVybnMgdGhvc2UgY2hhcmFjdGVycy4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIHJvdyBhbmQgY29sdW1uDQogICAgICogYXJlIGFkanVzdGVkOyBpZiBubyBtYXRjaCBpcyBmb3VuZCwgdGhlIHJlYWRlcidzIHN0YXRlIGlzIHVuY2hhbmdlZC4NCiAgICAgKiByZWFkaW5nIG9yIGZhbHNlIHRvIHN0b3AuDQogICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtYXRjaHRlciBJZiBhIHN0cmluZywgdGhlbiB0aGUgbGl0ZXJhbCBzdHJpbmcNCiAgICAgKiAgICAgIHZhbHVlIGlzIHNlYXJjaGVkIGZvci4gSWYgYSByZWd1bGFyIGV4cHJlc3Npb24sIHRoZW4gYW55IHN0cmluZw0KICAgICAqICAgICAgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gaXMgc2VhcmNoIGZvci4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgbWFkZSB1cCBvZiBhbGwgY2hhcmFjdGVycyB0aGF0IG1hdGNoZWQgb3INCiAgICAgKiAgICAgIG51bGwgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLg0KICAgICAqIEBtZXRob2QgcmVhZE1hdGNoDQogICAgICovDQogICAgcmVhZE1hdGNoOiBmdW5jdGlvbihtYXRjaGVyKXsNCg0KICAgICAgICB2YXIgc291cmNlID0gdGhpcy5faW5wdXQuc3Vic3RyaW5nKHRoaXMuX2N1cnNvciksDQogICAgICAgICAgICB2YWx1ZSA9IG51bGw7DQoNCiAgICAgICAgLy9pZiBpdCdzIGEgc3RyaW5nLCBqdXN0IGRvIGEgc3RyYWlnaHQgbWF0Y2gNCiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIGlmIChzb3VyY2UuaW5kZXhPZihtYXRjaGVyKSA9PT0gMCl7DQogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlYWRDb3VudChtYXRjaGVyLmxlbmd0aCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAobWF0Y2hlciBpbnN0YW5jZW9mIFJlZ0V4cCl7DQogICAgICAgICAgICBpZiAobWF0Y2hlci50ZXN0KHNvdXJjZSkpew0KICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZWFkQ291bnQoUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIH0sDQoNCg0KICAgIC8qKg0KICAgICAqIFJlYWRzIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIElmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQsDQogICAgICogaXQgcmVhZHMgb25seSB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYW5kIGRvZXMgbm90IHRocm93IGFuIGVycm9yLg0KICAgICAqIEBwYXJhbSB7aW50fSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZC4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgbWFkZSB1cCB0aGUgcmVhZCBjaGFyYWN0ZXJzLg0KICAgICAqIEBtZXRob2QgcmVhZENvdW50DQogICAgICovDQogICAgcmVhZENvdW50OiBmdW5jdGlvbihjb3VudCl7DQogICAgICAgIHZhciBidWZmZXIgPSAiIjsNCg0KICAgICAgICB3aGlsZShjb3VudC0tKXsNCiAgICAgICAgICAgIGJ1ZmZlciArPSB0aGlzLnJlYWQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBidWZmZXI7DQogICAgfQ0KDQp9Ow0KLyoqDQogKiBUeXBlIHRvIHVzZSB3aGVuIGEgc3ludGF4IGVycm9yIG9jY3Vycy4NCiAqIEBjbGFzcyBTeW50YXhFcnJvcg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIudXRpbA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4NCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4NCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuDQogKi8NCmZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbCl7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29sdW1uIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4NCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJvcGVydHkgY29sDQogICAgICovDQogICAgdGhpcy5jb2wgPSBjb2w7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbGluZSBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuDQogICAgICogQHR5cGUgaW50DQogICAgICogQHByb3BlcnR5IGxpbmUNCiAgICAgKi8NCiAgICB0aGlzLmxpbmUgPSBsaW5lOw0KDQogICAgLyoqDQogICAgICogVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IHRleHQNCiAgICAgKi8NCiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOw0KDQp9DQoNCi8vaW5oZXJpdCBmcm9tIEVycm9yDQpTeW50YXhFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsNCi8qKg0KICogQmFzZSB0eXBlIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBzeW50YWN0aWMgdW5pdC4NCiAqIEBjbGFzcyBTeW50YXhVbml0DQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi51dGlsDQogKiBAY29uc3RydWN0b3INCiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSB1bml0Lg0KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqLw0KZnVuY3Rpb24gU3ludGF4VW5pdCh0ZXh0LCBsaW5lLCBjb2wpew0KDQoNCiAgICAvKioNCiAgICAgKiBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJvcGVydHkgY29sDQogICAgICovDQogICAgdGhpcy5jb2wgPSBjb2w7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogICAgICogQHR5cGUgaW50DQogICAgICogQHByb3BlcnR5IGxpbmUNCiAgICAgKi8NCiAgICB0aGlzLmxpbmUgPSBsaW5lOw0KDQogICAgLyoqDQogICAgICogVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IHRleHQNCiAgICAgKi8NCiAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KDQp9DQoNCi8qKg0KICogQ3JlYXRlIGEgbmV3IHN5bnRheCB1bml0IGJhc2VkIHNvbGVseSBvbiB0aGUgZ2l2ZW4gdG9rZW4uDQogKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IHN5bnRheCB1bml0IHdoZW4NCiAqIGl0IHJlcHJlc2VudHMgYSBzaW5nbGUgdG9rZW4gaW5zdGVhZCBvZiBtdWx0aXBsZS4NCiAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBUaGUgdG9rZW4gb2JqZWN0IHRvIHJlcHJlc2VudC4NCiAqIEByZXR1cm4ge3BhcnNlcmxpYi51dGlsLlN5bnRheFVuaXR9IFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b2tlbi4NCiAqIEBzdGF0aWMNCiAqIEBtZXRob2QgZnJvbVRva2VuDQogKi8NClN5bnRheFVuaXQuZnJvbVRva2VuID0gZnVuY3Rpb24odG9rZW4pew0KICAgIHJldHVybiBuZXcgU3ludGF4VW5pdCh0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQp9Ow0KDQpTeW50YXhVbml0LnByb3RvdHlwZSA9IHsNCg0KICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3Rvcg0KICAgIGNvbnN0cnVjdG9yOiBTeW50YXhVbml0LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4NCiAgICAgKiBAbWV0aG9kIHZhbHVlT2YNCiAgICAgKi8NCiAgICB2YWx1ZU9mOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOw0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0Lg0KICAgICAqIEBtZXRob2QgdG9TdHJpbmcNCiAgICAgKi8NCiAgICB0b1N0cmluZzogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsNCiAgICB9DQoNCn07DQovKioNCiAqIEdlbmVyaWMgVG9rZW5TdHJlYW0gcHJvdmlkaW5nIGJhc2UgZnVuY3Rpb25hbGl0eS4NCiAqIEBjbGFzcyBUb2tlblN0cmVhbUJhc2UNCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLnV0aWwNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd8U3RyaW5nUmVhZGVyfSBpbnB1dCBUaGUgdGV4dCB0byB0b2tlbml6ZSBvciBhIHJlYWRlciBmcm9tIA0KICogICAgICB3aGljaCB0byByZWFkIHRoZSBpbnB1dC4NCiAqLw0KZnVuY3Rpb24gVG9rZW5TdHJlYW1CYXNlKGlucHV0LCB0b2tlbkRhdGEpew0KDQogICAgLyoqDQogICAgICogVGhlIHN0cmluZyByZWFkZXIgZm9yIGVhc3kgYWNjZXNzIHRvIHRoZSB0ZXh0Lg0KICAgICAqIEB0eXBlIFN0cmluZ1JlYWRlcg0KICAgICAqIEBwcm9wZXJ0eSBfcmVhZGVyDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICAvL3RoaXMuX3JlYWRlciA9ICh0eXBlb2YgaW5wdXQgPT0gInN0cmluZyIpID8gbmV3IFN0cmluZ1JlYWRlcihpbnB1dCkgOiBpbnB1dDsNCiAgICB0aGlzLl9yZWFkZXIgPSBpbnB1dCA/IG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQudG9TdHJpbmcoKSkgOiBudWxsOw0KICAgIA0KICAgIC8qKg0KICAgICAqIFRva2VuIG9iamVjdCBmb3IgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4uDQogICAgICogQHR5cGUgVG9rZW4NCiAgICAgKiBAcHJvcGVydHkgX3Rva2VuDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICB0aGlzLl90b2tlbiA9IG51bGw7ICAgIA0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBhcnJheSBvZiB0b2tlbiBpbmZvcm1hdGlvbi4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBfdG9rZW5EYXRhDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICB0aGlzLl90b2tlbkRhdGEgPSB0b2tlbkRhdGE7DQogICAgDQogICAgLyoqDQogICAgICogTG9va2FoZWFkIHRva2VuIGJ1ZmZlci4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBfbHQNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2x0ID0gW107DQogICAgDQogICAgLyoqDQogICAgICogTG9va2FoZWFkIHRva2VuIGJ1ZmZlciBpbmRleC4NCiAgICAgKiBAdHlwZSBpbnQNCiAgICAgKiBAcHJvcGVydHkgX2x0SW5kZXgNCiAgICAgKiBAcHJpdmF0ZQ0KICAgICAqLw0KICAgIHRoaXMuX2x0SW5kZXggPSAwOw0KICAgIA0KICAgIHRoaXMuX2x0SW5kZXhDYWNoZSA9IFtdOw0KfQ0KDQovKioNCiAqIEFjY2VwdHMgYW4gYXJyYXkgb2YgdG9rZW4gaW5mb3JtYXRpb24gYW5kIG91dHB1dHMNCiAqIGFuIGFycmF5IG9mIHRva2VuIGRhdGEgY29udGFpbmluZyBrZXktdmFsdWUgbWFwcGluZ3MNCiAqIGFuZCBtYXRjaGluZyBmdW5jdGlvbnMgdGhhdCB0aGUgVG9rZW5TdHJlYW0gbmVlZHMuDQogKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgQW4gYXJyYXkgb2YgdG9rZW4gZGVzY3JpcHRvcnMuDQogKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgcHJvY2Vzc2VkIHRva2VuIGRhdGEuDQogKiBAbWV0aG9kIGNyZWF0ZVRva2VuRGF0YQ0KICogQHN0YXRpYw0KICovDQpUb2tlblN0cmVhbUJhc2UuY3JlYXRlVG9rZW5EYXRhID0gZnVuY3Rpb24odG9rZW5zKXsNCg0KICAgIHZhciBuYW1lTWFwIAk9IFtdLA0KICAgICAgICB0eXBlTWFwIAk9IHt9LA0KCQl0b2tlbkRhdGEgCT0gdG9rZW5zLmNvbmNhdChbXSksDQoJCWkJCQk9IDAsDQoJCWxlbgkJCT0gdG9rZW5EYXRhLmxlbmd0aCsxOw0KICAgIA0KICAgIHRva2VuRGF0YS5VTktOT1dOID0gLTE7DQoJdG9rZW5EYXRhLnVuc2hpZnQoe25hbWU6IkVPRiJ9KTsNCg0KICAgIGZvciAoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICBuYW1lTWFwLnB1c2godG9rZW5EYXRhW2ldLm5hbWUpOw0KICAgICAgICB0b2tlbkRhdGFbdG9rZW5EYXRhW2ldLm5hbWVdID0gaTsNCiAgICAgICAgaWYgKHRva2VuRGF0YVtpXS50ZXh0KXsNCiAgICAgICAgICAgIHR5cGVNYXBbdG9rZW5EYXRhW2ldLnRleHRdID0gaTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICB0b2tlbkRhdGEubmFtZSA9IGZ1bmN0aW9uKHR0KXsNCiAgICAgICAgcmV0dXJuIG5hbWVNYXBbdHRdOw0KICAgIH07DQogICAgDQogICAgdG9rZW5EYXRhLnR5cGUgPSBmdW5jdGlvbihjKXsNCiAgICAgICAgcmV0dXJuIHR5cGVNYXBbY107DQogICAgfTsNCgkNCglyZXR1cm4gdG9rZW5EYXRhOw0KfTsNCg0KVG9rZW5TdHJlYW1CYXNlLnByb3RvdHlwZSA9IHsNCg0KICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3Rvcg0KICAgIGNvbnN0cnVjdG9yOiBUb2tlblN0cmVhbUJhc2UsICAgIA0KICAgIA0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIE1hdGNoaW5nIG1ldGhvZHMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICANCiAgICAvKioNCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHR5cGUuDQogICAgICogSWYgc28sIHRoYXQgdG9rZW4gaXMgY29uc3VtZWQ7IGlmIG5vdCwgdGhlIHRva2VuIGlzIHBsYWNlZA0KICAgICAqIGJhY2sgb250byB0aGUgdG9rZW4gc3RyZWFtLiBZb3UgY2FuIHBhc3MgaW4gYW55IG51bWJlciBvZg0KICAgICAqIHRva2VuIHR5cGVzIGFuZCB0aGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSB0b2tlbg0KICAgICAqIHR5cGVzIGlzIGZvdW5kLg0KICAgICAqIEBwYXJhbSB7aW50fGludFtdfSB0b2tlblR5cGVzIEVpdGhlciBhIHNpbmdsZSB0b2tlbiB0eXBlIG9yIGFuIGFycmF5IG9mDQogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIG1pZ2h0IGJlLiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsDQogICAgICogICAgICBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgdG9rZW4gY2FuIGJlIGFueSBvZiB0aGVzZS4NCiAgICAgKiBAcGFyYW0ge3ZhcmlhbnR9IGNoYW5uZWwgKE9wdGlvbmFsKSBUaGUgY2hhbm5lbCB0byByZWFkIGZyb20uIElmIG5vdA0KICAgICAqICAgICAgcHJvdmlkZWQsIHJlYWRzIGZyb20gdGhlIGRlZmF1bHQgKHVubmFtZWQpIGNoYW5uZWwuDQogICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdG9rZW4gdHlwZSBtYXRjaGVzLCBmYWxzZSBpZiBub3QuDQogICAgICogQG1ldGhvZCBtYXRjaA0KICAgICAqLw0KICAgIG1hdGNoOiBmdW5jdGlvbih0b2tlblR5cGVzLCBjaGFubmVsKXsNCiAgICANCiAgICAgICAgLy9hbHdheXMgY29udmVydCB0byBhbiBhcnJheSwgbWFrZXMgdGhpbmdzIGVhc2llcg0KICAgICAgICBpZiAoISh0b2tlblR5cGVzIGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgICAgICAgICAgIHRva2VuVHlwZXMgPSBbdG9rZW5UeXBlc107DQogICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgdmFyIHR0ICA9IHRoaXMuZ2V0KGNoYW5uZWwpLA0KICAgICAgICAgICAgaSAgID0gMCwNCiAgICAgICAgICAgIGxlbiA9IHRva2VuVHlwZXMubGVuZ3RoOw0KICAgICAgICAgICAgDQogICAgICAgIHdoaWxlKGkgPCBsZW4pew0KICAgICAgICAgICAgaWYgKHR0ID09IHRva2VuVHlwZXNbaSsrXSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vbm8gbWF0Y2ggZm91bmQsIHB1dCB0aGUgdG9rZW4gYmFjaw0KICAgICAgICB0aGlzLnVuZ2V0KCk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9LCAgICANCiAgICANCiAgICAvKioNCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHR5cGUuDQogICAgICogSWYgc28sIHRoYXQgdG9rZW4gaXMgY29uc3VtZWQ7IGlmIG5vdCwgYW4gZXJyb3IgaXMgdGhyb3duLg0KICAgICAqIEBwYXJhbSB7aW50fGludFtdfSB0b2tlblR5cGVzIEVpdGhlciBhIHNpbmdsZSB0b2tlbiB0eXBlIG9yIGFuIGFycmF5IG9mDQogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIHNob3VsZCBiZS4gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLA0KICAgICAqICAgICAgaXQncyBhc3N1bWVkIHRoYXQgdGhlIHRva2VuIG11c3QgYmUgb25lIG9mIHRoZXNlLg0KICAgICAqIEBwYXJhbSB7dmFyaWFudH0gY2hhbm5lbCAoT3B0aW9uYWwpIFRoZSBjaGFubmVsIHRvIHJlYWQgZnJvbS4gSWYgbm90DQogICAgICogICAgICBwcm92aWRlZCwgcmVhZHMgZnJvbSB0aGUgZGVmYXVsdCAodW5uYW1lZCkgY2hhbm5lbC4NCiAgICAgKiBAcmV0dXJuIHt2b2lkfQ0KICAgICAqIEBtZXRob2QgbXVzdE1hdGNoDQogICAgICovICAgIA0KICAgIG11c3RNYXRjaDogZnVuY3Rpb24odG9rZW5UeXBlcywgY2hhbm5lbCl7DQoNCiAgICAgICAgLy9hbHdheXMgY29udmVydCB0byBhbiBhcnJheSwgbWFrZXMgdGhpbmdzIGVhc2llcg0KICAgICAgICBpZiAoISh0b2tlblR5cGVzIGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgICAgICAgICAgIHRva2VuVHlwZXMgPSBbdG9rZW5UeXBlc107DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIXRoaXMubWF0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKSl7ICAgIA0KICAgICAgICAgICAgdG9rZW4gPSB0aGlzLkxUKDEpOw0KICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJFeHBlY3RlZCAiICsgdGhpcy5fdG9rZW5EYXRhW3Rva2VuVHlwZXNbMF1dLm5hbWUgKyANCiAgICAgICAgICAgICAgICAiIGF0IGxpbmUgIiArIHRva2VuLnN0YXJ0TGluZSArICIsIGNvbCAiICsgdG9rZW4uc3RhcnRDb2wgKyAiLiIsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAvLyBDb25zdW1pbmcgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEtlZXBzIHJlYWRpbmcgZnJvbSB0aGUgdG9rZW4gc3RyZWFtIHVudGlsIGVpdGhlciBvbmUgb2YgdGhlIHNwZWNpZmllZA0KICAgICAqIHRva2VuIHR5cGVzIGlzIGZvdW5kIG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQuDQogICAgICogQHBhcmFtIHtpbnR8aW50W119IHRva2VuVHlwZXMgRWl0aGVyIGEgc2luZ2xlIHRva2VuIHR5cGUgb3IgYW4gYXJyYXkgb2YNCiAgICAgKiAgICAgIHRva2VuIHR5cGVzIHRoYXQgdGhlIG5leHQgdG9rZW4gc2hvdWxkIGJlLiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsDQogICAgICogICAgICBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgdG9rZW4gbXVzdCBiZSBvbmUgb2YgdGhlc2UuDQogICAgICogQHBhcmFtIHt2YXJpYW50fSBjaGFubmVsIChPcHRpb25hbCkgVGhlIGNoYW5uZWwgdG8gcmVhZCBmcm9tLiBJZiBub3QNCiAgICAgKiAgICAgIHByb3ZpZGVkLCByZWFkcyBmcm9tIHRoZSBkZWZhdWx0ICh1bm5hbWVkKSBjaGFubmVsLg0KICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICogQG1ldGhvZCBhZHZhbmNlDQogICAgICovDQogICAgYWR2YW5jZTogZnVuY3Rpb24odG9rZW5UeXBlcywgY2hhbm5lbCl7DQogICAgICAgIA0KICAgICAgICB3aGlsZSh0aGlzLkxBKDApICE9IDAgJiYgIXRoaXMubWF0Y2godG9rZW5UeXBlcywgY2hhbm5lbCkpew0KICAgICAgICAgICAgdGhpcy5nZXQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLkxBKDApOyAgICANCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIHRva2VuIHN0cmVhbS4gDQogICAgICogQHJldHVybiB7aW50fSBUaGUgdG9rZW4gdHlwZSBvZiB0aGUgdG9rZW4gdGhhdCB3YXMganVzdCBjb25zdW1lZC4NCiAgICAgKiBAbWV0aG9kIGdldA0KICAgICAqLyAgICAgIA0KICAgIGdldDogZnVuY3Rpb24oY2hhbm5lbCl7DQogICAgDQogICAgICAgIHZhciB0b2tlbkluZm8gICA9IHRoaXMuX3Rva2VuRGF0YSwNCiAgICAgICAgICAgIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdmFsdWUsDQogICAgICAgICAgICBpICAgICAgICAgICA9MCwNCiAgICAgICAgICAgIGxlbiAgICAgICAgID0gdG9rZW5JbmZvLmxlbmd0aCwNCiAgICAgICAgICAgIGZvdW5kICAgICAgID0gZmFsc2UsDQogICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgIGluZm87DQogICAgICAgICAgICANCiAgICAgICAgLy9jaGVjayB0aGUgbG9va2FoZWFkIGJ1ZmZlciBmaXJzdA0KICAgICAgICBpZiAodGhpcy5fbHQubGVuZ3RoICYmIHRoaXMuX2x0SW5kZXggPj0gMCAmJiB0aGlzLl9sdEluZGV4IDwgdGhpcy5fbHQubGVuZ3RoKXsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpKys7DQogICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRoaXMuX2x0W3RoaXMuX2x0SW5kZXgrK107DQogICAgICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3RoaXMuX3Rva2VuLnR5cGVdOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL29iZXkgY2hhbm5lbHMgbG9naWMNCiAgICAgICAgICAgIHdoaWxlKChpbmZvLmNoYW5uZWwgIT09IHVuZGVmaW5lZCAmJiBjaGFubmVsICE9PSBpbmZvLmNoYW5uZWwpICYmDQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggPCB0aGlzLl9sdC5sZW5ndGgpew0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCsrXTsNCiAgICAgICAgICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3RoaXMuX3Rva2VuLnR5cGVdOw0KICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9oZXJlIGJlIGRyYWdvbnMNCiAgICAgICAgICAgIGlmICgoaW5mby5jaGFubmVsID09PSB1bmRlZmluZWQgfHwgY2hhbm5lbCA9PT0gaW5mby5jaGFubmVsKSAmJg0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9sdEluZGV4IDw9IHRoaXMuX2x0Lmxlbmd0aCl7DQogICAgICAgICAgICAgICAgdGhpcy5fbHRJbmRleENhY2hlLnB1c2goaSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuLnR5cGU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vY2FsbCB0b2tlbiByZXRyaWV2ZXIgbWV0aG9kDQoJCXRva2VuID0gdGhpcy5fZ2V0VG9rZW4oKTsNCg0KICAgICAgICAvL2lmIGl0IHNob3VsZCBiZSBoaWRkZW4sIGRvbid0IHNhdmUgYSB0b2tlbg0KICAgICAgICBpZiAodG9rZW4udHlwZSA+IC0xICYmICF0b2tlbkluZm9bdG9rZW4udHlwZV0uaGlkZSl7DQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vYXBwbHkgdG9rZW4gY2hhbm5lbA0KICAgICAgICAgICAgdG9rZW4uY2hhbm5lbCA9IHRva2VuSW5mb1t0b2tlbi50eXBlXS5jaGFubmVsOw0KICAgICAgICAgDQogICAgICAgICAgICAvL3NhdmUgZm9yIGxhdGVyDQogICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRva2VuOw0KICAgICAgICAgICAgdGhpcy5fbHQucHVzaCh0b2tlbik7DQoNCiAgICAgICAgICAgIC8vc2F2ZSBzcGFjZSB0aGF0IHdpbGwgYmUgbW92ZWQgKG11c3QgYmUgZG9uZSBiZWZvcmUgYXJyYXkgaXMgdHJ1bmNhdGVkKQ0KICAgICAgICAgICAgdGhpcy5fbHRJbmRleENhY2hlLnB1c2godGhpcy5fbHQubGVuZ3RoIC0gdGhpcy5fbHRJbmRleCArIGkpOyAgDQogICAgICAgIA0KICAgICAgICAgICAgLy9rZWVwIHRoZSBidWZmZXIgdW5kZXIgNSBpdGVtcw0KICAgICAgICAgICAgaWYgKHRoaXMuX2x0Lmxlbmd0aCA+IDUpew0KICAgICAgICAgICAgICAgIHRoaXMuX2x0LnNoaWZ0KCk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL2Fsc28ga2VlcCB0aGUgc2hpZnQgYnVmZmVyIHVuZGVyIDUgaXRlbXMNCiAgICAgICAgICAgIGlmICh0aGlzLl9sdEluZGV4Q2FjaGUubGVuZ3RoID4gNSl7DQogICAgICAgICAgICAgICAgdGhpcy5fbHRJbmRleENhY2hlLnNoaWZ0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAvL3VwZGF0ZSBsb29rYWhlYWQgaW5kZXgNCiAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggPSB0aGlzLl9sdC5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAvKg0KICAgICAgICAgKiBTa2lwIHRvIHRoZSBuZXh0IHRva2VuIGlmOg0KICAgICAgICAgKiAxLiBUaGUgdG9rZW4gdHlwZSBpcyBtYXJrZWQgYXMgaGlkZGVuLg0KICAgICAgICAgKiAyLiBUaGUgdG9rZW4gdHlwZSBoYXMgYSBjaGFubmVsIHNwZWNpZmllZCBhbmQgaXQgaXNuJ3QgdGhlIGN1cnJlbnQgY2hhbm5lbC4NCiAgICAgICAgICovDQogICAgICAgIGluZm8gPSB0b2tlbkluZm9bdG9rZW4udHlwZV07DQogICAgICAgIGlmIChpbmZvICYmIA0KICAgICAgICAgICAgICAgIChpbmZvLmhpZGUgfHwgDQogICAgICAgICAgICAgICAgKGluZm8uY2hhbm5lbCAhPT0gdW5kZWZpbmVkICYmIGNoYW5uZWwgIT09IGluZm8uY2hhbm5lbCkpKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChjaGFubmVsKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vcmV0dXJuIGp1c3QgdGhlIHR5cGUNCiAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICAvKioNCiAgICAgKiBMb29rcyBhaGVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHRva2VucyBhbmQgcmV0dXJucyB0aGUgdG9rZW4gdHlwZSBhdA0KICAgICAqIHRoYXQgcG9zaXRpb24uIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB5b3UgbG9va2FoZWFkIHBhc3QgdGhlDQogICAgICogZW5kIG9mIGlucHV0LCBwYXN0IHRoZSBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyLCBvciBiYWNrIHBhc3QNCiAgICAgKiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGxvb2thaGVhZCBidWZmZXIuDQogICAgICogQHBhcmFtIHtpbnR9IFRoZSBpbmRleCBvZiB0aGUgdG9rZW4gdHlwZSB0byByZXRyaWV2ZS4gMCBmb3IgdGhlDQogICAgICogICAgICBjdXJyZW50IHRva2VuLCAxIGZvciB0aGUgbmV4dCwgLTEgZm9yIHRoZSBwcmV2aW91cywgZXRjLg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgb2YgdGhlIHRva2VuIGluIHRoZSBnaXZlbiBwb3NpdGlvbi4NCiAgICAgKiBAbWV0aG9kIExBDQogICAgICovDQogICAgTEE6IGZ1bmN0aW9uKGluZGV4KXsNCiAgICAgICAgdmFyIHRvdGFsID0gaW5kZXgsDQogICAgICAgICAgICB0dDsNCiAgICAgICAgaWYgKGluZGV4ID4gMCl7DQogICAgICAgICAgICAvL1RPRE86IFN0b3JlIDUgc29tZXdoZXJlDQogICAgICAgICAgICBpZiAoaW5kZXggPiA1KXsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRvbyBtdWNoIGxvb2thaGVhZC4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICAvL2dldCBhbGwgdGhvc2UgdG9rZW5zDQogICAgICAgICAgICB3aGlsZSh0b3RhbCl7DQogICAgICAgICAgICAgICAgdHQgPSB0aGlzLmdldCgpOyAgIA0KICAgICAgICAgICAgICAgIHRvdGFsLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL3VuZ2V0IGFsbCB0aG9zZSB0b2tlbnMNCiAgICAgICAgICAgIHdoaWxlKHRvdGFsIDwgaW5kZXgpew0KICAgICAgICAgICAgICAgIHRoaXMudW5nZXQoKTsNCiAgICAgICAgICAgICAgICB0b3RhbCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGluZGV4IDwgMCl7DQogICAgICAgIA0KICAgICAgICAgICAgaWYodGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleF0pew0KICAgICAgICAgICAgICAgIHR0ID0gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleF0udHlwZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbXVjaCBsb29rYmVoaW5kLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHR0ID0gdGhpcy5fdG9rZW4udHlwZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHR0Ow0KICAgIA0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogTG9va3MgYWhlYWQgYSBjZXJ0YWluIG51bWJlciBvZiB0b2tlbnMgYW5kIHJldHVybnMgdGhlIHRva2VuIGF0DQogICAgICogdGhhdCBwb3NpdGlvbi4gVGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHlvdSBsb29rYWhlYWQgcGFzdCB0aGUNCiAgICAgKiBlbmQgb2YgaW5wdXQsIHBhc3QgdGhlIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIsIG9yIGJhY2sgcGFzdA0KICAgICAqIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlci4NCiAgICAgKiBAcGFyYW0ge2ludH0gVGhlIGluZGV4IG9mIHRoZSB0b2tlbiB0eXBlIHRvIHJldHJpZXZlLiAwIGZvciB0aGUNCiAgICAgKiAgICAgIGN1cnJlbnQgdG9rZW4sIDEgZm9yIHRoZSBuZXh0LCAtMSBmb3IgdGhlIHByZXZpb3VzLCBldGMuDQogICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgdG9rZW4gb2YgdGhlIHRva2VuIGluIHRoZSBnaXZlbiBwb3NpdGlvbi4NCiAgICAgKiBAbWV0aG9kIExBDQogICAgICovICAgIA0KICAgIExUOiBmdW5jdGlvbihpbmRleCl7DQogICAgDQogICAgICAgIC8vbG9va2FoZWFkIGZpcnN0IHRvIHByaW1lIHRoZSB0b2tlbiBidWZmZXINCiAgICAgICAgdGhpcy5MQShpbmRleCk7DQogICAgICAgIA0KICAgICAgICAvL25vdyBmaW5kIHRoZSB0b2tlbiwgc3VidHJhY3Qgb25lIGJlY2F1c2UgX2x0SW5kZXggaXMgYWxyZWFkeSBhdCB0aGUgbmV4dCBpbmRleA0KICAgICAgICByZXR1cm4gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleC0xXTsgICAgDQogICAgfSwNCiAgICANCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbiB0eXBlIGZvciB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtIHdpdGhvdXQgDQogICAgICogY29uc3VtaW5nIGl0Lg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbS4NCiAgICAgKiBAbWV0aG9kIHBlZWsNCiAgICAgKi8NCiAgICBwZWVrOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5MQSgxKTsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCB0b2tlbiBvYmplY3QgZm9yIHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuLg0KICAgICAqIEByZXR1cm4ge1Rva2VufSBUaGUgdG9rZW4gb2JqZWN0IGZvciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4NCiAgICAgKiBAbWV0aG9kIHRva2VuDQogICAgICovDQogICAgdG9rZW46IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLl90b2tlbjsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRva2VuIGZvciB0aGUgZ2l2ZW4gdG9rZW4gdHlwZS4NCiAgICAgKiBAcGFyYW0ge2ludH0gdG9rZW5UeXBlIFRoZSB0eXBlIG9mIHRva2VuIHRvIGdldCB0aGUgbmFtZSBvZi4NCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSB0b2tlbiBvciAiVU5LTk9XTl9UT0tFTiIgZm9yIGFueQ0KICAgICAqICAgICAgaW52YWxpZCB0b2tlbiB0eXBlLg0KICAgICAqIEBtZXRob2QgdG9rZW5OYW1lDQogICAgICovDQogICAgdG9rZW5OYW1lOiBmdW5jdGlvbih0b2tlblR5cGUpew0KICAgICAgICBpZiAodG9rZW5UeXBlIDwgMCB8fCB0b2tlblR5cGUgPiB0aGlzLl90b2tlbkRhdGEubGVuZ3RoKXsNCiAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTl9UT0tFTiI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5EYXRhW3Rva2VuVHlwZV0ubmFtZTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJucyB0aGUgdG9rZW4gdHlwZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRva2VuIG5hbWUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IHRva2VuTmFtZSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLg0KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgdmFsdWUgZm9yIHRoZSBnaXZlbiB0b2tlbiBuYW1lIG9yIC0xDQogICAgICogICAgICBmb3IgYW4gdW5rbm93biB0b2tlbi4NCiAgICAgKiBAbWV0aG9kIHRva2VuTmFtZQ0KICAgICAqLyAgICANCiAgICB0b2tlblR5cGU6IGZ1bmN0aW9uKHRva2VuTmFtZSl7DQogICAgICAgIHJldHVybiB0aGlzLl90b2tlbkRhdGFbdG9rZW5OYW1lXSB8fCAtMTsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gdG8gdGhlIHRva2VuIHN0cmVhbS4NCiAgICAgKiBAbWV0aG9kIHVuZ2V0DQogICAgICovICAgICAgDQogICAgdW5nZXQ6IGZ1bmN0aW9uKCl7DQogICAgICAgIC8vaWYgKHRoaXMuX2x0SW5kZXggPiAtMSl7DQogICAgICAgIGlmICh0aGlzLl9sdEluZGV4Q2FjaGUubGVuZ3RoKXsNCiAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggLT0gdGhpcy5fbHRJbmRleENhY2hlLnBvcCgpOy8vLS07DQogICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRoaXMuX2x0W3RoaXMuX2x0SW5kZXggLSAxXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVG9vIG11Y2ggbG9va2FoZWFkLiIpOw0KICAgICAgICB9DQogICAgfQ0KDQp9Ow0KDQoNCg0KcGFyc2VybGliLnV0aWwgPSB7DQpTdHJpbmdSZWFkZXI6IFN0cmluZ1JlYWRlciwNClN5bnRheEVycm9yIDogU3ludGF4RXJyb3IsDQpTeW50YXhVbml0ICA6IFN5bnRheFVuaXQsDQpFdmVudFRhcmdldCA6IEV2ZW50VGFyZ2V0LA0KVG9rZW5TdHJlYW1CYXNlIDogVG9rZW5TdHJlYW1CYXNlDQp9Ow0KfSkoKTsNCg0KLyogDQpQYXJzZXItTGliDQpDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBOaWNob2xhcyBDLiBaYWthcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQpUSEUgU09GVFdBUkUuDQoNCiovDQovKiBCdWlsZCB0aW1lOiAxMy1KdWx5LTIwMTEgMDQ6MzU6MjggKi8NCihmdW5jdGlvbigpew0KdmFyIEV2ZW50VGFyZ2V0ID0gcGFyc2VybGliLnV0aWwuRXZlbnRUYXJnZXQsDQpUb2tlblN0cmVhbUJhc2UgPSBwYXJzZXJsaWIudXRpbC5Ub2tlblN0cmVhbUJhc2UsDQpTdHJpbmdSZWFkZXIgPSBwYXJzZXJsaWIudXRpbC5TdHJpbmdSZWFkZXIsDQpTeW50YXhFcnJvciA9IHBhcnNlcmxpYi51dGlsLlN5bnRheEVycm9yLA0KU3ludGF4VW5pdCAgPSBwYXJzZXJsaWIudXRpbC5TeW50YXhVbml0Ow0KDQp2YXIgQ29sb3JzID0gew0KICAgIGFsaWNlYmx1ZSAgICAgICA6IiNmMGY4ZmYiLA0KICAgIGFudGlxdWV3aGl0ZSAgICA6IiNmYWViZDciLA0KICAgIGFxdWEgICAgICAgICAgICA6IiMwMGZmZmYiLA0KICAgIGFxdWFtYXJpbmUgICAgICA6IiM3ZmZmZDQiLA0KICAgIGF6dXJlICAgICAgICAgICA6IiNmMGZmZmYiLA0KICAgIGJlaWdlICAgICAgICAgICA6IiNmNWY1ZGMiLA0KICAgIGJpc3F1ZSAgICAgICAgICA6IiNmZmU0YzQiLA0KICAgIGJsYWNrICAgICAgICAgICA6IiMwMDAwMDAiLA0KICAgIGJsYW5jaGVkYWxtb25kICA6IiNmZmViY2QiLA0KICAgIGJsdWUgICAgICAgICAgICA6IiMwMDAwZmYiLA0KICAgIGJsdWV2aW9sZXQgICAgICA6IiM4YTJiZTIiLA0KICAgIGJyb3duICAgICAgICAgICA6IiNhNTJhMmEiLA0KICAgIGJ1cmx5d29vZCAgICAgICA6IiNkZWI4ODciLA0KICAgIGNhZGV0Ymx1ZSAgICAgICA6IiM1ZjllYTAiLA0KICAgIGNoYXJ0cmV1c2UgICAgICA6IiM3ZmZmMDAiLA0KICAgIGNob2NvbGF0ZSAgICAgICA6IiNkMjY5MWUiLA0KICAgIGNvcmFsICAgICAgICAgICA6IiNmZjdmNTAiLA0KICAgIGNvcm5mbG93ZXJibHVlICA6IiM2NDk1ZWQiLA0KICAgIGNvcm5zaWxrICAgICAgICA6IiNmZmY4ZGMiLA0KICAgIGNyaW1zb24gICAgICAgICA6IiNkYzE0M2MiLA0KICAgIGN5YW4gICAgICAgICAgICA6IiMwMGZmZmYiLA0KICAgIGRhcmtibHVlICAgICAgICA6IiMwMDAwOGIiLA0KICAgIGRhcmtjeWFuICAgICAgICA6IiMwMDhiOGIiLA0KICAgIGRhcmtnb2xkZW5yb2QgICA6IiNiODg2MGIiLA0KICAgIGRhcmtncmF5ICAgICAgICA6IiNhOWE5YTkiLA0KICAgIGRhcmtncmVlbiAgICAgICA6IiMwMDY0MDAiLA0KICAgIGRhcmtraGFraSAgICAgICA6IiNiZGI3NmIiLA0KICAgIGRhcmttYWdlbnRhICAgICA6IiM4YjAwOGIiLA0KICAgIGRhcmtvbGl2ZWdyZWVuICA6IiM1NTZiMmYiLA0KICAgIGRhcmtvcmFuZ2UgICAgICA6IiNmZjhjMDAiLA0KICAgIGRhcmtvcmNoaWQgICAgICA6IiM5OTMyY2MiLA0KICAgIGRhcmtyZWQgICAgICAgICA6IiM4YjAwMDAiLA0KICAgIGRhcmtzYWxtb24gICAgICA6IiNlOTk2N2EiLA0KICAgIGRhcmtzZWFncmVlbiAgICA6IiM4ZmJjOGYiLA0KICAgIGRhcmtzbGF0ZWJsdWUgICA6IiM0ODNkOGIiLA0KICAgIGRhcmtzbGF0ZWdyYXkgICA6IiMyZjRmNGYiLA0KICAgIGRhcmt0dXJxdW9pc2UgICA6IiMwMGNlZDEiLA0KICAgIGRhcmt2aW9sZXQgICAgICA6IiM5NDAwZDMiLA0KICAgIGRlZXBwaW5rICAgICAgICA6IiNmZjE0OTMiLA0KICAgIGRlZXBza3libHVlICAgICA6IiMwMGJmZmYiLA0KICAgIGRpbWdyYXkgICAgICAgICA6IiM2OTY5NjkiLA0KICAgIGRvZGdlcmJsdWUgICAgICA6IiMxZTkwZmYiLA0KICAgIGZpcmVicmljayAgICAgICA6IiNiMjIyMjIiLA0KICAgIGZsb3JhbHdoaXRlICAgICA6IiNmZmZhZjAiLA0KICAgIGZvcmVzdGdyZWVuICAgICA6IiMyMjhiMjIiLA0KICAgIGZ1Y2hzaWEgICAgICAgICA6IiNmZjAwZmYiLA0KICAgIGdhaW5zYm9ybyAgICAgICA6IiNkY2RjZGMiLA0KICAgIGdob3N0d2hpdGUgICAgICA6IiNmOGY4ZmYiLA0KICAgIGdvbGQgICAgICAgICAgICA6IiNmZmQ3MDAiLA0KICAgIGdvbGRlbnJvZCAgICAgICA6IiNkYWE1MjAiLA0KICAgIGdyYXkgICAgICAgICAgICA6IiM4MDgwODAiLA0KICAgIGdyZWVuICAgICAgICAgICA6IiMwMDgwMDAiLA0KICAgIGdyZWVueWVsbG93ICAgICA6IiNhZGZmMmYiLA0KICAgIGhvbmV5ZGV3ICAgICAgICA6IiNmMGZmZjAiLA0KICAgIGhvdHBpbmsgICAgICAgICA6IiNmZjY5YjQiLA0KICAgIGluZGlhbnJlZCAgICAgICA6IiNjZDVjNWMiLA0KICAgIGluZGlnbyAgICAgICAgICA6IiM0YjAwODIiLA0KICAgIGl2b3J5ICAgICAgICAgICA6IiNmZmZmZjAiLA0KICAgIGtoYWtpICAgICAgICAgICA6IiNmMGU2OGMiLA0KICAgIGxhdmVuZGVyICAgICAgICA6IiNlNmU2ZmEiLA0KICAgIGxhdmVuZGVyYmx1c2ggICA6IiNmZmYwZjUiLA0KICAgIGxhd25ncmVlbiAgICAgICA6IiM3Y2ZjMDAiLA0KICAgIGxlbW9uY2hpZmZvbiAgICA6IiNmZmZhY2QiLA0KICAgIGxpZ2h0Ymx1ZSAgICAgICA6IiNhZGQ4ZTYiLA0KICAgIGxpZ2h0Y29yYWwgICAgICA6IiNmMDgwODAiLA0KICAgIGxpZ2h0Y3lhbiAgICAgICA6IiNlMGZmZmYiLA0KICAgIGxpZ2h0Z29sZGVucm9keWVsbG93ICA6IiNmYWZhZDIiLA0KICAgIGxpZ2h0Z3JleSAgICAgICA6IiNkM2QzZDMiLA0KICAgIGxpZ2h0Z3JlZW4gICAgICA6IiM5MGVlOTAiLA0KICAgIGxpZ2h0cGluayAgICAgICA6IiNmZmI2YzEiLA0KICAgIGxpZ2h0c2FsbW9uICAgICA6IiNmZmEwN2EiLA0KICAgIGxpZ2h0c2VhZ3JlZW4gICA6IiMyMGIyYWEiLA0KICAgIGxpZ2h0c2t5Ymx1ZSAgICA6IiM4N2NlZmEiLA0KICAgIGxpZ2h0c2xhdGVncmF5ICA6IiM3Nzg4OTkiLA0KICAgIGxpZ2h0c3RlZWxibHVlICA6IiNiMGM0ZGUiLA0KICAgIGxpZ2h0eWVsbG93ICAgICA6IiNmZmZmZTAiLA0KICAgIGxpbWUgICAgICAgICAgICA6IiMwMGZmMDAiLA0KICAgIGxpbWVncmVlbiAgICAgICA6IiMzMmNkMzIiLA0KICAgIGxpbmVuICAgICAgICAgICA6IiNmYWYwZTYiLA0KICAgIG1hZ2VudGEgICAgICAgICA6IiNmZjAwZmYiLA0KICAgIG1hcm9vbiAgICAgICAgICA6IiM4MDAwMDAiLA0KICAgIG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLA0KICAgIG1lZGl1bWJsdWUgICAgICA6IiMwMDAwY2QiLA0KICAgIG1lZGl1bW9yY2hpZCAgICA6IiNiYTU1ZDMiLA0KICAgIG1lZGl1bXB1cnBsZSAgICA6IiM5MzcwZDgiLA0KICAgIG1lZGl1bXNlYWdyZWVuICA6IiMzY2IzNzEiLA0KICAgIG1lZGl1bXNsYXRlYmx1ZSA6IiM3YjY4ZWUiLA0KICAgIG1lZGl1bXNwcmluZ2dyZWVuICAgOiIjMDBmYTlhIiwNCiAgICBtZWRpdW10dXJxdW9pc2UgOiIjNDhkMWNjIiwNCiAgICBtZWRpdW12aW9sZXRyZWQgOiIjYzcxNTg1IiwNCiAgICBtaWRuaWdodGJsdWUgICAgOiIjMTkxOTcwIiwNCiAgICBtaW50Y3JlYW0gICAgICAgOiIjZjVmZmZhIiwNCiAgICBtaXN0eXJvc2UgICAgICAgOiIjZmZlNGUxIiwNCiAgICBtb2NjYXNpbiAgICAgICAgOiIjZmZlNGI1IiwNCiAgICBuYXZham93aGl0ZSAgICAgOiIjZmZkZWFkIiwNCiAgICBuYXZ5ICAgICAgICAgICAgOiIjMDAwMDgwIiwNCiAgICBvbGRsYWNlICAgICAgICAgOiIjZmRmNWU2IiwNCiAgICBvbGl2ZSAgICAgICAgICAgOiIjODA4MDAwIiwNCiAgICBvbGl2ZWRyYWIgICAgICAgOiIjNmI4ZTIzIiwNCiAgICBvcmFuZ2UgICAgICAgICAgOiIjZmZhNTAwIiwNCiAgICBvcmFuZ2VyZWQgICAgICAgOiIjZmY0NTAwIiwNCiAgICBvcmNoaWQgICAgICAgICAgOiIjZGE3MGQ2IiwNCiAgICBwYWxlZ29sZGVucm9kICAgOiIjZWVlOGFhIiwNCiAgICBwYWxlZ3JlZW4gICAgICAgOiIjOThmYjk4IiwNCiAgICBwYWxldHVycXVvaXNlICAgOiIjYWZlZWVlIiwNCiAgICBwYWxldmlvbGV0cmVkICAgOiIjZDg3MDkzIiwNCiAgICBwYXBheWF3aGlwICAgICAgOiIjZmZlZmQ1IiwNCiAgICBwZWFjaHB1ZmYgICAgICAgOiIjZmZkYWI5IiwNCiAgICBwZXJ1ICAgICAgICAgICAgOiIjY2Q4NTNmIiwNCiAgICBwaW5rICAgICAgICAgICAgOiIjZmZjMGNiIiwNCiAgICBwbHVtICAgICAgICAgICAgOiIjZGRhMGRkIiwNCiAgICBwb3dkZXJibHVlICAgICAgOiIjYjBlMGU2IiwNCiAgICBwdXJwbGUgICAgICAgICAgOiIjODAwMDgwIiwNCiAgICByZWQgICAgICAgICAgICAgOiIjZmYwMDAwIiwNCiAgICByb3N5YnJvd24gICAgICAgOiIjYmM4ZjhmIiwNCiAgICByb3lhbGJsdWUgICAgICAgOiIjNDE2OWUxIiwNCiAgICBzYWRkbGVicm93biAgICAgOiIjOGI0NTEzIiwNCiAgICBzYWxtb24gICAgICAgICAgOiIjZmE4MDcyIiwNCiAgICBzYW5keWJyb3duICAgICAgOiIjZjRhNDYwIiwNCiAgICBzZWFncmVlbiAgICAgICAgOiIjMmU4YjU3IiwNCiAgICBzZWFzaGVsbCAgICAgICAgOiIjZmZmNWVlIiwNCiAgICBzaWVubmEgICAgICAgICAgOiIjYTA1MjJkIiwNCiAgICBzaWx2ZXIgICAgICAgICAgOiIjYzBjMGMwIiwNCiAgICBza3libHVlICAgICAgICAgOiIjODdjZWViIiwNCiAgICBzbGF0ZWJsdWUgICAgICAgOiIjNmE1YWNkIiwNCiAgICBzbGF0ZWdyYXkgICAgICAgOiIjNzA4MDkwIiwNCiAgICBzbm93ICAgICAgICAgICAgOiIjZmZmYWZhIiwNCiAgICBzcHJpbmdncmVlbiAgICAgOiIjMDBmZjdmIiwNCiAgICBzdGVlbGJsdWUgICAgICAgOiIjNDY4MmI0IiwNCiAgICB0YW4gICAgICAgICAgICAgOiIjZDJiNDhjIiwNCiAgICB0ZWFsICAgICAgICAgICAgOiIjMDA4MDgwIiwNCiAgICB0aGlzdGxlICAgICAgICAgOiIjZDhiZmQ4IiwNCiAgICB0b21hdG8gICAgICAgICAgOiIjZmY2MzQ3IiwNCiAgICB0dXJxdW9pc2UgICAgICAgOiIjNDBlMGQwIiwNCiAgICB2aW9sZXQgICAgICAgICAgOiIjZWU4MmVlIiwNCiAgICB3aGVhdCAgICAgICAgICAgOiIjZjVkZWIzIiwNCiAgICB3aGl0ZSAgICAgICAgICAgOiIjZmZmZmZmIiwNCiAgICB3aGl0ZXNtb2tlICAgICAgOiIjZjVmNWY1IiwNCiAgICB5ZWxsb3cgICAgICAgICAgOiIjZmZmZjAwIiwNCiAgICB5ZWxsb3dncmVlbiAgICAgOiIjOWFjZDMyIg0KfTsNCi8qKg0KICogUmVwcmVzZW50cyBhIHNlbGVjdG9yIGNvbWJpbmF0b3IgKHdoaXRlc3BhY2UsICssID4pLg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKiBAY2xhc3MgQ29tYmluYXRvcg0KICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4gDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBDb21iaW5hdG9yKHRleHQsIGxpbmUsIGNvbCl7DQogICAgDQogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHRleHQsIGxpbmUsIGNvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgdHlwZSBvZiBtb2RpZmllci4NCiAgICAgKiBAdHlwZSBTdHJpbmcNCiAgICAgKiBAcHJvcGVydHkgdHlwZQ0KICAgICAqLw0KICAgIHRoaXMudHlwZSA9ICJ1bmtub3duIjsNCiAgICANCiAgICAvL3ByZXR0eSBzaW1wbGUNCiAgICBpZiAoL15ccyskLy50ZXN0KHRleHQpKXsNCiAgICAgICAgdGhpcy50eXBlID0gImRlc2NlbmRhbnQiOw0KICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiPiIpew0KICAgICAgICB0aGlzLnR5cGUgPSAiY2hpbGQiOw0KICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiKyIpew0KICAgICAgICB0aGlzLnR5cGUgPSAiYWRqYWNlbnQtc2libGluZyI7DQogICAgfSBlbHNlIGlmICh0ZXh0ID09ICJ+Iil7DQogICAgICAgIHRoaXMudHlwZSA9ICJzaWJsaW5nIjsNCiAgICB9DQoNCn0NCg0KQ29tYmluYXRvci5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KQ29tYmluYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb21iaW5hdG9yOw0KDQoNCg0KdmFyIExldmVsMVByb3BlcnRpZXMgPSB7DQoNCiAgICAiYmFja2dyb3VuZCI6IDEsDQogICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsDQogICAgImJhY2tncm91bmQtY29sb3IiOiAxLA0KICAgICJiYWNrZ3JvdW5kLWltYWdlIjogMSwNCiAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsDQogICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwNCiANCiAgICAiYm9yZGVyIjogMSwNCiAgICAiYm9yZGVyLWJvdHRvbSI6IDEsDQogICAgImJvcmRlci1ib3R0b20td2lkdGgiOiAxLA0KICAgICJib3JkZXItY29sb3IiOiAxLA0KICAgICJib3JkZXItbGVmdCI6IDEsDQogICAgImJvcmRlci1sZWZ0LXdpZHRoIjogMSwNCiAgICAiYm9yZGVyLXJpZ2h0IjogMSwNCiAgICAiYm9yZGVyLXJpZ2h0LXdpZHRoIjogMSwNCiAgICAiYm9yZGVyLXN0eWxlIjogMSwNCiAgICAiYm9yZGVyLXRvcCI6IDEsDQogICAgImJvcmRlci10b3Atd2lkdGgiOiAxLA0KICAgICJib3JkZXItd2lkdGgiOiAxLA0KIA0KICAgICJjbGVhciI6IDEsDQogICAgImNvbG9yIjogMSwNCiAgICAiZGlzcGxheSI6IDEsDQogICAgImZsb2F0IjogMSwNCiANCiAgICAiZm9udCI6IDEsDQogICAgImZvbnQtZmFtaWx5IjogMSwNCiAgICAiZm9udC1zaXplIjogMSwNCiAgICAiZm9udC1zdHlsZSI6IDEsDQogICAgImZvbnQtdmFyaWFudCI6IDEsDQogICAgImZvbnQtd2VpZ2h0IjogMSwNCiANCiAgICAiaGVpZ2h0IjogMSwNCiAgICAibGV0dGVyLXNwYWNpbmciOiAxLA0KICAgICJsaW5lLWhlaWdodCI6IDEsDQogDQogICAgImxpc3Qtc3R5bGUiOiAxLA0KICAgICJsaXN0LXN0eWxlLWltYWdlIjogMSwNCiAgICAibGlzdC1zdHlsZS1wb3NpdGlvbiI6IDEsDQogICAgImxpc3Qtc3R5bGUtdHlwZSI6IDEsDQogDQogICAgIm1hcmdpbiI6IDEsDQogICAgIm1hcmdpbi1ib3R0b20iOiAxLA0KICAgICJtYXJnaW4tbGVmdCI6IDEsDQogICAgIm1hcmdpbi1yaWdodCI6IDEsDQogICAgIm1hcmdpbi10b3AiOiAxLA0KIA0KICAgICJwYWRkaW5nIjogMSwNCiAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICJwYWRkaW5nLXJpZ2h0IjogMSwNCiAgICAicGFkZGluZy10b3AiOiAxLA0KIA0KICAgICJ0ZXh0LWFsaWduIjogMSwNCiAgICAidGV4dC1kZWNvcmF0aW9uIjogMSwNCiAgICAidGV4dC1pbmRlbnQiOiAxLA0KICAgICJ0ZXh0LXRyYW5zZm9ybSI6IDEsDQogDQogICAgInZlcnRpY2FsLWFsaWduIjogMSwNCiAgICAid2hpdGUtc3BhY2UiOiAxLA0KICAgICJ3aWR0aCI6IDEsDQogICAgIndvcmQtc3BhY2luZyI6IDENCiAgICANCn07DQoNCnZhciBMZXZlbDJQcm9wZXJ0aWVzID0gew0KDQogICAgLy9BdXJhbA0KICAgICJhemltdXRoIjogMSwNCiAgICAiY3VlLWFmdGVyIjogMSwNCiAgICAiY3VlLWJlZm9yZSI6IDEsDQogICAgImN1ZSI6IDEsDQogICAgImVsZXZhdGlvbiI6IDEsDQogICAgInBhdXNlLWFmdGVyIjogMSwNCiAgICAicGF1c2UtYmVmb3JlIjogMSwNCiAgICAicGF1c2UiOiAxLA0KICAgICJwaXRjaC1yYW5nZSI6IDEsDQogICAgInBpdGNoIjogMSwNCiAgICAicGxheS1kdXJpbmciOiAxLA0KICAgICJyaWNobmVzcyI6IDEsDQogICAgInNwZWFrLWhlYWRlciI6IDEsDQogICAgInNwZWFrLW51bWVyYWwiOiAxLA0KICAgICJzcGVhay1wdW5jdHVhdGlvbiI6IDEsDQogICAgInNwZWFrIjogMSwNCiAgICAic3BlZWNoLXJhdGUiOiAxLA0KICAgICJzdHJlc3MiOiAxLA0KICAgICJ2b2ljZS1mYW1pbHkiOiAxLA0KICAgICJ2b2x1bWUiOiAxLA0KICAgIA0KICAgIC8vUGFnZWQNCiAgICAib3JwaGFucyI6IDEsDQogICAgInBhZ2UtYnJlYWstYWZ0ZXIiOiAxLA0KICAgICJwYWdlLWJyZWFrLWJlZm9yZSI6IDEsDQogICAgInBhZ2UtYnJlYWstaW5zaWRlIjogMSwNCiAgICAid2lkb3dzIjogMSwNCg0KICAgIC8vSW50ZXJhY3RpdmUNCiAgICAiY3Vyc29yIjogMSwNCiAgICAib3V0bGluZS1jb2xvciI6IDEsDQogICAgIm91dGxpbmUtc3R5bGUiOiAxLA0KICAgICJvdXRsaW5lLXdpZHRoIjogMSwNCiAgICAib3V0bGluZSI6IDEsICAgIA0KICAgIA0KICAgIC8vVmlzdWFsDQogICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsDQogICAgImJhY2tncm91bmQtY29sb3IiOiAxLA0KICAgICJiYWNrZ3JvdW5kLWltYWdlIjogMSwNCiAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsDQogICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwNCiAgICAiYmFja2dyb3VuZCI6IDEsICAgIA0KICAgICJib3JkZXItY29sbGFwc2UiOiAxLA0KICAgICJib3JkZXItY29sb3IiOiAxLA0KICAgICJib3JkZXItc3BhY2luZyI6IDEsDQogICAgImJvcmRlci1zdHlsZSI6IDEsDQogICAgImJvcmRlci10b3AiOiAxLA0KICAgICJib3JkZXItdG9wLWNvbG9yIjogMSwNCiAgICAiYm9yZGVyLXRvcC1zdHlsZSI6IDEsDQogICAgImJvcmRlci10b3Atd2lkdGgiOiAxLA0KICAgICJib3JkZXItd2lkdGgiOiAxLA0KICAgICJib3JkZXIiOiAxLA0KICAgICJib3R0b20iOiAxLCAgICANCiAgICAiY2FwdGlvbi1zaWRlIjogMSwNCiAgICAiY2xlYXIiOiAxLA0KICAgICJjbGlwIjogMSwNCiAgICAiY29sb3IiOiAxLA0KICAgICJjb250ZW50IjogMSwNCiAgICAiY291bnRlci1pbmNyZW1lbnQiOiAxLA0KICAgICJjb3VudGVyLXJlc2V0IjogMSwNCiAgICAiZGlyZWN0aW9uIjogMSwNCiAgICAiZGlzcGxheSI6IDEsDQogICAgImVtcHR5LWNlbGxzIjogMSwNCiAgICAiZmxvYXQiOiAxLA0KICAgICJmb250LWZhbWlseSI6IDEsDQogICAgImZvbnQtc2l6ZSI6IDEsDQogICAgImZvbnQtc3R5bGUiOiAxLA0KICAgICJmb250LXZhcmlhbnQiOiAxLA0KICAgICJmb250LXdlaWdodCI6IDEsDQogICAgImZvbnQiOiAxLA0KICAgICJoZWlnaHQiOiAxLA0KICAgICJsZWZ0IjogMSwNCiAgICAibGV0dGVyLXNwYWNpbmciOiAxLA0KICAgICJsaW5lLWhlaWdodCI6IDEsDQogICAgImxpc3Qtc3R5bGUtaW1hZ2UiOiAxLA0KICAgICJsaXN0LXN0eWxlLXBvc2l0aW9uIjogMSwNCiAgICAibGlzdC1zdHlsZS10eXBlIjogMSwNCiAgICAibGlzdC1zdHlsZSI6IDEsDQogICAgIm1hcmdpbi1yaWdodCI6IDEsDQogICAgIm1hcmdpbi10b3AiOiAxLA0KICAgICJtYXJnaW4iOiAxLA0KICAgICJtYXgtaGVpZ2h0IjogMSwNCiAgICAibWF4LXdpZHRoIjogMSwNCiAgICAibWluLWhlaWdodCI6IDEsDQogICAgIm1pbi13aWR0aCI6IDEsDQogICAgIm92ZXJmbG93IjogMSwNCiAgICAicGFkZGluZy10b3AiOiAxLA0KICAgICJwYWRkaW5nIjogMSwNCiAgICAicG9zaXRpb24iOiAxLA0KICAgICJxdW90ZXMiOiAxLA0KICAgICJyaWdodCI6IDEsDQogICAgInRhYmxlLWxheW91dCI6IDEsDQogICAgInRleHQtYWxpZ24iOiAxLA0KICAgICJ0ZXh0LWRlY29yYXRpb24iOiAxLA0KICAgICJ0ZXh0LWluZGVudCI6IDEsDQogICAgInRleHQtdHJhbnNmb3JtIjogMSwNCiAgICAidG9wIjogMSwNCiAgICAidW5pY29kZS1iaWRpIjogMSwNCiAgICAidmVydGljYWwtYWxpZ24iOiAxLA0KICAgICJ2aXNpYmlsaXR5IjogMSwNCiAgICAid2hpdGUtc3BhY2UiOiAxLA0KICAgICJ3aWR0aCI6IDEsDQogICAgIndvcmQtc3BhY2luZyI6IDEsDQogICAgInotaW5kZXgiOiAxDQp9Ow0KLyoqDQogKiBSZXByZXNlbnRzIGEgbWVkaWEgZmVhdHVyZSwgc3VjaCBhcyBtYXgtd2lkdGg6NTAwLg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKiBAY2xhc3MgTWVkaWFGZWF0dXJlDQogKiBAZXh0ZW5kcyBwYXJzZXJsaWIudXRpbC5TeW50YXhVbml0DQogKiBAY29uc3RydWN0b3INCiAqIEBwYXJhbSB7U3ludGF4VW5pdH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4NCiAqIEBwYXJhbSB7U3ludGF4VW5pdH0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlIG9yIG51bGwgaWYgbm9uZS4NCiAqLw0KZnVuY3Rpb24gTWVkaWFGZWF0dXJlKG5hbWUsIHZhbHVlKXsNCiAgICANCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgIigiICsgbmFtZSArICh2YWx1ZSAhPT0gbnVsbCA/ICI6IiArIHZhbHVlIDogIiIpICsgIikiLCBuYW1lLnN0YXJ0TGluZSwgbmFtZS5zdGFydENvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbWVkaWEgZmVhdHVyZQ0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSBuYW1lDQogICAgICovDQogICAgdGhpcy5uYW1lID0gbmFtZTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLg0KICAgICAqIEB0eXBlIFN5bnRheFVuaXQNCiAgICAgKiBAcHJvcGVydHkgdmFsdWUNCiAgICAgKi8NCiAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQp9DQoNCk1lZGlhRmVhdHVyZS5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KTWVkaWFGZWF0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lZGlhRmVhdHVyZTsNCg0KDQovKioNCiAqIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBtZWRpYSBxdWVyeS4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIE1lZGlhUXVlcnkNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd9IG1vZGlmaWVyIFRoZSBtb2RpZmllciAibm90IiBvciAib25seSIgKG9yIG51bGwpLg0KICogQHBhcmFtIHtTdHJpbmd9IG1lZGlhVHlwZSBUaGUgdHlwZSBvZiBtZWRpYSAoaS5lLiwgInByaW50IikuDQogKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyBBcnJheSBvZiBzZWxlY3RvcnMgcGFydHMgbWFraW5nIHVwIHRoaXMgc2VsZWN0b3IuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBNZWRpYVF1ZXJ5KG1vZGlmaWVyLCBtZWRpYVR5cGUsIGZlYXR1cmVzLCBsaW5lLCBjb2wpew0KICAgIA0KICAgIFN5bnRheFVuaXQuY2FsbCh0aGlzLCAobW9kaWZpZXIgPyBtb2RpZmllciArICIgIjogIiIpICsgKG1lZGlhVHlwZSA/IG1lZGlhVHlwZSArICIgIiA6ICIiKSArIGZlYXR1cmVzLmpvaW4oIiBhbmQgIiksIGxpbmUsIGNvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbWVkaWEgbW9kaWZpZXIgKCJub3QiIG9yICJvbmx5IikNCiAgICAgKiBAdHlwZSBTdHJpbmcNCiAgICAgKiBAcHJvcGVydHkgbW9kaWZpZXINCiAgICAgKi8NCiAgICB0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgbWVkaWFUeXBlIChpLmUuLCAicHJpbnQiKQ0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSBtZWRpYVR5cGUNCiAgICAgKi8NCiAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsgICAgDQogICAgDQogICAgLyoqDQogICAgICogVGhlIHBhcnRzIHRoYXQgbWFrZSB1cCB0aGUgc2VsZWN0b3IuDQogICAgICogQHR5cGUgQXJyYXkNCiAgICAgKiBAcHJvcGVydHkgZmVhdHVyZXMNCiAgICAgKi8NCiAgICB0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7DQoNCn0NCg0KTWVkaWFRdWVyeS5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KTWVkaWFRdWVyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZWRpYVF1ZXJ5Ow0KDQoNCi8qKg0KICogQSBDU1MzIHBhcnNlci4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIFBhcnNlcg0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAoT3B0aW9uYWwpIFZhcmlvdXMgb3B0aW9ucyBmb3IgdGhlIHBhcnNlcjoNCiAqICAgICAgc3RhckhhY2sgKHRydWV8ZmFsc2UpIHRvIGFsbG93IElFNiBzdGFyIGhhY2sgYXMgdmFsaWQsDQogKiAgICAgIHVuZGVyc2NvcmVIYWNrICh0cnVlfGZhbHNlKSB0byBpbnRlcnByZXQgbGVhZGluZyB1bmRlcnNjb3Jlcw0KICogICAgICBhcyBJRTYtNyB0YXJnZXRpbmcgZm9yIGtub3duIHByb3BlcnRpZXMsIGllRmlsdGVycyAodHJ1ZXxmYWxzZSkNCiAqICAgICAgdG8gaW5kaWNhdGUgdGhhdCBJRSA8IDggZmlsdGVycyBzaG91bGQgYmUgYWNjZXB0ZWQgYW5kIG5vdCB0aHJvdw0KICogICAgICBzeW50YXggZXJyb3JzLg0KICovDQpmdW5jdGlvbiBQYXJzZXIob3B0aW9ucyl7DQoNCiAgICAvL2luaGVyaXQgZXZlbnQgZnVuY3Rpb25hbGl0eQ0KICAgIEV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7DQoNCg0KICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQoNCiAgICB0aGlzLl90b2tlblN0cmVhbSA9IG51bGw7DQp9DQoNClBhcnNlci5wcm90b3R5cGUgPSBmdW5jdGlvbigpew0KDQogICAgdmFyIHByb3RvID0gbmV3IEV2ZW50VGFyZ2V0KCksICAvL25ldyBwcm90b3R5cGUNCiAgICAgICAgcHJvcCwNCiAgICAgICAgYWRkaXRpb25zID0gIHsNCiAgICAgICAgDQogICAgICAgICAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3INCiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBQYXJzZXIsDQogICAgICAgIA0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgLy8gR3JhbW1hcg0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgICAgIF9zdHlsZXNoZWV0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBzdHlsZXNoZWV0DQogICAgICAgICAgICAgICAgICogIDogWyBDSEFSU0VUX1NZTSBTKiBTVFJJTkcgUyogJzsnIF0/DQogICAgICAgICAgICAgICAgICogICAgW1N8Q0RPfENEQ10qIFsgaW1wb3J0IFtTfENET3xDRENdKiBdKg0KICAgICAgICAgICAgICAgICAqICAgIFsgbmFtZXNwYWNlIFtTfENET3xDRENdKiBdKg0KICAgICAgICAgICAgICAgICAqICAgIFsgWyBydWxlc2V0IHwgbWVkaWEgfCBwYWdlIHwgZm9udF9mYWNlIHwga2V5ZnJhbWVzIF0gW1N8Q0RPfENEQ10qIF0qDQogICAgICAgICAgICAgICAgICogIDsNCiAgICAgICAgICAgICAgICAgKi8gDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgdHQ7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgic3RhcnRzdHlsZXNoZWV0Iik7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIGNoYXJhY3RlciBzZXQNCiAgICAgICAgICAgICAgICB0aGlzLl9jaGFyc2V0KCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7DQoNCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIGltcG9ydHMgLSBtYXkgYmUgbW9yZSB0aGFuIG9uZQ0KICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklNUE9SVF9TWU0pew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbXBvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vdHJ5IHRvIHJlYWQgbmFtZXNwYWNlcyAtIG1heSBiZSBtb3JlIHRoYW4gb25lDQogICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuTkFNRVNQQUNFX1NZTSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX25hbWVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9nZXQgdGhlIG5leHQgdG9rZW4NCiAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIHRoZSByZXN0DQogICAgICAgICAgICAgICAgd2hpbGUodHQgPiBUb2tlbnMuRU9GKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0dCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuTUVESUFfU1lNOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuUEFHRV9TWU06DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2UoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDcnVmdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuRk9OVF9GQUNFX1NZTToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9udF9mYWNlKCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2Vucy5LRVlGUkFNRVNfU1lNOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlmcmFtZXMoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDcnVmdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5zLlM6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5fcnVsZXNldCgpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vycm9yIGhhbmRsaW5nIGZvciBrbm93biBpc3N1ZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0dCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuQ0hBUlNFVF9TWU06DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0uTFQoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJzZXQoZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkBjaGFyc2V0IG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuSU1QT1JUX1NZTToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1wb3J0KGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJAaW1wb3J0IG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuTkFNRVNQQUNFX1NZTToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlKGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJAbmFtZXNwYWNlIG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7ICAvL2dldCB0aGUgbGFzdCB0b2tlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFN5bnRheEVycm9yICYmICF0aGlzLm9wdGlvbnMuc3RyaWN0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogICAgICBleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICAgZXgubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgZXguY29sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHR0ICE9IFRva2Vucy5FT0Ypew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKCJlbmRzdHlsZXNoZWV0Iik7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfY2hhcnNldDogZnVuY3Rpb24oZW1pdCl7DQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGNoYXJzZXQsDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ0hBUlNFVF9TWU0pKXsNCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlNUUklORyk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuU0VNSUNPTE9OKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChlbWl0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJjaGFyc2V0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0OmNoYXJzZXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9pbXBvcnQ6IGZ1bmN0aW9uKGVtaXQpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogaW1wb3J0DQogICAgICAgICAgICAgICAgICogICA6IElNUE9SVF9TWU0gUyoNCiAgICAgICAgICAgICAgICAgKiAgICBbU1RSSU5HfFVSSV0gUyogbWVkaWFfcXVlcnlfbGlzdD8gJzsnIFMqDQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHR0LA0KICAgICAgICAgICAgICAgICAgICB1cmksDQogICAgICAgICAgICAgICAgICAgIGltcG9ydFRva2VuLA0KICAgICAgICAgICAgICAgICAgICBtZWRpYUxpc3QgICA9IFtdOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vcmVhZCBpbXBvcnQgc3ltYm9sDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5JTVBPUlRfU1lNKTsNCiAgICAgICAgICAgICAgICBpbXBvcnRUb2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goW1Rva2Vucy5TVFJJTkcsIFRva2Vucy5VUkldKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2dyYWIgdGhlIFVSSSB2YWx1ZQ0KICAgICAgICAgICAgICAgIHVyaSA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUucmVwbGFjZSgvKD86dXJsXCgpP1siJ10oW14iJ10rKVsiJ11cKT8vLCAiJDEiKTsgICAgICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG1lZGlhTGlzdCA9IHRoaXMuX21lZGlhX3F1ZXJ5X2xpc3QoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL211c3QgZW5kIHdpdGggYSBzZW1pY29sb24NCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlNFTUlDT0xPTik7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoZW1pdCAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAiaW1wb3J0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogICAgdXJpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6ICBtZWRpYUxpc3QsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGltcG9ydFRva2VuLnN0YXJ0TGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgaW1wb3J0VG9rZW4uc3RhcnRDb2wNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9uYW1lc3BhY2U6IGZ1bmN0aW9uKGVtaXQpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbmFtZXNwYWNlDQogICAgICAgICAgICAgICAgICogICA6IE5BTUVTUEFDRV9TWU0gUyogW25hbWVzcGFjZV9wcmVmaXggUypdPyBbU1RSSU5HfFVSSV0gUyogJzsnIFMqDQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgcHJlZml4LA0KICAgICAgICAgICAgICAgICAgICB1cmk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9yZWFkIGltcG9ydCBzeW1ib2wNCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLk5BTUVTUEFDRV9TWU0pOw0KICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9pdCdzIGEgbmFtZXNwYWNlIHByZWZpeCAtIG5vIF9uYW1lc3BhY2VfcHJlZml4KCkgbWV0aG9kIGJlY2F1c2UgaXQncyBqdXN0IGFuIElERU5UDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goW1Rva2Vucy5TVFJJTkcsIFRva2Vucy5VUkldKTsNCiAgICAgICAgICAgICAgICAvKmlmICghdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlNUUklORykpew0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlVSSSk7DQogICAgICAgICAgICAgICAgfSovDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9ncmFiIHRoZSBVUkkgdmFsdWUNCiAgICAgICAgICAgICAgICB1cmkgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlLnJlcGxhY2UoLyg/OnVybFwoKT9bIiddKFteIiddKylbIiddXCk/LywgIiQxIik7ICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIC8vbXVzdCBlbmQgd2l0aCBhIHNlbWljb2xvbg0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuU0VNSUNPTE9OKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChlbWl0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJuYW1lc3BhY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsDQogICAgICAgICAgICAgICAgICAgICAgICB1cmk6ICAgIHVyaSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICB9LCAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIF9tZWRpYTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIG1lZGlhDQogICAgICAgICAgICAgICAgICogICA6IE1FRElBX1NZTSBTKiBtZWRpYV9xdWVyeV9saXN0IFMqICd7JyBTKiBydWxlc2V0KiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gICAgID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgbWVkaWFMaXN0Oy8vICAgICAgID0gW107DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9sb29rIGZvciBAbWVkaWENCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLk1FRElBX1NZTSk7DQogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgIG1lZGlhTGlzdCA9IHRoaXMuX21lZGlhX3F1ZXJ5X2xpc3QoKTsNCg0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTEJSQUNFKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgInN0YXJ0bWVkaWEiLA0KICAgICAgICAgICAgICAgICAgICBtZWRpYTogIG1lZGlhTGlzdCwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuUEFHRV9TWU0pew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFnZSgpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9ydWxlc2V0KCkpew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNFKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJlbmRtZWRpYSIsDQogICAgICAgICAgICAgICAgICAgIG1lZGlhOiAgbWVkaWFMaXN0LA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICANCg0KICAgICAgICAgICAgLy9DU1MzIE1lZGlhIFF1ZXJpZXMNCiAgICAgICAgICAgIF9tZWRpYV9xdWVyeV9saXN0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbWVkaWFfcXVlcnlfbGlzdA0KICAgICAgICAgICAgICAgICAqICAgOiBTKiBbbWVkaWFfcXVlcnkgWyAnLCcgUyogbWVkaWFfcXVlcnkgXSogXT8NCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgbWVkaWFMaXN0ICAgPSBbXTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklERU5UIHx8IHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuTFBBUkVOKXsNCiAgICAgICAgICAgICAgICAgICAgbWVkaWFMaXN0LnB1c2godGhpcy5fbWVkaWFfcXVlcnkoKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT01NQSkpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICBtZWRpYUxpc3QucHVzaCh0aGlzLl9tZWRpYV9xdWVyeSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIG1lZGlhTGlzdDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgKiBOb3RlOiAiZXhwcmVzc2lvbiIgaW4gdGhlIGdyYW1tYXIgbWFwcyB0byB0aGUgX21lZGlhX2V4cHJlc3Npb24NCiAgICAgICAgICAgICAqIG1ldGhvZC4NCiAgICAgICAgICAgICANCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgX21lZGlhX3F1ZXJ5OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbWVkaWFfcXVlcnkNCiAgICAgICAgICAgICAgICAgKiAgIDogW09OTFkgfCBOT1RdPyBTKiBtZWRpYV90eXBlIFMqIFsgQU5EIFMqIGV4cHJlc3Npb24gXSoNCiAgICAgICAgICAgICAgICAgKiAgIHwgZXhwcmVzc2lvbiBbIEFORCBTKiBleHByZXNzaW9uIF0qDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHR5cGUgICAgICAgID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgaWRlbnQgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zID0gW107DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsNCiAgICAgICAgICAgICAgICAgICAgaWRlbnQgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXJlJ3Mgbm8gY3VzdG9tIHRva2VucyBmb3IgdGhlc2UsIG5lZWQgdG8gbWFudWFsbHkgY2hlY2sNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlkZW50ICE9ICJvbmx5IiAmJiBpZGVudCAhPSAibm90Iil7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS51bmdldCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklERU5UKXsNCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRoaXMuX21lZGlhX3R5cGUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW5TdHJlYW0ucGVlaygpID09IFRva2Vucy5MUEFSRU4pew0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMuX21lZGlhX2V4cHJlc3Npb24oKSk7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCAmJiBleHByZXNzaW9ucy5sZW5ndGggPT09IDApew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUudG9Mb3dlckNhc2UoKSAhPSAiYW5kIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRva2VuU3RyZWFtLnRva2VuKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLl9tZWRpYV9leHByZXNzaW9uKCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVF1ZXJ5KGlkZW50LCB0eXBlLCBleHByZXNzaW9ucywgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvL0NTUzMgTWVkaWEgUXVlcmllcw0KICAgICAgICAgICAgX21lZGlhX3R5cGU6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBtZWRpYV90eXBlDQogICAgICAgICAgICAgICAgICogICA6IElERU5UDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhX2ZlYXR1cmUoKTsgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBOb3RlOiBpbiBDU1MzIE1lZGlhIFF1ZXJpZXMsIHRoaXMgaXMgY2FsbGVkICJleHByZXNzaW9uIi4NCiAgICAgICAgICAgICAqIFJlbmFtZWQgaGVyZSB0byBhdm9pZCBjb25mbGljdCB3aXRoIENTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICAgKiBkZWZpbml0aW9uIG9mICJleHByZXNzaW9uIi4gQWxzbyBub3RlIHRoYXQgImV4cHIiIGluIHRoZQ0KICAgICAgICAgICAgICogZ3JhbW1hciBub3cgbWFwcyB0byAiZXhwcmVzc2lvbiIgZnJvbSBDU1MzIHNlbGVjdG9ycy4NCiAgICAgICAgICAgICAqIEBtZXRob2QgX21lZGlhX2V4cHJlc3Npb24NCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9tZWRpYV9leHByZXNzaW9uOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogZXhwcmVzc2lvbg0KICAgICAgICAgICAgICAgICAqICA6ICcoJyBTKiBtZWRpYV9mZWF0dXJlIFMqIFsgJzonIFMqIGV4cHIgXT8gJyknIFMqDQogICAgICAgICAgICAgICAgICogIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiAgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTFBBUkVOKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBmZWF0dXJlID0gdGhpcy5fbWVkaWFfZmVhdHVyZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT0xPTikpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLkxUKDEpOw0KICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gdGhpcy5fZXhwcmVzc2lvbigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlJQQVJFTik7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFGZWF0dXJlKGZlYXR1cmUsIChleHByZXNzaW9uID8gbmV3IFN5bnRheFVuaXQoZXhwcmVzc2lvbiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCkgOiBudWxsKSk7ICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvL0NTUzMgTWVkaWEgUXVlcmllcw0KICAgICAgICAgICAgX21lZGlhX2ZlYXR1cmU6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBtZWRpYV9mZWF0dXJlDQogICAgICAgICAgICAgICAgICogICA6IElERU5UDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW07DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiBTeW50YXhVbml0LmZyb21Ub2tlbih0b2tlblN0cmVhbS50b2tlbigpKTsgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBQYWdlZCBNZWRpYQ0KICAgICAgICAgICAgX3BhZ2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBwYWdlOg0KICAgICAgICAgICAgICAgICAqICAgIFBBR0VfU1lNIFMqIElERU5UPyBwc2V1ZG9fcGFnZT8gUyogDQogICAgICAgICAgICAgICAgICogICAgJ3snIFMqIFsgZGVjbGFyYXRpb24gfCBtYXJnaW4gXT8gWyAnOycgUyogWyBkZWNsYXJhdGlvbiB8IG1hcmdpbiBdPyBdKiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiAgICA7DQogICAgICAgICAgICAgICAgICovICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBwc2V1ZG9QYWdlICA9IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9sb29rIGZvciBAcGFnZQ0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUEFHRV9TWU0pOw0KICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAvL1RoZSB2YWx1ZSAnYXV0bycgbWF5IG5vdCBiZSB1c2VkIGFzIGEgcGFnZSBuYW1lIGFuZCBNVVNUIGJlIHRyZWF0ZWQgYXMgYSBzeW50YXggZXJyb3IuDQogICAgICAgICAgICAgICAgICAgIGlmIChpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgPT09ICJhdXRvIil7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vc2VlIGlmIHRoZXJlJ3MgYSBjb2xvbiB1cGNvbWluZw0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLkNPTE9OKXsNCiAgICAgICAgICAgICAgICAgICAgcHNldWRvUGFnZSA9IHRoaXMuX3BzZXVkb19wYWdlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJzdGFydHBhZ2UiLA0KICAgICAgICAgICAgICAgICAgICBpZDogICAgIGlkZW50aWZpZXIsDQogICAgICAgICAgICAgICAgICAgIHBzZXVkbzogcHNldWRvUGFnZSwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSwgdHJ1ZSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZHBhZ2UiLA0KICAgICAgICAgICAgICAgICAgICBpZDogICAgIGlkZW50aWZpZXIsDQogICAgICAgICAgICAgICAgICAgIHBzZXVkbzogcHNldWRvUGFnZSwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFBhZ2VkIE1lZGlhDQogICAgICAgICAgICBfbWFyZ2luOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbWFyZ2luIDoNCiAgICAgICAgICAgICAgICAgKiAgICBtYXJnaW5fc3ltIFMqICd7JyBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbj8gXSogJ30nIFMqDQogICAgICAgICAgICAgICAgICogICAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2wsDQogICAgICAgICAgICAgICAgICAgIG1hcmdpblN5bSAgID0gdGhpcy5fbWFyZ2luX3N5bSgpOw0KDQogICAgICAgICAgICAgICAgaWYgKG1hcmdpblN5bSl7DQogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJzdGFydHBhZ2VtYXJnaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBtYXJnaW5TeW0sDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbA0KICAgICAgICAgICAgICAgICAgICB9KTsgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRGVjbGFyYXRpb25zKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZW5kcGFnZW1hcmdpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG1hcmdpblN5bSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgICAgIH0pOyAgICANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIC8vQ1NTMyBQYWdlZCBNZWRpYQ0KICAgICAgICAgICAgX21hcmdpbl9zeW06IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIG1hcmdpbl9zeW0gOg0KICAgICAgICAgICAgICAgICAqICAgIFRPUExFRlRDT1JORVJfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgVE9QTEVGVF9TWU0gfCANCiAgICAgICAgICAgICAgICAgKiAgICBUT1BDRU5URVJfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgVE9QUklHSFRfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgVE9QUklHSFRDT1JORVJfU1lNIHwNCiAgICAgICAgICAgICAgICAgKiAgICBCT1RUT01MRUZUQ09STkVSX1NZTSB8IA0KICAgICAgICAgICAgICAgICAqICAgIEJPVFRPTUxFRlRfU1lNIHwgDQogICAgICAgICAgICAgICAgICogICAgQk9UVE9NQ0VOVEVSX1NZTSB8IA0KICAgICAgICAgICAgICAgICAqICAgIEJPVFRPTVJJR0hUX1NZTSB8DQogICAgICAgICAgICAgICAgICogICAgQk9UVE9NUklHSFRDT1JORVJfU1lNIHwNCiAgICAgICAgICAgICAgICAgKiAgICBMRUZUVE9QX1NZTSB8DQogICAgICAgICAgICAgICAgICogICAgTEVGVE1JRERMRV9TWU0gfA0KICAgICAgICAgICAgICAgICAqICAgIExFRlRCT1RUT01fU1lNIHwNCiAgICAgICAgICAgICAgICAgKiAgICBSSUdIVFRPUF9TWU0gfA0KICAgICAgICAgICAgICAgICAqICAgIFJJR0hUTUlERExFX1NZTSB8DQogICAgICAgICAgICAgICAgICogICAgUklHSFRCT1RUT01fU1lNIA0KICAgICAgICAgICAgICAgICAqICAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5UT1BMRUZUQ09STkVSX1NZTSwgVG9rZW5zLlRPUExFRlRfU1lNLA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLlRPUENFTlRFUl9TWU0sIFRva2Vucy5UT1BSSUdIVF9TWU0sIFRva2Vucy5UT1BSSUdIVENPUk5FUl9TWU0sDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuQk9UVE9NTEVGVENPUk5FUl9TWU0sIFRva2Vucy5CT1RUT01MRUZUX1NZTSwgDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuQk9UVE9NQ0VOVEVSX1NZTSwgVG9rZW5zLkJPVFRPTVJJR0hUX1NZTSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5CT1RUT01SSUdIVENPUk5FUl9TWU0sIFRva2Vucy5MRUZUVE9QX1NZTSwgDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuTEVGVE1JRERMRV9TWU0sIFRva2Vucy5MRUZUQk9UVE9NX1NZTSwgVG9rZW5zLlJJR0hUVE9QX1NZTSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5SSUdIVE1JRERMRV9TWU0sIFRva2Vucy5SSUdIVEJPVFRPTV9TWU1dKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW50YXhVbml0LmZyb21Ub2tlbih0b2tlblN0cmVhbS50b2tlbigpKTsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfcHNldWRvX3BhZ2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBwc2V1ZG9fcGFnZQ0KICAgICAgICAgICAgICAgICAqICAgOiAnOicgSURFTlQNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgDQogICAgICAgICAgICAgICAgICovDQogICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuQ09MT04pOw0KICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vVE9ETzogQ1NTMyBQYWdlZCBNZWRpYSBzYXlzIG9ubHkgImxlZnQiLCAiY2VudGVyIiwgYW5kICJyaWdodCIgYXJlIGFsbG93ZWQNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9mb250X2ZhY2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBmb250X2ZhY2UNCiAgICAgICAgICAgICAgICAgKiAgIDogRk9OVF9GQUNFX1NZTSBTKiANCiAgICAgICAgICAgICAgICAgKiAgICAgJ3snIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uIF0qICd9JyBTKg0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLyAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2xvb2sgZm9yIEBwYWdlDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5GT05UX0ZBQ0VfU1lNKTsNCiAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRmb250ZmFjZSIsDQogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwNCiAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wNCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAiZW5kZm9udGZhY2UiLA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sDQogICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIF9vcGVyYXRvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogb3BlcmF0b3INCiAgICAgICAgICAgICAgICAgKiAgOiAnLycgUyogfCAnLCcgUyogfCAvKCBlbXB0eSApLw0KICAgICAgICAgICAgICAgICAqICA7DQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gICAgICAgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlNMQVNILCBUb2tlbnMuQ09NTUFdKSl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gIHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPyBQcm9wZXJ0eVZhbHVlUGFydC5mcm9tVG9rZW4odG9rZW4pIDogbnVsbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9jb21iaW5hdG9yOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBjb21iaW5hdG9yDQogICAgICAgICAgICAgICAgICogIDogUExVUyBTKiB8IEdSRUFURVIgUyogfCBUSUxERSBTKiB8IFMrDQogICAgICAgICAgICAgICAgICogIDsNCiAgICAgICAgICAgICAgICAgKi8gICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIHRva2VuOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuUExVUywgVG9rZW5zLkdSRUFURVIsIFRva2Vucy5USUxERV0pKXsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQ29tYmluYXRvcih0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF91bmFyeV9vcGVyYXRvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogdW5hcnlfb3BlcmF0b3INCiAgICAgICAgICAgICAgICAgKiAgOiAnLScgfCAnKycNCiAgICAgICAgICAgICAgICAgKiAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5NSU5VUywgVG9rZW5zLlBMVVNdKSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0gICAgICAgICANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9wcm9wZXJ0eTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogcHJvcGVydHkNCiAgICAgICAgICAgICAgICAgKiAgIDogSURFTlQgUyoNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgIA0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBoYWNrICAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIHRva2VuVmFsdWUsDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vY2hlY2sgZm9yIHN0YXIgaGFjayAtIHRocm93cyBlcnJvciBpZiBub3QgYWxsb3dlZA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLlNUQVIgJiYgdGhpcy5vcHRpb25zLnN0YXJIYWNrKXsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgaGFjayA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW4uc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlbi5zdGFydENvbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklERU5UKSl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5WYWx1ZSA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBmb3IgdW5kZXJzY29yZSBoYWNrIC0gbm8gZXJyb3IgaWYgbm90IGFsbG93ZWQgYmVjYXVzZSBpdCdzIHZhbGlkIENTUyBzeW50YXgNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuVmFsdWUuY2hhckF0KDApID09ICJfIiAmJiB0aGlzLm9wdGlvbnMudW5kZXJzY29yZUhhY2spew0KICAgICAgICAgICAgICAgICAgICAgICAgaGFjayA9ICJfIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVmFsdWUgPSB0b2tlblZhbHVlLnN1YnN0cmluZygxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgUHJvcGVydHlOYW1lKHRva2VuVmFsdWUsIGhhY2ssIChsaW5lfHx0b2tlbi5zdGFydExpbmUpLCAoY29sfHx0b2tlbi5zdGFydENvbCkpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgICAgICAgICB9LA0KICAgICAgICANCiAgICAgICAgICAgIC8vQXVnbWVudGVkIHdpdGggQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9ydWxlc2V0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogcnVsZXNldA0KICAgICAgICAgICAgICAgICAqICAgOiBzZWxlY3RvcnNfZ3JvdXANCiAgICAgICAgICAgICAgICAgKiAgICAgJ3snIFMqIGRlY2xhcmF0aW9uPyBbICc7JyBTKiBkZWNsYXJhdGlvbj8gXSogJ30nIFMqDQogICAgICAgICAgICAgICAgICogICA7ICAgIA0KICAgICAgICAgICAgICAgICAqLyAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHR0LA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnM7DQoNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogRXJyb3IgUmVjb3Zlcnk6IElmIGV2ZW4gYSBzaW5nbGUgc2VsZWN0b3IgZmFpbHMgdG8gcGFyc2UsDQogICAgICAgICAgICAgICAgICogdGhlbiB0aGUgZW50aXJlIHJ1bGVzZXQgc2hvdWxkIGJlIHRocm93biBhd2F5Lg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IHRoaXMuX3NlbGVjdG9yc19ncm91cCgpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KXsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IgJiYgIXRoaXMub3B0aW9ucy5zdHJpY3Qpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyZSBlcnJvciBldmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAgICAgIGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgIGV4Lm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBleC5jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2tpcCBvdmVyIGV2ZXJ5dGhpbmcgdW50aWwgY2xvc2luZyBicmFjZQ0KICAgICAgICAgICAgICAgICAgICAgICAgdHQgPSB0b2tlblN0cmVhbS5hZHZhbmNlKFtUb2tlbnMuUkJSQUNFXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHQgPT0gVG9rZW5zLlJCUkFDRSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgcmlnaHQgYnJhY2UsIHRoZSBydWxlIGlzIGZpbmlzaGVkIHNvIGRvbid0IGRvIGFueXRoaW5nDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlLCByZXRocm93IHRoZSBlcnJvciBiZWNhdXNlIGl0IHdhc24ndCBoYW5kbGVkIHByb3Blcmx5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7DQogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vbm90IGEgc3ludGF4IGVycm9yLCByZXRocm93IGl0DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsNCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy90cmlnZ2VyIHBhcnNlciB0byBjb250aW51ZQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9pZiBpdCBnb3QgaGVyZSwgYWxsIHNlbGVjdG9ycyBwYXJzZWQNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JzKXsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICJzdGFydHJ1bGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzOiAgc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgc2VsZWN0b3JzWzBdLmxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBzZWxlY3RvcnNbMF0uY29sDQogICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICJlbmRydWxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yczogIHNlbGVjdG9ycywNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgICAgIHNlbGVjdG9yc1swXS5saW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgc2VsZWN0b3JzWzBdLmNvbA0KICAgICAgICAgICAgICAgICAgICB9KTsgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yczsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9zZWxlY3RvcnNfZ3JvdXA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAqIHNlbGVjdG9yc19ncm91cA0KICAgICAgICAgICAgICAgICAqICAgOiBzZWxlY3RvciBbIENPTU1BIFMqIHNlbGVjdG9yIF0qDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzICAgPSBbXSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gdGhpcy5fc2VsZWN0b3IoKTsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwpew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT01NQSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gdGhpcy5fc2VsZWN0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0uTFQoMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9ycy5sZW5ndGggPyBzZWxlY3RvcnMgOiBudWxsOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9zZWxlY3RvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICogICA6IHNpbXBsZV9zZWxlY3Rvcl9zZXF1ZW5jZSBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlIF0qDQogICAgICAgICAgICAgICAgICogICA7ICAgIA0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgICAgPSBbXSwNCiAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVjdG9yID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICB3cyAgICAgICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHNpbXBsZSBzZWxlY3RvciwgdGhlbiB0aGVyZSdzIG5vIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgbmV4dFNlbGVjdG9yID0gdGhpcy5fc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlKCk7DQogICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKG5leHRTZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9sb29rIGZvciBhIGNvbWJpbmF0b3INCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciA9IHRoaXMuX2NvbWJpbmF0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5hdG9yICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2goY29tYmluYXRvcik7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0b3IgPSB0aGlzLl9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy90aGVyZSBtdXN0IGJlIGEgbmV4dCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRoaXMuTFQoMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dFNlbGVjdG9yIGlzIGFuIGluc3RhbmNlIG9mIFNlbGVjdG9yUGFydA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2gobmV4dFNlbGVjdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCB3aGl0ZXNwYWNlLCB3ZSdyZSBkb25lDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVhZFdoaXRlc3BhY2UoKSl7ICAgICAgICAgICANCiAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGQgd2hpdGVzcGFjZSBzZXBhcmF0b3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IG5ldyBDb21iaW5hdG9yKHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lLCB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbWJpbmF0b3IgaXMgbm90IHJlcXVpcmVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciA9IHRoaXMuX2NvbWJpbmF0b3IoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlbGVjdG9yIGlzIHJlcXVpcmVkIGlmIHRoZXJlJ3MgYSBjb21iaW5hdG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVjdG9yID0gdGhpcy5fc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5hdG9yICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgIT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucHVzaChjb21iaW5hdG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2god3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKG5leHRTZWxlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gd2hpbGUodHJ1ZSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0b3JbMF0ubGluZSwgc2VsZWN0b3JbMF0uY29sKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2U6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBzaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UNCiAgICAgICAgICAgICAgICAgKiAgIDogWyB0eXBlX3NlbGVjdG9yIHwgdW5pdmVyc2FsIF0NCiAgICAgICAgICAgICAgICAgKiAgICAgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gfCBuZWdhdGlvbiBdKg0KICAgICAgICAgICAgICAgICAqICAgfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyB8IG5lZ2F0aW9uIF0rDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAvL3BhcnRzIG9mIGEgc2ltcGxlIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzICAgPSBbXSwNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vY29tcGxldGUgc2VsZWN0b3IgdGV4dA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclRleHQ9ICIiLA0KDQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGRpZmZlcmVudCBwYXJ0cyBhZnRlciB0aGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBmb3INCiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyAgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICAvL0hBU0gNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5IQVNIKSA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VsZWN0b3JTdWJQYXJ0KHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUsICJpZCIsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lLCB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sKSA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsYXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0cmliLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHNldWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmVnYXRpb24NCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgaSAgICAgICAgICAgPSAwLA0KICAgICAgICAgICAgICAgICAgICBsZW4gICAgICAgICA9IGNvbXBvbmVudHMubGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGZvdW5kICAgICAgID0gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vZ2V0IHN0YXJ0aW5nIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhlIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IHRoaXMuX3R5cGVfc2VsZWN0b3IoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnROYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLl91bml2ZXJzYWwoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JUZXh0ICs9IGVsZW1lbnROYW1lOw0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgLy93aGl0ZXNwYWNlIG1lYW5zIHdlJ3JlIGRvbmUNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PT0gVG9rZW5zLlMpew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBmb3IgZWFjaCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUoaSA8IGxlbiAmJiBjb21wb25lbnQgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpKytdLmNhbGwodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgZG9uJ3QgaGF2ZSBhIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JUZXh0ID09PSAiIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMucHVzaChjb21wb25lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JUZXh0ICs9IGNvbXBvbmVudC50b1N0cmluZygpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yVGV4dCAhPT0gIiIgPw0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yUGFydChlbGVtZW50TmFtZSwgbW9kaWZpZXJzLCBzZWxlY3RvclRleHQsIGxpbmUsIGNvbCkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsNCiAgICAgICAgICAgIH0sICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF90eXBlX3NlbGVjdG9yOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogdHlwZV9zZWxlY3Rvcg0KICAgICAgICAgICAgICAgICAqICAgOiBbIG5hbWVzcGFjZV9wcmVmaXggXT8gZWxlbWVudF9uYW1lDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBucyAgICAgICAgICA9IHRoaXMuX25hbWVzcGFjZV9wcmVmaXgoKSwNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLl9lbGVtZW50X25hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50TmFtZSl7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICogTmVlZCB0byBiYWNrIG91dCB0aGUgbmFtZXNwYWNlIHRoYXQgd2FzIHJlYWQgZHVlIHRvIGJvdGgNCiAgICAgICAgICAgICAgICAgICAgICogdHlwZV9zZWxlY3RvciBhbmQgdW5pdmVyc2FsIHJlYWRpbmcgbmFtZXNwYWNlX3ByZWZpeA0KICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdC4gS2luZCBvZiBoYWNreSwgYnV0IG9ubHkgd2F5IEkgY2FuIGZpZ3VyZSBvdXQNCiAgICAgICAgICAgICAgICAgICAgICogcmlnaHQgbm93IGhvdyB0byBub3QgY2hhbmdlIHRoZSBncmFtbWFyLg0KICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgaWYgKG5zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLnVuZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnMubGVuZ3RoID4gMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0udW5nZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChucyl7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZS50ZXh0ID0gbnMgKyBlbGVtZW50TmFtZS50ZXh0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUuY29sIC09IG5zLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycw0KICAgICAgICAgICAgX2NsYXNzOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogY2xhc3MNCiAgICAgICAgICAgICAgICAgKiAgIDogJy4nIElERU5UDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW47DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5ET1QpKXsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5JREVOVCk7ICAgIA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JTdWJQYXJ0KCIuIiArIHRva2VuLnZhbHVlLCAiY2xhc3MiLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sIC0gMSk7ICAgICAgICANCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycw0KICAgICAgICAgICAgX2VsZW1lbnRfbmFtZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGVsZW1lbnRfbmFtZQ0KICAgICAgICAgICAgICAgICAqICAgOiBJREVOVA0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLyAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW47DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpew0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JTdWJQYXJ0KHRva2VuLnZhbHVlLCAiZWxlbWVudE5hbWUiLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9uYW1lc3BhY2VfcHJlZml4OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICogbmFtZXNwYWNlX3ByZWZpeA0KICAgICAgICAgICAgICAgICAqICAgOiBbIElERU5UIHwgJyonIF0/ICd8Jw0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9ICIiOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3ZlcmlmeSB0aGF0IHRoaXMgaXMgYSBuYW1lc3BhY2UgcHJlZml4DQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLkxBKDEpID09PSBUb2tlbnMuUElQRSB8fCB0b2tlblN0cmVhbS5MQSgyKSA9PT0gVG9rZW5zLlBJUEUpew0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuSURFTlQsIFRva2Vucy5TVEFSXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5QSVBFKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gInwiOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogbnVsbDsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICBfdW5pdmVyc2FsOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogdW5pdmVyc2FsDQogICAgICAgICAgICAgICAgICogICA6IFsgbmFtZXNwYWNlX3ByZWZpeCBdPyAnKicNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgbnM7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG5zID0gdGhpcy5fbmFtZXNwYWNlX3ByZWZpeCgpOw0KICAgICAgICAgICAgICAgIGlmKG5zKXsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gbnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5TVEFSKSl7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9ICIqIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogbnVsbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycw0KICAgICAgICAgICAgX2F0dHJpYjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGF0dHJpYg0KICAgICAgICAgICAgICAgICAqICAgOiAnWycgUyogWyBuYW1lc3BhY2VfcHJlZml4IF0/IElERU5UIFMqDQogICAgICAgICAgICAgICAgICogICAgICAgICBbIFsgUFJFRklYTUFUQ0ggfA0KICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFNVRkZJWE1BVENIIHwNCiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTVUJTVFJJTkdNQVRDSCB8DQogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgJz0nIHwNCiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJTkNMVURFUyB8DQogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqDQogICAgICAgICAgICAgICAgICogICAgICAgICBdPyAnXScNCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIG5zLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbjsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkxCUkFDS0VUKSl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIG5zID0gdGhpcy5fbmFtZXNwYWNlX3ByZWZpeCgpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgaWYgKG5zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IG5zOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZih0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlBSRUZJWE1BVENILCBUb2tlbnMuU1VGRklYTUFUQ0gsIFRva2Vucy5TVUJTVFJJTkdNQVRDSCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuRVFVQUxTLCBUb2tlbnMuSU5DTFVERVMsIFRva2Vucy5EQVNITUFUQ0hdKSl7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFtUb2tlbnMuSURFTlQsIFRva2Vucy5TVFJJTkddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNLRVQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yU3ViUGFydCh2YWx1ZSArICJdIiwgImF0dHJpYnV0ZSIsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9wc2V1ZG86IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIHBzZXVkbw0KICAgICAgICAgICAgICAgICAqICAgOiAnOicgJzonPyBbIElERU5UIHwgZnVuY3Rpb25hbF9wc2V1ZG8gXQ0KICAgICAgICAgICAgICAgICAqICAgOyAgICANCiAgICAgICAgICAgICAgICAgKi8gICANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGNvbG9ucyAgICAgID0gIjoiLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT0xPTikpew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkNPTE9OKSl7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvbnMgKz0gIjoiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sIC0gY29sb25zLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLkZVTkNUSU9OKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbCAtIGNvbG9ucy5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gPSB0aGlzLl9mdW5jdGlvbmFsX3BzZXVkbygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAocHNldWRvKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyA9IG5ldyBTZWxlY3RvclN1YlBhcnQoY29sb25zICsgcHNldWRvLCAicHNldWRvIiwgbGluZSwgY29sKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHBzZXVkbzsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9mdW5jdGlvbmFsX3BzZXVkbzogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uYWxfcHNldWRvDQogICAgICAgICAgICAgICAgICogICA6IEZVTkNUSU9OIFMqIGV4cHJlc3Npb24gJyknDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgKi8gICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5GVU5DVElPTikpew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX2V4cHJlc3Npb24oKTsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5SUEFSRU4pOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAiKSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMNCiAgICAgICAgICAgIF9leHByZXNzaW9uOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogZXhwcmVzc2lvbg0KICAgICAgICAgICAgICAgICAqICAgOiBbIFsgUExVUyB8ICctJyB8IERJTUVOU0lPTiB8IE5VTUJFUiB8IFNUUklORyB8IElERU5UIF0gUyogXSsNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgID0gIiI7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuUExVUywgVG9rZW5zLk1JTlVTLCBUb2tlbnMuRElNRU5TSU9OLA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLk5VTUJFUiwgVG9rZW5zLlNUUklORywgVG9rZW5zLklERU5ULCBUb2tlbnMuTEVOR1RILA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkZSRVEsIFRva2Vucy5BTkdMRSwgVG9rZW5zLlRJTUUsDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuUkVTT0xVVElPTl0pKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPyB2YWx1ZSA6IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICBfbmVnYXRpb246IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgKiBuZWdhdGlvbg0KICAgICAgICAgICAgICAgICAqICAgOiBOT1QgUyogbmVnYXRpb25fYXJnIFMqICcpJw0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLw0KDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgYXJnLA0KICAgICAgICAgICAgICAgICAgICBzdWJwYXJ0ICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuTk9UKSl7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOw0KICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICBhcmcgPSB0aGlzLl9uZWdhdGlvbl9hcmcoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gYXJnOw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUlBBUkVOKTsNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHN1YnBhcnQgPSBuZXcgU2VsZWN0b3JTdWJQYXJ0KHZhbHVlLCAibm90IiwgbGluZSwgY29sKTsNCiAgICAgICAgICAgICAgICAgICAgc3VicGFydC5hcmdzLnB1c2goYXJnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnBhcnQ7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzDQogICAgICAgICAgICBfbmVnYXRpb25fYXJnOiBmdW5jdGlvbigpeyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogbmVnYXRpb25fYXJnDQogICAgICAgICAgICAgICAgICogICA6IHR5cGVfc2VsZWN0b3IgfCB1bml2ZXJzYWwgfCBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8NCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgYXJncyAgICAgICAgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90eXBlX3NlbGVjdG9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5pdmVyc2FsLA0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkhBU0gpID8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWxlY3RvclN1YlBhcnQodG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZSwgImlkIiwgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmUsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2wpIDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xhc3MsDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdHRyaWIsDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wc2V1ZG8gICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICBhcmcgICAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGkgICAgICAgICAgID0gMCwNCiAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAgPSBhcmdzLmxlbmd0aCwNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsDQogICAgICAgICAgICAgICAgICAgIGxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbCwNCiAgICAgICAgICAgICAgICAgICAgcGFydDsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aGlsZShpIDwgbGVuICYmIGFyZyA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdzW2ldLmNhbGwodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9tdXN0IGJlIGEgbmVnYXRpb24gYXJnDQogICAgICAgICAgICAgICAgaWYgKGFyZyA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgfQ0KIA0KICAgICAgICAgICAgICAgIC8vaXQncyBhbiBlbGVtZW50IG5hbWUNCiAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUgPT0gImVsZW1lbnROYW1lIil7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU2VsZWN0b3JQYXJ0KGFyZywgW10sIGFyZy50b1N0cmluZygpLCBsaW5lLCBjb2wpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU2VsZWN0b3JQYXJ0KG51bGwsIFthcmddLCBhcmcudG9TdHJpbmcoKSwgbGluZSwgY29sKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2RlY2xhcmF0aW9uOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBkZWNsYXJhdGlvbg0KICAgICAgICAgICAgICAgICAqICAgOiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPw0KICAgICAgICAgICAgICAgICAqICAgfCAvKCBlbXB0eSApLw0KICAgICAgICAgICAgICAgICAqICAgOyAgICAgDQogICAgICAgICAgICAgICAgICovICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ICAgID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgZXhwciAgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBwcmlvICAgICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0eSgpOw0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPT0gbnVsbCl7DQoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5DT0xPTik7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5fZXhwcigpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHBhcnRzIGZvciB0aGUgdmFsdWUsIGl0J3MgYW4gZXJyb3INCiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHByIHx8IGV4cHIubGVuZ3RoID09PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHByaW8gPSB0aGlzLl9wcmlvKCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoew0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgInByb3BlcnR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAgIHByb3BlcnR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICAgICAgZXhwciwNCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudDogIHByaW8sDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgICAgICBwcm9wZXJ0eS5saW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgcHJvcGVydHkuY29sDQogICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfcHJpbzogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIHByaW8NCiAgICAgICAgICAgICAgICAgKiAgIDogSU1QT1JUQU5UX1NZTSBTKg0KICAgICAgICAgICAgICAgICAqICAgOyAgICANCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCAgICAgID0gdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklNUE9SVEFOVF9TWU0pOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfZXhwcjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGV4cHINCiAgICAgICAgICAgICAgICAgKiAgIDogdGVybSBbIG9wZXJhdG9yIHRlcm0gXSoNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHZhbHVlcyAgICAgID0gW10sDQoJCQkJCS8vdmFsdWVQYXJ0cwk9IFtdLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yICAgID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXJtKCk7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSB0aGlzLl9vcGVyYXRvcigpOw0KICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbiBvcGVyYXRvciwga2VlcCBidWlsZGluZyB1cCB0aGUgdmFsdWUgcGFydHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRvcil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gob3BlcmF0b3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBub3QgYW4gb3BlcmF0b3IsIHlvdSBoYXZlIGEgZnVsbCB2YWx1ZQ0KCQkJCQkJCXZhbHVlcy5wdXNoKG5ldyBQcm9wZXJ0eVZhbHVlKHZhbHVlUGFydHMsIHZhbHVlUGFydHNbMF0ubGluZSwgdmFsdWVQYXJ0c1swXS5jb2wpKTsNCgkJCQkJCQl2YWx1ZVBhcnRzID0gW107DQoJCQkJCQl9Ki8NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXJtKCk7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSh0cnVlKTsNCiAgICAgICAgICAgICAgICB9DQoJCQkJDQoJCQkJLy9jbGVhbnVwDQogICAgICAgICAgICAgICAgLyppZiAodmFsdWVQYXJ0cy5sZW5ndGgpew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChuZXcgUHJvcGVydHlWYWx1ZSh2YWx1ZVBhcnRzLCB2YWx1ZVBhcnRzWzBdLmxpbmUsIHZhbHVlUGFydHNbMF0uY29sKSk7DQogICAgICAgICAgICAgICAgfSovDQogICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IG5ldyBQcm9wZXJ0eVZhbHVlKHZhbHVlcywgdmFsdWVzWzBdLnN0YXJ0TGluZSwgdmFsdWVzWzBdLnN0YXJ0Q29sKSA6IG51bGw7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfdGVybTogZnVuY3Rpb24oKXsgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiB0ZXJtDQogICAgICAgICAgICAgICAgICogICA6IHVuYXJ5X29wZXJhdG9yPw0KICAgICAgICAgICAgICAgICAqICAgICBbIE5VTUJFUiBTKiB8IFBFUkNFTlRBR0UgUyogfCBMRU5HVEggUyogfCBBTkdMRSBTKiB8DQogICAgICAgICAgICAgICAgICogICAgICAgVElNRSBTKiB8IEZSRVEgUyogfCBmdW5jdGlvbiB8IGllX2Z1bmN0aW9uIF0NCiAgICAgICAgICAgICAgICAgKiAgIHwgU1RSSU5HIFMqIHwgSURFTlQgUyogfCBVUkkgUyogfCBVTklDT0RFUkFOR0UgUyogfCBoZXhjb2xvcg0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLyAgICANCiAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHVuYXJ5ICAgICAgID0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBsaW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vcmV0dXJucyB0aGUgb3BlcmF0b3Igb3IgbnVsbA0KICAgICAgICAgICAgICAgIHVuYXJ5ID0gdGhpcy5fdW5hcnlfb3BlcmF0b3IoKTsNCiAgICAgICAgICAgICAgICBpZiAodW5hcnkgIT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vZXhjZXB0aW9uIGZvciBJRSBmaWx0ZXJzDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuSUVfRlVOQ1RJT04gJiYgdGhpcy5vcHRpb25zLmllRmlsdGVycyl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faWVfZnVuY3Rpb24oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHVuYXJ5ID09PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3NlZSBpZiB0aGVyZSdzIGEgc2ltcGxlIG1hdGNoDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLk5VTUJFUiwgVG9rZW5zLlBFUkNFTlRBR0UsIFRva2Vucy5MRU5HVEgsDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuQU5HTEUsIFRva2Vucy5USU1FLA0KICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkZSRVEsIFRva2Vucy5TVFJJTkcsIFRva2Vucy5JREVOVCwgVG9rZW5zLlVSSSwgVG9rZW5zLlVOSUNPREVfUkFOR0VdKSl7DQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgLy9zZWUgaWYgaXQncyBhIGNvbG9yDQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faGV4Y29sb3IoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlJ3Mgbm8gdW5hcnksIGdldCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgdG9rZW4gZm9yIGxpbmUvY29sIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaGFzIHRvIGJlIGEgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGNoZWNrcyBmb3IgYWxwaGEob3BhY2l0eT0wKSBzdHlsZSBvZiBJRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9ucy4gSUVfRlVOQ1RJT04gb25seSBwcmVzZW50cyBwcm9naWQ6IHN0eWxlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5MQSgzKSA9PSBUb2tlbnMuRVFVQUxTICYmIHRoaXMub3B0aW9ucy5pZUZpbHRlcnMpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2llX2Z1bmN0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9mdW5jdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAodmFsdWUgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIGF0IGxpbmUgIiArIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lICsgIiwgY2hhcmFjdGVyICIgKyAgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbCArICIuIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9Ki8NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5hcnkgPT09IG51bGwpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCA/DQogICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZVBhcnQodW5hcnkgIT09IG51bGwgPyB1bmFyeSArIHZhbHVlIDogdmFsdWUsIGxpbmUsIGNvbCkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsNCiAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfZnVuY3Rpb246IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uDQogICAgICAgICAgICAgICAgICogICA6IEZVTkNUSU9OIFMqIGV4cHIgJyknIFMqDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBleHByICAgICAgICA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuRlVOQ1RJT04pKXsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuX2V4cHIoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5SUEFSRU4pOyAgICANCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IGV4cHIgKyAiKSI7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UZXh0Ow0KICAgICAgICAgICAgfSwgDQogICAgICAgICAgICANCiAgICAgICAgICAgIF9pZV9mdW5jdGlvbjogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qIChNeSBvd24gZXh0ZW5zaW9uKQ0KICAgICAgICAgICAgICAgICAqIGllX2Z1bmN0aW9uDQogICAgICAgICAgICAgICAgICogICA6IElFX0ZVTkNUSU9OIFMqIElERU5UICc9JyB0ZXJtIFtTKiAnLCc/IElERU5UICc9JyB0ZXJtXSsgJyknIFMqDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSBudWxsLA0KICAgICAgICAgICAgICAgICAgICBleHByICAgICAgICA9IG51bGwsDQogICAgICAgICAgICAgICAgICAgIGx0Ow0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL0lFIGZ1bmN0aW9uIGNhbiBiZWdpbiBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgdG9vDQogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuSUVfRlVOQ1RJT04sIFRva2Vucy5GVU5DVElPTl0pKXsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVhZFdoaXRlc3BhY2UoKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWlnaHQgYmUgc2Vjb25kIHRpbWUgaW4gdGhlIGxvb3ANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5MQSgwKSA9PSBUb2tlbnMuQ09NTUEpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uVGV4dCArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkVRVUFMUyk7DQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9mdW5jdGlvblRleHQgKz0gdGhpcy5fdGVybSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0b2tlblN0cmVhbS5wZWVrKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShsdCAhPSBUb2tlbnMuQ09NTUEgJiYgbHQgIT0gVG9rZW5zLlMgJiYgbHQgIT0gVG9rZW5zLlJQQVJFTil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0b2tlblN0cmVhbS5wZWVrKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5DT01NQSwgVG9rZW5zLlNdKSk7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5SUEFSRU4pOyAgICANCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9ICIpIjsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvblRleHQ7DQogICAgICAgICAgICB9LCANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2hleGNvbG9yOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogVGhlcmUgaXMgYSBjb25zdHJhaW50IG9uIHRoZSBjb2xvciB0aGF0IGl0IG11c3QNCiAgICAgICAgICAgICAgICAgKiBoYXZlIGVpdGhlciAzIG9yIDYgaGV4LWRpZ2l0cyAoaS5lLiwgWzAtOWEtZkEtRl0pDQogICAgICAgICAgICAgICAgICogYWZ0ZXIgdGhlICIjIjsgZS5nLiwgIiMwMDAiIGlzIE9LLCBidXQgIiNhYmNkIiBpcyBub3QuDQogICAgICAgICAgICAgICAgICoNCiAgICAgICAgICAgICAgICAgKiBoZXhjb2xvcg0KICAgICAgICAgICAgICAgICAqICAgOiBIQVNIIFMqDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5IQVNIKSl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byBkbyBzb21lIHZhbGlkYXRpb24gaGVyZQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOw0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIS8jW2EtZjAtOV17Myw2fS9pLnRlc3QoY29sb3IpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiRXhwZWN0ZWQgYSBoZXggY29sb3IgYnV0IGZvdW5kICciICsgY29sb3IgKyAiJyBhdCBsaW5lICIgKyB0b2tlbi5zdGFydExpbmUgKyAiLCBjb2wgIiArIHRva2VuLnN0YXJ0Q29sICsgIi4iLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAvLyBBbmltYXRpb25zIG1ldGhvZHMNCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2tleWZyYW1lczogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICoga2V5ZnJhbWVzOg0KICAgICAgICAgICAgICAgICAqICAgOiBLRVlGUkFNRVNfU1lNIFMqIGtleWZyYW1lX25hbWUgUyogJ3snIFMqIGtleWZyYW1lX3J1bGUqICd9JyB7DQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICB0dCwNCiAgICAgICAgICAgICAgICAgICAgbmFtZTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5LRVlGUkFNRVNfU1lNKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl9rZXlmcmFtZV9uYW1lKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLkxCUkFDRSk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgInN0YXJ0a2V5ZnJhbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogICBuYW1lLA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIG5hbWUubGluZSwNCiAgICAgICAgICAgICAgICAgICAgY29sOiAgICBuYW1lLmNvbA0KICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIHR0ID0gdG9rZW5TdHJlYW0ucGVlaygpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vY2hlY2sgZm9yIGtleQ0KICAgICAgICAgICAgICAgIHdoaWxlKHR0ID09IFRva2Vucy5JREVOVCB8fCB0dCA9PSBUb2tlbnMuUEVSQ0VOVEFHRSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlmcmFtZV9ydWxlKCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIHR0ID0gdG9rZW5TdHJlYW0ucGVlaygpOw0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZGtleWZyYW1lcyIsDQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICAgbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBuYW1lLmxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAgbmFtZS5jb2wNCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5SQlJBQ0UpOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfa2V5ZnJhbWVfbmFtZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICoga2V5ZnJhbWVfbmFtZToNCiAgICAgICAgICAgICAgICAgKiAgIDogSURFTlQNCiAgICAgICAgICAgICAgICAgKiAgIHwgU1RSSU5HDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHRva2VuOw0KDQogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFtUb2tlbnMuSURFTlQsIFRva2Vucy5TVFJJTkddKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7ICAgICAgICAgICAgDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICBfa2V5ZnJhbWVfcnVsZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICoga2V5ZnJhbWVfcnVsZToNCiAgICAgICAgICAgICAgICAgKiAgIDoga2V5X2xpc3QgUyogDQogICAgICAgICAgICAgICAgICogICAgICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiAgIDsNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4sDQogICAgICAgICAgICAgICAgICAgIGtleUxpc3QgPSB0aGlzLl9rZXlfbGlzdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRrZXlmcmFtZXJ1bGUiLA0KICAgICAgICAgICAgICAgICAgICBrZXlzOiAgIGtleUxpc3QsDQogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAga2V5TGlzdFswXS5saW5lLA0KICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGtleUxpc3RbMF0uY29sDQogICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZGtleWZyYW1lcnVsZSIsDQogICAgICAgICAgICAgICAgICAgIGtleXM6ICAga2V5TGlzdCwNCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBrZXlMaXN0WzBdLmxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNvbDogICAga2V5TGlzdFswXS5jb2wNCiAgICAgICAgICAgICAgICB9KTsgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgX2tleV9saXN0OiBmdW5jdGlvbigpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBrZXlfbGlzdDoNCiAgICAgICAgICAgICAgICAgKiAgIDoga2V5IFsgUyogJywnIFMqIGtleV0qDQogICAgICAgICAgICAgICAgICogICA7DQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sDQogICAgICAgICAgICAgICAgICAgIHRva2VuLA0KICAgICAgICAgICAgICAgICAgICBrZXksDQogICAgICAgICAgICAgICAgICAgIGtleUxpc3QgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9tdXN0IGJlIGxlYXN0IG9uZSBrZXkNCiAgICAgICAgICAgICAgICBrZXlMaXN0LnB1c2godGhpcy5fa2V5KCkpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ09NTUEpKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKHRoaXMuX2tleSgpKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4ga2V5TGlzdDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIF9rZXk6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBUaGVyZSBpcyBhIHJlc3RyaWN0aW9uIHRoYXQgSURFTlQgY2FuIGJlIG9ubHkgImZyb20iIG9yICJ0byIuDQogICAgICAgICAgICAgICAgICoNCiAgICAgICAgICAgICAgICAgKiBrZXkNCiAgICAgICAgICAgICAgICAgKiAgIDogUEVSQ0VOVEFHRQ0KICAgICAgICAgICAgICAgICAqICAgfCBJREVOVA0KICAgICAgICAgICAgICAgICAqICAgOw0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdG9rZW47DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUEVSQ0VOVEFHRSkpew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAoL2Zyb218dG8vaS50ZXN0KHRva2VuLnZhbHVlKSl7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS51bmdldCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2lmIGl0IGdldHMgaGVyZSwgdGhlcmUgd2Fzbid0IGEgdmFsaWQgdG9rZW4sIHNvIHRpbWUgdG8gZXhwbG9kZQ0KICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAvLyBIZWxwZXIgbWV0aG9kcw0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIE5vdCBwYXJ0IG9mIENTUyBncmFtbWFyLCBidXQgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyDQogICAgICAgICAgICAgKiBjb21iaW5hdGlvbiBvZiB3aGl0ZSBzcGFjZSBhbmQgSFRNTC1zdHlsZSBjb21tZW50cy4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge3ZvaWR9DQogICAgICAgICAgICAgKiBAbWV0aG9kIF9za2lwQ3J1ZnQNCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9za2lwQ3J1ZnQ6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgd2hpbGUodGhpcy5fdG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5TLCBUb2tlbnMuQ0RPLCBUb2tlbnMuQ0RDXSkpew0KICAgICAgICAgICAgICAgICAgICAvL25vb3ANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIE5vdCBwYXJ0IG9mIENTUyBncmFtbWFyLCBidXQgdGhpcyBwYXR0ZXJuIG9jY3VycyBmcmVxdWVudGx5DQogICAgICAgICAgICAgKiBpbiB0aGUgb2ZmaWNpYWwgQ1NTIGdyYW1tYXIuIFNwbGl0IG91dCBoZXJlIHRvIGVsaW1pbmF0ZQ0KICAgICAgICAgICAgICogZHVwbGljYXRlIGNvZGUuDQogICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNoZWNrU3RhcnQgSW5kaWNhdGVzIGlmIHRoZSBydWxlIHNob3VsZCBjaGVjaw0KICAgICAgICAgICAgICogICAgICBmb3IgdGhlIGxlZnQgYnJhY2UgYXQgdGhlIGJlZ2lubmluZy4NCiAgICAgICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVhZE1hcmdpbnMgSW5kaWNhdGVzIGlmIHRoZSBydWxlIHNob3VsZCBjaGVjaw0KICAgICAgICAgICAgICogICAgICBmb3IgbWFyZ2luIHBhdHRlcm5zLg0KICAgICAgICAgICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgICAgICAgICAqIEBtZXRob2QgX3JlYWREZWNsYXJhdGlvbnMNCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9yZWFkRGVjbGFyYXRpb25zOiBmdW5jdGlvbihjaGVja1N0YXJ0LCByZWFkTWFyZ2lucyl7DQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBSZWFkcyB0aGUgcGF0dGVybg0KICAgICAgICAgICAgICAgICAqIFMqICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCiAgICAgICAgICAgICAgICAgKiBvcg0KICAgICAgICAgICAgICAgICAqIFMqICd7JyBTKiBbIGRlY2xhcmF0aW9uIHwgbWFyZ2luIF0/IFsgJzsnIFMqIFsgZGVjbGFyYXRpb24gfCBtYXJnaW4gXT8gXSogJ30nIFMqDQogICAgICAgICAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgaG93IGl0IGlzIGRlc2NyaWJlZCBpbiBDU1MzIFBhZ2VkIE1lZGlhLCBidXQgaXMgYWN0dWFsbHkgaW5jb3JyZWN0Lg0KICAgICAgICAgICAgICAgICAqIEEgc2VtaWNvbG9uIGlzIG9ubHkgbmVjZXNzYXJ5IGZvbGxvd2luZyBhIGRlbGNhcmF0aW9uIGlzIHRoZXJlJ3MgYW5vdGhlciBkZWNsYXJhdGlvbg0KICAgICAgICAgICAgICAgICAqIG9yIG1hcmdpbiBhZnRlcndhcmRzLiANCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwNCiAgICAgICAgICAgICAgICAgICAgdHQ7DQogICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoY2hlY2tTdGFydCl7DQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTEJSQUNFKTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZE1hcmdpbnMgJiYgdGhpcy5fbWFyZ2luKCkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9vcA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kZWNsYXJhdGlvbigpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5TRU1JQ09MT04pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgoIXRoaXMuX21hcmdpbigpICYmICF0aGlzLl9kZWNsYXJhdGlvbigpKSB8fCAhdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlNFTUlDT0xPTikpew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAvL30NCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNFKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IgJiYgIXRoaXMub3B0aW9ucy5zdHJpY3Qpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyZSBlcnJvciBldmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAgICAgIGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgIGV4Lm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBleC5jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VlIGlmIHRoZXJlJ3MgYW5vdGhlciBkZWNsYXJhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgdHQgPSB0b2tlblN0cmVhbS5hZHZhbmNlKFtUb2tlbnMuU0VNSUNPTE9OLCBUb2tlbnMuUkJSQUNFXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHQgPT0gVG9rZW5zLlNFTUlDT0xPTil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgc2VtaWNvbG9uLCB0aGVuIHRoZXJlIG1pZ2h0IGJlIGFub3RoZXIgZGVjbGFyYXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRGVjbGFyYXRpb25zKGZhbHNlLCByZWFkTWFyZ2lucyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR0ID09IFRva2Vucy5SQlJBQ0Upew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhIHJpZ2h0IGJyYWNlLCB0aGUgcnVsZSBpcyBmaW5pc2hlZCBzbyBkb24ndCBkbyBhbnl0aGluZw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL290aGVyd2lzZSwgcmV0aHJvdyB0aGUgZXJyb3IgYmVjYXVzZSBpdCB3YXNuJ3QgaGFuZGxlZCBwcm9wZXJseQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL25vdCBhIHN5bnRheCBlcnJvciwgcmV0aHJvdyBpdA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICB9LCAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIEluIHNvbWUgY2FzZXMsIHlvdSBjYW4gZW5kIHVwIHdpdGggdHdvIHdoaXRlIHNwYWNlIHRva2VucyBpbiBhDQogICAgICAgICAgICAgKiByb3cuIEluc3RlYWQgb2YgbWFraW5nIGEgY2hhbmdlIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgbG9va3MgZm9yDQogICAgICAgICAgICAgKiB3aGl0ZSBzcGFjZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hdGNoIGFzIG11Y2ggd2hpdGUgc3BhY2UNCiAgICAgICAgICAgICAqIGFzIG5lY2Vzc2FyeS4NCiAgICAgICAgICAgICAqIEBtZXRob2QgX3JlYWRXaGl0ZXNwYWNlDQogICAgICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB3aGl0ZSBzcGFjZSBpZiBmb3VuZCwgZW1wdHkgc3RyaW5nIGlmIG5vdC4NCiAgICAgICAgICAgICAqIEBwcml2YXRlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIF9yZWFkV2hpdGVzcGFjZTogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICB3cyA9ICIiOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUykpew0KICAgICAgICAgICAgICAgICAgICB3cyArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gd3M7DQogICAgICAgICAgICB9LA0KICAgICAgICAgIA0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIFRocm93cyBhbiBlcnJvciB3aGVuIGFuIHVuZXhwZWN0ZWQgdG9rZW4gaXMgZm91bmQuDQogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gVGhlIHRva2VuIHRoYXQgd2FzIGZvdW5kLg0KICAgICAgICAgICAgICogQG1ldGhvZCBfdW5leHBlY3RlZFRva2VuDQogICAgICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQ0KICAgICAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgX3VuZXhwZWN0ZWRUb2tlbjogZnVuY3Rpb24odG9rZW4pew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAnIiArIHRva2VuLnZhbHVlICsgIicgYXQgbGluZSAiICsgdG9rZW4uc3RhcnRMaW5lICsgIiwgY29sICIgKyB0b2tlbi5zdGFydENvbCArICIuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCBmb3IgcGFyc2luZyBzdWJwYXJ0cyBvZiBhIHN0eWxlIHNoZWV0Lg0KICAgICAgICAgICAgICogQHJldHVybiB7dm9pZH0NCiAgICAgICAgICAgICAqIEBtZXRob2QgX3ZlcmlmeUVuZA0KICAgICAgICAgICAgICogQHByaXZhdGUNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgX3ZlcmlmeUVuZDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdG9rZW5TdHJlYW0uTEEoMSkgIT0gVG9rZW5zLkVPRil7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0aGlzLl90b2tlblN0cmVhbS5MVCgxKSk7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgLy8gUGFyc2luZyBtZXRob2RzDQogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbihpbnB1dCl7ICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlc2hlZXQoKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhcnNlU3R5bGVTaGVldDogZnVuY3Rpb24oaW5wdXQpew0KICAgICAgICAgICAgICAgIC8vanVzdCBwYXNzdGhyb3VnaA0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKGlucHV0KTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhcnNlTWVkaWFRdWVyeTogZnVuY3Rpb24oaW5wdXQpew0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9tZWRpYV9xdWVyeSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbnl0aGluZyBtb3JlLCB0aGVuIGl0J3MgYW4gaW52YWxpZCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeUVuZCgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlIHJldHVybiByZXN1bHQNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBQYXJzZXMgYSBwcm9wZXJ0eSB2YWx1ZSAoZXZlcnl0aGluZyBhZnRlciB0aGUgc2VtaWNvbG9uKS4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge3BhcnNlcmxpYi5jc3MuUHJvcGVydHlWYWx1ZX0gVGhlIHByb3BlcnR5IHZhbHVlLg0KICAgICAgICAgICAgICogQHRocm93cyBwYXJzZXJsaWIudXRpbC5TeW50YXhFcnJvciBJZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzIGZvdW5kLg0KICAgICAgICAgICAgICogQG1ldGhvZCBwYXJzZXJQcm9wZXJ0eVZhbHVlDQogICAgICAgICAgICAgKi8gICAgICAgICAgICAgDQogICAgICAgICAgICBwYXJzZVByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uKGlucHV0KXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2V4cHIoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL29rYXkgdG8gaGF2ZSBhIHRyYWlsaW5nIHdoaXRlIHNwYWNlDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL2lmIHRoZXJlJ3MgYW55dGhpbmcgbW9yZSwgdGhlbiBpdCdzIGFuIGludmFsaWQgc2VsZWN0b3INCiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlFbmQoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL290aGVyd2lzZSByZXR1cm4gcmVzdWx0DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICANCiAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICogUGFyc2VzIGEgY29tcGxldGUgQ1NTIHJ1bGUsIGluY2x1ZGluZyBzZWxlY3RvcnMgYW5kDQogICAgICAgICAgICAgKiBwcm9wZXJ0aWVzLg0KICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSB0ZXh0IHRvIHBhcnNlci4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBhcnNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIG5vdC4NCiAgICAgICAgICAgICAqIEBtZXRob2QgcGFyc2VSdWxlDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIHBhcnNlUnVsZTogZnVuY3Rpb24oaW5wdXQpew0KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgbGVhZGluZyB3aGl0ZSBzcGFjZQ0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3J1bGVzZXQoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3NraXAgYW55IHRyYWlsaW5nIHdoaXRlIHNwYWNlDQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsNCg0KICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbnl0aGluZyBtb3JlLCB0aGVuIGl0J3MgYW4gaW52YWxpZCBzZWxlY3Rvcg0KICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeUVuZCgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlIHJldHVybiByZXN1bHQNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgIA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBQYXJzZXMgYSBzaW5nbGUgQ1NTIHNlbGVjdG9yIChubyBjb21tYSkNCiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgdGV4dCB0byBwYXJzZSBhcyBhIENTUyBzZWxlY3Rvci4NCiAgICAgICAgICAgICAqIEByZXR1cm4ge1NlbGVjdG9yfSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3Rvci4NCiAgICAgICAgICAgICAqIEB0aHJvd3MgcGFyc2VybGliLnV0aWwuU3ludGF4RXJyb3IgSWYgYW4gdW5leHBlY3RlZCB0b2tlbiBpcyBmb3VuZC4NCiAgICAgICAgICAgICAqIEBtZXRob2QgcGFyc2VTZWxlY3Rvcg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBwYXJzZVNlbGVjdG9yOiBmdW5jdGlvbihpbnB1dCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlblN0cmVhbSA9IG5ldyBUb2tlblN0cmVhbShpbnB1dCwgVG9rZW5zKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3NraXAgYW55IGxlYWRpbmcgd2hpdGUgc3BhY2UNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9zZWxlY3RvcigpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgdHJhaWxpbmcgd2hpdGUgc3BhY2UNCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOw0KDQogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGFueXRoaW5nIG1vcmUsIHRoZW4gaXQncyBhbiBpbnZhbGlkIHNlbGVjdG9yDQogICAgICAgICAgICAgICAgdGhpcy5fdmVyaWZ5RW5kKCk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHJlc3VsdA0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgLy9jb3B5IG92ZXIgb250byBwcm90b3R5cGUNCiAgICBmb3IgKHByb3AgaW4gYWRkaXRpb25zKXsNCiAgICAgICAgcHJvdG9bcHJvcF0gPSBhZGRpdGlvbnNbcHJvcF07DQogICAgfSAgIA0KICAgIA0KICAgIHJldHVybiBwcm90bzsNCn0oKTsNCg0KDQovKg0KbnRoDQogIDogUyogWyBbJy0nfCcrJ10/IElOVEVHRVI/IHtOfSBbIFMqIFsnLSd8JysnXSBTKiBJTlRFR0VSIF0/IHwNCiAgICAgICAgIFsnLSd8JysnXT8gSU5URUdFUiB8IHtPfXtEfXtEfSB8IHtFfXtWfXtFfXtOfSBdIFMqDQogIDsNCiovDQovKioNCiAqIFJlcHJlc2VudHMgYSBzZWxlY3RvciBjb21iaW5hdG9yICh3aGl0ZXNwYWNlLCArLCA+KS4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIFByb3BlcnR5TmFtZQ0KICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4gDQogKiBAcGFyYW0ge1N0cmluZ30gaGFjayBUaGUgdHlwZSBvZiBJRSBoYWNrIGFwcGxpZWQgKCIqIiwgIl8iLCBvciBudWxsKS4NCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKi8NCmZ1bmN0aW9uIFByb3BlcnR5TmFtZSh0ZXh0LCBoYWNrLCBsaW5lLCBjb2wpew0KICAgIA0KICAgIFN5bnRheFVuaXQuY2FsbCh0aGlzLCAoaGFja3x8IiIpICsgdGV4dCwgbGluZSwgY29sKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB0eXBlIG9mIElFIGhhY2sgYXBwbGllZCAoIioiLCAiXyIsIG9yIG51bGwpLg0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSBoYWNrDQogICAgICovDQogICAgdGhpcy5oYWNrID0gaGFjazsNCg0KfQ0KDQpQcm9wZXJ0eU5hbWUucHJvdG90eXBlID0gbmV3IFN5bnRheFVuaXQoKTsNClByb3BlcnR5TmFtZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eU5hbWU7DQoNCg0KLyoqDQogKiBSZXByZXNlbnRzIGEgc2luZ2xlIHBhcnQgb2YgYSBDU1MgcHJvcGVydHkgdmFsdWUsIG1lYW5pbmcgdGhhdCBpdCByZXByZXNlbnRzDQogKiBqdXN0IGV2ZXJ5dGhpbmcgc2luZ2xlIHBhcnQgYmV0d2VlbiAiOiIgYW5kICI7Ii4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcw0KICogc2VwYXJhdGVkIGJ5IGNvbW1hcywgdGhpcyB0eXBlIHJlcHJlc2VudHMganVzdCBvbmUgb2YgdGhlIHZhbHVlcy4NCiAqIEBwYXJhbSB7U3RyaW5nW119IHBhcnRzIEFuIGFycmF5IG9mIHZhbHVlIHBhcnRzIG1ha2luZyB1cCB0aGlzIHZhbHVlLg0KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcw0KICogQGNsYXNzIFByb3BlcnR5VmFsdWUNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICovDQpmdW5jdGlvbiBQcm9wZXJ0eVZhbHVlKHBhcnRzLCBsaW5lLCBjb2wpew0KDQogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHBhcnRzLmpvaW4oIiAiKSwgbGluZSwgY29sKTsNCiAgICANCiAgICAvKioNCiAgICAgKiBUaGUgcGFydHMgdGhhdCBtYWtlIHVwIHRoZSBzZWxlY3Rvci4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBwYXJ0cw0KICAgICAqLw0KICAgIHRoaXMucGFydHMgPSBwYXJ0czsNCiAgICANCn0NCg0KUHJvcGVydHlWYWx1ZS5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOw0KUHJvcGVydHlWYWx1ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eVZhbHVlOw0KDQoNCi8qKg0KICogUmVwcmVzZW50cyBhIHNpbmdsZSBwYXJ0IG9mIGEgQ1NTIHByb3BlcnR5IHZhbHVlLCBtZWFuaW5nIHRoYXQgaXQgcmVwcmVzZW50cw0KICoganVzdCBvbmUgcGFydCBvZiB0aGUgZGF0YSBiZXR3ZWVuICI6IiBhbmQgIjsiLg0KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKiBAY2xhc3MgUHJvcGVydHlWYWx1ZVBhcnQNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICovDQpmdW5jdGlvbiBQcm9wZXJ0eVZhbHVlUGFydCh0ZXh0LCBsaW5lLCBjb2wpew0KDQogICAgU3ludGF4VW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQogICAgDQogICAgLyoqDQogICAgICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIHZhbHVlIHVuaXQuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IHR5cGUNCiAgICAgKi8NCiAgICB0aGlzLnR5cGUgPSAidW5rbm93biI7DQoNCiAgICAvL2ZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mIGRhdGEgaXQgaXMNCiAgICANCiAgICB2YXIgdGVtcDsNCiAgICANCiAgICAvL2l0IGlzIGEgbWVhc3VyZW1lbnQ/DQogICAgaWYgKC9eKFsrXC1dP1tcZFwuXSspKFthLXpdKykkL2kudGVzdCh0ZXh0KSl7ICAvL2RpbWVuc2lvbg0KICAgICAgICB0aGlzLnR5cGUgPSAiZGltZW5zaW9uIjsNCiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7DQogICAgICAgIHRoaXMudW5pdHMgPSBSZWdFeHAuJDI7DQogICAgICAgIA0KICAgICAgICAvL3RyeSB0byBuYXJyb3cgZG93bg0KICAgICAgICBzd2l0Y2godGhpcy51bml0cy50b0xvd2VyQ2FzZSgpKXsNCiAgICAgICAgDQogICAgICAgICAgICBjYXNlICJlbSI6DQogICAgICAgICAgICBjYXNlICJyZW0iOg0KICAgICAgICAgICAgY2FzZSAiZXgiOg0KICAgICAgICAgICAgY2FzZSAicHgiOg0KICAgICAgICAgICAgY2FzZSAiY20iOg0KICAgICAgICAgICAgY2FzZSAibW0iOg0KICAgICAgICAgICAgY2FzZSAiaW4iOg0KICAgICAgICAgICAgY2FzZSAicHQiOg0KICAgICAgICAgICAgY2FzZSAicGMiOg0KICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9ICJsZW5ndGgiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSAiZGVnIjoNCiAgICAgICAgICAgIGNhc2UgInJhZCI6DQogICAgICAgICAgICBjYXNlICJncmFkIjoNCiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAiYW5nbGUiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlICJtcyI6DQogICAgICAgICAgICBjYXNlICJzIjoNCiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAidGltZSI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgImh6IjoNCiAgICAgICAgICAgIGNhc2UgImtoeiI6DQogICAgICAgICAgICAgICAgdGhpcy50eXBlID0gImZyZXF1ZW5jeSI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgImRwaSI6DQogICAgICAgICAgICBjYXNlICJkcGNtIjoNCiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAicmVzb2x1dGlvbiI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAvL2RlZmF1bHQNCiAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICB9IGVsc2UgaWYgKC9eKFsrXC1dP1tcZFwuXSspJSQvaS50ZXN0KHRleHQpKXsgIC8vcGVyY2VudGFnZQ0KICAgICAgICB0aGlzLnR5cGUgPSAicGVyY2VudGFnZSI7DQogICAgICAgIHRoaXMudmFsdWUgPSArUmVnRXhwLiQxOw0KICAgIH0gZWxzZSBpZiAoL14oWytcLV0/W1xkXC5dKyklJC9pLnRlc3QodGV4dCkpeyAgLy9wZXJjZW50YWdlDQogICAgICAgIHRoaXMudHlwZSA9ICJwZXJjZW50YWdlIjsNCiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7DQogICAgfSBlbHNlIGlmICgvXihbK1wtXT9cZCspJC9pLnRlc3QodGV4dCkpeyAgLy9pbnRlZ2VyDQogICAgICAgIHRoaXMudHlwZSA9ICJpbnRlZ2VyIjsNCiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7DQogICAgfSBlbHNlIGlmICgvXihbK1wtXT9bXGRcLl0rKSQvaS50ZXN0KHRleHQpKXsgIC8vbnVtYmVyDQogICAgICAgIHRoaXMudHlwZSA9ICJudW1iZXIiOw0KICAgICAgICB0aGlzLnZhbHVlID0gK1JlZ0V4cC4kMTsNCiAgICANCiAgICB9IGVsc2UgaWYgKC9eIyhbYS1mMC05XXszLDZ9KS9pLnRlc3QodGV4dCkpeyAgLy9oZXhjb2xvcg0KICAgICAgICB0aGlzLnR5cGUgPSAiY29sb3IiOw0KICAgICAgICB0ZW1wID0gUmVnRXhwLiQxOw0KICAgICAgICBpZiAodGVtcC5sZW5ndGggPT0gMyl7DQogICAgICAgICAgICB0aGlzLnJlZCAgICA9IHBhcnNlSW50KHRlbXAuY2hhckF0KDApK3RlbXAuY2hhckF0KDApLDE2KTsNCiAgICAgICAgICAgIHRoaXMuZ3JlZW4gID0gcGFyc2VJbnQodGVtcC5jaGFyQXQoMSkrdGVtcC5jaGFyQXQoMSksMTYpOw0KICAgICAgICAgICAgdGhpcy5ibHVlICAgPSBwYXJzZUludCh0ZW1wLmNoYXJBdCgyKSt0ZW1wLmNoYXJBdCgyKSwxNik7ICAgICAgICAgICAgDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnJlZCAgICA9IHBhcnNlSW50KHRlbXAuc3Vic3RyaW5nKDAsMiksMTYpOw0KICAgICAgICAgICAgdGhpcy5ncmVlbiAgPSBwYXJzZUludCh0ZW1wLnN1YnN0cmluZygyLDQpLDE2KTsNCiAgICAgICAgICAgIHRoaXMuYmx1ZSAgID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoNCw2KSwxNik7ICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICB9IGVsc2UgaWYgKC9ecmdiXChccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKlwpL2kudGVzdCh0ZXh0KSl7IC8vcmdiKCkgY29sb3Igd2l0aCBhYnNvbHV0ZSBudW1iZXJzDQogICAgICAgIHRoaXMudHlwZSAgID0gImNvbG9yIjsNCiAgICAgICAgdGhpcy5yZWQgICAgPSArUmVnRXhwLiQxOw0KICAgICAgICB0aGlzLmdyZWVuICA9ICtSZWdFeHAuJDI7DQogICAgICAgIHRoaXMuYmx1ZSAgID0gK1JlZ0V4cC4kMzsNCiAgICB9IGVsc2UgaWYgKC9ecmdiXChccyooXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKlwpL2kudGVzdCh0ZXh0KSl7IC8vcmdiKCkgY29sb3Igd2l0aCBwZXJjZW50YWdlcw0KICAgICAgICB0aGlzLnR5cGUgICA9ICJjb2xvciI7DQogICAgICAgIHRoaXMucmVkICAgID0gK1JlZ0V4cC4kMSAqIDI1NSAvIDEwMDsNCiAgICAgICAgdGhpcy5ncmVlbiAgPSArUmVnRXhwLiQyICogMjU1IC8gMTAwOw0KICAgICAgICB0aGlzLmJsdWUgICA9ICtSZWdFeHAuJDMgKiAyNTUgLyAxMDA7DQogICAgfSBlbHNlIGlmICgvXnVybFwoWyInXT8oW15cKSInXSspWyInXT9cKS9pLnRlc3QodGV4dCkpeyAvL1VSSQ0KICAgICAgICB0aGlzLnR5cGUgICA9ICJ1cmkiOw0KICAgICAgICB0aGlzLnVyaSAgICA9IFJlZ0V4cC4kMTsNCiAgICB9IGVsc2UgaWYgKC9eWyInXVteIiddKlsiJ10vLnRlc3QodGV4dCkpeyAgICAvL3N0cmluZw0KICAgICAgICB0aGlzLnR5cGUgICA9ICJzdHJpbmciOw0KICAgICAgICB0aGlzLnZhbHVlICA9IGV2YWwodGV4dCk7DQogICAgfSBlbHNlIGlmIChDb2xvcnNbdGV4dC50b0xvd2VyQ2FzZSgpXSl7ICAvL25hbWVkIGNvbG9yDQogICAgICAgIHRoaXMudHlwZSAgID0gImNvbG9yIjsNCiAgICAgICAgdGVtcCAgICAgICAgPSBDb2xvcnNbdGV4dC50b0xvd2VyQ2FzZSgpXS5zdWJzdHJpbmcoMSk7DQogICAgICAgIHRoaXMucmVkICAgID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoMCwyKSwxNik7DQogICAgICAgIHRoaXMuZ3JlZW4gID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoMiw0KSwxNik7DQogICAgICAgIHRoaXMuYmx1ZSAgID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoNCw2KSwxNik7ICAgICAgICAgDQogICAgfSBlbHNlIGlmICgvXltcLFwvXSQvLnRlc3QodGV4dCkpew0KICAgICAgICB0aGlzLnR5cGUgICA9ICJvcGVyYXRvciI7DQogICAgICAgIHRoaXMudmFsdWUgID0gdGV4dDsNCiAgICB9IGVsc2UgaWYgKC9eW2EtelwtXHUwMDgwLVx1RkZGRl1bYS16MC05XC1cdTAwODAtXHVGRkZGXSokL2kudGVzdCh0ZXh0KSl7DQogICAgICAgIHRoaXMudHlwZSAgID0gImlkZW50aWZpZXIiOw0KICAgICAgICB0aGlzLnZhbHVlICA9IHRleHQ7DQogICAgfQ0KDQp9DQoNClByb3BlcnR5VmFsdWVQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpQcm9wZXJ0eVZhbHVlUGFydC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eVZhbHVlOw0KDQovKioNCiAqIENyZWF0ZSBhIG5ldyBzeW50YXggdW5pdCBiYXNlZCBzb2xlbHkgb24gdGhlIGdpdmVuIHRva2VuLg0KICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBzeW50YXggdW5pdCB3aGVuDQogKiBpdCByZXByZXNlbnRzIGEgc2luZ2xlIHRva2VuIGluc3RlYWQgb2YgbXVsdGlwbGUuDQogKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gVGhlIHRva2VuIG9iamVjdCB0byByZXByZXNlbnQuDQogKiBAcmV0dXJuIHtwYXJzZXJsaWIuY3NzLlByb3BlcnR5VmFsdWVQYXJ0fSBUaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG9rZW4uDQogKiBAc3RhdGljDQogKiBAbWV0aG9kIGZyb21Ub2tlbg0KICovDQpQcm9wZXJ0eVZhbHVlUGFydC5mcm9tVG9rZW4gPSBmdW5jdGlvbih0b2tlbil7DQogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVZhbHVlUGFydCh0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7DQp9Ow0KLyoqDQogKiBSZXByZXNlbnRzIGFuIGVudGlyZSBzaW5nbGUgc2VsZWN0b3IsIGluY2x1ZGluZyBhbGwgcGFydHMgYnV0IG5vdA0KICogaW5jbHVkaW5nIG11bHRpcGxlIHNlbGVjdG9ycyAodGhvc2Ugc2VwYXJhdGVkIGJ5IGNvbW1hcykuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MNCiAqIEBjbGFzcyBTZWxlY3Rvcg0KICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdA0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyBBcnJheSBvZiBzZWxlY3RvcnMgcGFydHMgbWFraW5nIHVwIHRoaXMgc2VsZWN0b3IuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBTZWxlY3RvcihwYXJ0cywgbGluZSwgY29sKXsNCiAgICANCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgcGFydHMuam9pbigiICIpLCBsaW5lLCBjb2wpOw0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhlIHNlbGVjdG9yLg0KICAgICAqIEB0eXBlIEFycmF5DQogICAgICogQHByb3BlcnR5IHBhcnRzDQogICAgICovDQogICAgdGhpcy5wYXJ0cyA9IHBhcnRzOw0KDQp9DQoNClNlbGVjdG9yLnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpTZWxlY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTZWxlY3RvcjsNCg0KDQovKioNCiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgcGFydCBvZiBhIHNlbGVjdG9yIHN0cmluZywgbWVhbmluZyBhIHNpbmdsZSBzZXQgb2YNCiAqIGVsZW1lbnQgbmFtZSBhbmQgbW9kaWZpZXJzLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgY29tYmluYXRvcnMgc3VjaCBhcw0KICogc3BhY2VzLCArLCA+LCBldGMuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MNCiAqIEBjbGFzcyBTZWxlY3RvclBhcnQNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd9IGVsZW1lbnROYW1lIFRoZSBlbGVtZW50IG5hbWUgaW4gdGhlIHNlbGVjdG9yIG9yIG51bGwNCiAqICAgICAgaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBuYW1lLg0KICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzIEFycmF5IG9mIGluZGl2aWR1YWwgbW9kaWZpZXJzIGZvciB0aGUgZWxlbWVudC4NCiAqICAgICAgTWF5IGJlIGVtcHR5IGlmIHRoZXJlIGFyZSBub25lLg0KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuIA0KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4NCiAqLw0KZnVuY3Rpb24gU2VsZWN0b3JQYXJ0KGVsZW1lbnROYW1lLCBtb2RpZmllcnMsIHRleHQsIGxpbmUsIGNvbCl7DQogICAgDQogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHRleHQsIGxpbmUsIGNvbCk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgdGFnIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBwYXJ0DQogICAgICogb2YgdGhlIHNlbGVjdG9yIGFmZmVjdHMuDQogICAgICogQHR5cGUgU3RyaW5nDQogICAgICogQHByb3BlcnR5IGVsZW1lbnROYW1lDQogICAgICovDQogICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOw0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBwYXJ0cyB0aGF0IGNvbWUgYWZ0ZXIgdGhlIGVsZW1lbnQgbmFtZSwgc3VjaCBhcyBjbGFzcyBuYW1lcywgSURzLA0KICAgICAqIHBzZXVkbyBjbGFzc2VzL2VsZW1lbnRzLCBldGMuDQogICAgICogQHR5cGUgQXJyYXkNCiAgICAgKiBAcHJvcGVydHkgbW9kaWZpZXJzDQogICAgICovDQogICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7DQoNCn0NCg0KU2VsZWN0b3JQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpTZWxlY3RvclBhcnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VsZWN0b3JQYXJ0Ow0KDQoNCi8qKg0KICogUmVwcmVzZW50cyBhIHNlbGVjdG9yIG1vZGlmaWVyIHN0cmluZywgbWVhbmluZyBhIGNsYXNzIG5hbWUsIGVsZW1lbnQgbmFtZSwNCiAqIGVsZW1lbnQgSUQsIHBzZXVkbyBydWxlLCBldGMuDQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MNCiAqIEBjbGFzcyBTZWxlY3RvclN1YlBhcnQNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQNCiAqIEBjb25zdHJ1Y3Rvcg0KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuIA0KICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2Ygc2VsZWN0b3IgbW9kaWZpZXIuDQogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuDQogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLg0KICovDQpmdW5jdGlvbiBTZWxlY3RvclN1YlBhcnQodGV4dCwgdHlwZSwgbGluZSwgY29sKXsNCiAgICANCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgdGV4dCwgbGluZSwgY29sKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB0eXBlIG9mIG1vZGlmaWVyLg0KICAgICAqIEB0eXBlIFN0cmluZw0KICAgICAqIEBwcm9wZXJ0eSB0eXBlDQogICAgICovDQogICAgdGhpcy50eXBlID0gdHlwZTsNCiAgICANCiAgICAvKioNCiAgICAgKiBTb21lIHN1YnBhcnRzIGhhdmUgYXJndW1lbnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlbS4NCiAgICAgKiBAdHlwZSBBcnJheQ0KICAgICAqIEBwcm9wZXJ0eSBhcmdzDQogICAgICovDQogICAgdGhpcy5hcmdzID0gW107DQoNCn0NCg0KU2VsZWN0b3JTdWJQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7DQpTZWxlY3RvclN1YlBhcnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VsZWN0b3JTdWJQYXJ0Ow0KDQoNCg0KDQp2YXIgaCA9IC9eWzAtOWEtZkEtRl0kLywNCiAgICBub25hc2NpaSA9IC9eW1x1MDA4MC1cdUZGRkZdJC8sDQogICAgbmwgPSAvXG58XHJcbnxccnxcZi87DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIEhlbHBlciBmdW5jdGlvbnMNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpmdW5jdGlvbiBpc0hleERpZ2l0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgaC50ZXN0KGMpOw0KfQ0KDQpmdW5jdGlvbiBpc0RpZ2l0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgL1xkLy50ZXN0KGMpOw0KfQ0KDQpmdW5jdGlvbiBpc1doaXRlc3BhY2UoYyl7DQogICAgcmV0dXJuIGMgIT0gbnVsbCAmJiAvXHMvLnRlc3QoYyk7DQp9DQoNCmZ1bmN0aW9uIGlzTmV3TGluZShjKXsNCiAgICByZXR1cm4gYyAhPSBudWxsICYmIG5sLnRlc3QoYyk7DQp9DQoNCmZ1bmN0aW9uIGlzTmFtZVN0YXJ0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgKC9bYS16X1x1MDA4MC1cdUZGRkZcXF0vaS50ZXN0KGMpKTsNCn0NCg0KZnVuY3Rpb24gaXNOYW1lQ2hhcihjKXsNCiAgICByZXR1cm4gYyAhPSBudWxsICYmIChpc05hbWVTdGFydChjKSB8fCAvWzAtOVwtXFxdLy50ZXN0KGMpKTsNCn0NCg0KZnVuY3Rpb24gaXNJZGVudFN0YXJ0KGMpew0KICAgIHJldHVybiBjICE9IG51bGwgJiYgKGlzTmFtZVN0YXJ0KGMpIHx8IC9cLVxcLy50ZXN0KGMpKTsNCn0NCg0KZnVuY3Rpb24gbWl4KHJlY2VpdmVyLCBzdXBwbGllcil7DQoJZm9yICh2YXIgcHJvcCBpbiBzdXBwbGllcil7DQoJCWlmIChzdXBwbGllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7DQoJCQlyZWNlaXZlcltwcm9wXSA9IHN1cHBsaWVyW3Byb3BdOw0KCQl9DQoJfQ0KCXJldHVybiByZWNlaXZlcjsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQ1NTIFRva2VuIFN0cmVhbQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCi8qKg0KICogQSB0b2tlbiBzdHJlYW0gdGhhdCBwcm9kdWNlcyBDU1MgdG9rZW5zLg0KICogQHBhcmFtIHtTdHJpbmd8UmVhZGVyfSBpbnB1dCBUaGUgc291cmNlIG9mIHRleHQgdG8gdG9rZW5pemUuDQogKiBAY29uc3RydWN0b3INCiAqIEBjbGFzcyBUb2tlblN0cmVhbQ0KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzDQogKi8NCmZ1bmN0aW9uIFRva2VuU3RyZWFtKGlucHV0KXsNCglUb2tlblN0cmVhbUJhc2UuY2FsbCh0aGlzLCBpbnB1dCwgVG9rZW5zKTsNCn0NCg0KVG9rZW5TdHJlYW0ucHJvdG90eXBlID0gbWl4KG5ldyBUb2tlblN0cmVhbUJhc2UoKSwgew0KDQogICAgLyoqDQogICAgICogT3ZlcnJpZGVzIHRoZSBUb2tlblN0cmVhbUJhc2UgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUNCiAgICAgKiB0byBwcm9kdWNlIENTUyB0b2tlbnMuDQogICAgICogQHBhcmFtIHt2YXJpYW50fSBjaGFubmVsIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHRvIHVzZQ0KICAgICAqICAgICAgZm9yIHRoZSBuZXh0IHRva2VuLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHRva2VuLg0KICAgICAqIEBtZXRob2QgX2dldFRva2VuDQogICAgICogQHByaXZhdGUNCiAgICAgKi8NCiAgICBfZ2V0VG9rZW46IGZ1bmN0aW9uKGNoYW5uZWwpew0KDQogICAgICAgIHZhciBjLA0KICAgICAgICAgICAgcmVhZGVyID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdG9rZW4gICA9IG51bGwsDQogICAgICAgICAgICBzdGFydExpbmUgICA9IHJlYWRlci5nZXRMaW5lKCksDQogICAgICAgICAgICBzdGFydENvbCAgICA9IHJlYWRlci5nZXRDb2woKTsNCg0KICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsNCg0KDQogICAgICAgIHdoaWxlKGMpew0KICAgICAgICAgICAgc3dpdGNoKGMpew0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gQ09NTUVOVA0KICAgICAgICAgICAgICAgICAqIC0gU0xBU0gNCiAgICAgICAgICAgICAgICAgKiAtIENIQVINCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICIvIjoNCg0KICAgICAgICAgICAgICAgICAgICBpZihyZWFkZXIucGVlaygpID09ICIqIil7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY29tbWVudFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNoYXJUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoNCiAgICAgICAgICAgICAgICAgKiAtIERBU0hNQVRDSA0KICAgICAgICAgICAgICAgICAqIC0gSU5DTFVERVMNCiAgICAgICAgICAgICAgICAgKiAtIFBSRUZJWE1BVENIDQogICAgICAgICAgICAgICAgICogLSBTVUZGSVhNQVRDSA0KICAgICAgICAgICAgICAgICAqIC0gU1VCU1RSSU5HTUFUQ0gNCiAgICAgICAgICAgICAgICAgKiAtIENIQVINCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICJ8IjoNCiAgICAgICAgICAgICAgICBjYXNlICJ+IjoNCiAgICAgICAgICAgICAgICBjYXNlICJeIjoNCiAgICAgICAgICAgICAgICBjYXNlICIkIjoNCiAgICAgICAgICAgICAgICBjYXNlICIqIjoNCiAgICAgICAgICAgICAgICAgICAgaWYocmVhZGVyLnBlZWsoKSA9PSAiPSIpew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNvbXBhcmlzb25Ub2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICogLSBTVFJJTkcNCiAgICAgICAgICAgICAgICAgKiAtIElOVkFMSUQNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICJcIiI6DQogICAgICAgICAgICAgICAgY2FzZSAiJyI6DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5zdHJpbmdUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICogLSBIQVNIDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiIyI6DQogICAgICAgICAgICAgICAgICAgIGlmIChpc05hbWVDaGFyKHJlYWRlci5wZWVrKCkpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5oYXNoVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gRE9UDQogICAgICAgICAgICAgICAgICogLSBOVU1CRVINCiAgICAgICAgICAgICAgICAgKiAtIERJTUVOU0lPTg0KICAgICAgICAgICAgICAgICAqIC0gUEVSQ0VOVEFHRQ0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIGNhc2UgIi4iOg0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNEaWdpdChyZWFkZXIucGVlaygpKSl7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubnVtYmVyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gQ0RDDQogICAgICAgICAgICAgICAgICogLSBNSU5VUw0KICAgICAgICAgICAgICAgICAqIC0gTlVNQkVSDQogICAgICAgICAgICAgICAgICogLSBESU1FTlNJT04NCiAgICAgICAgICAgICAgICAgKiAtIFBFUkNFTlRBR0UNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICItIjoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5wZWVrKCkgPT0gIi0iKXsgIC8vY291bGQgYmUgY2xvc2luZyBIVE1MLXN0eWxlIGNvbW1lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5odG1sQ29tbWVudEVuZFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFtZVN0YXJ0KHJlYWRlci5wZWVrKCkpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5pZGVudE9yRnVuY3Rpb25Ub2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICogLSBJTVBPUlRBTlRfU1lNDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiISI6DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5pbXBvcnRhbnRUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIEFueSBhdC1rZXl3b3JkIG9yIENIQVINCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBjYXNlICJAIjoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmF0UnVsZVRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoNCiAgICAgICAgICAgICAgICAgKiAtIE5PVA0KICAgICAgICAgICAgICAgICAqIC0gQ0hBUg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIGNhc2UgIjoiOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubm90VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gQ0RPDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiPCI6DQogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5odG1sQ29tbWVudFN0YXJ0VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAqIC0gVU5JQ09ERV9SQU5HRQ0KICAgICAgICAgICAgICAgICAqIC0gVVJMDQogICAgICAgICAgICAgICAgICogLSBDSEFSDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgY2FzZSAiVSI6DQogICAgICAgICAgICAgICAgY2FzZSAidSI6DQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICIrIil7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMudW5pY29kZVJhbmdlVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvKmZhbGxzIHRocm91Z2gqLw0KDQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCg0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAgICAgKiAtIE5VTUJFUg0KICAgICAgICAgICAgICAgICAgICAgKiAtIERJTUVOU0lPTg0KICAgICAgICAgICAgICAgICAgICAgKiAtIExFTkdUSA0KICAgICAgICAgICAgICAgICAgICAgKiAtIEZSRVENCiAgICAgICAgICAgICAgICAgICAgICogLSBUSU1FDQogICAgICAgICAgICAgICAgICAgICAqIC0gRU1TDQogICAgICAgICAgICAgICAgICAgICAqIC0gRVhTDQogICAgICAgICAgICAgICAgICAgICAqIC0gQU5HTEUNCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgIGlmIChpc0RpZ2l0KGMpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5udW1iZXJUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQoNCiAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoNCiAgICAgICAgICAgICAgICAgICAgICogLSBTDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy53aGl0ZXNwYWNlVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KDQogICAgICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6DQogICAgICAgICAgICAgICAgICAgICAqIC0gSURFTlQNCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgIGlmIChpc0lkZW50U3RhcnQoYykpew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmlkZW50T3JGdW5jdGlvblRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UNCg0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOg0KICAgICAgICAgICAgICAgICAgICAgKiAtIENIQVINCiAgICAgICAgICAgICAgICAgICAgICogLSBQTFVTDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCg0KDQoNCg0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoaXMgdG9rZW4gaXMgd2FudGVkDQogICAgICAgICAgICAvL1RPRE86IGNoZWNrIGNoYW5uZWwNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghdG9rZW4gJiYgYyA9PSBudWxsKXsNCiAgICAgICAgICAgIHRva2VuID0gdGhpcy5jcmVhdGVUb2tlbihUb2tlbnMuRU9GLG51bGwsc3RhcnRMaW5lLHN0YXJ0Q29sKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0b2tlbjsNCiAgICB9LA0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gTWV0aG9kcyB0byBjcmVhdGUgdG9rZW5zDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIHRva2VuIGJhc2VkIG9uIGF2YWlsYWJsZSBkYXRhIGFuZCB0aGUgY3VycmVudA0KICAgICAqIHJlYWRlciBwb3NpdGlvbiBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IG90aGVyDQogICAgICogcHJpdmF0ZSBtZXRob2RzIHRvIGNyZWF0ZSB0b2tlbnMgYW5kIGlzIG5ldmVyIGNhbGxlZCBkaXJlY3RseS4NCiAgICAgKiBAcGFyYW0ge2ludH0gdHQgVGhlIHRva2VuIHR5cGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSB0b2tlbi4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgKE9wdGlvbmFsKSBTcGVjaWZpZXMgYSBjaGFubmVsIHByb3BlcnR5DQogICAgICogICAgICB0byBpbmRpY2F0ZSB0aGF0IGEgZGlmZmVyZW50IGNoYW5uZWwgc2hvdWxkIGJlIHNjYW5uZWQNCiAgICAgKiAgICAgIGFuZC9vciBhIGhpZGUgcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IHRoZSB0b2tlbiBzaG91bGQNCiAgICAgKiAgICAgIGJlIGhpZGRlbi4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgY3JlYXRlVG9rZW4NCiAgICAgKi8NCiAgICBjcmVhdGVUb2tlbjogZnVuY3Rpb24odHQsIHZhbHVlLCBzdGFydExpbmUsIHN0YXJ0Q29sLCBvcHRpb25zKXsNCiAgICAgICAgdmFyIHJlYWRlciA9IHRoaXMuX3JlYWRlcjsNCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHZhbHVlOiAgICAgIHZhbHVlLA0KICAgICAgICAgICAgdHlwZTogICAgICAgdHQsDQogICAgICAgICAgICBjaGFubmVsOiAgICBvcHRpb25zLmNoYW5uZWwsDQogICAgICAgICAgICBoaWRlOiAgICAgICBvcHRpb25zLmhpZGUgfHwgZmFsc2UsDQogICAgICAgICAgICBzdGFydExpbmU6ICBzdGFydExpbmUsDQogICAgICAgICAgICBzdGFydENvbDogICBzdGFydENvbCwNCiAgICAgICAgICAgIGVuZExpbmU6ICAgIHJlYWRlci5nZXRMaW5lKCksDQogICAgICAgICAgICBlbmRDb2w6ICAgICByZWFkZXIuZ2V0Q29sKCkNCiAgICAgICAgfTsNCiAgICB9LA0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gTWV0aG9kcyB0byBjcmVhdGUgc3BlY2lmaWMgdG9rZW5zDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIHRva2VuIGZvciBhbnkgYXQtcnVsZS4gSWYgdGhlIGF0LXJ1bGUgaXMgdW5rbm93biwgdGhlbg0KICAgICAqIHRoZSB0b2tlbiBpcyBmb3IgYSBzaW5nbGUgIkAiIGNoYXJhY3Rlci4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBmb3IgdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgYXRSdWxlVG9rZW4NCiAgICAgKi8NCiAgICBhdFJ1bGVUb2tlbjogZnVuY3Rpb24oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpew0KICAgICAgICB2YXIgcnVsZSAgICA9IGZpcnN0LA0KICAgICAgICAgICAgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIHR0ICAgICAgPSBUb2tlbnMuQ0hBUiwNCiAgICAgICAgICAgIHZhbGlkICAgPSBmYWxzZSwNCiAgICAgICAgICAgIGlkZW50LA0KICAgICAgICAgICAgYzsNCg0KICAgICAgICAvKg0KICAgICAgICAgKiBGaXJzdCwgbWFyayB3aGVyZSB3ZSBhcmUuIFRoZXJlIGFyZSBvbmx5IGZvdXIgQCBydWxlcywNCiAgICAgICAgICogc28gYW55dGhpbmcgZWxzZSBpcyByZWFsbHkganVzdCBhbiBpbnZhbGlkIHRva2VuLg0KICAgICAgICAgKiBCYXNpY2FsbHksIGlmIHRoaXMgZG9lc24ndCBtYXRjaCBvbmUgb2YgdGhlIGtub3duIEANCiAgICAgICAgICogcnVsZXMsIGp1c3QgcmV0dXJuICdAJyBhcyBhbiB1bmtub3duIHRva2VuIGFuZCBhbGxvdw0KICAgICAgICAgKiBwYXJzaW5nIHRvIGNvbnRpbnVlIGFmdGVyIHRoYXQgcG9pbnQuDQogICAgICAgICAqLw0KICAgICAgICByZWFkZXIubWFyaygpOw0KDQogICAgICAgIC8vdHJ5IHRvIGZpbmQgdGhlIGF0LWtleXdvcmQNCiAgICAgICAgaWRlbnQgPSB0aGlzLnJlYWROYW1lKCk7DQogICAgICAgIHJ1bGUgPSBmaXJzdCArIGlkZW50Ow0KICAgICAgICB0dCA9IFRva2Vucy50eXBlKHJ1bGUudG9Mb3dlckNhc2UoKSk7DQoNCiAgICAgICAgLy9pZiBpdCdzIG5vdCB2YWxpZCwgdXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb25seSBhbmQgcmVzZXQgdGhlIHJlYWRlcg0KICAgICAgICBpZiAodHQgPT0gVG9rZW5zLkNIQVIgfHwgdHQgPT0gVG9rZW5zLlVOS05PV04pew0KICAgICAgICAgICAgdHQgPSBUb2tlbnMuQ0hBUjsNCiAgICAgICAgICAgIHJ1bGUgPSBmaXJzdDsNCiAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIHJ1bGUsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIGNoYXJhY3RlciB0b2tlbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2hhcmFjdGVyDQogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoZXJlJ3MgYSBzcGVjaWFsIChub24tc3RhbmRhcmQpDQogICAgICogdG9rZW4gbmFtZSwgdGhpcyBpcyB1c2VkOyBvdGhlcndpc2UgQ0hBUiBpcyB1c2VkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjIFRoZSBjaGFyYWN0ZXIgZm9yIHRoZSB0b2tlbi4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4NCiAgICAgKiBAbWV0aG9kIGNoYXJUb2tlbg0KICAgICAqLw0KICAgIGNoYXJUb2tlbjogZnVuY3Rpb24oYywgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciB0dCA9IFRva2Vucy50eXBlKGMpOw0KDQogICAgICAgIGlmICh0dCA9PSAtMSl7DQogICAgICAgICAgICB0dCA9IFRva2Vucy5DSEFSOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIGNoYXJhY3RlciB0b2tlbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2hhcmFjdGVyDQogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoZXJlJ3MgYSBzcGVjaWFsIChub24tc3RhbmRhcmQpDQogICAgICogdG9rZW4gbmFtZSwgdGhpcyBpcyB1c2VkOyBvdGhlcndpc2UgQ0hBUiBpcyB1c2VkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGZvciB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBjb21tZW50VG9rZW4NCiAgICAgKi8NCiAgICBjb21tZW50VG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBjb21tZW50ID0gdGhpcy5yZWFkQ29tbWVudChmaXJzdCk7DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkNPTU1FTlQsIGNvbW1lbnQsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBQcm9kdWNlcyBhIGNvbXBhcmlzb24gdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3Rlcg0KICAgICAqIGFuZCBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtLiBUaGUgbmV4dCBjaGFyYWN0ZXIgbXVzdCBiZQ0KICAgICAqIHJlYWQgYW5kIGlzIGFscmVhZHkga25vd24gdG8gYmUgYW4gZXF1YWxzIHNpZ24uDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGMgVGhlIGNoYXJhY3RlciBmb3IgdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgY29tcGFyaXNvblRva2VuDQogICAgICovDQogICAgY29tcGFyaXNvblRva2VuOiBmdW5jdGlvbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBjb21wYXJpc29uICA9IGMgKyByZWFkZXIucmVhZCgpLA0KICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy50eXBlKGNvbXBhcmlzb24pIHx8IFRva2Vucy5DSEFSOw0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCBjb21wYXJpc29uLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYSBoYXNoIHRva2VuIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uIFRoZQ0KICAgICAqIGZpcnN0IGNoYXJhY3RlciBwcm92aWRlZCBpcyB0aGUgcG91bmQgc2lnbiAoIykgYW5kIHRoZW4gdGhpcw0KICAgICAqIG1ldGhvZCByZWFkcyBhIG5hbWUgYWZ0ZXJ3YXJkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyICgjKSBpbiB0aGUgaGFzaCBuYW1lLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgaGFzaFRva2VuDQogICAgICovDQogICAgaGFzaFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgbmFtZSAgICA9IHRoaXMucmVhZE5hbWUoZmlyc3QpOw0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5IQVNILCBuYW1lLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYSBDRE8gb3IgQ0hBUiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUNCiAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgaXMgcHJvdmlkZWQgYW5kIHRoZSByZXN0IGlzIHJlYWQgYnkgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZQ0KICAgICAqIHRoZSBjb3JyZWN0IHRva2VuIHRvIGNyZWF0ZS4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBodG1sQ29tbWVudFN0YXJ0VG9rZW4NCiAgICAgKi8NCiAgICBodG1sQ29tbWVudFN0YXJ0VG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdGV4dCAgICAgICAgPSBmaXJzdDsNCg0KICAgICAgICByZWFkZXIubWFyaygpOw0KICAgICAgICB0ZXh0ICs9IHJlYWRlci5yZWFkQ291bnQoMyk7DQoNCiAgICAgICAgaWYgKHRleHQgPT0gIjwhLS0iKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5DRE8sIHRleHQsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyVG9rZW4oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgQ0RDIG9yIENIQVIgdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlDQogICAgICogZmlyc3QgY2hhcmFjdGVyIGlzIHByb3ZpZGVkIGFuZCB0aGUgcmVzdCBpcyByZWFkIGJ5IHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUNCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2QgaHRtbENvbW1lbnRFbmRUb2tlbg0KICAgICAqLw0KICAgIGh0bWxDb21tZW50RW5kVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdGV4dCAgICAgICAgPSBmaXJzdDsNCg0KICAgICAgICByZWFkZXIubWFyaygpOw0KICAgICAgICB0ZXh0ICs9IHJlYWRlci5yZWFkQ291bnQoMik7DQoNCiAgICAgICAgaWYgKHRleHQgPT0gIi0tPiIpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkNEQywgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZWFkZXIucmVzZXQoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYW4gSURFTlQgb3IgRlVOQ1RJT04gdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlDQogICAgICogZmlyc3QgY2hhcmFjdGVyIGlzIHByb3ZpZGVkIGFuZCB0aGUgcmVzdCBpcyByZWFkIGJ5IHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUNCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGlkZW50aWZpZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBpZGVudE9yRnVuY3Rpb25Ub2tlbg0KICAgICAqLw0KICAgIGlkZW50T3JGdW5jdGlvblRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgaWRlbnQgICA9IHRoaXMucmVhZE5hbWUoZmlyc3QpLA0KICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5JREVOVDsNCg0KICAgICAgICAvL2lmIHRoZXJlJ3MgYSBsZWZ0IHBhcmVuIGltbWVkaWF0ZWx5IGFmdGVyLCBpdCdzIGEgVVJJIG9yIGZ1bmN0aW9uDQogICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICIoIil7DQogICAgICAgICAgICBpZGVudCArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgaWYgKGlkZW50LnRvTG93ZXJDYXNlKCkgPT0gInVybCgiKXsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5VUkk7DQogICAgICAgICAgICAgICAgaWRlbnQgPSB0aGlzLnJlYWRVUkkoaWRlbnQpOw0KDQogICAgICAgICAgICAgICAgLy9kaWRuJ3QgZmluZCBhIHZhbGlkIFVSTCBvciB0aGVyZSdzIG5vIGNsb3NpbmcgcGFyZW4NCiAgICAgICAgICAgICAgICBpZiAoaWRlbnQudG9Mb3dlckNhc2UoKSA9PSAidXJsKCIpew0KICAgICAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5GVU5DVElPTjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkZVTkNUSU9OOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5wZWVrKCkgPT0gIjoiKXsgIC8vbWlnaHQgYmUgYW4gSUUgZnVuY3Rpb24NCg0KICAgICAgICAgICAgLy9JRS1zcGVjaWZpYyBmdW5jdGlvbnMgYWx3YXlzIGJlaW5nIHdpdGggcHJvZ2lkOg0KICAgICAgICAgICAgaWYgKGlkZW50LnRvTG93ZXJDYXNlKCkgPT0gInByb2dpZCIpew0KICAgICAgICAgICAgICAgIGlkZW50ICs9IHJlYWRlci5yZWFkVG8oIigiKTsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5JRV9GVU5DVElPTjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCBpZGVudCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGFuIElNUE9SVEFOVF9TWU0gb3IgQ0hBUiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUNCiAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgaXMgcHJvdmlkZWQgYW5kIHRoZSByZXN0IGlzIHJlYWQgYnkgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZQ0KICAgICAqIHRoZSBjb3JyZWN0IHRva2VuIHRvIGNyZWF0ZS4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBpbXBvcnRhbnRUb2tlbg0KICAgICAqLw0KICAgIGltcG9ydGFudFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgICAgICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIGltcG9ydGFudCAgID0gZmlyc3QsDQogICAgICAgICAgICB0dCAgICAgICAgICA9IFRva2Vucy5DSEFSLA0KICAgICAgICAgICAgdGVtcCwNCiAgICAgICAgICAgIGM7DQoNCiAgICAgICAgcmVhZGVyLm1hcmsoKTsNCiAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7DQoNCiAgICAgICAgd2hpbGUoYyl7DQoNCiAgICAgICAgICAgIC8vdGhlcmUgY2FuIGJlIGEgY29tbWVudCBpbiBoZXJlDQogICAgICAgICAgICBpZiAoYyA9PSAiLyIpew0KDQogICAgICAgICAgICAgICAgLy9pZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXNuJ3QgYSBzdGFyLCB0aGVuIHRoaXMgaXNuJ3QgYSB2YWxpZCAhaW1wb3J0YW50IHRva2VuDQogICAgICAgICAgICAgICAgaWYgKHJlYWRlci5wZWVrKCkgIT0gIioiKXsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRoaXMucmVhZENvbW1lbnQoYyk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID09ICIiKXsgICAgLy9icm9rZW4hDQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKXsNCiAgICAgICAgICAgICAgICBpbXBvcnRhbnQgKz0gYyArIHRoaXMucmVhZFdoaXRlc3BhY2UoKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL2kvaS50ZXN0KGMpKXsNCiAgICAgICAgICAgICAgICB0ZW1wID0gcmVhZGVyLnJlYWRDb3VudCg4KTsNCiAgICAgICAgICAgICAgICBpZiAoL21wb3J0YW50L2kudGVzdCh0ZW1wKSl7DQogICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCArPSBjICsgdGVtcDsNCiAgICAgICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuSU1QT1JUQU5UX1NZTTsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsgIC8vd2UncmUgZG9uZQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodHQgPT0gVG9rZW5zLkNIQVIpew0KICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyVG9rZW4oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIGltcG9ydGFudCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0NCg0KDQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgTk9UIG9yIENIQVIgdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlDQogICAgICogZmlyc3QgY2hhcmFjdGVyIGlzIHByb3ZpZGVkIGFuZCB0aGUgcmVzdCBpcyByZWFkIGJ5IHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUNCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4NCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0Lg0KICAgICAqIEBtZXRob2Qgbm90VG9rZW4NCiAgICAgKi8NCiAgICBub3RUb2tlbjogZnVuY3Rpb24oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpew0KICAgICAgICB2YXIgcmVhZGVyICAgICAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICB0ZXh0ICAgICAgICA9IGZpcnN0Ow0KDQogICAgICAgIHJlYWRlci5tYXJrKCk7DQogICAgICAgIHRleHQgKz0gcmVhZGVyLnJlYWRDb3VudCg0KTsNCg0KICAgICAgICBpZiAodGV4dC50b0xvd2VyQ2FzZSgpID09ICI6bm90KCIpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLk5PVCwgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZWFkZXIucmVzZXQoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUHJvZHVjZXMgYSBudW1iZXIgdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3Rlcg0KICAgICAqIGFuZCBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtLiBUaGlzIG1heSByZXR1cm4gYSB0b2tlbiBvZg0KICAgICAqIE5VTUJFUiwgRU1TLCBFWFMsIExFTkdUSCwgQU5HTEUsIFRJTUUsIEZSRVEsIERJTUVOU0lPTiwNCiAgICAgKiBvciBQRVJDRU5UQUdFLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGZvciB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBudW1iZXJUb2tlbg0KICAgICAqLw0KICAgIG51bWJlclRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdmFsdWUgICA9IHRoaXMucmVhZE51bWJlcihmaXJzdCksDQogICAgICAgICAgICBpZGVudCwNCiAgICAgICAgICAgIHR0ICAgICAgPSBUb2tlbnMuTlVNQkVSLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7DQoNCiAgICAgICAgaWYgKGlzSWRlbnRTdGFydChjKSl7DQogICAgICAgICAgICBpZGVudCA9IHRoaXMucmVhZE5hbWUocmVhZGVyLnJlYWQoKSk7DQogICAgICAgICAgICB2YWx1ZSArPSBpZGVudDsNCg0KICAgICAgICAgICAgaWYgKC9eZW0kfF5leCR8XnB4JHxeZ2QkfF5yZW0kfF52dyR8XnZoJHxedm0kfF5jaCR8XmNtJHxebW0kfF5pbiR8XnB0JHxecGMkL2kudGVzdChpZGVudCkpew0KICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkxFTkdUSDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15kZWd8XnJhZCR8XmdyYWQkL2kudGVzdChpZGVudCkpew0KICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkFOR0xFOw0KICAgICAgICAgICAgfSBlbHNlIGlmICgvXm1zJHxecyQvaS50ZXN0KGlkZW50KSl7DQogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuVElNRTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15oeiR8XmtoeiQvaS50ZXN0KGlkZW50KSl7DQogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuRlJFUTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15kcGkkfF5kcGNtJC9pLnRlc3QoaWRlbnQpKXsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5SRVNPTFVUSU9OOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5ESU1FTlNJT047DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlIGlmIChjID09ICIlIil7DQogICAgICAgICAgICB2YWx1ZSArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgdHQgPSBUb2tlbnMuUEVSQ0VOVEFHRTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgc3RyaW5nIHRva2VuIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFyYWN0ZXINCiAgICAgKiBhbmQgbG9jYXRpb24gaW4gdGhlIHN0cmVhbS4gU2luY2Ugc3RyaW5ncyBtYXkgYmUgaW5kaWNhdGVkDQogICAgICogYnkgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGEgZmFpbHVyZSB0byBtYXRjaCBzdGFydGluZw0KICAgICAqIGFuZCBlbmRpbmcgcXVvdGVzIHJlc3VsdHMgaW4gYW4gSU5WQUxJRCB0b2tlbiBiZWluZyBnZW5lcmF0ZWQuDQogICAgICogVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIGlzIHBhc3NlZCBpbiBhbmQgdGhlbg0KICAgICAqIHRoZSByZXN0IGFyZSByZWFkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGZpbmFsIHF1b3RhdGlvbiBtYXJrLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCBzdHJpbmdUb2tlbg0KICAgICAqLw0KICAgIHN0cmluZ1Rva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciBkZWxpbSAgID0gZmlyc3QsDQogICAgICAgICAgICBzdHJpbmcgID0gZmlyc3QsDQogICAgICAgICAgICByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgcHJldiAgICA9IGZpcnN0LA0KICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5TVFJJTkcsDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnJlYWQoKTsNCg0KICAgICAgICB3aGlsZShjKXsNCiAgICAgICAgICAgIHN0cmluZyArPSBjOw0KDQogICAgICAgICAgICAvL2lmIHRoZSBkZWxpbWl0ZXIgaXMgZm91bmQgd2l0aCBhbiBlc2NhcGVtZW50LCB3ZSdyZSBkb25lLg0KICAgICAgICAgICAgaWYgKGMgPT0gZGVsaW0gJiYgcHJldiAhPSAiXFwiKXsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgbmV3bGluZSB3aXRob3V0IGFuIGVzY2FwZW1lbnQsIGl0J3MgYW4gaW52YWxpZCBzdHJpbmcNCiAgICAgICAgICAgIGlmIChpc05ld0xpbmUocmVhZGVyLnBlZWsoKSkgJiYgYyAhPSAiXFwiKXsNCiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5JTlZBTElEOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL3NhdmUgcHJldmlvdXMgYW5kIGdldCBuZXh0DQogICAgICAgICAgICBwcmV2ID0gYzsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9pZiBjIGlzIG51bGwsIHRoYXQgbWVhbnMgd2UncmUgb3V0IG9mIGlucHV0IGFuZCB0aGUgc3RyaW5nIHdhcyBuZXZlciBjbG9zZWQNCiAgICAgICAgaWYgKGMgPT0gbnVsbCl7DQogICAgICAgICAgICB0dCA9IFRva2Vucy5JTlZBTElEOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIHN0cmluZywgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIHVuaWNvZGVSYW5nZVRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdmFsdWUgICA9IGZpcnN0LA0KICAgICAgICAgICAgdGVtcCwNCiAgICAgICAgICAgIHR0ICAgICAgPSBUb2tlbnMuQ0hBUjsNCg0KICAgICAgICAvL3RoZW4gaXQgc2hvdWxkIGJlIGEgdW5pY29kZSByYW5nZQ0KICAgICAgICBpZiAocmVhZGVyLnBlZWsoKSA9PSAiKyIpew0KICAgICAgICAgICAgcmVhZGVyLm1hcmsoKTsNCiAgICAgICAgICAgIHZhbHVlICs9IHJlYWRlci5yZWFkKCk7DQogICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnJlYWRVbmljb2RlUmFuZ2VQYXJ0KHRydWUpOw0KDQogICAgICAgICAgICAvL2Vuc3VyZSB0aGVyZSdzIGFuIGFjdHVhbCB1bmljb2RlIHJhbmdlIGhlcmUNCiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMil7DQogICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuVU5JQ09ERV9SQU5HRTsNCg0KICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhID8gaW4gdGhlIGZpcnN0IHBhcnQsIHRoZXJlIGNhbid0IGJlIGEgc2Vjb25kIHBhcnQNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPyIpID09IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLnBlZWsoKSA9PSAiLSIpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm1hcmsoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCArPSB0aGlzLnJlYWRVbmljb2RlUmFuZ2VQYXJ0KGZhbHNlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCBhbm90aGVyIHZhbHVlLCBiYWNrIHVwIGFuZCBqdXN0IHRha2UgdGhlIGZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPT0gMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRlbXA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIFByb2R1Y2VzIGEgUyB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBTaW5jZSB3aGl0ZXNwYWNlDQogICAgICogbWF5IGhhdmUgbXVsdGlwbGUgY2hhcmFjdGVycywgdGhpcyBjb25zdW1lcyBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzDQogICAgICogaW50byBhIHNpbmdsZSB0b2tlbi4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuDQogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuDQogICAgICogQG1ldGhvZCB3aGl0ZXNwYWNlVG9rZW4NCiAgICAgKi8NCiAgICB3aGl0ZXNwYWNlVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICB2YWx1ZSAgID0gZmlyc3QgKyB0aGlzLnJlYWRXaGl0ZXNwYWNlKCk7DQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5TLCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7DQogICAgfSwNCg0KDQoNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIE1ldGhvZHMgdG8gcmVhZCB2YWx1ZXMgZnJvbSB0aGUgc3RyaW5nIHN0cmVhbQ0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgcmVhZFVuaWNvZGVSYW5nZVBhcnQ6IGZ1bmN0aW9uKGFsbG93UXVlc3Rpb25NYXJrKXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBwYXJ0ID0gIiIsDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsNCg0KICAgICAgICAvL2ZpcnN0IHJlYWQgaGV4IGRpZ2l0cw0KICAgICAgICB3aGlsZShpc0hleERpZ2l0KGMpICYmIHBhcnQubGVuZ3RoIDwgNil7DQogICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgcGFydCArPSBjOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvL3RoZW4gcmVhZCBxdWVzdGlvbiBtYXJrcyBpZiBhbGxvd2VkDQogICAgICAgIGlmIChhbGxvd1F1ZXN0aW9uTWFyayl7DQogICAgICAgICAgICB3aGlsZShjID09ICI/IiAmJiBwYXJ0Lmxlbmd0aCA8IDYpew0KICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkKCk7DQogICAgICAgICAgICAgICAgcGFydCArPSBjOw0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy90aGVyZSBjYW4ndCBiZSBhbnkgb3RoZXIgY2hhcmFjdGVycyBhZnRlciB0aGlzIHBvaW50DQoNCiAgICAgICAgcmV0dXJuIHBhcnQ7DQogICAgfSwNCg0KICAgIHJlYWRXaGl0ZXNwYWNlOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAiIiwNCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOw0KDQogICAgICAgIHdoaWxlKGlzV2hpdGVzcGFjZShjKSl7DQogICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgd2hpdGVzcGFjZSArPSBjOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gd2hpdGVzcGFjZTsNCiAgICB9LA0KICAgIHJlYWROdW1iZXI6IGZ1bmN0aW9uKGZpcnN0KXsNCiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsDQogICAgICAgICAgICBudW1iZXIgID0gZmlyc3QsDQogICAgICAgICAgICBoYXNEb3QgID0gKGZpcnN0ID09ICIuIiksDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsNCg0KDQogICAgICAgIHdoaWxlKGMpew0KICAgICAgICAgICAgaWYgKGlzRGlnaXQoYykpew0KICAgICAgICAgICAgICAgIG51bWJlciArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICIuIil7DQogICAgICAgICAgICAgICAgaWYgKGhhc0RvdCl7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGhhc0RvdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIG51bWJlciArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG51bWJlcjsNCiAgICB9LA0KICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgZGVsaW0gICA9IHJlYWRlci5yZWFkKCksDQogICAgICAgICAgICBzdHJpbmcgID0gZGVsaW0sDQogICAgICAgICAgICBwcmV2ICAgID0gZGVsaW0sDQogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsNCg0KICAgICAgICB3aGlsZShjKXsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgc3RyaW5nICs9IGM7DQoNCiAgICAgICAgICAgIC8vaWYgdGhlIGRlbGltaXRlciBpcyBmb3VuZCB3aXRoIGFuIGVzY2FwZW1lbnQsIHdlJ3JlIGRvbmUuDQogICAgICAgICAgICBpZiAoYyA9PSBkZWxpbSAmJiBwcmV2ICE9ICJcXCIpew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL2lmIHRoZXJlJ3MgYSBuZXdsaW5lIHdpdGhvdXQgYW4gZXNjYXBlbWVudCwgaXQncyBhbiBpbnZhbGlkIHN0cmluZw0KICAgICAgICAgICAgaWYgKGlzTmV3TGluZShyZWFkZXIucGVlaygpKSAmJiBjICE9ICJcXCIpew0KICAgICAgICAgICAgICAgIHN0cmluZyA9ICIiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL3NhdmUgcHJldmlvdXMgYW5kIGdldCBuZXh0DQogICAgICAgICAgICBwcmV2ID0gYzsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9pZiBjIGlzIG51bGwsIHRoYXQgbWVhbnMgd2UncmUgb3V0IG9mIGlucHV0IGFuZCB0aGUgc3RyaW5nIHdhcyBuZXZlciBjbG9zZWQNCiAgICAgICAgaWYgKGMgPT0gbnVsbCl7DQogICAgICAgICAgICBzdHJpbmcgPSAiIjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBzdHJpbmc7DQogICAgfSwNCiAgICByZWFkVVJJOiBmdW5jdGlvbihmaXJzdCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdXJpICAgICA9IGZpcnN0LA0KICAgICAgICAgICAgaW5uZXIgICA9ICIiLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7DQoNCiAgICAgICAgcmVhZGVyLm1hcmsoKTsNCg0KICAgICAgICAvL3NraXAgd2hpdGVzcGFjZSBiZWZvcmUNCiAgICAgICAgd2hpbGUoYyAmJiBpc1doaXRlc3BhY2UoYykpew0KICAgICAgICAgICAgcmVhZGVyLnJlYWQoKTsNCiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9pdCdzIGEgc3RyaW5nDQogICAgICAgIGlmIChjID09ICInIiB8fCBjID09ICJcIiIpew0KICAgICAgICAgICAgaW5uZXIgPSB0aGlzLnJlYWRTdHJpbmcoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlubmVyID0gdGhpcy5yZWFkVVJMKCk7DQogICAgICAgIH0NCg0KICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsNCg0KICAgICAgICAvL3NraXAgd2hpdGVzcGFjZSBhZnRlcg0KICAgICAgICB3aGlsZShjICYmIGlzV2hpdGVzcGFjZShjKSl7DQogICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvL2lmIHRoZXJlIHdhcyBubyBpbm5lciB2YWx1ZSBvciB0aGUgbmV4dCBjaGFyYWN0ZXIgaXNuJ3QgY2xvc2luZyBwYXJlbiwgaXQncyBub3QgYSBVUkkNCiAgICAgICAgaWYgKGlubmVyID09ICIiIHx8IGMgIT0gIikiKXsNCiAgICAgICAgICAgIHVyaSA9IGZpcnN0Ow0KICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1cmkgKz0gaW5uZXIgKyByZWFkZXIucmVhZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHVyaTsNCiAgICB9LA0KICAgIHJlYWRVUkw6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgdXJsICAgICA9ICIiLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7DQoNCiAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgZXNjYXBlIGFuZCBub25hc2NpaQ0KICAgICAgICB3aGlsZSAoL15bISMkJSZcXCotfl0kLy50ZXN0KGMpKXsNCiAgICAgICAgICAgIHVybCArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gdXJsOw0KDQogICAgfSwNCiAgICByZWFkTmFtZTogZnVuY3Rpb24oZmlyc3Qpew0KICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwNCiAgICAgICAgICAgIGlkZW50ICAgPSBmaXJzdCB8fCAiIiwNCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOw0KDQogICAgICAgIHdoaWxlKHRydWUpew0KICAgICAgICAgICAgaWYgKGMgPT0gIlxcIil7DQogICAgICAgICAgICAgICAgaWRlbnQgKz0gdGhpcy5yZWFkRXNjYXBlKHJlYWRlci5yZWFkKCkpOw0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICAgICAgfSBlbHNlIGlmKGMgJiYgaXNOYW1lQ2hhcihjKSl7DQogICAgICAgICAgICAgICAgaWRlbnQgKz0gcmVhZGVyLnJlYWQoKTsNCiAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gaWRlbnQ7DQogICAgfSwNCiAgICANCiAgICByZWFkRXNjYXBlOiBmdW5jdGlvbihmaXJzdCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgY3NzRXNjYXBlID0gZmlyc3QgfHwgIiIsDQogICAgICAgICAgICBpICAgICAgID0gMCwNCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOyAgICANCiAgICANCiAgICAgICAgaWYgKGlzSGV4RGlnaXQoYykpew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGNzc0VzY2FwZSArPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOw0KICAgICAgICAgICAgfSB3aGlsZShjICYmIGlzSGV4RGlnaXQoYykgJiYgKytpIDwgNik7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChjc3NFc2NhcGUubGVuZ3RoID09IDMgJiYgL1xzLy50ZXN0KGMpIHx8DQogICAgICAgICAgICBjc3NFc2NhcGUubGVuZ3RoID09IDcgfHwgY3NzRXNjYXBlLmxlbmd0aCA9PSAxKXsNCiAgICAgICAgICAgICAgICByZWFkZXIucmVhZCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgYyA9ICIiOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gY3NzRXNjYXBlICsgYzsNCiAgICB9LA0KICAgIA0KICAgIHJlYWRDb21tZW50OiBmdW5jdGlvbihmaXJzdCl7DQogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLA0KICAgICAgICAgICAgY29tbWVudCA9IGZpcnN0IHx8ICIiLA0KICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5yZWFkKCk7DQoNCiAgICAgICAgaWYgKGMgPT0gIioiKXsNCiAgICAgICAgICAgIHdoaWxlKGMpew0KICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gYzsNCg0KICAgICAgICAgICAgICAgIC8vbG9vayBmb3IgZW5kIG9mIGNvbW1lbnQNCiAgICAgICAgICAgICAgICBpZiAoYyA9PSAiKiIgJiYgcmVhZGVyLnBlZWsoKSA9PSAiLyIpew0KICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHJlYWRlci5yZWFkKCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gY29tbWVudDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgfQ0KDQogICAgfQ0KfSk7DQoNCg0KdmFyIFRva2VucyAgPSBbDQoNCiAgICAvKg0KICAgICAqIFRoZSBmb2xsb3dpbmcgdG9rZW4gbmFtZXMgYXJlIGRlZmluZWQgaW4gQ1NTMyBHcmFtbWFyOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jbGV4aWNhbA0KICAgICAqLw0KICAgICANCiAgICAvL0hUTUwtc3R5bGUgY29tbWVudHMNCiAgICB7IG5hbWU6ICJDRE8ifSwNCiAgICB7IG5hbWU6ICJDREMifSwNCg0KICAgIC8vaWdub3JhYmxlcw0KICAgIHsgbmFtZTogIlMiLCB3aGl0ZXNwYWNlOiB0cnVlLyosIGNoYW5uZWw6ICJ3cyIqL30sDQogICAgeyBuYW1lOiAiQ09NTUVOVCIsIGNvbW1lbnQ6IHRydWUsIGhpZGU6IHRydWUsIGNoYW5uZWw6ICJjb21tZW50IiB9LA0KICAgICAgICANCiAgICAvL2F0dHJpYnV0ZSBlcXVhbGl0eQ0KICAgIHsgbmFtZTogIklOQ0xVREVTIiwgdGV4dDogIn49In0sDQogICAgeyBuYW1lOiAiREFTSE1BVENIIiwgdGV4dDogInw9In0sDQogICAgeyBuYW1lOiAiUFJFRklYTUFUQ0giLCB0ZXh0OiAiXj0ifSwNCiAgICB7IG5hbWU6ICJTVUZGSVhNQVRDSCIsIHRleHQ6ICIkPSJ9LA0KICAgIHsgbmFtZTogIlNVQlNUUklOR01BVENIIiwgdGV4dDogIio9In0sDQogICAgICAgIA0KICAgIC8vaWRlbnRpZmllciB0eXBlcw0KICAgIHsgbmFtZTogIlNUUklORyJ9LCAgICAgDQogICAgeyBuYW1lOiAiSURFTlQifSwNCiAgICB7IG5hbWU6ICJIQVNIIn0sDQoNCiAgICAvL2F0LWtleXdvcmRzDQogICAgeyBuYW1lOiAiSU1QT1JUX1NZTSIsIHRleHQ6ICJAaW1wb3J0In0sDQogICAgeyBuYW1lOiAiUEFHRV9TWU0iLCB0ZXh0OiAiQHBhZ2UifSwNCiAgICB7IG5hbWU6ICJNRURJQV9TWU0iLCB0ZXh0OiAiQG1lZGlhIn0sDQogICAgeyBuYW1lOiAiRk9OVF9GQUNFX1NZTSIsIHRleHQ6ICJAZm9udC1mYWNlIn0sDQogICAgeyBuYW1lOiAiQ0hBUlNFVF9TWU0iLCB0ZXh0OiAiQGNoYXJzZXQifSwNCiAgICB7IG5hbWU6ICJOQU1FU1BBQ0VfU1lNIiwgdGV4dDogIkBuYW1lc3BhY2UifSwNCiAgICAvL3sgbmFtZTogIkFUS0VZV09SRCJ9LA0KICAgIA0KICAgIC8vQ1NTMyBhbmltYXRpb25zDQogICAgeyBuYW1lOiAiS0VZRlJBTUVTX1NZTSIsIHRleHQ6IFsgIkBrZXlmcmFtZXMiLCAiQC13ZWJraXQta2V5ZnJhbWVzIiwgIkAtbW96LWtleWZyYW1lcyIgXSB9LA0KDQogICAgLy9pbXBvcnRhbnQgc3ltYm9sDQogICAgeyBuYW1lOiAiSU1QT1JUQU5UX1NZTSJ9LA0KDQogICAgLy9tZWFzdXJlbWVudHMNCiAgICB7IG5hbWU6ICJMRU5HVEgifSwNCiAgICB7IG5hbWU6ICJBTkdMRSJ9LA0KICAgIHsgbmFtZTogIlRJTUUifSwNCiAgICB7IG5hbWU6ICJGUkVRIn0sDQogICAgeyBuYW1lOiAiRElNRU5TSU9OIn0sDQogICAgeyBuYW1lOiAiUEVSQ0VOVEFHRSJ9LA0KICAgIHsgbmFtZTogIk5VTUJFUiJ9LA0KICAgIA0KICAgIC8vZnVuY3Rpb25zDQogICAgeyBuYW1lOiAiVVJJIn0sDQogICAgeyBuYW1lOiAiRlVOQ1RJT04ifSwNCiAgICANCiAgICAvL1VuaWNvZGUgcmFuZ2VzDQogICAgeyBuYW1lOiAiVU5JQ09ERV9SQU5HRSJ9LA0KICAgIA0KICAgIC8qDQogICAgICogVGhlIGZvbGxvd2luZyB0b2tlbiBuYW1lcyBhcmUgZGVmaW5lZCBpbiBDU1MzIFNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3NlbGVjdG9yLXN5bnRheA0KICAgICAqLyAgICANCiAgICANCiAgICAvL2ludmFsaWQgc3RyaW5nDQogICAgeyBuYW1lOiAiSU5WQUxJRCJ9LA0KICAgIA0KICAgIC8vY29tYmluYXRvcnMNCiAgICB7IG5hbWU6ICJQTFVTIiwgdGV4dDogIisiIH0sDQogICAgeyBuYW1lOiAiR1JFQVRFUiIsIHRleHQ6ICI+In0sDQogICAgeyBuYW1lOiAiQ09NTUEiLCB0ZXh0OiAiLCJ9LA0KICAgIHsgbmFtZTogIlRJTERFIiwgdGV4dDogIn4ifSwNCiAgICANCiAgICAvL21vZGlmaWVyDQogICAgeyBuYW1lOiAiTk9UIn0sICAgICAgICANCiAgICANCiAgICAvKg0KICAgICAqIERlZmluZWQgaW4gQ1NTMyBQYWdlZCBNZWRpYQ0KICAgICAqLw0KICAgIHsgbmFtZTogIlRPUExFRlRDT1JORVJfU1lNIiwgdGV4dDogIkB0b3AtbGVmdC1jb3JuZXIifSwNCiAgICB7IG5hbWU6ICJUT1BMRUZUX1NZTSIsIHRleHQ6ICJAdG9wLWxlZnQifSwNCiAgICB7IG5hbWU6ICJUT1BDRU5URVJfU1lNIiwgdGV4dDogIkB0b3AtY2VudGVyIn0sDQogICAgeyBuYW1lOiAiVE9QUklHSFRfU1lNIiwgdGV4dDogIkB0b3AtcmlnaHQifSwNCiAgICB7IG5hbWU6ICJUT1BSSUdIVENPUk5FUl9TWU0iLCB0ZXh0OiAiQHRvcC1yaWdodC1jb3JuZXIifSwNCiAgICB7IG5hbWU6ICJCT1RUT01MRUZUQ09STkVSX1NZTSIsIHRleHQ6ICJAYm90dG9tLWxlZnQtY29ybmVyIn0sDQogICAgeyBuYW1lOiAiQk9UVE9NTEVGVF9TWU0iLCB0ZXh0OiAiQGJvdHRvbS1sZWZ0In0sDQogICAgeyBuYW1lOiAiQk9UVE9NQ0VOVEVSX1NZTSIsIHRleHQ6ICJAYm90dG9tLWNlbnRlciJ9LA0KICAgIHsgbmFtZTogIkJPVFRPTVJJR0hUX1NZTSIsIHRleHQ6ICJAYm90dG9tLXJpZ2h0In0sDQogICAgeyBuYW1lOiAiQk9UVE9NUklHSFRDT1JORVJfU1lNIiwgdGV4dDogIkBib3R0b20tcmlnaHQtY29ybmVyIn0sDQogICAgeyBuYW1lOiAiTEVGVFRPUF9TWU0iLCB0ZXh0OiAiQGxlZnQtdG9wIn0sDQogICAgeyBuYW1lOiAiTEVGVE1JRERMRV9TWU0iLCB0ZXh0OiAiQGxlZnQtbWlkZGxlIn0sDQogICAgeyBuYW1lOiAiTEVGVEJPVFRPTV9TWU0iLCB0ZXh0OiAiQGxlZnQtYm90dG9tIn0sDQogICAgeyBuYW1lOiAiUklHSFRUT1BfU1lNIiwgdGV4dDogIkByaWdodC10b3AifSwNCiAgICB7IG5hbWU6ICJSSUdIVE1JRERMRV9TWU0iLCB0ZXh0OiAiQHJpZ2h0LW1pZGRsZSJ9LA0KICAgIHsgbmFtZTogIlJJR0hUQk9UVE9NX1NZTSIsIHRleHQ6ICJAcmlnaHQtYm90dG9tIn0sDQoNCiAgICAvKg0KICAgICAqIFRoZSBmb2xsb3dpbmcgdG9rZW4gbmFtZXMgYXJlIGRlZmluZWQgaW4gQ1NTMyBNZWRpYSBRdWVyaWVzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLW1lZGlhcXVlcmllcy8jc3ludGF4DQogICAgICovDQogICAgLyp7IG5hbWU6ICJNRURJQV9PTkxZIiwgc3RhdGU6ICJtZWRpYSJ9LA0KICAgIHsgbmFtZTogIk1FRElBX05PVCIsIHN0YXRlOiAibWVkaWEifSwNCiAgICB7IG5hbWU6ICJNRURJQV9BTkQiLCBzdGF0ZTogIm1lZGlhIn0sKi8NCiAgICB7IG5hbWU6ICJSRVNPTFVUSU9OIiwgc3RhdGU6ICJtZWRpYSJ9LA0KDQogICAgLyoNCiAgICAgKiBUaGUgZm9sbG93aW5nIHRva2VuIG5hbWVzIGFyZSBub3QgZGVmaW5lZCBpbiBhbnkgQ1NTIHNwZWNpZmljYXRpb24gYnV0IGFyZSB1c2VkIGJ5IHRoZSBsZXhlci4NCiAgICAgKi8NCiAgICANCiAgICAvL25vdCBhIHJlYWwgdG9rZW4sIGJ1dCB1c2VmdWwgZm9yIHN0dXBpZCBJRSBmaWx0ZXJzDQogICAgeyBuYW1lOiAiSUVfRlVOQ1RJT04iIH0sDQoNCiAgICAvL3BhcnQgb2YgQ1NTMyBncmFtbWFyIGJ1dCBub3QgdGhlIEZsZXggY29kZQ0KICAgIHsgbmFtZTogIkNIQVIiIH0sDQogICAgDQogICAgLy9UT0RPOiBOZWVkZWQ/DQogICAgLy9Ob3QgZGVmaW5lZCBhcyB0b2tlbnMsIGJ1dCBtaWdodCBhcyB3ZWxsIGJlDQogICAgew0KICAgICAgICBuYW1lOiAiUElQRSIsDQogICAgICAgIHRleHQ6ICJ8Ig0KICAgIH0sDQogICAgew0KICAgICAgICBuYW1lOiAiU0xBU0giLA0KICAgICAgICB0ZXh0OiAiLyINCiAgICB9LA0KICAgIHsNCiAgICAgICAgbmFtZTogIk1JTlVTIiwNCiAgICAgICAgdGV4dDogIi0iDQogICAgfSwNCiAgICB7DQogICAgICAgIG5hbWU6ICJTVEFSIiwNCiAgICAgICAgdGV4dDogIioiDQogICAgfSwNCg0KICAgIHsNCiAgICAgICAgbmFtZTogIkxCUkFDRSIsDQogICAgICAgIHRleHQ6ICJ7Ig0KICAgIH0sICAgDQogICAgew0KICAgICAgICBuYW1lOiAiUkJSQUNFIiwNCiAgICAgICAgdGV4dDogIn0iDQogICAgfSwgICAgICANCiAgICB7DQogICAgICAgIG5hbWU6ICJMQlJBQ0tFVCIsDQogICAgICAgIHRleHQ6ICJbIg0KICAgIH0sICAgDQogICAgew0KICAgICAgICBuYW1lOiAiUkJSQUNLRVQiLA0KICAgICAgICB0ZXh0OiAiXSINCiAgICB9LCAgICANCiAgICB7DQogICAgICAgIG5hbWU6ICJFUVVBTFMiLA0KICAgICAgICB0ZXh0OiAiPSINCiAgICB9LA0KICAgIHsNCiAgICAgICAgbmFtZTogIkNPTE9OIiwNCiAgICAgICAgdGV4dDogIjoiDQogICAgfSwgICAgDQogICAgew0KICAgICAgICBuYW1lOiAiU0VNSUNPTE9OIiwNCiAgICAgICAgdGV4dDogIjsiDQogICAgfSwgICAgDQogDQogICAgew0KICAgICAgICBuYW1lOiAiTFBBUkVOIiwNCiAgICAgICAgdGV4dDogIigiDQogICAgfSwgICANCiAgICB7DQogICAgICAgIG5hbWU6ICJSUEFSRU4iLA0KICAgICAgICB0ZXh0OiAiKSINCiAgICB9LCAgICAgDQogICAgew0KICAgICAgICBuYW1lOiAiRE9UIiwNCiAgICAgICAgdGV4dDogIi4iDQogICAgfQ0KXTsNCg0KKGZ1bmN0aW9uKCl7DQoNCiAgICB2YXIgbmFtZU1hcCA9IFtdLA0KICAgICAgICB0eXBlTWFwID0ge307DQogICAgDQogICAgVG9rZW5zLlVOS05PV04gPSAtMTsNCiAgICBUb2tlbnMudW5zaGlmdCh7bmFtZToiRU9GIn0pOw0KICAgIGZvciAodmFyIGk9MCwgbGVuID0gVG9rZW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgbmFtZU1hcC5wdXNoKFRva2Vuc1tpXS5uYW1lKTsNCiAgICAgICAgVG9rZW5zW1Rva2Vuc1tpXS5uYW1lXSA9IGk7DQogICAgICAgIGlmIChUb2tlbnNbaV0udGV4dCl7DQogICAgICAgICAgICBpZiAoVG9rZW5zW2ldLnRleHQgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqIDwgVG9rZW5zW2ldLnRleHQubGVuZ3RoOyBqKyspew0KICAgICAgICAgICAgICAgICAgICB0eXBlTWFwW1Rva2Vuc1tpXS50ZXh0W2pdXSA9IGk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0eXBlTWFwW1Rva2Vuc1tpXS50ZXh0XSA9IGk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgVG9rZW5zLm5hbWUgPSBmdW5jdGlvbih0dCl7DQogICAgICAgIHJldHVybiBuYW1lTWFwW3R0XTsNCiAgICB9Ow0KICAgIA0KICAgIFRva2Vucy50eXBlID0gZnVuY3Rpb24oYyl7DQogICAgICAgIHJldHVybiB0eXBlTWFwW2NdIHx8IC0xOw0KICAgIH07DQoNCn0pKCk7DQoNCg0KDQoNCg0KcGFyc2VybGliLmNzcyA9IHsNCkNvbG9ycyAgICAgICAgICAgICAgOkNvbG9ycywgICAgDQpDb21iaW5hdG9yICAgICAgICAgIDpDb21iaW5hdG9yLCAgICAgICAgICAgICAgICANClBhcnNlciAgICAgICAgICAgICAgOlBhcnNlciwNClByb3BlcnR5TmFtZSAgICAgICAgOlByb3BlcnR5TmFtZSwNClByb3BlcnR5VmFsdWUgICAgICAgOlByb3BlcnR5VmFsdWUsDQpQcm9wZXJ0eVZhbHVlUGFydCAgIDpQcm9wZXJ0eVZhbHVlUGFydCwNCk1lZGlhRmVhdHVyZSAgICAgICAgOk1lZGlhRmVhdHVyZSwNCk1lZGlhUXVlcnkgICAgICAgICAgOk1lZGlhUXVlcnksDQpTZWxlY3RvciAgICAgICAgICAgIDpTZWxlY3RvciwNClNlbGVjdG9yUGFydCAgICAgICAgOlNlbGVjdG9yUGFydCwNClNlbGVjdG9yU3ViUGFydCAgICAgOlNlbGVjdG9yU3ViUGFydCwNClRva2VuU3RyZWFtICAgICAgICAgOlRva2VuU3RyZWFtLA0KVG9rZW5zICAgICAgICAgICAgICA6VG9rZW5zDQp9Ow0KfSkoKTsNCg0KLyoqDQogKiBNYWluIENTU0xpbnQgb2JqZWN0Lg0KICogQGNsYXNzIENTU0xpbnQNCiAqIEBzdGF0aWMNCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLkV2ZW50VGFyZ2V0DQogKi8NCnZhciBDU1NMaW50ID0gKGZ1bmN0aW9uKCl7DQoNCiAgICB2YXIgcnVsZXMgICAgICA9IFtdLA0KICAgICAgICBmb3JtYXR0ZXJzID0gW10sDQogICAgICAgIGFwaSAgICAgICAgPSBuZXcgcGFyc2VybGliLnV0aWwuRXZlbnRUYXJnZXQoKTsNCiAgICAgICAgDQogICAgYXBpLnZlcnNpb24gPSAiQFZFUlNJT05AIjsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIFJ1bGUgTWFuYWdlbWVudA0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLyoqDQogICAgICogQWRkcyBhIG5ldyBydWxlIHRvIHRoZSBlbmdpbmUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdG8gYWRkLg0KICAgICAqIEBtZXRob2QgYWRkUnVsZQ0KICAgICAqLw0KICAgIGFwaS5hZGRSdWxlID0gZnVuY3Rpb24ocnVsZSl7DQogICAgICAgIHJ1bGVzLnB1c2gocnVsZSk7DQogICAgICAgIHJ1bGVzW3J1bGUuaWRdID0gcnVsZTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogQ2xlYXJzIGFsbCBydWxlIGZyb20gdGhlIGVuZ2luZS4NCiAgICAgKiBAbWV0aG9kIGNsZWFyUnVsZXMNCiAgICAgKi8NCiAgICBhcGkuY2xlYXJSdWxlcyA9IGZ1bmN0aW9uKCl7DQogICAgICAgIHJ1bGVzID0gW107DQogICAgfTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIEZvcm1hdHRlcnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIC8qKg0KICAgICAqIEFkZHMgYSBuZXcgZm9ybWF0dGVyIHRvIHRoZSBlbmdpbmUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IGZvcm1hdHRlciBUaGUgZm9ybWF0dGVyIHRvIGFkZC4NCiAgICAgKiBAbWV0aG9kIGFkZEZvcm1hdHRlcg0KICAgICAqLw0KICAgIGFwaS5hZGRGb3JtYXR0ZXIgPSBmdW5jdGlvbihmb3JtYXR0ZXIpIHsNCiAgICAgICAgLy8gZm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7DQogICAgICAgIGZvcm1hdHRlcnNbZm9ybWF0dGVyLmlkXSA9IGZvcm1hdHRlcjsNCiAgICB9Ow0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHJpZXZlcyBhIGZvcm1hdHRlciBmb3IgdXNlLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRJZCBUaGUgbmFtZSBvZiB0aGUgZm9ybWF0IHRvIHJldHJpZXZlLg0KICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZvcm1hdHRlciBvciB1bmRlZmluZWQuDQogICAgICogQG1ldGhvZCBnZXRGb3JtYXR0ZXINCiAgICAgKi8NCiAgICBhcGkuZ2V0Rm9ybWF0dGVyID0gZnVuY3Rpb24oZm9ybWF0SWQpew0KICAgICAgICByZXR1cm4gZm9ybWF0dGVyc1tmb3JtYXRJZF07DQogICAgfTsNCiAgICANCiAgICAvKioNCiAgICAgKiBGb3JtYXRzIHRoZSByZXN1bHRzIGluIGEgcGFydGljdWxhciBmb3JtYXQgZm9yIGEgc2luZ2xlIGZpbGUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCBUaGUgcmVzdWx0cyByZXR1cm5lZCBmcm9tIENTU0xpbnQudmVyaWZ5KCkuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIFRoZSBmaWxlbmFtZSBmb3Igd2hpY2ggdGhlIHJlc3VsdHMgYXBwbHkuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdElkIFRoZSBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIgdG8gdXNlLg0KICAgICAqIEByZXR1cm4ge1N0cmluZ30gQSBmb3JtYXR0ZWQgc3RyaW5nIGZvciB0aGUgcmVzdWx0cy4NCiAgICAgKiBAbWV0aG9kIGZvcm1hdA0KICAgICAqLw0KICAgIGFwaS5mb3JtYXQgPSBmdW5jdGlvbihyZXN1bHRzLCBmaWxlbmFtZSwgZm9ybWF0SWQpIHsNCiAgICAgICAgdmFyIGZvcm1hdHRlciA9IHRoaXMuZ2V0Rm9ybWF0dGVyKGZvcm1hdElkKSwNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7DQogICAgICAgICAgICANCiAgICAgICAgaWYgKGZvcm1hdHRlcil7DQogICAgICAgICAgICByZXN1bHQgPSBmb3JtYXR0ZXIuc3RhcnRGb3JtYXQoKTsNCiAgICAgICAgICAgIHJlc3VsdCArPSBmb3JtYXR0ZXIuZm9ybWF0UmVzdWx0cyhyZXN1bHRzLCBmaWxlbmFtZSk7DQogICAgICAgICAgICByZXN1bHQgKz0gZm9ybWF0dGVyLmVuZEZvcm1hdCgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH0gICAgDQogICAgDQogICAgLyoqDQogICAgICogSW5kaWNhdGVzIGlmIHRoZSBnaXZlbiBmb3JtYXQgaXMgc3VwcG9ydGVkLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRJZCBUaGUgSUQgb2YgdGhlIGZvcm1hdCB0byBjaGVjay4NCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmb3JtYXQgZXhpc3RzLCBmYWxzZSBpZiBub3QuDQogICAgICogQG1ldGhvZCBoYXNGb3JtYXQNCiAgICAgKi8NCiAgICBhcGkuaGFzRm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0SWQpew0KICAgICAgICByZXR1cm4gZm9ybWF0dGVycy5oYXNPd25Qcm9wZXJ0eShmb3JtYXRJZCk7DQogICAgfTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vIFZlcmlmaWNhdGlvbg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLyoqDQogICAgICogU3RhcnRzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBmb3IgdGhlIGdpdmVuIENTUyB0ZXh0Lg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBDU1MgdGV4dCB0byB2ZXJpZnkuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGVzZXQgKE9wdGlvbmFsKSBMaXN0IG9mIHJ1bGVzIHRvIGFwcGx5LiBJZiBudWxsLCB0aGVuDQogICAgICogICAgICBhbGwgcnVsZXMgYXJlIHVzZWQuDQogICAgICogQHJldHVybiB7T2JqZWN0fSBSZXN1bHRzIG9mIHRoZSB2ZXJpZmljYXRpb24uDQogICAgICogQG1ldGhvZCB2ZXJpZnkNCiAgICAgKi8NCiAgICBhcGkudmVyaWZ5ID0gZnVuY3Rpb24odGV4dCwgcnVsZXNldCl7DQoNCiAgICAgICAgdmFyIGkgICAgICAgPSAwLA0KICAgICAgICAgICAgbGVuICAgICA9IHJ1bGVzLmxlbmd0aCwNCiAgICAgICAgICAgIHJlcG9ydGVyLA0KICAgICAgICAgICAgbGluZXMsDQogICAgICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VybGliLmNzcy5QYXJzZXIoeyBzdGFySGFjazogdHJ1ZSwgaWVGaWx0ZXJzOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzY29yZUhhY2s6IHRydWUsIHN0cmljdDogZmFsc2UgfSk7DQoNCiAgICAgICAgbGluZXMgPSB0ZXh0LnNwbGl0KC9cblxyPy9nKTsNCiAgICAgICAgcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXIobGluZXMpOw0KDQogICAgICAgIGlmICghcnVsZXNldCl7DQogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbil7DQogICAgICAgICAgICAgICAgcnVsZXNbaSsrXS5pbml0KHBhcnNlciwgcmVwb3J0ZXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcnVsZXNldC5lcnJvcnMgPSAxOyAgICAgICAvL2Fsd2F5cyByZXBvcnQgcGFyc2luZyBlcnJvcnMNCiAgICAgICAgICAgIGZvciAoaSBpbiBydWxlc2V0KXsNCiAgICAgICAgICAgICAgICBpZihydWxlc2V0Lmhhc093blByb3BlcnR5KGkpKXsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzW2ldKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmluaXQocGFyc2VyLCByZXBvcnRlcik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvL2NhcHR1cmUgbW9zdCBob3JyaWJsZSBlcnJvciB0eXBlDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBwYXJzZXIucGFyc2UodGV4dCk7DQogICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICByZXBvcnRlci5lcnJvcigiRmF0YWwgZXJyb3IsIGNhbm5vdCBjb250aW51ZTogIiArIGV4Lm1lc3NhZ2UsIGV4LmxpbmUsIGV4LmNvbCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbWVzc2FnZXMgICAgOiByZXBvcnRlci5tZXNzYWdlcywNCiAgICAgICAgICAgIHN0YXRzICAgICAgIDogcmVwb3J0ZXIuc3RhdHMNCiAgICAgICAgfTsNCiAgICB9Ow0KDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gUHVibGlzaCB0aGUgQVBJDQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICByZXR1cm4gYXBpOw0KDQp9KSgpOw0KLyoqDQogKiBBbiBpbnN0YW5jZSBvZiBSZXBvcnQgaXMgdXNlZCB0byByZXBvcnQgcmVzdWx0cyBvZiB0aGUNCiAqIHZlcmlmaWNhdGlvbiBiYWNrIHRvIHRoZSBtYWluIEFQSS4NCiAqIEBjbGFzcyBSZXBvcnRlcg0KICogQGNvbnN0cnVjdG9yDQogKiBAcGFyYW0ge1N0cmluZ1tdfSBsaW5lcyBUaGUgdGV4dCBsaW5lcyBvZiB0aGUgc291cmNlLg0KICovDQpmdW5jdGlvbiBSZXBvcnRlcihsaW5lcyl7DQoNCiAgICAvKioNCiAgICAgKiBMaXN0IG9mIG1lc3NhZ2VzIGJlaW5nIHJlcG9ydGVkLg0KICAgICAqIEBwcm9wZXJ0eSBtZXNzYWdlcw0KICAgICAqIEB0eXBlIFN0cmluZ1tdDQogICAgICovDQogICAgdGhpcy5tZXNzYWdlcyA9IFtdOw0KDQogICAgLyoqDQogICAgICogTGlzdCBvZiBzdGF0aXN0aWNzIGJlaW5nIHJlcG9ydGVkLg0KICAgICAqIEBwcm9wZXJ0eSBzdGF0cw0KICAgICAqIEB0eXBlIFN0cmluZ1tdDQogICAgICovDQogICAgdGhpcy5zdGF0cyA9IFtdOw0KDQogICAgLyoqDQogICAgICogTGluZXMgb2YgY29kZSBiZWluZyByZXBvcnRlZCBvbi4gVXNlZCB0byBwcm92aWRlIGNvbnRleHR1YWwgaW5mb3JtYXRpb24NCiAgICAgKiBmb3IgbWVzc2FnZXMuDQogICAgICogQHByb3BlcnR5IGxpbmVzDQogICAgICogQHR5cGUgU3RyaW5nW10NCiAgICAgKi8NCiAgICB0aGlzLmxpbmVzID0gbGluZXM7DQp9DQoNClJlcG9ydGVyLnByb3RvdHlwZSA9IHsNCg0KICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3Rvcg0KICAgIGNvbnN0cnVjdG9yOiBSZXBvcnRlciwNCg0KICAgIC8qKg0KICAgICAqIFJlcG9ydCBhbiBlcnJvci4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4NCiAgICAgKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBudW1iZXIuDQogICAgICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG51bWJlci4NCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0aGlzIG1lc3NhZ2UgcmVsYXRlcyB0by4NCiAgICAgKiBAbWV0aG9kIGVycm9yDQogICAgICovDQogICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIGxpbmUsIGNvbCwgcnVsZSl7DQogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7DQogICAgICAgICAgICB0eXBlICAgIDogImVycm9yIiwNCiAgICAgICAgICAgIGxpbmUgICAgOiBsaW5lLA0KICAgICAgICAgICAgY29sICAgICA6IGNvbCwNCiAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLA0KICAgICAgICAgICAgZXZpZGVuY2U6IHRoaXMubGluZXNbbGluZS0xXSwNCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlDQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZXBvcnQgYW4gd2FybmluZy4NCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4NCiAgICAgKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBudW1iZXIuDQogICAgICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG51bWJlci4NCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0aGlzIG1lc3NhZ2UgcmVsYXRlcyB0by4NCiAgICAgKiBAbWV0aG9kIHdhcm4NCiAgICAgKi8NCiAgICB3YXJuOiBmdW5jdGlvbihtZXNzYWdlLCBsaW5lLCBjb2wsIHJ1bGUpew0KICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goew0KICAgICAgICAgICAgdHlwZSAgICA6ICJ3YXJuaW5nIiwNCiAgICAgICAgICAgIGxpbmUgICAgOiBsaW5lLA0KICAgICAgICAgICAgY29sICAgICA6IGNvbCwNCiAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLA0KICAgICAgICAgICAgZXZpZGVuY2U6IHRoaXMubGluZXNbbGluZS0xXSwNCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlDQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZXBvcnQgc29tZSBpbmZvcm1hdGlvbmFsIHRleHQuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc3RvcmUuDQogICAgICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgbnVtYmVyLg0KICAgICAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBudW1iZXIuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8uDQogICAgICogQG1ldGhvZCBpbmZvDQogICAgICovDQogICAgaW5mbzogZnVuY3Rpb24obWVzc2FnZSwgbGluZSwgY29sLCBydWxlKXsNCiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsNCiAgICAgICAgICAgIHR5cGUgICAgOiAiaW5mbyIsDQogICAgICAgICAgICBsaW5lICAgIDogbGluZSwNCiAgICAgICAgICAgIGNvbCAgICAgOiBjb2wsDQogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwNCiAgICAgICAgICAgIGV2aWRlbmNlOiB0aGlzLmxpbmVzW2xpbmUtMV0sDQogICAgICAgICAgICBydWxlICAgIDogcnVsZQ0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVwb3J0IHNvbWUgcm9sbHVwIGVycm9yIGluZm9ybWF0aW9uLg0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHN0b3JlLg0KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBydWxlIFRoZSBydWxlIHRoaXMgbWVzc2FnZSByZWxhdGVzIHRvLg0KICAgICAqIEBtZXRob2Qgcm9sbHVwRXJyb3INCiAgICAgKi8NCiAgICByb2xsdXBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgcnVsZSl7DQogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7DQogICAgICAgICAgICB0eXBlICAgIDogImVycm9yIiwNCiAgICAgICAgICAgIHJvbGx1cCAgOiB0cnVlLA0KICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsDQogICAgICAgICAgICBydWxlICAgIDogcnVsZQ0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUmVwb3J0IHNvbWUgcm9sbHVwIHdhcm5pbmcgaW5mb3JtYXRpb24uDQogICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc3RvcmUuDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8uDQogICAgICogQG1ldGhvZCByb2xsdXBXYXJuDQogICAgICovDQogICAgcm9sbHVwV2FybjogZnVuY3Rpb24obWVzc2FnZSwgcnVsZSl7DQogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7DQogICAgICAgICAgICB0eXBlICAgIDogIndhcm5pbmciLA0KICAgICAgICAgICAgcm9sbHVwICA6IHRydWUsDQogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwNCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlDQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBSZXBvcnQgYSBzdGF0aXN0aWMuDQogICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0YXQgdG8gc3RvcmUuDQogICAgICogQHBhcmFtIHtWYXJpYW50fSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXQuDQogICAgICogQG1ldGhvZCBzdGF0DQogICAgICovDQogICAgc3RhdDogZnVuY3Rpb24obmFtZSwgdmFsdWUpew0KICAgICAgICB0aGlzLnN0YXRzW25hbWVdID0gdmFsdWU7DQogICAgfQ0KfTsNCi8qDQogKiBVdGlsaXR5IGZ1bmN0aW9ucyB0aGF0IG1ha2UgbGlmZSBlYXNpZXIuDQogKi8NCg0KLyoNCiAqIEFkZHMgYWxsIHByb3BlcnRpZXMgZnJvbSBzdXBwbGllciBvbnRvIHJlY2VpdmVyLA0KICogb3ZlcndyaXRpbmcgaWYgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBvbg0KICogcmVjaWV2ZXIuDQogKiBAcGFyYW0ge09iamVjdH0gVGhlIG9iamVjdCB0byByZWNlaXZlIHRoZSBwcm9wZXJ0aWVzLg0KICogQHBhcmFtIHtPYmplY3R9IFRoZSBvYmplY3QgdG8gcHJvdmlkZSB0aGUgcHJvcGVydGllcy4NCiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlY2VpdmVyDQogKi8NCmZ1bmN0aW9uIG1peChyZWNpZXZlciwgc3VwcGxpZXIpew0KICAgIHZhciBwcm9wOw0KDQogICAgZm9yIChwcm9wIGluIHN1cHBsaWVyKXsNCiAgICAgICAgaWYgKHN1cHBsaWVyLmhhc093blByb3BlcnR5KHByb3ApKXsNCiAgICAgICAgICAgIHJlY2VpdmVyW3Byb3BdID0gc3VwcGxpZXJbcHJvcF07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gcHJvcDsNCn0NCg0KLyoNCiAqIFBvbHlmaWxsIGZvciBhcnJheSBpbmRleE9mKCkgbWV0aG9kLg0KICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBhcnJheSB0byBzZWFyY2guDQogKiBAcGFyYW0ge1ZhcmlhbnR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLg0KICogQHJldHVybiB7aW50fSBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIGlmIGZvdW5kLCAtMSBpZiBub3QuDQogKi8NCmZ1bmN0aW9uIGluZGV4T2YodmFsdWVzLCB2YWx1ZSl7DQogICAgaWYgKHZhbHVlcy5pbmRleE9mKXsNCiAgICAgICAgcmV0dXJuIHZhbHVlcy5pbmRleE9mKHZhbHVlKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj12YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpew0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQp9DQovKg0KICogUnVsZTogRG9uJ3QgdXNlIGFkam9pbmluZyBjbGFzc2VzICguZm9vLmJhcikuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImFkam9pbmluZy1jbGFzc2VzIiwNCiAgICBuYW1lOiAiQWRqb2luaW5nIENsYXNzZXMiLA0KICAgIGRlc2M6ICJEb24ndCB1c2UgYWRqb2luaW5nIGNsYXNzZXMuIiwNCiAgICBicm93c2VyczogIklFNiIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgbW9kaWZpZXIsDQogICAgICAgICAgICAgICAgY2xhc3NDb3VudCwNCiAgICAgICAgICAgICAgICBpLCBqLCBrOw0KDQogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07DQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0NvdW50ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgcGFydC5tb2RpZmllcnMubGVuZ3RoOyBrKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyID0gcGFydC5tb2RpZmllcnNba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImNsYXNzIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ291bnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzQ291bnQgPiAxKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRG9uJ3QgdXNlIGFkam9pbmluZyBjbGFzc2VzLiIsIHBhcnQubGluZSwgcGFydC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBEb24ndCB1c2Ugd2lkdGggb3IgaGVpZ2h0IHdoZW4gdXNpbmcgcGFkZGluZyBvciBib3JkZXIuIA0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJib3gtbW9kZWwiLA0KICAgIG5hbWU6ICJCb3ggTW9kZWwiLA0KICAgIGRlc2M6ICJEb24ndCB1c2Ugd2lkdGggb3IgaGVpZ2h0IHdoZW4gdXNpbmcgcGFkZGluZyBvciBib3JkZXIuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIHdpZHRoUHJvcGVydGllcyA9IHsNCiAgICAgICAgICAgICAgICBib3JkZXI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1sZWZ0IjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IjogMQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGhlaWdodFByb3BlcnRpZXMgPSB7DQogICAgICAgICAgICAgICAgYm9yZGVyOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcCI6IDEsDQogICAgICAgICAgICAgICAgcGFkZGluZzogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXRvcCI6IDENCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBwcm9wZXJ0aWVzOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmIChoZWlnaHRQcm9wZXJ0aWVzW25hbWVdIHx8IHdpZHRoUHJvcGVydGllc1tuYW1lXSl7DQogICAgICAgICAgICAgICAgaWYgKCEvXjBcUyokLy50ZXN0KGV2ZW50LnZhbHVlKSAmJiAhKG5hbWUgPT0gImJvcmRlciIgJiYgZXZlbnQudmFsdWUgPT0gIm5vbmUiKSl7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSB7IGxpbmU6IGV2ZW50LnByb3BlcnR5LmxpbmUsIGNvbDogZXZlbnQucHJvcGVydHkuY29sLCB2YWx1ZTogZXZlbnQudmFsdWUgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJ3aWR0aCIgfHwgbmFtZSA9PSAiaGVpZ2h0Iil7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHJ1bGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgdmFyIHByb3A7DQogICAgICAgICAgICBpZiAocHJvcGVydGllc1siaGVpZ2h0Il0pew0KICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBoZWlnaHRQcm9wZXJ0aWVzKXsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcGVydGllc1twcm9wXSl7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9zcGVjaWFsIGNhc2UgZm9yIHBhZGRpbmcNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09ICJwYWRkaW5nIiAmJiBwcm9wZXJ0aWVzW3Byb3BdLnZhbHVlLnBhcnRzLmxlbmd0aCA9PSAyICYmIHByb3BlcnRpZXNbcHJvcF0udmFsdWUucGFydHNbMF0udmFsdWUgPT0gMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ub29wDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkJyb2tlbiBib3ggbW9kZWw6IHVzaW5nIGhlaWdodCB3aXRoICIgKyBwcm9wICsgIi4iLCBwcm9wZXJ0aWVzW3Byb3BdLmxpbmUsIHByb3BlcnRpZXNbcHJvcF0uY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbIndpZHRoIl0pew0KICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiB3aWR0aFByb3BlcnRpZXMpew0KICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGhQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3BlcnRpZXNbcHJvcF0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAicGFkZGluZyIgJiYgcHJvcGVydGllc1twcm9wXS52YWx1ZS5wYXJ0cy5sZW5ndGggPT0gMiAmJiBwcm9wZXJ0aWVzW3Byb3BdLnZhbHVlLnBhcnRzWzFdLnZhbHVlID09IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9vcA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJCcm9rZW4gYm94IG1vZGVsOiB1c2luZyB3aWR0aCB3aXRoICIgKyBwcm9wICsgIi4iLCBwcm9wZXJ0aWVzW3Byb3BdLmxpbmUsIHByb3BlcnRpZXNbcHJvcF0uY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9KTsNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IEluY2x1ZGUgYWxsIGNvbXBhdGlibGUgdmVuZG9yIHByZWZpeGVzIHRvIHJlYWNoIGEgd2lkZXINCiAqIHJhbmdlIG9mIHVzZXJzLg0KICovDQovKmdsb2JhbCBDU1NMaW50Ki8gDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJjb21wYXRpYmxlLXZlbmRvci1wcmVmaXhlcyIsDQogICAgbmFtZTogIkNvbXBhdGlibGUgVmVuZG9yIFByZWZpeGVzIiwNCiAgICBkZXNjOiAiSW5jbHVkZSBhbGwgY29tcGF0aWJsZSB2ZW5kb3IgcHJlZml4ZXMgdG8gcmVhY2ggYSB3aWRlciByYW5nZSBvZiB1c2Vycy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbiAocGFyc2VyLCByZXBvcnRlcikgew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBjb21wYXRpYmxlUHJlZml4ZXMsDQogICAgICAgICAgICBwcm9wZXJ0aWVzLA0KICAgICAgICAgICAgcHJvcCwNCiAgICAgICAgICAgIHZhcmlhdGlvbnMsDQogICAgICAgICAgICBwcmVmaXhlZCwNCiAgICAgICAgICAgIGksDQogICAgICAgICAgICBsZW4sDQogICAgICAgICAgICBhcnJheVB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwNCiAgICAgICAgICAgIGFwcGx5VG8gPSBbXTsNCg0KICAgICAgICAvLyBTZWUgaHR0cDovL3BldGVyLnNoL2V4cGVyaW1lbnRzL3ZlbmRvci1wcmVmaXhlZC1jc3MtcHJvcGVydHktb3ZlcnZpZXcvIGZvciBkZXRhaWxzDQogICAgICAgIGNvbXBhdGlibGVQcmVmaXhlcyA9IHsNCiAgICAgICAgICAgICJhbmltYXRpb24iICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYW5pbWF0aW9uLWRlbGF5IiAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImFuaW1hdGlvbi1kaXJlY3Rpb24iICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJhbmltYXRpb24tZHVyYXRpb24iICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYW5pbWF0aW9uLWZpbGwtbW9kZSIgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQiICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJhbmltYXRpb24tbmFtZSIgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYW5pbWF0aW9uLXBsYXktc3RhdGUiICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb24iICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJhcHBlYXJhbmNlIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm9yZGVyLWVuZCIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJvcmRlci1lbmQtY29sb3IiICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJib3JkZXItZW5kLXN0eWxlIiAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm9yZGVyLWVuZC13aWR0aCIgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJvcmRlci1pbWFnZSIgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgImJvcmRlci1yYWRpdXMiICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJib3JkZXItc3RhcnQiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm9yZGVyLXN0YXJ0LWNvbG9yIiAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJvcmRlci1zdGFydC1zdHlsZSIgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJib3JkZXItc3RhcnQtd2lkdGgiICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiYm94LWFsaWduIiAgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3ogbXMiLA0KICAgICAgICAgICAgImJveC1kaXJlY3Rpb24iICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwNCiAgICAgICAgICAgICJib3gtZmxleCIgICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsDQogICAgICAgICAgICAiYm94LWxpbmVzIiAgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtcyIsDQogICAgICAgICAgICAiYm94LW9yZGluYWwtZ3JvdXAiICAgICAgICAgIDogIndlYmtpdCBtb3ogbXMiLA0KICAgICAgICAgICAgImJveC1vcmllbnQiICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwNCiAgICAgICAgICAgICJib3gtcGFjayIgICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsDQogICAgICAgICAgICAiYm94LXNpemluZyIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImJveC1zaGFkb3ciICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJjb2x1bW4tY291bnQiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiY29sdW1uLWdhcCIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImNvbHVtbi1ydWxlIiAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJjb2x1bW4tcnVsZS1jb2xvciIgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiY29sdW1uLXJ1bGUtc3R5bGUiICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgImNvbHVtbi1ydWxlLXdpZHRoIiAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJjb2x1bW4td2lkdGgiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAiaHlwaGVucyIgICAgICAgICAgICAgICAgICAgIDogImVwdWIgbW96IiwNCiAgICAgICAgICAgICJsaW5lLWJyZWFrIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1zIiwNCiAgICAgICAgICAgICJtYXJnaW4tZW5kIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAibWFyZ2luLXN0YXJ0IiAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgIm1hcnF1ZWUtc3BlZWQiICAgICAgICAgICAgICA6ICJ3ZWJraXQgd2FwIiwNCiAgICAgICAgICAgICJtYXJxdWVlLXN0eWxlIiAgICAgICAgICAgICAgOiAid2Via2l0IHdhcCIsDQogICAgICAgICAgICAicGFkZGluZy1lbmQiICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLA0KICAgICAgICAgICAgInBhZGRpbmctc3RhcnQiICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJ0YWItc2l6ZSIgICAgICAgICAgICAgICAgICAgOiAibW96IG8iLA0KICAgICAgICAgICAgInRleHQtc2l6ZS1hZGp1c3QiICAgICAgICAgICA6ICJ3ZWJraXQgbXMiLA0KICAgICAgICAgICAgInRyYW5zZm9ybSIgICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIG8iLA0KICAgICAgICAgICAgInRyYW5zZm9ybS1vcmlnaW4iICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24iICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXkiICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tZHVyYXRpb24iICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tcHJvcGVydHkiICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiA6ICJ3ZWJraXQgbW96IG8iLA0KICAgICAgICAgICAgInVzZXItbW9kaWZ5IiAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwNCiAgICAgICAgICAgICJ1c2VyLXNlbGVjdCIgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsDQogICAgICAgICAgICAid29yZC1icmVhayIgICAgICAgICAgICAgICAgIDogImVwdWIgbXMiLA0KICAgICAgICAgICAgIndyaXRpbmctbW9kZSIgICAgICAgICAgICAgICA6ICJlcHViIG1zIg0KICAgICAgICB9Ow0KDQogICAgICAgIGZvciAocHJvcCBpbiBjb21wYXRpYmxlUHJlZml4ZXMpIHsNCiAgICAgICAgICAgIGlmIChjb21wYXRpYmxlUHJlZml4ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICAgICAgICB2YXJpYXRpb25zID0gW107DQogICAgICAgICAgICAgICAgcHJlZml4ZWQgPSBjb21wYXRpYmxlUHJlZml4ZXNbcHJvcF0uc3BsaXQoJyAnKTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcmVmaXhlZC5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb25zLnB1c2goJy0nICsgcHJlZml4ZWRbaV0gKyAnLScgKyBwcm9wKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY29tcGF0aWJsZVByZWZpeGVzW3Byb3BdID0gdmFyaWF0aW9uczsNCiAgICAgICAgICAgICAgICBhcnJheVB1c2guYXBwbHkoYXBwbHlUbywgdmFyaWF0aW9ucyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBwcm9wZXJ0aWVzID0gW107DQogICAgICAgIH0pOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbiAoZXZlbnQpIHsNCiAgICAgICAgICAgIHZhciBuYW1lID0gZXZlbnQucHJvcGVydHkudGV4dDsNCiAgICAgICAgICAgIGlmIChhcHBseVRvLmluZGV4T2YobmFtZSkgPiAtMSkgew0KICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcHJvcGVydHlHcm91cHMgPSB7fSwNCiAgICAgICAgICAgICAgICBpLA0KICAgICAgICAgICAgICAgIGxlbiwNCiAgICAgICAgICAgICAgICBuYW1lLA0KICAgICAgICAgICAgICAgIHByb3AsDQogICAgICAgICAgICAgICAgdmFyaWF0aW9ucywNCiAgICAgICAgICAgICAgICB2YWx1ZSwNCiAgICAgICAgICAgICAgICBmdWxsLA0KICAgICAgICAgICAgICAgIGFjdHVhbCwNCiAgICAgICAgICAgICAgICBpdGVtLA0KICAgICAgICAgICAgICAgIHByb3BlcnRpZXNTcGVjaWZpZWQ7DQoNCiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBuYW1lID0gcHJvcGVydGllc1tpXTsNCg0KICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBjb21wYXRpYmxlUHJlZml4ZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhdGlibGVQcmVmaXhlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9ucyA9IGNvbXBhdGlibGVQcmVmaXhlc1twcm9wXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYXRpb25zLmluZGV4T2YobmFtZSkgPiAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUdyb3Vwc1twcm9wXSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5R3JvdXBzW3Byb3BdID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA6IHZhcmlhdGlvbnMuc2xpY2UoMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgOiBbXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlHcm91cHNbcHJvcF0uYWN0dWFsLmluZGV4T2YobmFtZSkgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5R3JvdXBzW3Byb3BdLmFjdHVhbC5wdXNoKG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChwcm9wIGluIHByb3BlcnR5R3JvdXBzKSB7DQogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5R3JvdXBzLmhhc093blByb3BlcnR5KHByb3ApKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlHcm91cHNbcHJvcF07DQogICAgICAgICAgICAgICAgICAgIGZ1bGwgPSB2YWx1ZS5mdWxsOw0KICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSB2YWx1ZS5hY3R1YWw7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwubGVuZ3RoID4gYWN0dWFsLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gZnVsbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmdWxsW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1NwZWNpZmllZCA9IChhY3R1YWwubGVuZ3RoID09PSAxKSA/IGFjdHVhbFswXSA6IChhY3R1YWwubGVuZ3RoID09IDIpID8gYWN0dWFsLmpvaW4oIiBhbmQgIikgOiBhY3R1YWwuam9pbigiLCAiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiVGhlIHByb3BlcnR5ICIgKyBpdGVtICsgIiBpcyBjb21wYXRpYmxlIHdpdGggIiArIHByb3BlcnRpZXNTcGVjaWZpZWQgKyAiIGFuZCBzaG91bGQgYmUgaW5jbHVkZWQgYXMgd2VsbC4iLCBldmVudC5zZWxlY3RvcnNbMF0ubGluZSwgZXZlbnQuc2VsZWN0b3JzWzBdLmNvbCwgcnVsZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQp9KTsNCi8qDQogKiBSdWxlOiBDZXJ0YWluIHByb3BlcnRpZXMgZG9uJ3QgcGxheSB3ZWxsIHdpdGggY2VydGFpbiBkaXNwbGF5IHZhbHVlcy4gDQogKiAtIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZS1ibG9jaw0KICogLSBoZWlnaHQsIHdpZHRoLCBtYXJnaW4tdG9wLCBtYXJnaW4tYm90dG9tLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBpbmxpbmUNCiAqIC0gdmVydGljYWwtYWxpZ24gc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYmxvY2sNCiAqIC0gbWFyZ2luLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCB0YWJsZS0qDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImRpc3BsYXktcHJvcGVydHktZ3JvdXBpbmciLA0KICAgIG5hbWU6ICJEaXNwbGF5IFByb3BlcnR5IEdyb3VwaW5nIiwNCiAgICBkZXNjOiAiQ2VydGFpbiBwcm9wZXJ0aWVzIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggY2VydGFpbiBkaXNwbGF5IHByb3BlcnR5IHZhbHVlcy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KDQogICAgICAgIHZhciBwcm9wZXJ0aWVzVG9DaGVjayA9IHsNCiAgICAgICAgICAgICAgICBkaXNwbGF5OiAxLA0KICAgICAgICAgICAgICAgICJmbG9hdCI6ICJub25lIiwNCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEsDQogICAgICAgICAgICAgICAgd2lkdGg6IDEsDQogICAgICAgICAgICAgICAgbWFyZ2luOiAxLA0KICAgICAgICAgICAgICAgICJtYXJnaW4tbGVmdCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmdpbi1yaWdodCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmdpbi1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJtYXJnaW4tdG9wIjogMSwNCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXRvcCI6IDEsDQogICAgICAgICAgICAgICAgInZlcnRpY2FsLWFsaWduIjogMQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHByb3BlcnRpZXM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcHJvcGVydGllcyA9IHt9Ow0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzVG9DaGVja1tuYW1lXSl7DQogICAgICAgICAgICAgICAgcHJvcGVydGllc1tuYW1lXSA9IHsgdmFsdWU6IGV2ZW50LnZhbHVlLnRleHQsIGxpbmU6IGV2ZW50LnByb3BlcnR5LmxpbmUsIGNvbDogZXZlbnQucHJvcGVydHkuY29sIH07ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgdmFyIGRpc3BsYXkgPSBwcm9wZXJ0aWVzLmRpc3BsYXkgPyBwcm9wZXJ0aWVzLmRpc3BsYXkudmFsdWUgOiBudWxsOw0KICAgICAgICAgICAgaWYgKGRpc3BsYXkpew0KICAgICAgICAgICAgICAgIHN3aXRjaChkaXNwbGF5KXsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmxpbmUiOg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9oZWlnaHQsIHdpZHRoLCBtYXJnaW4tdG9wLCBtYXJnaW4tYm90dG9tLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBpbmxpbmUNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJoZWlnaHQiLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJ3aWR0aCIsIGRpc3BsYXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbiIsIGRpc3BsYXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi10b3AiLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJtYXJnaW4tYm90dG9tIiwgZGlzcGxheSk7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJmbG9hdCIsIGRpc3BsYXksICJkaXNwbGF5OmlubGluZSBoYXMgbm8gZWZmZWN0IG9uIGZsb2F0ZWQgZWxlbWVudHMgKGJ1dCBtYXkgYmUgdXNlZCB0byBmaXggdGhlIElFNiBkb3VibGUtbWFyZ2luIGJ1ZykuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJibG9jayI6DQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsLWFsaWduIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGJsb2NrDQogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgidmVydGljYWwtYWxpZ24iLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgICAgIGNhc2UgImlubGluZS1ibG9jayI6DQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZS1ibG9jaw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoImZsb2F0IiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJnaW4sIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHRhYmxlDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5pbmRleE9mKCJ0YWJsZS0iKSA9PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgibWFyZ2luIiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1sZWZ0IiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1yaWdodCIsIGRpc3BsYXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJtYXJnaW4tdG9wIiwgZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1ib3R0b20iLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgiZmxvYXQiLCBkaXNwbGF5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgZG8gbm90aGluZw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgfSk7DQoNCg0KICAgICAgICBmdW5jdGlvbiByZXBvcnRQcm9wZXJ0eShuYW1lLCBkaXNwbGF5LCBtc2cpew0KICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbbmFtZV0pew0KICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiBwcm9wZXJ0aWVzVG9DaGVja1tuYW1lXSA9PSAic3RyaW5nIikgfHwgcHJvcGVydGllc1tuYW1lXS52YWx1ZS50b0xvd2VyQ2FzZSgpICE9IHByb3BlcnRpZXNUb0NoZWNrW25hbWVdKXsNCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2Fybihtc2cgfHwgbmFtZSArICIgY2FuJ3QgYmUgdXNlZCB3aXRoIGRpc3BsYXk6ICIgKyBkaXNwbGF5ICsgIi4iLCBwcm9wZXJ0aWVzW25hbWVdLmxpbmUsIHByb3BlcnRpZXNbbmFtZV0uY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IER1cGxpY2F0ZSBwcm9wZXJ0aWVzIG11c3QgYXBwZWFyIG9uZSBhZnRlciB0aGUgb3RoZXIuIElmIGFuIGFscmVhZHktZGVmaW5lZA0KICogcHJvcGVydHkgYXBwZWFycyBzb21ld2hlcmUgZWxzZSBpbiB0aGUgcnVsZSwgdGhlbiBpdCdzIGxpa2VseSBhbiBlcnJvci4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAiZHVwbGljYXRlLXByb3BlcnRpZXMiLA0KICAgIG5hbWU6ICJEdXBsaWNhdGUgUHJvcGVydGllcyIsDQogICAgZGVzYzogIkR1cGxpY2F0ZSBwcm9wZXJ0aWVzIG11c3QgYXBwZWFyIG9uZSBhZnRlciB0aGUgb3RoZXIuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIHByb3BlcnRpZXMsDQogICAgICAgICAgICBsYXN0UHJvcGVydHk7ICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSdWxlKGV2ZW50KXsNCiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7fTsgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIHN0YXJ0UnVsZSk7DQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRmb250ZmFjZSIsIHN0YXJ0UnVsZSk7DQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRwYWdlIiwgc3RhcnRSdWxlKTsNCiAgICAgICAgDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBldmVudC5wcm9wZXJ0eSwNCiAgICAgICAgICAgICAgICBuYW1lID0gcHJvcGVydHkudGV4dC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAocHJvcGVydGllc1tuYW1lXSAmJiAobGFzdFByb3BlcnR5ICE9IG5hbWUgfHwgcHJvcGVydGllc1tuYW1lXSA9PSBldmVudC52YWx1ZS50ZXh0KSl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRHVwbGljYXRlIHByb3BlcnR5ICciICsgZXZlbnQucHJvcGVydHkgKyAiJyBmb3VuZC4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcm9wZXJ0aWVzW25hbWVdID0gZXZlbnQudmFsdWUudGV4dDsNCiAgICAgICAgICAgIGxhc3RQcm9wZXJ0eSA9IG5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgDQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBTdHlsZSBydWxlcyB3aXRob3V0IGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgc2hvdWxkIGJlIHJlbW92ZWQuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImVtcHR5LXJ1bGVzIiwNCiAgICBuYW1lOiAiRW1wdHkgUnVsZXMiLA0KICAgIGRlc2M6ICJSdWxlcyB3aXRob3V0IGFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBzaG91bGQgYmUgcmVtb3ZlZC4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLA0KICAgICAgICAgICAgY291bnQgPSAwOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGNvdW50PTA7DQogICAgICAgIH0pOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgY291bnQrKzsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9yczsNCiAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKXsNCiAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJSdWxlIGlzIGVtcHR5LiIsIHNlbGVjdG9yc1swXS5saW5lLCBzZWxlY3RvcnNbMF0uY29sLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBUaGVyZSBzaG91bGQgYmUgbm8gc3ludGF4IGVycm9ycy4gKER1aC4pDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImVycm9ycyIsDQogICAgbmFtZTogIlBhcnNpbmcgRXJyb3JzIiwNCiAgICBkZXNjOiAiVGhpcyBydWxlIGxvb2tzIGZvciByZWNvdmVyYWJsZSBzeW50YXggZXJyb3JzLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHJlcG9ydGVyLmVycm9yKGV2ZW50Lm1lc3NhZ2UsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7DQogICAgICAgIH0pOw0KDQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBZb3Ugc2hvdWxkbid0IHVzZSBtb3JlIHRoYW4gMTAgZmxvYXRzLiBJZiB5b3UgZG8sIHRoZXJlJ3MgcHJvYmFibHkNCiAqIHJvb20gZm9yIHNvbWUgYWJzdHJhY3Rpb24uDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImZsb2F0cyIsDQogICAgbmFtZTogIkZsb2F0cyIsDQogICAgZGVzYzogIlRoaXMgcnVsZSB0ZXN0cyBpZiB0aGUgZmxvYXQgcHJvcGVydHkgaXMgdXNlZCB0b28gbWFueSB0aW1lcyIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXM7DQogICAgICAgIHZhciBjb3VudCA9IDA7DQoNCiAgICAgICAgLy9jb3VudCBob3cgbWFueSB0aW1lcyAiZmxvYXQiIGlzIHVzZWQNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIGlmIChldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCkgPT0gImZsb2F0IiAmJg0KICAgICAgICAgICAgICAgICAgICBldmVudC52YWx1ZS50ZXh0LnRvTG93ZXJDYXNlKCkgIT0gIm5vbmUiKXsNCiAgICAgICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICAvL3JlcG9ydCB0aGUgcmVzdWx0cw0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgiZmxvYXRzIiwgY291bnQpOw0KICAgICAgICAgICAgaWYgKGNvdW50ID49IDEwKXsNCiAgICAgICAgICAgICAgICByZXBvcnRlci5yb2xsdXBXYXJuKCJUb28gbWFueSBmbG9hdHMgKCIgKyBjb3VudCArICIpLCB5b3UncmUgcHJvYmFibHkgdXNpbmcgdGhlbSBmb3IgbGF5b3V0LiBDb25zaWRlciB1c2luZyBhIGdyaWQgc3lzdGVtIGluc3RlYWQuIiwgcnVsZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogQXZvaWQgdG9vIG1hbnkgQGZvbnQtZmFjZSBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgc3R5bGVzaGVldC4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAiZm9udC1mYWNlcyIsDQogICAgbmFtZTogIkZvbnQgRmFjZXMiLA0KICAgIGRlc2M6ICJUb28gbWFueSBkaWZmZXJlbnQgd2ViIGZvbnRzIGluIHRoZSBzYW1lIHN0eWxlc2hlZXQuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIGNvdW50ID0gMDsNCg0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRmb250ZmFjZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgaWYgKGNvdW50ID4gNSl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIucm9sbHVwV2FybigiVG9vIG1hbnkgQGZvbnQtZmFjZSBkZWNsYXJhdGlvbnMgKCIgKyBjb3VudCArICIpLiIsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IFlvdSBzaG91bGRuJ3QgbmVlZCBtb3JlIHRoYW4gOSBmb250LXNpemUgZGVjbGFyYXRpb25zLg0KICovDQoNCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImZvbnQtc2l6ZXMiLA0KICAgIG5hbWU6ICJGb250IFNpemVzIiwNCiAgICBkZXNjOiAiQ2hlY2tzIHRoZSBudW1iZXIgb2YgZm9udC1zaXplIGRlY2xhcmF0aW9ucy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLA0KICAgICAgICAgICAgY291bnQgPSAwOw0KDQogICAgICAgIC8vY2hlY2sgZm9yIHVzZSBvZiAiZm9udC1zaXplIg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5ID09ICJmb250LXNpemUiKXsNCiAgICAgICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICAvL3JlcG9ydCB0aGUgcmVzdWx0cw0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgiZm9udC1zaXplcyIsIGNvdW50KTsNCiAgICAgICAgICAgIGlmIChjb3VudCA+PSAxMCl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIucm9sbHVwV2FybigiVG9vIG1hbnkgZm9udC1zaXplIGRlY2xhcmF0aW9ucyAoIiArIGNvdW50ICsgIiksIGFic3RyYWN0aW9uIG5lZWRlZC4iLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBXaGVuIHVzaW5nIGEgdmVuZG9yLXByZWZpeGVkIGdyYWRpZW50LCBtYWtlIHN1cmUgdG8gdXNlIHRoZW0gYWxsLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJncmFkaWVudHMiLA0KICAgIG5hbWU6ICJHcmFkaWVudHMiLA0KICAgIGRlc2M6ICJXaGVuIHVzaW5nIGEgdmVuZG9yLXByZWZpeGVkIGdyYWRpZW50LCBtYWtlIHN1cmUgdG8gdXNlIHRoZW0gYWxsLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBncmFkaWVudHM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgZ3JhZGllbnRzID0gew0KICAgICAgICAgICAgICAgIG1vejogMCwNCiAgICAgICAgICAgICAgICB3ZWJraXQ6IDAsDQogICAgICAgICAgICAgICAgbXM6IDAsDQogICAgICAgICAgICAgICAgbzogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsNCg0KICAgICAgICAgICAgaWYgKC9cLShtb3p8bXN8b3x3ZWJraXQpKD86XC0oPzpsaW5lYXJ8cmFkaWFsKSlcLWdyYWRpZW50Ly50ZXN0KGV2ZW50LnZhbHVlKSl7DQogICAgICAgICAgICAgICAgZ3JhZGllbnRzW1JlZ0V4cC4kMV0gPSAxOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0pOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBtaXNzaW5nID0gW107DQoNCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLm1veil7DQogICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKCJGaXJlZm94IDMuNisiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFncmFkaWVudHMud2Via2l0KXsNCiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIldlYmtpdCAoU2FmYXJpLCBDaHJvbWUpIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLm1zKXsNCiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIkludGVybmV0IEV4cGxvcmVyIDEwKyIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIWdyYWRpZW50cy5vKXsNCiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIk9wZXJhIDExLjErIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCAmJiBtaXNzaW5nLmxlbmd0aCA8IDQpeyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIk1pc3NpbmcgdmVuZG9yLXByZWZpeGVkIENTUyBncmFkaWVudHMgZm9yICIgKyBtaXNzaW5nLmpvaW4oIiwgIikgKyAiLiIsIGV2ZW50LnNlbGVjdG9yc1swXS5saW5lLCBldmVudC5zZWxlY3RvcnNbMF0uY29sLCBydWxlKTsgDQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQoNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IERvbid0IHVzZSBJRHMgZm9yIHNlbGVjdG9ycy4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAiaWRzIiwNCiAgICBuYW1lOiAiSURzIiwNCiAgICBkZXNjOiAiU2VsZWN0b3JzIHNob3VsZCBub3QgY29udGFpbiBJRHMuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgbW9kaWZpZXIsDQogICAgICAgICAgICAgICAgaWRDb3VudCwNCiAgICAgICAgICAgICAgICBpLCBqLCBrOw0KDQogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07DQogICAgICAgICAgICAgICAgaWRDb3VudCA9IDA7DQoNCiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IHNlbGVjdG9yLnBhcnRzLmxlbmd0aDsgaisrKXsNCiAgICAgICAgICAgICAgICAgICAgcGFydCA9IHNlbGVjdG9yLnBhcnRzW2pdOw0KICAgICAgICAgICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIHBhcnNlcmxpYi5jc3MuU2VsZWN0b3JQYXJ0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgcGFydC5tb2RpZmllcnMubGVuZ3RoOyBrKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyID0gcGFydC5tb2RpZmllcnNba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImlkIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQ291bnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaWRDb3VudCA9PSAxKXsNCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRG9uJ3QgdXNlIElEcyBpbiBzZWxlY3RvcnMuIiwgc2VsZWN0b3IubGluZSwgc2VsZWN0b3IuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkQ291bnQgPiAxKXsNCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybihpZENvdW50ICsgIiBJRHMgaW4gdGhlIHNlbGVjdG9yLCByZWFsbHk/Iiwgc2VsZWN0b3IubGluZSwgc2VsZWN0b3IuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBEb24ndCB1c2UgQGltcG9ydCwgdXNlIDxsaW5rPiBpbnN0ZWFkLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJpbXBvcnQiLA0KICAgIG5hbWU6ICJAaW1wb3J0IiwNCiAgICBkZXNjOiAiRG9uJ3QgdXNlIEBpbXBvcnQsIHVzZSA8bGluaz4gaW5zdGVhZC4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KICAgICAgICANCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJpbXBvcnQiLCBmdW5jdGlvbihldmVudCl7ICAgICAgICANCiAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkBpbXBvcnQgcHJldmVudHMgcGFyYWxsZWwgZG93bmxvYWRzLCB1c2UgPGxpbms+IGluc3RlYWQuIiwgZXZlbnQubGluZSwgZXZlbnQuY29sLCBydWxlKTsNCiAgICAgICAgfSk7DQoNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IE1ha2Ugc3VyZSAhaW1wb3J0YW50IGlzIG5vdCBvdmVydXNlZCwgdGhpcyBjb3VsZCBsZWFkIHRvIHNwZWNpZmljaXR5DQogKiB3YXIuIERpc3BsYXkgYSB3YXJuaW5nIG9uICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zLCBhbiBlcnJvciBpZiBpdCdzDQogKiB1c2VkIG1vcmUgYXQgbGVhc3QgMTAgdGltZXMuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogImltcG9ydGFudCIsDQogICAgbmFtZTogIkltcG9ydGFudCIsDQogICAgZGVzYzogIkJlIGNhcmVmdWwgd2hlbiB1c2luZyAhaW1wb3J0YW50IGRlY2xhcmF0aW9uIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIGNvdW50ID0gMDsNCg0KICAgICAgICAvL3dhcm4gdGhhdCBpbXBvcnRhbnQgaXMgdXNlZCBhbmQgaW5jcmVtZW50IHRoZSBkZWNsYXJhdGlvbiBjb3VudGVyDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICBpZiAoZXZlbnQuaW1wb3J0YW50ID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlVzZSBvZiAhaW1wb3J0YW50IiwgZXZlbnQubGluZSwgZXZlbnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy9pZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEwLCBzaG93IGFuIGVycm9yDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kc3R5bGVzaGVldCIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXBvcnRlci5zdGF0KCJpbXBvcnRhbnQiLCBjb3VudCk7DQogICAgICAgICAgICBpZiAoY291bnQgPj0gMTApew0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJvbGx1cFdhcm4oIlRvbyBtYW55ICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zICgiICsgY291bnQgKyAiKSwgdHJ5IHRvIHVzZSBsZXNzIHRoYW4gMTAgdG8gYXZvaWQgc3BlY2lmaXR5IGlzc3Vlcy4iLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBQcm9wZXJ0aWVzIHNob3VsZCBiZSBrbm93biAobGlzdGVkIGluIENTUzMgc3BlY2lmaWNhdGlvbikgb3INCiAqIGJlIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5Lg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJrbm93bi1wcm9wZXJ0aWVzIiwNCiAgICBuYW1lOiAiS25vd24gUHJvcGVydGllcyIsDQogICAgZGVzYzogIlByb3BlcnRpZXMgc2hvdWxkIGJlIGtub3duIChsaXN0ZWQgaW4gQ1NTIHNwZWNpZmljYXRpb24pIG9yIGJlIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5LiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBwcm9wZXJ0aWVzID0gew0KDQogICAgICAgICAgICAgICAgImFsaWdubWVudC1hZGp1c3QiOiAxLA0KICAgICAgICAgICAgICAgICJhbGlnbm1lbnQtYmFzZWxpbmUiOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24tZGVsYXkiOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24tZGlyZWN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLWR1cmF0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCI6IDEsDQogICAgICAgICAgICAgICAgImFuaW1hdGlvbi1uYW1lIjogMSwNCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLXBsYXktc3RhdGUiOiAxLA0KICAgICAgICAgICAgICAgICJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZSI6IDEsDQogICAgICAgICAgICAgICAgImF6aW11dGgiOiAxLA0KICAgICAgICAgICAgICAgICJiYWNrZmFjZS12aXNpYmlsaXR5IjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZCI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtYnJlYWsiOiAxLA0KICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNsaXAiOiAxLA0KICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1pbWFnZSI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtb3JpZ2luIjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwNCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1zaXplIjogMSwNCiAgICAgICAgICAgICAgICAiYmFzZWxpbmUtc2hpZnQiOiAxLA0KICAgICAgICAgICAgICAgICJiaW5kaW5nIjogMSwNCiAgICAgICAgICAgICAgICAiYmxlZWQiOiAxLA0KICAgICAgICAgICAgICAgICJib29rbWFyay1sYWJlbCI6IDEsDQogICAgICAgICAgICAgICAgImJvb2ttYXJrLWxldmVsIjogMSwNCiAgICAgICAgICAgICAgICAiYm9va21hcmstc3RhdGUiOiAxLA0KICAgICAgICAgICAgICAgICJib29rbWFyay10YXJnZXQiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXIiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWJvdHRvbS1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbGxhcHNlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlLW91dHNldCI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1pbWFnZS1yZXBlYXQiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2Utc2xpY2UiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2Utc291cmNlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItbGVmdC1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci1sZWZ0LXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQtd2lkdGgiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXNwYWNpbmciOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItdG9wIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcC1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci10b3AtbGVmdC1yYWRpdXMiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyI6IDEsDQogICAgICAgICAgICAgICAgImJvcmRlci10b3Atc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJib3JkZXItdG9wLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm9yZGVyLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiYm90dG9tIjogMSwgDQogICAgICAgICAgICAgICAgImJveC1hbGlnbiI6IDEsDQogICAgICAgICAgICAgICAgImJveC1kZWNvcmF0aW9uLWJyZWFrIjogMSwNCiAgICAgICAgICAgICAgICAiYm94LWRpcmVjdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImJveC1mbGV4IjogMSwNCiAgICAgICAgICAgICAgICAiYm94LWZsZXgtZ3JvdXAiOiAxLA0KICAgICAgICAgICAgICAgICJib3gtbGluZXMiOiAxLA0KICAgICAgICAgICAgICAgICJib3gtb3JkaW5hbC1ncm91cCI6IDEsDQogICAgICAgICAgICAgICAgImJveC1vcmllbnQiOiAxLA0KICAgICAgICAgICAgICAgICJib3gtcGFjayI6IDEsDQogICAgICAgICAgICAgICAgImJveC1zaGFkb3ciOiAxLA0KICAgICAgICAgICAgICAgICJib3gtc2l6aW5nIjogMSwNCiAgICAgICAgICAgICAgICAiYnJlYWstYWZ0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJicmVhay1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJicmVhay1pbnNpZGUiOiAxLA0KICAgICAgICAgICAgICAgICJjYXB0aW9uLXNpZGUiOiAxLA0KICAgICAgICAgICAgICAgICJjbGVhciI6IDEsDQogICAgICAgICAgICAgICAgImNsaXAiOiAxLA0KICAgICAgICAgICAgICAgICJjb2xvciI6IDEsDQogICAgICAgICAgICAgICAgImNvbG9yLXByb2ZpbGUiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tY291bnQiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tZmlsbCI6IDEsDQogICAgICAgICAgICAgICAgImNvbHVtbi1nYXAiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tcnVsZSI6IDEsDQogICAgICAgICAgICAgICAgImNvbHVtbi1ydWxlLWNvbG9yIjogMSwNCiAgICAgICAgICAgICAgICAiY29sdW1uLXJ1bGUtc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJjb2x1bW4tcnVsZS13aWR0aCI6IDEsDQogICAgICAgICAgICAgICAgImNvbHVtbi1zcGFuIjogMSwNCiAgICAgICAgICAgICAgICAiY29sdW1uLXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAiY29sdW1ucyI6IDEsDQogICAgICAgICAgICAgICAgImNvbnRlbnQiOiAxLA0KICAgICAgICAgICAgICAgICJjb3VudGVyLWluY3JlbWVudCI6IDEsDQogICAgICAgICAgICAgICAgImNvdW50ZXItcmVzZXQiOiAxLA0KICAgICAgICAgICAgICAgICJjcm9wIjogMSwNCiAgICAgICAgICAgICAgICAiY3VlIjogMSwNCiAgICAgICAgICAgICAgICAiY3VlLWFmdGVyIjogMSwNCiAgICAgICAgICAgICAgICAiY3VlLWJlZm9yZSI6IDEsDQogICAgICAgICAgICAgICAgImN1cnNvciI6IDEsDQogICAgICAgICAgICAgICAgImRpcmVjdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAxLA0KICAgICAgICAgICAgICAgICJkb21pbmFudC1iYXNlbGluZSI6IDEsDQogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3QiOiAxLA0KICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYWZ0ZXItYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYmVmb3JlLWFkanVzdCI6IDEsDQogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC1iZWZvcmUtYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtc2l6ZSI6IDEsDQogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC12YWx1ZSI6IDEsDQogICAgICAgICAgICAgICAgImVsZXZhdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgImVtcHR5LWNlbGxzIjogMSwNCiAgICAgICAgICAgICAgICAiZml0IjogMSwNCiAgICAgICAgICAgICAgICAiZml0LXBvc2l0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiZmxvYXQiOiAxLCAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiZmxvYXQtb2Zmc2V0IjogMSwNCiAgICAgICAgICAgICAgICAiZm9udCI6IDEsDQogICAgICAgICAgICAgICAgImZvbnQtZmFtaWx5IjogMSwNCiAgICAgICAgICAgICAgICAiZm9udC1zaXplIjogMSwNCiAgICAgICAgICAgICAgICAiZm9udC1zaXplLWFkanVzdCI6IDEsDQogICAgICAgICAgICAgICAgImZvbnQtc3RyZXRjaCI6IDEsDQogICAgICAgICAgICAgICAgImZvbnQtc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJmb250LXZhcmlhbnQiOiAxLA0KICAgICAgICAgICAgICAgICJmb250LXdlaWdodCI6IDEsDQogICAgICAgICAgICAgICAgImdyaWQtY29sdW1ucyI6IDEsDQogICAgICAgICAgICAgICAgImdyaWQtcm93cyI6IDEsDQogICAgICAgICAgICAgICAgImhhbmdpbmctcHVuY3R1YXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJoZWlnaHQiOiAxLA0KICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtYWZ0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtYmVmb3JlIjogMSwNCiAgICAgICAgICAgICAgICAiaHlwaGVuYXRlLWNoYXJhY3RlciI6IDEsDQogICAgICAgICAgICAgICAgImh5cGhlbmF0ZS1saW5lcyI6IDEsDQogICAgICAgICAgICAgICAgImh5cGhlbmF0ZS1yZXNvdXJjZSI6IDEsDQogICAgICAgICAgICAgICAgImh5cGhlbnMiOiAxLA0KICAgICAgICAgICAgICAgICJpY29uIjogMSwNCiAgICAgICAgICAgICAgICAiaW1hZ2Utb3JpZW50YXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJpbWFnZS1yZW5kZXJpbmciOiAxLA0KICAgICAgICAgICAgICAgICJpbWFnZS1yZXNvbHV0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAiaW5saW5lLWJveC1hbGlnbiI6IDEsDQogICAgICAgICAgICAgICAgImxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJsZXR0ZXItc3BhY2luZyI6IDEsDQogICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibGluZS1zdGFja2luZyI6IDEsDQogICAgICAgICAgICAgICAgImxpbmUtc3RhY2tpbmctcnVieSI6IDEsDQogICAgICAgICAgICAgICAgImxpbmUtc3RhY2tpbmctc2hpZnQiOiAxLA0KICAgICAgICAgICAgICAgICJsaW5lLXN0YWNraW5nLXN0cmF0ZWd5IjogMSwNCiAgICAgICAgICAgICAgICAibGlzdC1zdHlsZSI6IDEsDQogICAgICAgICAgICAgICAgImxpc3Qtc3R5bGUtaW1hZ2UiOiAxLA0KICAgICAgICAgICAgICAgICJsaXN0LXN0eWxlLXBvc2l0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAibGlzdC1zdHlsZS10eXBlIjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luIjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luLWJvdHRvbSI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmdpbi1sZWZ0IjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibWFyZ2luLXRvcCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcmsiOiAxLA0KICAgICAgICAgICAgICAgICJtYXJrLWFmdGVyIjogMSwNCiAgICAgICAgICAgICAgICAibWFyay1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJtYXJrcyI6IDEsDQogICAgICAgICAgICAgICAgIm1hcnF1ZWUtZGlyZWN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAibWFycXVlZS1wbGF5LWNvdW50IjogMSwNCiAgICAgICAgICAgICAgICAibWFycXVlZS1zcGVlZCI6IDEsDQogICAgICAgICAgICAgICAgIm1hcnF1ZWUtc3R5bGUiOiAxLA0KICAgICAgICAgICAgICAgICJtYXgtaGVpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibWF4LXdpZHRoIjogMSwNCiAgICAgICAgICAgICAgICAibWluLWhlaWdodCI6IDEsDQogICAgICAgICAgICAgICAgIm1pbi13aWR0aCI6IDEsDQogICAgICAgICAgICAgICAgIm1vdmUtdG8iOiAxLA0KICAgICAgICAgICAgICAgICJuYXYtZG93biI6IDEsDQogICAgICAgICAgICAgICAgIm5hdi1pbmRleCI6IDEsDQogICAgICAgICAgICAgICAgIm5hdi1sZWZ0IjogMSwNCiAgICAgICAgICAgICAgICAibmF2LXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAibmF2LXVwIjogMSwNCiAgICAgICAgICAgICAgICAib3BhY2l0eSI6IDEsDQogICAgICAgICAgICAgICAgIm9ycGhhbnMiOiAxLA0KICAgICAgICAgICAgICAgICJvdXRsaW5lIjogMSwNCiAgICAgICAgICAgICAgICAib3V0bGluZS1jb2xvciI6IDEsDQogICAgICAgICAgICAgICAgIm91dGxpbmUtb2Zmc2V0IjogMSwNCiAgICAgICAgICAgICAgICAib3V0bGluZS1zdHlsZSI6IDEsDQogICAgICAgICAgICAgICAgIm91dGxpbmUtd2lkdGgiOiAxLA0KICAgICAgICAgICAgICAgICJvdmVyZmxvdyI6IDEsDQogICAgICAgICAgICAgICAgIm92ZXJmbG93LXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAib3ZlcmZsb3cteCI6IDEsDQogICAgICAgICAgICAgICAgIm92ZXJmbG93LXkiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nIjogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLA0KICAgICAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAicGFkZGluZy10b3AiOiAxLA0KICAgICAgICAgICAgICAgICJwYWdlIjogMSwNCiAgICAgICAgICAgICAgICAicGFnZS1icmVhay1hZnRlciI6IDEsDQogICAgICAgICAgICAgICAgInBhZ2UtYnJlYWstYmVmb3JlIjogMSwNCiAgICAgICAgICAgICAgICAicGFnZS1icmVhay1pbnNpZGUiOiAxLA0KICAgICAgICAgICAgICAgICJwYWdlLXBvbGljeSI6IDEsDQogICAgICAgICAgICAgICAgInBhdXNlIjogMSwNCiAgICAgICAgICAgICAgICAicGF1c2UtYWZ0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJwYXVzZS1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJwZXJzcGVjdGl2ZSI6IDEsDQogICAgICAgICAgICAgICAgInBlcnNwZWN0aXZlLW9yaWdpbiI6IDEsDQogICAgICAgICAgICAgICAgInBob25lbWVzIjogMSwNCiAgICAgICAgICAgICAgICAicGl0Y2giOiAxLA0KICAgICAgICAgICAgICAgICJwaXRjaC1yYW5nZSI6IDEsDQogICAgICAgICAgICAgICAgInBsYXktZHVyaW5nIjogMSwNCiAgICAgICAgICAgICAgICAicG9zaXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJwcmVzZW50YXRpb24tbGV2ZWwiOiAxLA0KICAgICAgICAgICAgICAgICJwdW5jdHVhdGlvbi10cmltIjogMSwNCiAgICAgICAgICAgICAgICAicXVvdGVzIjogMSwNCiAgICAgICAgICAgICAgICAicmVuZGVyaW5nLWludGVudCI6IDEsDQogICAgICAgICAgICAgICAgInJlc2l6ZSI6IDEsDQogICAgICAgICAgICAgICAgInJlc3QiOiAxLA0KICAgICAgICAgICAgICAgICJyZXN0LWFmdGVyIjogMSwNCiAgICAgICAgICAgICAgICAicmVzdC1iZWZvcmUiOiAxLA0KICAgICAgICAgICAgICAgICJyaWNobmVzcyI6IDEsDQogICAgICAgICAgICAgICAgInJpZ2h0IjogMSwNCiAgICAgICAgICAgICAgICAicm90YXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJyb3RhdGlvbi1wb2ludCI6IDEsDQogICAgICAgICAgICAgICAgInJ1YnktYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJydWJ5LW92ZXJoYW5nIjogMSwNCiAgICAgICAgICAgICAgICAicnVieS1wb3NpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInJ1Ynktc3BhbiI6IDEsDQogICAgICAgICAgICAgICAgInNpemUiOiAxLA0KICAgICAgICAgICAgICAgICJzcGVhayI6IDEsDQogICAgICAgICAgICAgICAgInNwZWFrLWhlYWRlciI6IDEsDQogICAgICAgICAgICAgICAgInNwZWFrLW51bWVyYWwiOiAxLA0KICAgICAgICAgICAgICAgICJzcGVhay1wdW5jdHVhdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInNwZWVjaC1yYXRlIjogMSwNCiAgICAgICAgICAgICAgICAic3RyZXNzIjogMSwNCiAgICAgICAgICAgICAgICAic3RyaW5nLXNldCI6IDEsDQogICAgICAgICAgICAgICAgInRhYmxlLWxheW91dCI6IDEsDQogICAgICAgICAgICAgICAgInRhcmdldCI6IDEsDQogICAgICAgICAgICAgICAgInRhcmdldC1uYW1lIjogMSwNCiAgICAgICAgICAgICAgICAidGFyZ2V0LW5ldyI6IDEsDQogICAgICAgICAgICAgICAgInRhcmdldC1wb3NpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWFsaWduLWxhc3QiOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWRlY29yYXRpb24iOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWVtcGhhc2lzIjogMSwNCiAgICAgICAgICAgICAgICAidGV4dC1oZWlnaHQiOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LWluZGVudCI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtanVzdGlmeSI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtb3V0bGluZSI6IDEsDQogICAgICAgICAgICAgICAgInRleHQtc2hhZG93IjogMSwNCiAgICAgICAgICAgICAgICAidGV4dC10cmFuc2Zvcm0iOiAxLA0KICAgICAgICAgICAgICAgICJ0ZXh0LXdyYXAiOiAxLA0KICAgICAgICAgICAgICAgICJ0b3AiOiAxLA0KICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm0iOiAxLA0KICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm0tb3JpZ2luIjogMSwNCiAgICAgICAgICAgICAgICAidHJhbnNmb3JtLXN0eWxlIjogMSwNCiAgICAgICAgICAgICAgICAidHJhbnNpdGlvbiI6IDEsDQogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXkiOiAxLA0KICAgICAgICAgICAgICAgICJ0cmFuc2l0aW9uLWR1cmF0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAidHJhbnNpdGlvbi1wcm9wZXJ0eSI6IDEsDQogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAidW5pY29kZS1iaWRpIjogMSwNCiAgICAgICAgICAgICAgICAidmVydGljYWwtYWxpZ24iOiAxLA0KICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5IjogMSwNCiAgICAgICAgICAgICAgICAidm9pY2UtYmFsYW5jZSI6IDEsDQogICAgICAgICAgICAgICAgInZvaWNlLWR1cmF0aW9uIjogMSwNCiAgICAgICAgICAgICAgICAidm9pY2UtZmFtaWx5IjogMSwNCiAgICAgICAgICAgICAgICAidm9pY2UtcGl0Y2giOiAxLA0KICAgICAgICAgICAgICAgICJ2b2ljZS1waXRjaC1yYW5nZSI6IDEsDQogICAgICAgICAgICAgICAgInZvaWNlLXJhdGUiOiAxLA0KICAgICAgICAgICAgICAgICJ2b2ljZS1zdHJlc3MiOiAxLA0KICAgICAgICAgICAgICAgICJ2b2ljZS12b2x1bWUiOiAxLA0KICAgICAgICAgICAgICAgICJ2b2x1bWUiOiAxLA0KICAgICAgICAgICAgICAgICJ3aGl0ZS1zcGFjZSI6IDEsDQogICAgICAgICAgICAgICAgIndoaXRlLXNwYWNlLWNvbGxhcHNlIjogMSwNCiAgICAgICAgICAgICAgICAid2lkb3dzIjogMSwNCiAgICAgICAgICAgICAgICAid2lkdGgiOiAxLA0KICAgICAgICAgICAgICAgICJ3b3JkLWJyZWFrIjogMSwNCiAgICAgICAgICAgICAgICAid29yZC1zcGFjaW5nIjogMSwNCiAgICAgICAgICAgICAgICAid29yZC13cmFwIjogMSwNCiAgICAgICAgICAgICAgICAiei1pbmRleCI6IDEsDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy9JRQ0KICAgICAgICAgICAgICAgICJmaWx0ZXIiOiAxLA0KICAgICAgICAgICAgICAgICJ6b29tIjogMQ0KICAgICAgICAgICAgfTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuYW1lXSAmJiBuYW1lLmNoYXJBdCgwKSAhPSAiLSIpew0KICAgICAgICAgICAgICAgIHJlcG9ydGVyLmVycm9yKCJVbmtub3duIHByb3BlcnR5ICciICsgZXZlbnQucHJvcGVydHkgKyAiJy4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogRG9uJ3QgdXNlIGNsYXNzZXMgb3IgSURzIHdpdGggZWxlbWVudHMgKGEuZm9vIG9yIGEjZm9vKS4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAib3ZlcnF1YWxpZmllZC1lbGVtZW50cyIsDQogICAgbmFtZTogIk92ZXJxdWFsaWZpZWQgRWxlbWVudHMiLA0KICAgIGRlc2M6ICJEb24ndCB1c2UgY2xhc3NlcyBvciBJRHMgd2l0aCBlbGVtZW50cyAoYS5mb28gb3IgYSNmb28pLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXMsDQogICAgICAgICAgICBjbGFzc2VzID0ge307DQogICAgICAgICAgICANCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgbW9kaWZpZXIsDQogICAgICAgICAgICAgICAgaSwgaiwgazsNCg0KICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspew0KICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOw0KDQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgayA8IHBhcnQubW9kaWZpZXJzLmxlbmd0aDsgaysrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA9IHBhcnQubW9kaWZpZXJzW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmVsZW1lbnROYW1lICYmIG1vZGlmaWVyLnR5cGUgPT0gImlkIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkVsZW1lbnQgKCIgKyBwYXJ0ICsgIikgaXMgb3ZlcnF1YWxpZmllZCwganVzdCB1c2UgIiArIG1vZGlmaWVyICsgIiB3aXRob3V0IGVsZW1lbnQgbmFtZS4iLCBwYXJ0LmxpbmUsIHBhcnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImNsYXNzIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYXNzZXNbbW9kaWZpZXJdKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXNbbW9kaWZpZXJdID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlc1ttb2RpZmllcl0ucHVzaCh7IG1vZGlmaWVyOiBtb2RpZmllciwgcGFydDogcGFydCB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRzdHlsZXNoZWV0IiwgZnVuY3Rpb24oKXsNCiAgICAgICAgDQogICAgICAgICAgICB2YXIgcHJvcDsNCiAgICAgICAgICAgIGZvciAocHJvcCBpbiBjbGFzc2VzKXsNCiAgICAgICAgICAgICAgICBpZiAoY2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vb25lIHVzZSBtZWFucyB0aGF0IHRoaXMgaXMgb3ZlcnF1YWxpZmllZA0KICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3Nlc1twcm9wXS5sZW5ndGggPT0gMSAmJiBjbGFzc2VzW3Byb3BdWzBdLnBhcnQuZWxlbWVudE5hbWUpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRWxlbWVudCAoIiArIGNsYXNzZXNbcHJvcF1bMF0ucGFydCArICIpIGlzIG92ZXJxdWFsaWZpZWQsIGp1c3QgdXNlICIgKyBjbGFzc2VzW3Byb3BdWzBdLm1vZGlmaWVyICsgIiB3aXRob3V0IGVsZW1lbnQgbmFtZS4iLCBjbGFzc2VzW3Byb3BdWzBdLnBhcnQubGluZSwgY2xhc3Nlc1twcm9wXVswXS5wYXJ0LmNvbCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ICAgICAgICANCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBIZWFkaW5ncyAoaDEtaDYpIHNob3VsZCBub3QgYmUgcXVhbGlmaWVkIChuYW1lc3BhY2VkKS4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAicXVhbGlmaWVkLWhlYWRpbmdzIiwNCiAgICBuYW1lOiAiUXVhbGlmaWVkIEhlYWRpbmdzIiwNCiAgICBkZXNjOiAiSGVhZGluZ3Mgc2hvdWxkIG5vdCBiZSBxdWFsaWZpZWQgKG5hbWVzcGFjZWQpLiIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KDQogICAgLy9pbml0aWFsaXphdGlvbg0KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpew0KICAgICAgICB2YXIgcnVsZSA9IHRoaXM7DQoNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXZlbnQuc2VsZWN0b3JzLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9yLA0KICAgICAgICAgICAgICAgIHBhcnQsDQogICAgICAgICAgICAgICAgaSwgajsNCg0KICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspew0KICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOw0KDQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5lbGVtZW50TmFtZSAmJiAvaFsxLTZdLy50ZXN0KHBhcnQuZWxlbWVudE5hbWUudG9TdHJpbmcoKSkgJiYgaiA+IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkhlYWRpbmcgKCIgKyBwYXJ0LmVsZW1lbnROYW1lICsgIikgc2hvdWxkIG5vdCBiZSBxdWFsaWZpZWQuIiwgcGFydC5saW5lLCBwYXJ0LmNvbCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogU2VsZWN0b3JzIHRoYXQgbG9vayBsaWtlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHNsb3cgYW5kIHNob3VsZCBiZSBhdm9pZGVkLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJyZWdleC1zZWxlY3RvcnMiLA0KICAgIG5hbWU6ICJSZWdleCBTZWxlY3RvcnMiLA0KICAgIGRlc2M6ICJTZWxlY3RvcnMgdGhhdCBsb29rIGxpa2UgcmVndWxhciBleHByZXNzaW9ucyBhcmUgc2xvdyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBldmVudC5zZWxlY3RvcnMsDQogICAgICAgICAgICAgICAgc2VsZWN0b3IsDQogICAgICAgICAgICAgICAgcGFydCwNCiAgICAgICAgICAgICAgICBtb2RpZmllciwNCiAgICAgICAgICAgICAgICBpLCBqLCBrOw0KDQogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7DQogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07DQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBzZWxlY3Rvci5wYXJ0cy5sZW5ndGg7IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgayA8IHBhcnQubW9kaWZpZXJzLmxlbmd0aDsgaysrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA9IHBhcnQubW9kaWZpZXJzW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllci50eXBlID09ICJhdHRyaWJ1dGUiKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC8oW1x+XHxcXlwkXCpdPSkvLnRlc3QobW9kaWZpZXIpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkF0dHJpYnV0ZSBzZWxlY3RvcnMgd2l0aCAiICsgUmVnRXhwLiQxICsgIiBhcmUgc2xvdyEiLCBtb2RpZmllci5saW5lLCBtb2RpZmllci5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogVG90YWwgbnVtYmVyIG9mIHJ1bGVzIHNob3VsZCBub3QgZXhjZWVkIHguDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInJ1bGVzLWNvdW50IiwNCiAgICBuYW1lOiAiUnVsZXMgQ291bnQiLA0KICAgIGRlc2M6ICJUcmFjayBob3cgbWFueSBydWxlcyB0aGVyZSBhcmUuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIGNvdW50ID0gMDsNCg0KICAgICAgICAvL2NvdW50IGVhY2ggcnVsZQ0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBjb3VudCsrOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgicnVsZS1jb3VudCIsIGNvdW50KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsNCi8qDQogKiBSdWxlOiBEb24ndCB1c2UgdGV4dC1pbmRlbnQgZm9yIGltYWdlIHJlcGxhY2VtZW50IGlmIHlvdSBuZWVkIHRvIHN1cHBvcnQgcnRsLiANCiAqIA0KICovDQovKg0KICogU2hvdWxkIHdlIGJlIGNoZWNraW5nIGZvciBydGwvbHRyPw0KICovDQovL0NvbW1lbnRlZCBvdXQgZHVlIHRvIGxhY2sgb2YgdGVzdHMNCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInRleHQtaW5kZW50IiwNCiAgICBuYW1lOiAiVGV4dCBJbmRlbnQiLA0KICAgIGRlc2M6ICJDaGVja3MgZm9yIHRleHQgaW5kZW50IGxlc3MgdGhhbiAtOTlweCIsDQogICAgYnJvd3NlcnM6ICJBbGwiLA0KICAgIA0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KICAgIA0KICAgICAgICAvL2NoZWNrIGZvciB1c2Ugb2YgImZvbnQtc2l6ZSINCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBuYW1lID0gZXZlbnQucHJvcGVydHksDQogICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC52YWx1ZS5wYXJ0c1swXS52YWx1ZTsNCg0KICAgICAgICAgICAgaWYgKG5hbWUgPT0gInRleHQtaW5kZW50IiAmJiB2YWx1ZSA8IC05OSl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiTmVnYXRpdmUgdGV4dC1pbmRlbnQgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBSVEwuIElmIHlvdSB1c2UgdGV4dC1pbmRlbnQgZm9yIGltYWdlIHJlcGxhY2VtZW50IGV4cGxpY2l0bHkgc2V0IHRleHQtZGlyZWN0aW9uIGZvciB0aGF0IGl0ZW0gdG8gbHRyLiIsIG5hbWUubGluZSwgbmFtZS5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCn0pOw0KLyoNCiAqIFJ1bGU6IEhlYWRpbmdzIChoMS1oNikgc2hvdWxkIGJlIGRlZmluZWQgb25seSBvbmNlLg0KICovDQpDU1NMaW50LmFkZFJ1bGUoew0KDQogICAgLy9ydWxlIGluZm9ybWF0aW9uDQogICAgaWQ6ICJ1bmlxdWUtaGVhZGluZ3MiLA0KICAgIG5hbWU6ICJVbmlxdWUgSGVhZGluZ3MiLA0KICAgIGRlc2M6ICJIZWFkaW5ncyBzaG91bGQgYmUgZGVmaW5lZCBvbmx5IG9uY2UuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpczsNCg0KICAgICAgICB2YXIgaGVhZGluZ3MgPSAgew0KICAgICAgICAgICAgICAgIGgxOiAwLA0KICAgICAgICAgICAgICAgIGgyOiAwLA0KICAgICAgICAgICAgICAgIGgzOiAwLA0KICAgICAgICAgICAgICAgIGg0OiAwLA0KICAgICAgICAgICAgICAgIGg1OiAwLA0KICAgICAgICAgICAgICAgIGg2OiAwDQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywNCiAgICAgICAgICAgICAgICBzZWxlY3RvciwNCiAgICAgICAgICAgICAgICBwYXJ0LA0KICAgICAgICAgICAgICAgIGk7DQoNCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKXsNCiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsNCiAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbc2VsZWN0b3IucGFydHMubGVuZ3RoLTFdOw0KDQogICAgICAgICAgICAgICAgaWYgKHBhcnQuZWxlbWVudE5hbWUgJiYgLyhoWzEtNl0pLy50ZXN0KHBhcnQuZWxlbWVudE5hbWUudG9TdHJpbmcoKSkpew0KICAgICAgICAgICAgICAgICAgICBoZWFkaW5nc1tSZWdFeHAuJDFdKys7DQogICAgICAgICAgICAgICAgICAgIGlmIChoZWFkaW5nc1tSZWdFeHAuJDFdID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiSGVhZGluZyAoIiArIHBhcnQuZWxlbWVudE5hbWUgKyAiKSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIiwgcGFydC5saW5lLCBwYXJ0LmNvbCwgcnVsZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogRG9uJ3QgdXNlIHVuaXZlcnNhbCBzZWxlY3RvciBiZWNhdXNlIGl0J3Mgc2xvdy4NCiAqLw0KQ1NTTGludC5hZGRSdWxlKHsNCg0KICAgIC8vcnVsZSBpbmZvcm1hdGlvbg0KICAgIGlkOiAidW5pdmVyc2FsLXNlbGVjdG9yIiwNCiAgICBuYW1lOiAiVW5pdmVyc2FsIFNlbGVjdG9yIiwNCiAgICBkZXNjOiAiVGhlIHVuaXZlcnNhbCBzZWxlY3RvciAoKikgaXMga25vd24gdG8gYmUgc2xvdy4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywNCiAgICAgICAgICAgICAgICBzZWxlY3RvciwNCiAgICAgICAgICAgICAgICBwYXJ0LA0KICAgICAgICAgICAgICAgIG1vZGlmaWVyLA0KICAgICAgICAgICAgICAgIGksIGosIGs7DQoNCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKXsNCiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbc2VsZWN0b3IucGFydHMubGVuZ3RoLTFdOw0KICAgICAgICAgICAgICAgIGlmIChwYXJ0LmVsZW1lbnROYW1lID09ICIqIil7DQogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4ocnVsZS5kZXNjLCBwYXJ0LmxpbmUsIHBhcnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogV2hlbiB1c2luZyBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSwgbWFrZSBzdXJlIHRvDQogKiBpbmNsdWRlIHRoZSBzdGFuZGFyZCBvbmUuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInZlbmRvci1wcmVmaXgiLA0KICAgIG5hbWU6ICJWZW5kb3IgUHJlZml4IiwNCiAgICBkZXNjOiAiV2hlbiB1c2luZyBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSwgbWFrZSBzdXJlIHRvIGluY2x1ZGUgdGhlIHN0YW5kYXJkIG9uZS4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLA0KICAgICAgICAgICAgcHJvcGVydGllcywNCiAgICAgICAgICAgIG51bSwNCiAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gew0KICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMiOiAiYm9yZGVyLXJhZGl1cyIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtYm9yZGVyLXJhZGl1cyI6ICJib3JkZXItcmFkaXVzIiwNCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzIjogImJvcmRlci10b3AtbGVmdC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzIjogImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwNCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIjogImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIjogImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwNCiAgICAgICAgICAgICAgICAiLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQiOiAiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsDQogICAgICAgICAgICAgICAgIi1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodCI6ICJib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyIsDQogICAgICAgICAgICAgICAgIi1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0IjogImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQiOiAiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLA0KICAgICAgICAgICAgICAgICItbW96LWJveC1zaGFkb3ciOiAiYm94LXNoYWRvdyIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtYm94LXNoYWRvdyI6ICJib3gtc2hhZG93IiwNCiAgICAgICAgICAgICAgICAiLW1vei10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtdHJhbnNmb3JtIiA6ICJ0cmFuc2Zvcm0iLA0KICAgICAgICAgICAgICAgICItby10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsDQogICAgICAgICAgICAgICAgIi1tcy10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsDQogICAgICAgICAgICAgICAgIi1tb3otYm94LXNpemluZyIgOiAiYm94LXNpemluZyIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtYm94LXNpemluZyIgOiAiYm94LXNpemluZyIsDQogICAgICAgICAgICAgICAgIi1tb3otdXNlci1zZWxlY3QiIDogInVzZXItc2VsZWN0IiwNCiAgICAgICAgICAgICAgICAiLWtodG1sLXVzZXItc2VsZWN0IiA6ICJ1c2VyLXNlbGVjdCIsDQogICAgICAgICAgICAgICAgIi13ZWJraXQtdXNlci1zZWxlY3QiIDogInVzZXItc2VsZWN0IiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgLy9ldmVudCBoYW5kbGVyIGZvciBiZWdpbm5pbmcgb2YgcnVsZXMNCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSdWxlKCl7DQogICAgICAgICAgICBwcm9wZXJ0aWVzID0ge307DQogICAgICAgICAgICBudW09MTsgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvL2V2ZW50IGhhbmRsZXIgZm9yIGVuZCBvZiBydWxlcw0KICAgICAgICBmdW5jdGlvbiBlbmRSdWxlKGV2ZW50KXsNCiAgICAgICAgICAgIHZhciBwcm9wLA0KICAgICAgICAgICAgICAgIGksIGxlbiwNCiAgICAgICAgICAgICAgICBzdGFuZGFyZCwNCiAgICAgICAgICAgICAgICBuZWVkZWQsDQogICAgICAgICAgICAgICAgYWN0dWFsLA0KICAgICAgICAgICAgICAgIG5lZWRzU3RhbmRhcmQgPSBbXTsNCg0KICAgICAgICAgICAgZm9yIChwcm9wIGluIHByb3BlcnRpZXMpew0KICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzVG9DaGVja1twcm9wXSl7DQogICAgICAgICAgICAgICAgICAgIG5lZWRzU3RhbmRhcmQucHVzaCh7IGFjdHVhbDogcHJvcCwgbmVlZGVkOiBwcm9wZXJ0aWVzVG9DaGVja1twcm9wXX0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChpPTAsIGxlbj1uZWVkc1N0YW5kYXJkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBuZWVkZWQgPSBuZWVkc1N0YW5kYXJkW2ldLm5lZWRlZDsNCiAgICAgICAgICAgICAgICBhY3R1YWwgPSBuZWVkc1N0YW5kYXJkW2ldLmFjdHVhbDsNCg0KICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuZWVkZWRdKXsgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiTWlzc2luZyBzdGFuZGFyZCBwcm9wZXJ0eSAnIiArIG5lZWRlZCArICInIHRvIGdvIGFsb25nIHdpdGggJyIgKyBhY3R1YWwgKyAiJy4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHN0YW5kYXJkIHByb3BlcnR5IGlzIGxhc3QNCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbbmVlZGVkXVswXS5wb3MgPCBwcm9wZXJ0aWVzW2FjdHVhbF1bMF0ucG9zKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlN0YW5kYXJkIHByb3BlcnR5ICciICsgbmVlZGVkICsgIicgc2hvdWxkIGNvbWUgYWZ0ZXIgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5ICciICsgYWN0dWFsICsgIicuIiwgZXZlbnQubGluZSwgZXZlbnQuY29sLCBydWxlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9ICAgICAgICANCiAgICAgICAgDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgc3RhcnRSdWxlKTsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydGZvbnRmYWNlIiwgc3RhcnRSdWxlKTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuYW1lXSl7DQogICAgICAgICAgICAgICAgcHJvcGVydGllc1tuYW1lXSA9IFtdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBwcm9wZXJ0aWVzW25hbWVdLnB1c2goeyBuYW1lOiBldmVudC5wcm9wZXJ0eSwgdmFsdWUgOiBldmVudC52YWx1ZSwgcG9zOm51bSsrIH0pOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHJ1bGUiLCBlbmRSdWxlKTsNCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRmb250ZmFjZSIsIGVuZFJ1bGUpOw0KICAgIH0NCg0KfSk7DQovKg0KICogUnVsZTogSWYgYW4gZWxlbWVudCBoYXMgYSB3aWR0aCBvZiAxMDAlLCBiZSBjYXJlZnVsIHdoZW4gcGxhY2luZyB3aXRoaW4NCiAqIGFuIGVsZW1lbnQgdGhhdCBoYXMgcGFkZGluZy4gSXQgbWF5IGxvb2sgc3RyYW5nZS4NCiAqLw0KLy9Db21tZW50ZWQgb3V0IHBlbmRpbmcgZnVydGhlciByZXZpZXcuDQovKkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogIndpZHRoLTEwMCIsDQogICAgbmFtZTogIldpZHRoIDEwMCUiLA0KICAgIGRlc2M6ICJCZSBjYXJlZnVsIHdoZW4gdXNpbmcgd2lkdGg6IDEwMCUgb24gZWxlbWVudHMuIiwNCiAgICBicm93c2VyczogIkFsbCIsDQoNCiAgICAvL2luaXRpYWxpemF0aW9uDQogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7DQogICAgICAgIHZhciBydWxlID0gdGhpcywNCiAgICAgICAgICAgIHdpZHRoMTAwLA0KICAgICAgICAgICAgYm94c2l6aW5nOw0KDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHdpZHRoMTAwID0gbnVsbDsNCiAgICAgICAgICAgIGJveHNpemluZyA9IGZhbHNlOw0KICAgICAgICB9KTsNCg0KICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCksDQogICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC52YWx1ZTsNCg0KICAgICAgICAgICAgaWYgKG5hbWUgPT0gIndpZHRoIiAmJiB2YWx1ZSA9PSAiMTAwJSIpew0KICAgICAgICAgICAgICAgIHdpZHRoMTAwID0gZXZlbnQucHJvcGVydHk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImJveC1zaXppbmciIHx8IC9cLSg/OndlYmtpdHxtc3xtb3opXC1ib3gtc2l6aW5nLy50ZXN0KG5hbWUpKXsgIC8vbWVhbnMgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcNCiAgICAgICAgICAgICAgICBib3hzaXppbmcgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBpZiAod2lkdGgxMDAgJiYgIWJveHNpemluZyl7DQogICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRWxlbWVudHMgd2l0aCBhIHdpZHRoIG9mIDEwMCUgbWF5IG5vdCBhcHBlYXIgYXMgeW91IGV4cGVjdCBpbnNpZGUgb2Ygb3RoZXIgZWxlbWVudHMuIiwgd2lkdGgxMDAubGluZSwgd2lkdGgxMDAuY29sLCBydWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQp9KTsqLw0KLyoNCiAqIFJ1bGU6IFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgdW5pdHMgd2hlbiBhIHZhbHVlIGlzIDAuDQogKi8NCkNTU0xpbnQuYWRkUnVsZSh7DQoNCiAgICAvL3J1bGUgaW5mb3JtYXRpb24NCiAgICBpZDogInplcm8tdW5pdHMiLA0KICAgIG5hbWU6ICJaZXJvIFVuaXRzIiwNCiAgICBkZXNjOiAiWW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB1bml0cyB3aGVuIGEgdmFsdWUgaXMgMC4iLA0KICAgIGJyb3dzZXJzOiAiQWxsIiwNCg0KICAgIC8vaW5pdGlhbGl6YXRpb24NCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsNCiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOw0KDQogICAgICAgIC8vY291bnQgaG93IG1hbnkgdGltZXMgImZsb2F0IiBpcyB1c2VkDQogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgcGFydHMgPSBldmVudC52YWx1ZS5wYXJ0cywNCiAgICAgICAgICAgICAgICBpID0gMCwgDQogICAgICAgICAgICAgICAgbGVuID0gcGFydHMubGVuZ3RoOw0KDQogICAgICAgICAgICB3aGlsZShpIDwgbGVuKXsNCiAgICAgICAgICAgICAgICBpZiAoKHBhcnRzW2ldLnVuaXRzIHx8IHBhcnRzW2ldLnR5cGUgPT0gInBlcmNlbnRhZ2UiKSAmJiBwYXJ0c1tpXS52YWx1ZSA9PT0gMCl7DQogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlZhbHVlcyBvZiAwIHNob3VsZG4ndCBoYXZlIHVuaXRzIHNwZWNpZmllZC4iLCBwYXJ0c1tpXS5saW5lLCBwYXJ0c1tpXS5jb2wsIHJ1bGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQoNCiAgICB9DQoNCn0pOw0KDQpleHBvcnRzLkNTU0xpbnQgPSBDU1NMaW50Ow0KfSk7DQo=]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKCB0eXBlb2Yoc3RyKSA9PSAnc3RyaW5nJyAmJiBtYXRjaCkgew0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yDQogICAgICAgICAgICAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgew0KICAgICAgICAgICAgICAgIHIyID0gUmVnRXhwKHRoaXMuc291cmNlLCByZWFsLnJlcGxhY2UuY2FsbChnZXROYXRpdmVGbGFncyh0aGlzKSwgImciLCAiIikpOw0KICAgICAgICAgICAgICAgIC8vIFVzaW5nIGBzdHIuc2xpY2UobWF0Y2guaW5kZXgpYCByYXRoZXIgdGhhbiBgbWF0Y2hbMF1gIGluIGNhc2UgbG9va2FoZWFkIGFsbG93ZWQNCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaA0KICAgICAgICAgICAgICAgIHJlYWwucmVwbGFjZS5jYWxsKHN0ci5zbGljZShtYXRjaC5pbmRleCksIHIyLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW2ldID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBBdHRhY2ggbmFtZWQgY2FwdHVyZSBwcm9wZXJ0aWVzDQogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWF0Y2gubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2kgLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW25hbWVdID0gbWF0Y2hbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHRoYXQgaW5jcmVtZW50IGBsYXN0SW5kZXhgIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50ICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgIH07DQoNCiAgICAvLyBEb24ndCBvdmVycmlkZSBgdGVzdGAgaWYgaXQgd29uJ3QgY2hhbmdlIGFueXRoaW5nDQogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsNCiAgICAgICAgLy8gRml4IGJyb3dzZXIgYnVnIGluIG5hdGl2ZSBtZXRob2QNCiAgICAgICAgUmVnRXhwLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHN0cikgew0KICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuDQogICAgICAgICAgICAvLyBgZXhlY2Agd291bGQgdGFrZSBjYXJlIG9mIHRoZSBgbGFzdEluZGV4YCBmaXgNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlYWwuZXhlYy5jYWxsKHRoaXMsIHN0cik7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgZnVuY3Rpb24gZ2V0TmF0aXZlRmxhZ3MgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguaWdub3JlQ2FzZSA/ICJpIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXgubXVsdGlsaW5lICA/ICJtIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMw0KICAgICAgICAgICAgICAgKHJlZ2V4LnN0aWNreSAgICAgPyAieSIgOiAiIik7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGluZGV4T2YgKGFycmF5LCBpdGVtLCBmcm9tKSB7DQogICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgLy8gVXNlIHRoZSBuYXRpdmUgYXJyYXkgbWV0aG9kIGlmIGF2YWlsYWJsZQ0KICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7DQogICAgICAgIGZvciAodmFyIGkgPSBmcm9tIHx8IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KDQp9KTsNCi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQogDQpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2Uvd29ya2VyL21pcnJvcicsICdhY2Uvd29ya2VyL2pzaGludCcsICdhY2UvbmFyY2lzc3VzL2pzcGFyc2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQogICAgDQp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOw0KdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7DQp2YXIgbGludCA9IHJlcXVpcmUoIi4uL3dvcmtlci9qc2hpbnQiKS5KU0hJTlQ7DQogICAgDQp2YXIgSmF2YVNjcmlwdFdvcmtlciA9IGV4cG9ydHMuSmF2YVNjcmlwdFdvcmtlciA9IGZ1bmN0aW9uKHNlbmRlcikgew0KICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7DQogICAgdGhpcy5zZXRUaW1lb3V0KDUwMCk7DQp9Ow0KDQpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdFdvcmtlciwgTWlycm9yKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kb2MuZ2V0VmFsdWUoKTsNCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eIyEuKlxuLywgIlxuIik7DQogICAgICAgIA0KLy8gICAgICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCk7DQogICAgICAgIHZhciBwYXJzZXIgPSByZXF1aXJlKCIuLi9uYXJjaXNzdXMvanNwYXJzZSIpOw0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHZhbHVlKTsNCiAgICAgICAgfSBjYXRjaChlKSB7DQovLyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJuYXJjaXNzdXMiKQ0KLy8gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsNCiAgICAgICAgICAgIHZhciBjaHVua3MgPSBlLm1lc3NhZ2Uuc3BsaXQoIjoiKQ0KICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaHVua3MucG9wKCkudHJpbSgpOw0KICAgICAgICAgICAgdmFyIGxpbmVOdW1iZXIgPSBwYXJzZUludChjaHVua3MucG9wKCkudHJpbSgpKSAtIDE7DQogICAgICAgICAgICB0aGlzLnNlbmRlci5lbWl0KCJuYXJjaXNzdXMiLCB7DQogICAgICAgICAgICAgICAgcm93OiBsaW5lTnVtYmVyLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCwgLy8gVE9ETyBjb252ZXJ0IGUuY3Vyc29yDQogICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZSwNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfSBmaW5hbGx5IHsNCi8vICAgICAgICAgICAgY29uc29sZS5sb2coInBhcnNlIHRpbWU6ICIgKyAobmV3IERhdGUoKSAtIHN0YXJ0KSk7DQogICAgICAgIH0NCiAgICAgICAgDQovLyAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsNCi8vICAgICAgICBjb25zb2xlLmxvZygianNsaW50IikNCiAgICAgICAgbGludCh2YWx1ZSwge3VuZGVmOiBmYWxzZSwgb25ldmFyOiBmYWxzZSwgcGFzc2ZhaWw6IGZhbHNlfSk7DQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImpzbGludCIsIGxpbnQuZXJyb3JzKTsgICAgICAgIA0KLy8gICAgICAgIGNvbnNvbGUubG9nKCJsaW50IHRpbWU6ICIgKyAobmV3IERhdGUoKSAtIHN0YXJ0KSk7DQogICAgfQ0KICAgIA0KfSkuY2FsbChKYXZhU2NyaXB0V29ya2VyLnByb3RvdHlwZSk7DQoNCn0pO2RlZmluZSgnYWNlL3dvcmtlci9taXJyb3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9kb2N1bWVudCcsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBEb2N1bWVudCA9IHJlcXVpcmUoIi4uL2RvY3VtZW50IikuRG9jdW1lbnQ7DQp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7DQogICAgDQp2YXIgTWlycm9yID0gZXhwb3J0cy5NaXJyb3IgPSBmdW5jdGlvbihzZW5kZXIpIHsNCiAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsNCiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOw0KICAgIA0KICAgIHZhciBkZWZlcnJlZFVwZGF0ZSA9IHRoaXMuZGVmZXJyZWRVcGRhdGUgPSBsYW5nLmRlZmVycmVkQ2FsbCh0aGlzLm9uVXBkYXRlLmJpbmQodGhpcykpOw0KICAgIA0KICAgIHZhciBfc2VsZiA9IHRoaXM7DQogICAgc2VuZGVyLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7DQogICAgICAgIGRvYy5hcHBseURlbHRhcyhbZS5kYXRhXSk7ICAgICAgICANCiAgICAgICAgZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUoX3NlbGYuJHRpbWVvdXQpOw0KICAgIH0pOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KICAgIA0KICAgIHRoaXMuJHRpbWVvdXQgPSA1MDA7DQogICAgDQogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgew0KICAgICAgICB0aGlzLiR0aW1lb3V0ID0gdGltZW91dDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICB0aGlzLmRvYy5zZXRWYWx1ZSh2YWx1ZSk7DQogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgew0KICAgICAgICB0aGlzLnNlbmRlci5jYWxsYmFjayh0aGlzLmRvYy5nZXRWYWx1ZSgpLCBjYWxsYmFja0lkKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgLy8gYWJzdHJhY3QgbWV0aG9kDQogICAgfTsNCiAgICANCn0pLmNhbGwoTWlycm9yLnByb3RvdHlwZSk7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9kb2N1bWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgJ2FjZS9yYW5nZScsICdhY2UvYW5jaG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4vcmFuZ2UiKS5SYW5nZTsNCnZhciBBbmNob3IgPSByZXF1aXJlKCIuL2FuY2hvciIpLkFuY2hvcjsNCg0KdmFyIERvY3VtZW50ID0gZnVuY3Rpb24odGV4dCkgew0KICAgIHRoaXMuJGxpbmVzID0gW107DQoNCiAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZXh0KSkgew0KICAgICAgICB0aGlzLmluc2VydExpbmVzKDAsIHRleHQpOw0KICAgIH0NCiAgICAvLyBUaGVyZSBoYXMgdG8gYmUgb25lIGxpbmUgYXQgbGVhc3QgaW4gdGhlIGRvY3VtZW50LiBJZiB5b3UgcGFzcyBhbiBlbXB0eQ0KICAgIC8vIHN0cmluZyB0byB0aGUgaW5zZXJ0IGZ1bmN0aW9uLCBub3RoaW5nIHdpbGwgaGFwcGVuLiBXb3JrYXJvdW5kLg0KICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7DQogICAgfQ0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KDQogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7DQogICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZSgwLCAwLCBsZW4sIHRoaXMuZ2V0TGluZShsZW4tMSkubGVuZ3RoKSk7DQogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jcmVhdGVBbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gbmV3IEFuY2hvcih0aGlzLCByb3csIGNvbHVtbik7DQogICAgfTsNCg0KICAgIC8vIGNoZWNrIGZvciBJRSBzcGxpdCBidWcNCiAgICBpZiAoImFhYSIuc3BsaXQoL2EvKS5sZW5ndGggPT0gMCkNCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cclxufFxyL2csICJcbiIpLnNwbGl0KCJcbiIpOw0KICAgICAgICB9DQogICAgZWxzZQ0KICAgICAgICB0aGlzLiRzcGxpdCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cclxufFxyfFxuLyk7DQogICAgICAgIH07DQoNCg0KICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7DQogICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSBtYXRjaFsxXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHsNCiAgICAgIHN3aXRjaCAodGhpcy4kbmV3TGluZU1vZGUpIHsNCiAgICAgICAgICBjYXNlICJ3aW5kb3dzIjoNCiAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsNCg0KICAgICAgICAgIGNhc2UgInVuaXgiOg0KICAgICAgICAgICAgICByZXR1cm4gIlxuIjsNCg0KICAgICAgICAgIGNhc2UgImF1dG8iOg0KICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kYXV0b05ld0xpbmU7DQogICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsNCiAgICB0aGlzLiRuZXdMaW5lTW9kZSA9ICJhdXRvIjsNCiAgICB0aGlzLnNldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24obmV3TGluZU1vZGUpIHsNCiAgICAgICAgaWYgKHRoaXMuJG5ld0xpbmVNb2RlID09PSBuZXdMaW5lTW9kZSkNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB0aGlzLiRuZXdMaW5lTW9kZSA9IG5ld0xpbmVNb2RlOw0KICAgIH07DQoNCiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc05ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIHJldHVybiAodGV4dCA9PSAiXHJcbiIgfHwgdGV4dCA9PSAiXHIiIHx8IHRleHQgPT0gIlxuIik7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIEdldCBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGdpdmVuIGxpbmUgYXMgaXQgaXMgaW4gdGhlIGRvY3VtZW50DQogICAgICovDQogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOw0KICAgIH07DQoNCiAgICB0aGlzLmdldExpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGZpcnN0Um93LCBsYXN0Um93ICsgMSk7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgYWxsIGxpbmVzIGluIHRoZSBkb2N1bWVudCBhcyBzdHJpbmcgYXJyYXkuIFdhcm5pbmc6IFRoZSBjYWxsZXINCiAgICAgKiBzaG91bGQgbm90IG1vZGlmeSB0aGlzIGFycmF5IQ0KICAgICAqLw0KICAgIHRoaXMuZ2V0QWxsTGluZXMgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXMoMCwgdGhpcy5nZXRMZW5ndGgoKSk7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0VGV4dFJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93KSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgbGluZXMgPSBbXTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKSk7DQogICAgICAgICAgICBsaW5lcy5wdXNoLmFwcGx5KGxpbmVzLCB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdysxLCByYW5nZS5lbmQucm93LTEpKTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2UuZW5kLnJvd10uc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pKTsNCiAgICAgICAgICAgIHJldHVybiBsaW5lcy5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLiRjbGlwUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsNCiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsNCiAgICAgICAgICAgIHBvc2l0aW9uLnJvdyA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIDEpOw0KICAgICAgICAgICAgcG9zaXRpb24uY29sdW1uID0gdGhpcy5nZXRMaW5lKGxlbmd0aC0xKS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KDQogICAgICAgIHBvc2l0aW9uID0gdGhpcy4kY2xpcFBvc2l0aW9uKHBvc2l0aW9uKTsNCg0KICAgICAgICBpZiAodGhpcy5nZXRMZW5ndGgoKSA8PSAxKQ0KICAgICAgICAgICAgdGhpcy4kZGV0ZWN0TmV3TGluZSh0ZXh0KTsNCg0KICAgICAgICB2YXIgbGluZXMgPSB0aGlzLiRzcGxpdCh0ZXh0KTsNCiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzLnNwbGljZSgwLCAxKVswXTsNCiAgICAgICAgdmFyIGxhc3RMaW5lID0gbGluZXMubGVuZ3RoID09IDAgPyBudWxsIDogbGluZXMuc3BsaWNlKGxpbmVzLmxlbmd0aCAtIDEsIDEpWzBdOw0KDQogICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGZpcnN0TGluZSk7DQogICAgICAgIGlmIChsYXN0TGluZSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydE5ld0xpbmUocG9zaXRpb24pOyAvLyB0ZXJtaW5hdGUgZmlyc3QgbGluZQ0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydExpbmVzKHBvc2l0aW9uLnJvdywgbGluZXMpOw0KICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgbGFzdExpbmUgfHwgIiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwb3NpdGlvbjsNCiAgICB9Ow0KDQogICAgdGhpcy5pbnNlcnRMaW5lcyA9IGZ1bmN0aW9uKHJvdywgbGluZXMpIHsNCiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHtyb3c6IHJvdywgY29sdW1uOiAwfTsNCg0KICAgICAgICB2YXIgYXJncyA9IFtyb3csIDBdOw0KICAgICAgICBhcmdzLnB1c2guYXBwbHkoYXJncywgbGluZXMpOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UuYXBwbHkodGhpcy4kbGluZXMsIGFyZ3MpOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIDAsIHJvdyArIGxpbmVzLmxlbmd0aCwgMCk7DQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydExpbmVzIiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydE5ld0xpbmUgPSBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7DQogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsNCg0KICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKTsNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHBvc2l0aW9uLnJvdyArIDEsIDAsIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbiwgbGluZS5sZW5ndGgpKTsNCg0KICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93ICsgMSwNCiAgICAgICAgICAgIGNvbHVtbiA6IDANCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLA0KICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydEluTGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7DQogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KDQogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsNCg0KICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKSArIHRleHQNCiAgICAgICAgICAgICAgICArIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbik7DQoNCiAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdywNCiAgICAgICAgICAgIGNvbHVtbiA6IHBvc2l0aW9uLmNvbHVtbiArIHRleHQubGVuZ3RoDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsDQogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwNCiAgICAgICAgICAgIHRleHQ6IHRleHQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCg0KICAgICAgICByZXR1cm4gZW5kOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIC8vIGNsaXAgdG8gZG9jdW1lbnQNCiAgICAgICAgcmFuZ2Uuc3RhcnQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2Uuc3RhcnQpOw0KICAgICAgICByYW5nZS5lbmQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2UuZW5kKTsNCg0KICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIHZhciBmaXJzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgdmFyIGxhc3RSb3cgPSByYW5nZS5lbmQucm93Ow0KDQogICAgICAgIGlmIChyYW5nZS5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICB2YXIgZmlyc3RGdWxsUm93ID0gcmFuZ2Uuc3RhcnQuY29sdW1uID09IDAgPyBmaXJzdFJvdyA6IGZpcnN0Um93ICsgMTsNCiAgICAgICAgICAgIHZhciBsYXN0RnVsbFJvdyA9IGxhc3RSb3cgLSAxOw0KDQogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+IDApDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUobGFzdFJvdywgMCwgcmFuZ2UuZW5kLmNvbHVtbik7DQoNCiAgICAgICAgICAgIGlmIChsYXN0RnVsbFJvdyA+PSBmaXJzdEZ1bGxSb3cpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhmaXJzdEZ1bGxSb3csIGxhc3RGdWxsUm93KTsNCg0KICAgICAgICAgICAgaWYgKGZpcnN0RnVsbFJvdyAhPSBmaXJzdFJvdykgew0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHRoaXMuZ2V0TGluZShmaXJzdFJvdykubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5ld0xpbmUocmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVJbkxpbmUgPSBmdW5jdGlvbihyb3csIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pIHsNCiAgICAgICAgaWYgKHN0YXJ0Q29sdW1uID09IGVuZENvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBzdGFydENvbHVtbiwgcm93LCBlbmRDb2x1bW4pOw0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgcmVtb3ZlZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pOw0KICAgICAgICB2YXIgbmV3TGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGxpbmUuc3Vic3RyaW5nKGVuZENvbHVtbiwgbGluZS5sZW5ndGgpOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAxLCBuZXdMaW5lKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIHRleHQ6IHJlbW92ZWQNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBSZW1vdmVzIGEgcmFuZ2Ugb2YgZnVsbCBsaW5lcw0KICAgICAqDQogICAgICogQHBhcmFtIGZpcnN0Um93IHtJbnRlZ2VyfSBUaGUgZmlyc3Qgcm93IHRvIGJlIHJlbW92ZWQNCiAgICAgKiBAcGFyYW0gbGFzdFJvdyB7SW50ZWdlcn0gVGhlIGxhc3Qgcm93IHRvIGJlIHJlbW92ZWQNCiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX0gVGhlIHJlbW92ZWQgbGluZXMNCiAgICAgKi8NCiAgICB0aGlzLnJlbW92ZUxpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKGZpcnN0Um93LCAwLCBsYXN0Um93ICsgMSwgMCk7DQogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy4kbGluZXMuc3BsaWNlKGZpcnN0Um93LCBsYXN0Um93IC0gZmlyc3RSb3cgKyAxKTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVMaW5lcyIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICBubDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksDQogICAgICAgICAgICBsaW5lczogcmVtb3ZlZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmVtb3ZlZDsNCiAgICB9Ow0KDQogICAgdGhpcy5yZW1vdmVOZXdMaW5lID0gZnVuY3Rpb24ocm93KSB7DQogICAgICAgIHZhciBmaXJzdExpbmUgPSB0aGlzLmdldExpbmUocm93KTsNCiAgICAgICAgdmFyIHNlY29uZExpbmUgPSB0aGlzLmdldExpbmUocm93KzEpOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIGZpcnN0TGluZS5sZW5ndGgsIHJvdysxLCAwKTsNCiAgICAgICAgdmFyIGxpbmUgPSBmaXJzdExpbmUgKyBzZWNvbmRMaW5lOw0KDQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDIsIGxpbmUpOw0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsNCiAgICB9Ow0KDQogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24ocmFuZ2UsIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQ0KICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIC8vIFNob3J0Y3V0OiBJZiB0aGUgdGV4dCB3ZSB3YW50IHRvIGluc2VydCBpcyB0aGUgc2FtZSBhcyBpdCBpcyBhbHJlYWR5DQogICAgICAgIC8vIGluIHRoZSBkb2N1bWVudCwgd2UgZG9uJ3QgaGF2ZSB0byByZXBsYWNlIGFueXRoaW5nLg0KICAgICAgICBpZiAodGV4dCA9PSB0aGlzLmdldFRleHRSYW5nZShyYW5nZSkpDQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOw0KDQogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgaWYgKHRleHQpIHsNCiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgdGV4dCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBlbmQgPSByYW5nZS5zdGFydDsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBlbmQ7DQogICAgfTsNCg0KICAgIHRoaXMuYXBwbHlEZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsNCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRlbHRhcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOw0KICAgICAgICAgICAgdmFyIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2UuZW5kKTsNCg0KICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gMSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICB0aGlzLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgew0KICAgICAgICBmb3IgKHZhciBpPWRlbHRhcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7DQogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07DQoNCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7DQoNCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikNCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7DQogICAgICAgIH0NCiAgICB9Ow0KDQp9KS5jYWxsKERvY3VtZW50LnByb3RvdHlwZSk7DQoNCmV4cG9ydHMuRG9jdW1lbnQgPSBEb2N1bWVudDsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL3JhbmdlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIFJhbmdlID0gZnVuY3Rpb24oc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbikgew0KICAgIHRoaXMuc3RhcnQgPSB7DQogICAgICAgIHJvdzogc3RhcnRSb3csDQogICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4NCiAgICB9Ow0KDQogICAgdGhpcy5lbmQgPSB7DQogICAgICAgIHJvdzogZW5kUm93LA0KICAgICAgICBjb2x1bW46IGVuZENvbHVtbg0KICAgIH07DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgdGhpcy5pc0VlcXVhbCA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByYW5nZS5zdGFydC5yb3cgJiYNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9PSByYW5nZS5lbmQucm93ICYmDQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9PSByYW5nZS5zdGFydC5jb2x1bW4gJiYNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9PSByYW5nZS5lbmQuY29sdW1uDQogICAgfTsNCg0KICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICgiUmFuZ2U6IFsiICsgdGhpcy5zdGFydC5yb3cgKyAiLyIgKyB0aGlzLnN0YXJ0LmNvbHVtbiArDQogICAgICAgICAgICAiXSAtPiBbIiArIHRoaXMuZW5kLnJvdyArICIvIiArIHRoaXMuZW5kLmNvbHVtbiArICJdIik7DQogICAgfTsNCg0KICAgIHRoaXMuY29udGFpbnMgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBDb21wYXJlcyB0aGlzIHJhbmdlIChBKSB3aXRoIGFub3RoZXIgcmFuZ2UgKEIpLCB3aGVyZSBCIGlzIHRoZSBwYXNzZWQgaW4NCiAgICAgKiByYW5nZS4NCiAgICAgKg0KICAgICAqIFJldHVybiB2YWx1ZXM6DQogICAgICogIC0yOiAoQikgaXMgaW5mcm9udCBvZiAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpDQogICAgICogIC0xOiAoQikgYmVnaW5zIGJlZm9yZSAoQSkgYnV0IGVuZHMgaW5zaWRlIG9mIChBKQ0KICAgICAqICAgMDogKEIpIGlzIGNvbXBsZXRseSBpbnNpZGUgb2YgKEEpIE9SIChBKSBpcyBjb21wbGV0eSBpbnNpZGUgb2YgKEIpDQogICAgICogICsxOiAoQikgYmVnaW5zIGluc2lkZSBvZiAoQSkgYnV0IGVuZHMgb3V0c2lkZSBvZiAoQSkNCiAgICAgKiAgKzI6IChCKSBpcyBhZnRlciAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpDQogICAgICoNCiAgICAgKiAgNDI6IEZUVyBzdGF0ZTogKEIpIGVuZHMgaW4gKEEpIGJ1dCBzdGFydHMgb3V0c2lkZSBvZiAoQSkNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7DQogICAgICAgIHZhciBjbXAsDQogICAgICAgICAgICBlbmQgPSByYW5nZS5lbmQsDQogICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0Ow0KDQogICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbmQucm93LCBlbmQuY29sdW1uKTsNCiAgICAgICAgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgcmV0dXJuIC0yOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAxKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDQyOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZVBvaW50ID0gZnVuY3Rpb24ocCkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHAucm93LCBwLmNvbHVtbik7DQogICAgfQ0KDQogICAgdGhpcy5jb250YWluc1JhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsNCiAgICB9DQoNCiAgICB0aGlzLmlzRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbjsNCiAgICB9DQoNCiAgICB0aGlzLmlzU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsNCiAgICB9DQoNCiAgICB0aGlzLnNldFN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHR5cGVvZiByb3cgPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gcm93LmNvbHVtbjsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93Ow0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBjb2x1bW47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLnNldEVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSByb3cuY29sdW1uOw0KICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gcm93LnJvdzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdzsNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGNvbHVtbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pIHx8IHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZVN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7DQogICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICghdGhpcy5pc011bHRpTGluZSgpKSB7DQogICAgICAgICAgICBpZiAocm93ID09PSB0aGlzLnN0YXJ0LnJvdykgew0KICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPCB0aGlzLnN0YXJ0LmNvbHVtbiA/IC0xIDogKGNvbHVtbiA+IHRoaXMuZW5kLmNvbHVtbiA/IDEgOiAwKTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocm93IDwgdGhpcy5zdGFydC5yb3cpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgaWYgKHJvdyA+IHRoaXMuZW5kLnJvdykNCiAgICAgICAgICAgIHJldHVybiAxOw0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQ0KICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA+PSB0aGlzLnN0YXJ0LmNvbHVtbiA/IDAgOiAtMTsNCg0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09PSByb3cpDQogICAgICAgICAgICByZXR1cm4gY29sdW1uIDw9IHRoaXMuZW5kLmNvbHVtbiA/IDAgOiAxOw0KDQogICAgICAgIHJldHVybiAwOw0KICAgIH07DQoNCiAgICAvKioNCiAgICAgKiBMaWtlIC5jb21wYXJlKCksIGJ1dCBpZiBpc1N0YXJ0IGlzIHRydWUsIHJldHVybiAtMTsNCiAgICAgKi8NCiAgICB0aGlzLmNvbXBhcmVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzRW5kIGlzIHRydWUsIHJldHVybiAxOw0KICAgICAqLw0KICAgIHRoaXMuY29tcGFyZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmNvbXBhcmVJbnNpZGUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY2xpcFJvd3MgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICBpZiAodGhpcy5lbmQucm93ID4gbGFzdFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPiBsYXN0Um93KSB7DQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7DQogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93IDwgZmlyc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmV4dGVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KDQogICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICBlbHNlIGlmIChjbXAgPT0gLTEpDQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59Ow0KDQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7DQogICAgfTsNCg0KICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09IHRoaXMuZW5kLnJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSB0aGlzLmVuZC5jb2x1bW4pOw0KICAgIH07DQoNCiAgICB0aGlzLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7DQogICAgfTsNCg0KICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGhpcy5zdGFydCwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICB0aGlzLmNvbGxhcHNlUm93cyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5lbmQuY29sdW1uID09IDApDQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCBNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdywgdGhpcy5lbmQucm93LTEpLCAwKQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCB0aGlzLmVuZC5yb3csIDApDQogICAgfTsNCg0KICAgIHRoaXMudG9TY3JlZW5SYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24pIHsNCiAgICAgICAgdmFyIHNjcmVlblBvc1N0YXJ0ID0NCiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpOw0KICAgICAgICB2YXIgc2NyZWVuUG9zRW5kID0NCiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTsNCg0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlKA0KICAgICAgICAgICAgc2NyZWVuUG9zU3RhcnQucm93LCBzY3JlZW5Qb3NTdGFydC5jb2x1bW4sDQogICAgICAgICAgICBzY3JlZW5Qb3NFbmQucm93LCBzY3JlZW5Qb3NFbmQuY29sdW1uDQogICAgICAgICk7DQogICAgfTsNCg0KfSkuY2FsbChSYW5nZS5wcm90b3R5cGUpOw0KDQoNClJhbmdlLmZyb21Qb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbiwgZW5kLnJvdywgZW5kLmNvbHVtbik7DQp9Ow0KDQpleHBvcnRzLlJhbmdlID0gUmFuZ2U7DQp9KTsNCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9hbmNob3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOw0KdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7DQoNCi8qKg0KICogQW4gQW5jaG9yIGlzIGEgZmxvYXRpbmcgcG9pbnRlciBpbiB0aGUgZG9jdW1lbnQuIFdoZW5ldmVyIHRleHQgaXMgaW5zZXJ0ZWQgb3INCiAqIGRlbGV0ZWQgYmVmb3JlIHRoZSBjdXJzb3IsIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGlzIHVwZGF0ZWQNCiAqLw0KdmFyIEFuY2hvciA9IGV4cG9ydHMuQW5jaG9yID0gZnVuY3Rpb24oZG9jLCByb3csIGNvbHVtbikgew0KICAgIHRoaXMuZG9jdW1lbnQgPSBkb2M7DQogICAgDQogICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7DQogICAgZWxzZQ0KICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsNCg0KICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOw0KICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOw0KfTsNCg0KKGZ1bmN0aW9uKCkgew0KDQogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOw0KICAgIA0KICAgIHRoaXMuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQ7DQogICAgfTsNCiAgICANCiAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24oZSkgew0KICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7DQogICAgICAgIHZhciByYW5nZSA9IGRlbHRhLnJhbmdlOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgIT0gdGhpcy5yb3cpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA+IHRoaXMucm93KQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gdGhpcy5yb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uID4gdGhpcy5jb2x1bW4pDQogICAgICAgICAgICByZXR1cm47DQogICAgDQogICAgICAgIHZhciByb3cgPSB0aGlzLnJvdzsNCiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uOw0KICAgICAgICANCiAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydFRleHQiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDw9IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJhbmdlLmVuZC5yb3cpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uICs9IHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gLT0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7DQogICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0TGluZXMiKSB7DQogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgew0KICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8IGNvbHVtbikgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQuY29sdW1uID49IGNvbHVtbikNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gKHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW4pKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgew0KICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmQucm93ID09IHJvdykgew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSByYW5nZS5lbmQuY29sdW1uKSArIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcm93IC09IChyYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7DQogICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPD0gcm93KQ0KICAgICAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4sIHRydWUpOw0KICAgIH07DQoNCiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgew0KICAgICAgICB2YXIgcG9zOw0KICAgICAgICBpZiAobm9DbGlwKSB7DQogICAgICAgICAgICBwb3MgPSB7DQogICAgICAgICAgICAgICAgcm93OiByb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4NCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHRoaXMucm93ID09IHBvcy5yb3cgJiYgdGhpcy5jb2x1bW4gPT0gcG9zLmNvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICB2YXIgb2xkID0gew0KICAgICAgICAgICAgcm93OiB0aGlzLnJvdywNCiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4NCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIHRoaXMucm93ID0gcG9zLnJvdzsNCiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOw0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7DQogICAgICAgICAgICBvbGQ6IG9sZCwNCiAgICAgICAgICAgIHZhbHVlOiBwb3MNCiAgICAgICAgfSk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmRldGFjaCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICB2YXIgcG9zID0ge307DQogICAgDQogICAgICAgIGlmIChyb3cgPj0gdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSkgew0KICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSB0aGlzLmRvY3VtZW50LmdldExpbmUocG9zLnJvdykubGVuZ3RoOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSAwOw0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwb3Mucm93ID0gcm93Ow0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoY29sdW1uIDwgMCkNCiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOw0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBwb3M7DQogICAgfTsNCiAgICANCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2xpYi9sYW5nJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5zdHJpbmdSZXZlcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7DQogICAgcmV0dXJuIHN0cmluZy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpOw0KfTsNCg0KZXhwb3J0cy5zdHJpbmdSZXBlYXQgPSBmdW5jdGlvbiAoc3RyaW5nLCBjb3VudCkgew0KICAgICByZXR1cm4gbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbihzdHJpbmcpOw0KfTsNCg0KdmFyIHRyaW1CZWdpblJlZ2V4cCA9IC9eXHNccyovOw0KdmFyIHRyaW1FbmRSZWdleHAgPSAvXHNccyokLzsNCg0KZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUJlZ2luUmVnZXhwLCAnJyk7DQp9Ow0KDQpleHBvcnRzLnN0cmluZ1RyaW1SaWdodCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOw0KfTsNCg0KZXhwb3J0cy5jb3B5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7DQogICAgdmFyIGNvcHkgPSB7fTsNCiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7DQogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOw0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuY29weUFycmF5ID0gZnVuY3Rpb24oYXJyYXkpew0KICAgIHZhciBjb3B5ID0gW107DQogICAgZm9yICh2YXIgaT0wLCBsPWFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsNCiAgICAgICAgaWYgKGFycmF5W2ldICYmIHR5cGVvZiBhcnJheVtpXSA9PSAib2JqZWN0IikNCiAgICAgICAgICAgIGNvcHlbaV0gPSB0aGlzLmNvcHlPYmplY3QoIGFycmF5W2ldICk7DQogICAgICAgIGVsc2UgDQogICAgICAgICAgICBjb3B5W2ldID0gYXJyYXlbaV07DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIChvYmopIHsNCiAgICBpZiAodHlwZW9mIG9iaiAhPSAib2JqZWN0Iikgew0KICAgICAgICByZXR1cm4gb2JqOw0KICAgIH0NCiAgICANCiAgICB2YXIgY29weSA9IG9iai5jb25zdHJ1Y3RvcigpOw0KICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsNCiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgY29weVtrZXldID0gdGhpcy5kZWVwQ29weShvYmpba2V5XSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gY29weTsNCn07DQoNCmV4cG9ydHMuYXJyYXlUb01hcCA9IGZ1bmN0aW9uKGFycikgew0KICAgIHZhciBtYXAgPSB7fTsNCiAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIG1hcFthcnJbaV1dID0gMTsNCiAgICB9DQogICAgcmV0dXJuIG1hcDsNCg0KfTsNCg0KLyoqDQogKiBzcGxpY2Ugb3V0IG9mICdhcnJheScgYW55dGhpbmcgdGhhdCA9PT0gJ3ZhbHVlJw0KICovDQpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7DQogIGZvciAodmFyIGkgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKHZhbHVlID09PSBhcnJheVtpXSkgew0KICAgICAgYXJyYXkuc3BsaWNlKGksIDEpOw0KICAgIH0NCiAgfQ0KfTsNCg0KZXhwb3J0cy5lc2NhcGVSZWdFeHAgPSBmdW5jdGlvbihzdHIpIHsNCiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsNCn07DQoNCmV4cG9ydHMuZGVmZXJyZWRDYWxsID0gZnVuY3Rpb24oZmNuKSB7DQoNCiAgICB2YXIgdGltZXIgPSBudWxsOw0KICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgIGZjbigpOw0KICAgIH07DQoNCiAgICB2YXIgZGVmZXJyZWQgPSBmdW5jdGlvbih0aW1lb3V0KSB7DQogICAgICAgIGRlZmVycmVkLmNhbmNlbCgpOw0KICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgZGVmZXJyZWQuc2NoZWR1bGUgPSBkZWZlcnJlZDsNCg0KICAgIGRlZmVycmVkLmNhbGwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5jYW5jZWwoKTsNCiAgICAgICAgZmNuKCk7DQogICAgICAgIHJldHVybiBkZWZlcnJlZDsNCiAgICB9Ow0KDQogICAgZGVmZXJyZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7DQogICAgICAgIHRpbWVyID0gbnVsbDsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICByZXR1cm4gZGVmZXJyZWQ7DQp9Ow0KDQp9KTsNCmRlZmluZSgnYWNlL3dvcmtlci9qc2hpbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KLyohDQogKiBKU0hpbnQsIGJ5IEpTSGludCBDb21tdW5pdHkuDQogKg0KICogTGljZW5zZWQgdW5kZXIgdGhlIHNhbWUgc2xpZ2h0bHkgbW9kaWZpZWQgTUlUIGxpY2Vuc2UgdGhhdCBKU0xpbnQgaXMuDQogKiBJdCBzdG9wcyBldmlsLWRvZXJzIGV2ZXJ5d2hlcmUuDQogKg0KICogSlNIaW50IGlzIGEgZGVyaXZhdGl2ZSB3b3JrIG9mIEpTTGludDoNCiAqDQogKiAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIENyb2NrZm9yZCAgKHd3dy5KU0xpbnQuY29tKQ0KICoNCiAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQogKiAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCiAqICAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbg0KICogICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCiAqICAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20NCiAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQogKg0KICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZA0KICogICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqDQogKiAgIFRoZSBTb2Z0d2FyZSBzaGFsbCBiZSB1c2VkIGZvciBHb29kLCBub3QgRXZpbC4NCiAqDQogKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQogKiAgIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KICogICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCiAqICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KICogICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORw0KICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQogKiAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiAqDQogKiBKU0hpbnQgd2FzIGZvcmtlZCBmcm9tIDIwMTAtMTItMTYgZWRpdGlvbiBvZiBKU0xpbnQuDQogKg0KICovDQoNCi8qDQogSlNISU5UIGlzIGEgZ2xvYmFsIGZ1bmN0aW9uLiBJdCB0YWtlcyB0d28gcGFyYW1ldGVycy4NCg0KICAgICB2YXIgbXlSZXN1bHQgPSBKU0hJTlQoc291cmNlLCBvcHRpb24pOw0KDQogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gSWYgaXQgaXMgYQ0KIHN0cmluZywgaXQgd2lsbCBiZSBzcGxpdCBvbiAnXG4nIG9yICdccicuIElmIGl0IGlzIGFuIGFycmF5IG9mIHN0cmluZ3MsIGl0DQogaXMgYXNzdW1lZCB0aGF0IGVhY2ggc3RyaW5nIHJlcHJlc2VudHMgb25lIGxpbmUuIFRoZSBzb3VyY2UgY2FuIGJlIGENCiBKYXZhU2NyaXB0IHRleHQgb3IgYSBKU09OIHRleHQuDQoNCiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBvYmplY3Qgb2Ygb3B0aW9ucyB3aGljaCBjb250cm9sIHRoZQ0KIG9wZXJhdGlvbiBvZiBKU0hJTlQuIE1vc3Qgb2YgdGhlIG9wdGlvbnMgYXJlIGJvb2xlYW5zOiBUaGV5IGFyZSBhbGwNCiBvcHRpb25hbCBhbmQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgb2YgZmFsc2UuIE9uZSBvZiB0aGUgb3B0aW9ucywgcHJlZGVmLA0KIGNhbiBiZSBhbiBhcnJheSBvZiBuYW1lcywgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlY2xhcmUgZ2xvYmFsIHZhcmlhYmxlcywNCiBvciBhbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgdXNlZCBhcyBnbG9iYWwgbmFtZXMsIHdpdGggYSBib29sZWFuIHZhbHVlDQogdGhhdCBkZXRlcm1pbmVzIGlmIHRoZXkgYXJlIGFzc2lnbmFibGUuDQoNCiBJZiBpdCBjaGVja3Mgb3V0LCBKU0hJTlQgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UsIGl0IHJldHVybnMgZmFsc2UuDQoNCiBJZiBmYWxzZSwgeW91IGNhbiBpbnNwZWN0IEpTSElOVC5lcnJvcnMgdG8gZmluZCBvdXQgdGhlIHByb2JsZW1zLg0KIEpTSElOVC5lcnJvcnMgaXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRoZXNlIG1lbWJlcnM6DQoNCiB7DQogICAgIGxpbmUgICAgICA6IFRoZSBsaW5lIChyZWxhdGl2ZSB0byAwKSBhdCB3aGljaCB0aGUgbGludCB3YXMgZm91bmQNCiAgICAgY2hhcmFjdGVyIDogVGhlIGNoYXJhY3RlciAocmVsYXRpdmUgdG8gMCkgYXQgd2hpY2ggdGhlIGxpbnQgd2FzIGZvdW5kDQogICAgIHJlYXNvbiAgICA6IFRoZSBwcm9ibGVtDQogICAgIGV2aWRlbmNlICA6IFRoZSB0ZXh0IGxpbmUgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJyZWQNCiAgICAgcmF3ICAgICAgIDogVGhlIHJhdyBtZXNzYWdlIGJlZm9yZSB0aGUgZGV0YWlscyB3ZXJlIGluc2VydGVkDQogICAgIGEgICAgICAgICA6IFRoZSBmaXJzdCBkZXRhaWwNCiAgICAgYiAgICAgICAgIDogVGhlIHNlY29uZCBkZXRhaWwNCiAgICAgYyAgICAgICAgIDogVGhlIHRoaXJkIGRldGFpbA0KICAgICBkICAgICAgICAgOiBUaGUgZm91cnRoIGRldGFpbA0KIH0NCg0KIElmIGEgZmF0YWwgZXJyb3Igd2FzIGZvdW5kLCBhIG51bGwgd2lsbCBiZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQ0KIEpTSElOVC5lcnJvcnMgYXJyYXkuDQoNCiBZb3UgY2FuIHJlcXVlc3QgYSBGdW5jdGlvbiBSZXBvcnQsIHdoaWNoIHNob3dzIGFsbCBvZiB0aGUgZnVuY3Rpb25zDQogYW5kIHRoZSBwYXJhbWV0ZXJzIGFuZCB2YXJzIHRoYXQgdGhleSB1c2UuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZA0KIGltcGxpZWQgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgb3RoZXIgcHJvYmxlbXMuIFRoZSByZXBvcnQgaXMgaW4gSFRNTCBhbmQNCiBjYW4gYmUgaW5zZXJ0ZWQgaW4gYW4gSFRNTCA8Ym9keT4uDQoNCiAgICAgdmFyIG15UmVwb3J0ID0gSlNISU5ULnJlcG9ydChsaW1pdGVkKTsNCg0KIElmIGxpbWl0ZWQgaXMgdHJ1ZSwgdGhlbiB0aGUgcmVwb3J0IHdpbGwgYmUgbGltaXRlZCB0byBvbmx5IGVycm9ycy4NCg0KIFlvdSBjYW4gcmVxdWVzdCBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIEpTSGludCdzIHJlc3VsdHMuDQoNCiAgICAgdmFyIG15RGF0YSA9IEpTSElOVC5kYXRhKCk7DQoNCiBJdCByZXR1cm5zIGEgc3RydWN0dXJlIHdpdGggdGhpcyBmb3JtOg0KDQogew0KICAgICBlcnJvcnM6IFsNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBsaW5lOiBOVU1CRVIsDQogICAgICAgICAgICAgY2hhcmFjdGVyOiBOVU1CRVIsDQogICAgICAgICAgICAgcmVhc29uOiBTVFJJTkcsDQogICAgICAgICAgICAgZXZpZGVuY2U6IFNUUklORw0KICAgICAgICAgfQ0KICAgICBdLA0KICAgICBmdW5jdGlvbnM6IFsNCiAgICAgICAgIG5hbWU6IFNUUklORywNCiAgICAgICAgIGxpbmU6IE5VTUJFUiwNCiAgICAgICAgIGxhc3Q6IE5VTUJFUiwNCiAgICAgICAgIHBhcmFtOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgY2xvc3VyZTogWw0KICAgICAgICAgICAgIFNUUklORw0KICAgICAgICAgXSwNCiAgICAgICAgIHZhcjogWw0KICAgICAgICAgICAgIFNUUklORw0KICAgICAgICAgXSwNCiAgICAgICAgIGV4Y2VwdGlvbjogWw0KICAgICAgICAgICAgIFNUUklORw0KICAgICAgICAgXSwNCiAgICAgICAgIG91dGVyOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgdW51c2VkOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgZ2xvYmFsOiBbDQogICAgICAgICAgICAgU1RSSU5HDQogICAgICAgICBdLA0KICAgICAgICAgbGFiZWw6IFsNCiAgICAgICAgICAgICBTVFJJTkcNCiAgICAgICAgIF0NCiAgICAgXSwNCiAgICAgZ2xvYmFsczogWw0KICAgICAgICAgU1RSSU5HDQogICAgIF0sDQogICAgIG1lbWJlcjogew0KICAgICAgICAgU1RSSU5HOiBOVU1CRVINCiAgICAgfSwNCiAgICAgdW51c2VkczogWw0KICAgICAgICAgew0KICAgICAgICAgICAgIG5hbWU6IFNUUklORywNCiAgICAgICAgICAgICBsaW5lOiBOVU1CRVINCiAgICAgICAgIH0NCiAgICAgXSwNCiAgICAgaW1wbGllZHM6IFsNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBuYW1lOiBTVFJJTkcsDQogICAgICAgICAgICAgbGluZTogTlVNQkVSDQogICAgICAgICB9DQogICAgIF0sDQogICAgIHVybHM6IFsNCiAgICAgICAgIFNUUklORw0KICAgICBdLA0KICAgICBqc29uOiBCT09MRUFODQogfQ0KDQogRW1wdHkgYXJyYXlzIHdpbGwgbm90IGJlIGluY2x1ZGVkLg0KDQoqLw0KDQovKmpzaGludA0KIGV2aWw6IHRydWUsIG5vbWVuOiBmYWxzZSwgb25ldmFyOiBmYWxzZSwgcmVnZXhwOiBmYWxzZSwgc3RyaWN0OiB0cnVlLCBib3NzOiB0cnVlLA0KIHVuZGVmOiB0cnVlLCBtYXhsZW46IDEwMA0KKi8NCg0KLyptZW1iZXJzICJcYiIsICJcdCIsICJcbiIsICJcZiIsICJcciIsICIhPSIsICIhPT0iLCAiXCIiLCAiJSIsICIoYmVnaW4pIiwNCiAiKGJyZWFrYWdlKSIsICIoY29udGV4dCkiLCAiKGVycm9yKSIsICIoZ2xvYmFsKSIsICIoaWRlbnRpZmllcikiLCAiKGxhc3QpIiwNCiAiKGxpbmUpIiwgIihsb29wYWdlKSIsICIobmFtZSkiLCAiKG9uZXZhcikiLCAiKHBhcmFtcykiLCAiKHNjb3BlKSIsDQogIihzdGF0ZW1lbnQpIiwgIih2ZXJiKSIsICIqIiwgIisiLCAiKysiLCAiLSIsICItLSIsICJcLyIsICI8IiwgIjw9IiwgIj09IiwNCiAiPT09IiwgIj4iLCAiPj0iLCAkLCAkJCwgJEEsICRGLCAkSCwgJFIsICRicmVhaywgJGNvbnRpbnVlLCAkdywgQWJzdHJhY3QsIEFqYXgsDQogX19maWxlbmFtZSwgX19kaXJuYW1lLCBBY3RpdmVYT2JqZWN0LCBBcnJheSwgQXJyYXlCdWZmZXIsIEFycmF5QnVmZmVyVmlldywNCiBBdXRvY29tcGxldGVyLCBBc3NldHMsIEJvb2xlYW4sIEJ1aWxkZXIsIEJ1ZmZlciwgQnJvd3NlciwgQ09NLCBDU2NyaXB0LCBDYW52YXMsDQogQ3VzdG9tQW5pbWF0aW9uLCBDbGFzcywgQ29udHJvbCwgQ2hhaW4sIENvbG9yLCBDb29raWUsIENvcmUsIERhdGFWaWV3LCBEYXRlLA0KIERlYnVnLCBEcmFnZ2FibGUsIERyYWdnYWJsZXMsIERyb3BwYWJsZXMsIERvY3VtZW50LCBEb21SZWFkeSwgRE9NUmVhZHksIERyYWcsDQogRSwgRW51bWVyYXRvciwgRW51bWVyYWJsZSwgRWxlbWVudCwgRWxlbWVudHMsIEVycm9yLCBFZmZlY3QsIEV2YWxFcnJvciwgRXZlbnQsDQogRXZlbnRzLCBGYWRlQW5pbWF0aW9uLCBGaWVsZCwgRmxhc2gsIEZsb2F0MzJBcnJheSwgRmxvYXQ2NEFycmF5LCBGb3JtLA0KIEZvcm1GaWVsZCwgRnJhbWUsIEZ1bmN0aW9uLCBGeCwgR2V0T2JqZWN0LCBHcm91cCwgSGFzaCwgSG90S2V5LCBIVE1MRWxlbWVudCwNCiBIdG1sVGFibGUsIElmcmFtZSwgSWZyYW1lU2hpbSwgSW1hZ2UsIEludDE2QXJyYXksIEludDMyQXJyYXksIEludDhBcnJheSwNCiBJbnNlcnRpb24sIElucHV0VmFsaWRhdG9yLCBKU09OLCBLZXlib2FyZCwgTG9jYWxlLCBMTjEwLCBMTjIsIExPRzEwRSwgTE9HMkUsDQogTUFYX1ZBTFVFLCBNSU5fVkFMVUUsIE1hc2ssIE1hdGgsIE1lbnVJdGVtLCBNb3ZlQW5pbWF0aW9uLCBNb29Ub29scywgTmF0aXZlLA0KIE5FR0FUSVZFX0lORklOSVRZLCBOdW1iZXIsIE9iamVjdCwgT2JqZWN0UmFuZ2UsIE9wdGlvbiwgT3B0aW9ucywgT3ZlclRleHQsIFBJLA0KIFBPU0lUSVZFX0lORklOSVRZLCBQZXJpb2RpY2FsRXhlY3V0ZXIsIFBvaW50LCBQb3NpdGlvbiwgUHJvdG90eXBlLCBSYW5nZUVycm9yLA0KIFJlY3RhbmdsZSwgUmVmZXJlbmNlRXJyb3IsIFJlZ0V4cCwgUmVzaXplQW5pbWF0aW9uLCBSZXF1ZXN0LCBSb3RhdGVBbmltYXRpb24sDQogU1FSVDFfMiwgU1FSVDIsIFNjcm9sbEJhciwgU2NyaXB0RW5naW5lLCBTY3JpcHRFbmdpbmVCdWlsZFZlcnNpb24sDQogU2NyaXB0RW5naW5lTWFqb3JWZXJzaW9uLCBTY3JpcHRFbmdpbmVNaW5vclZlcnNpb24sIFNjcmlwdGFjdWxvdXMsIFNjcm9sbGVyLA0KIFNsaWNrLCBTbGlkZXIsIFNlbGVjdG9yLCBTdHJpbmcsIFN0eWxlLCBTeW50YXhFcnJvciwgU29ydGFibGUsIFNvcnRhYmxlcywNCiBTb3J0YWJsZU9ic2VydmVyLCBTb3VuZCwgU3Bpbm5lciwgU3lzdGVtLCBTd2lmZiwgVGV4dCwgVGV4dEFyZWEsIFRlbXBsYXRlLA0KIFRpbWVyLCBUaXBzLCBUeXBlLCBUeXBlRXJyb3IsIFRvZ2dsZSwgVHJ5LCBVUkksIFVSSUVycm9yLCBVUkwsIFZCQXJyYXksIFdTSCwNCiBXU2NyaXB0LCBXZWIsIFdpbmRvdywgWE1MRE9NLCBYTUxIdHRwUmVxdWVzdCwgWFBhdGhFdmFsdWF0b3IsIFhQYXRoRXhjZXB0aW9uLA0KIFhQYXRoRXhwcmVzc2lvbiwgWFBhdGhOYW1lc3BhY2UsIFhQYXRoTlNSZXNvbHZlciwgWFBhdGhSZXN1bHQsICJcXCIsIGEsDQogYWRkRXZlbnRMaXN0ZW5lciwgYWRkcmVzcywgYWxlcnQsIGFwcGx5LCBhcHBsaWNhdGlvbkNhY2hlLCBhcmd1bWVudHMsIGFyaXR5LA0KIGFzaSwgYiwgYml0d2lzZSwgYmxvY2ssIGJsdXIsIGJvb2xPcHRpb25zLCBib3NzLCBicm93c2VyLCBjLCBjYWxsLCBjYWxsZWUsDQogY2FsbGVyLCBjYXNlcywgY2hhckF0LCBjaGFyQ29kZUF0LCBjaGFyYWN0ZXIsIGNsZWFySW50ZXJ2YWwsIGNsZWFyVGltZW91dCwNCiBjbG9zZSwgY2xvc2VkLCBjbG9zdXJlLCBjb21tZW50LCBjb25kaXRpb24sIGNvbmZpcm0sIGNvbnNvbGUsIGNvbnN0cnVjdG9yLA0KIGNvbnRlbnQsIGNvdWNoLCBjcmVhdGUsIGNzcywgY3VybHksIGQsIGRhdGEsIGRhdGFsaXN0LCBkZCwgZGVidWcsIGRlY29kZVVSSSwNCiBkZWNvZGVVUklDb21wb25lbnQsIGRlZmF1bHRTdGF0dXMsIGRlZmluZUNsYXNzLCBkZXNlcmlhbGl6ZSwgZGV2ZWwsIGRvY3VtZW50LA0KIGRvam8sIGRpaml0LCBkb2pveCwgZGVmaW5lLCBlZGl0aW9uLCBlbHNlLCBlbWl0LCBlbmNvZGVVUkksIGVuY29kZVVSSUNvbXBvbmVudCwNCiBlbnRpdHlpZnksIGVxZXFlcSwgZXFudWxsLCBlcnJvcnMsIGVzNSwgZXNjYXBlLCBldmFsLCBldmVudCwgZXZpZGVuY2UsIGV2aWwsDQogZXgsIGV4Y2VwdGlvbiwgZXhlYywgZXhwcywgZXhwciwgZXhwb3J0cywgRmlsZVJlYWRlciwgZmlyc3QsIGZsb29yLCBmb2N1cywNCiBmb3JpbiwgZnJhZ21lbnQsIGZyYW1lcywgZnJvbSwgZnJvbUNoYXJDb2RlLCBmdWQsIGZ1bmN0LCBmdW5jdGlvbiwgZnVuY3Rpb25zLA0KIGcsIGdjLCBnZXRDb21wdXRlZFN0eWxlLCBnZXRSb3csIEdMT0JBTCwgZ2xvYmFsLCBnbG9iYWxzLCBnbG9iYWxzdHJpY3QsDQogaGFzT3duUHJvcGVydHksIGhlbHAsIGhpc3RvcnksIGksIGlkLCBpZGVudGlmaWVyLCBpbW1lZCwgaW1wbGllZHMsIGluY2x1ZGUsDQogaW5kZW50LCBpbmRleE9mLCBpbml0LCBpbnMsIGluc3RhbmNlT2YsIGlzQWxwaGEsIGlzQXBwbGljYXRpb25SdW5uaW5nLCBpc0FycmF5LA0KIGlzRGlnaXQsIGlzRmluaXRlLCBpc05hTiwgaXRlcmF0b3IsIGpvaW4sIGpzaGludCwNCiBKU0hJTlQsIGpzb24sIGpxdWVyeSwgalF1ZXJ5LCBrZXlzLCBsYWJlbCwgbGFiZWxsZWQsIGxhc3QsIGxhc3RzZW1pYywgbGF4YnJlYWssDQogbGF0ZWRlZiwgbGJwLCBsZWQsIGxlZnQsIGxlbmd0aCwgbGluZSwgbG9hZCwgbG9hZENsYXNzLCBsb2NhbFN0b3JhZ2UsIGxvY2F0aW9uLA0KIGxvZywgbG9vcGZ1bmMsIG0sIG1hdGNoLCBtYXhlcnIsIG1heGxlbiwgbWVtYmVyLG1lc3NhZ2UsIG1ldGEsIG1vZHVsZSwgbW92ZUJ5LA0KIG1vdmVUbywgbW9vdG9vbHMsIG5hbWUsIG5hdmlnYXRvciwgbmV3LCBuZXdjYXAsIG5vYXJnLCBub2RlLCBub2VtcHR5LCBub21lbiwNCiBub25ldywgbnVkLCBvbmJlZm9yZXVubG9hZCwgb25ibHVyLCBvbmVycm9yLCBvbmV2YXIsIG9uZm9jdXMsIG9ubG9hZCwgb25yZXNpemUsDQogb251bmxvYWQsIG9wZW4sIG9wZW5EYXRhYmFzZSwgb3BlblVSTCwgb3BlbmVyLCBvcGVyYSwgb3V0ZXIsIHBhcmFtLCBwYXJlbnQsDQogcGFyc2VGbG9hdCwgcGFyc2VJbnQsIHBhc3NmYWlsLCBwbHVzcGx1cywgcHJlZGVmLCBwcmludCwgcHJvY2VzcywgcHJvbXB0LA0KIHByb3RvLCBwcm90b3R5cGUsIHByb3RvdHlwZWpzLCBwdXNoLCBxdWl0LCByYW5nZSwgcmF3LCByZWFjaCwgcmVhc29uLCByZWdleHAsDQogcmVhZEZpbGUsIHJlYWRVcmwsIHJlZ2V4ZGFzaCwgcmVtb3ZlRXZlbnRMaXN0ZW5lciwgcmVwbGFjZSwgcmVwb3J0LCByZXF1aXJlLA0KIHJlc2VydmVkLCByZXNpemVCeSwgcmVzaXplVG8sIHJlc29sdmVQYXRoLCByZXN1bWVVcGRhdGVzLCByZXNwb25kLCByaGlubywgcmlnaHQsDQogcnVuQ29tbWFuZCwgc2Nyb2xsLCBzY3JlZW4sIHNjcmlwdHVybCwgc2Nyb2xsQnksIHNjcm9sbFRvLCBzY3JvbGxiYXIsIHNlYXJjaCwgc2VhbCwgc2VuZCwNCiBzZXJpYWxpemUsIHNldEludGVydmFsLCBzZXRUaW1lb3V0LCBzaGlmdCwgc2xpY2UsIHNvcnQsc3Bhd24sIHNwbGl0LCBzdGFjaywNCiBzdGF0dXMsIHN0YXJ0LCBzdHJpY3QsIHN1Yiwgc3Vic3RyLCBzdXBlcm5ldywgc2hhZG93LCBzdXBwbGFudCwgc3VtLCBzeW5jLA0KIHRlc3QsIHRvTG93ZXJDYXNlLCB0b1N0cmluZywgdG9VcHBlckNhc2UsIHRvaW50MzIsIHRva2VuLCB0b3AsIHRyYWlsaW5nLCB0eXBlLA0KIHR5cGVPZiwgVWludDE2QXJyYXksIFVpbnQzMkFycmF5LCBVaW50OEFycmF5LCB1bmRlZiwgdW51c2VkLCB1cmxzLCB2YWx1ZSwgdmFsdWVPZiwNCiB2YXIsIHZlcnNpb24sIFdlYlNvY2tldCwgd2hpdGUsIHdpbmRvdywgV29ya2VyLCB3c2gqLw0KDQovKmdsb2JhbCBleHBvcnRzOiBmYWxzZSAqLw0KDQovLyBXZSBidWlsZCB0aGUgYXBwbGljYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gc28gdGhhdCB3ZSBwcm9kdWNlIG9ubHkgYSBzaW5nbGUNCi8vIGdsb2JhbCB2YXJpYWJsZS4gVGhhdCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHksIGFuZCBpdHMgcmV0dXJuDQovLyB2YWx1ZSBpcyB0aGUgSlNISU5UIGZ1bmN0aW9uIGl0c2VsZi4NCg0KdmFyIEpTSElOVCA9IChmdW5jdGlvbiAoKSB7DQogICAgInVzZSBzdHJpY3QiOw0KDQogICAgdmFyIGFub25uYW1lLCAgICAgICAvLyBUaGUgZ3Vlc3NlZCBuYW1lIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zLg0KDQovLyBUaGVzZSBhcmUgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhlICEgb3BlcmF0b3IuDQoNCiAgICAgICAgYmFuZyA9IHsNCiAgICAgICAgICAgICc8JyAgOiB0cnVlLA0KICAgICAgICAgICAgJzw9JyA6IHRydWUsDQogICAgICAgICAgICAnPT0nIDogdHJ1ZSwNCiAgICAgICAgICAgICc9PT0nOiB0cnVlLA0KICAgICAgICAgICAgJyE9PSc6IHRydWUsDQogICAgICAgICAgICAnIT0nIDogdHJ1ZSwNCiAgICAgICAgICAgICc+JyAgOiB0cnVlLA0KICAgICAgICAgICAgJz49JyA6IHRydWUsDQogICAgICAgICAgICAnKycgIDogdHJ1ZSwNCiAgICAgICAgICAgICctJyAgOiB0cnVlLA0KICAgICAgICAgICAgJyonICA6IHRydWUsDQogICAgICAgICAgICAnLycgIDogdHJ1ZSwNCiAgICAgICAgICAgICclJyAgOiB0cnVlDQogICAgICAgIH0sDQoNCi8vIFRoZXNlIGFyZSB0aGUgSlNIaW50IGJvb2xlYW4gb3B0aW9ucy4NCg0KICAgICAgICBib29sT3B0aW9ucyA9IHsNCiAgICAgICAgICAgIGFzaSAgICAgICAgIDogdHJ1ZSwgLy8gaWYgYXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24gc2hvdWxkIGJlIHRvbGVyYXRlZA0KICAgICAgICAgICAgYml0d2lzZSAgICAgOiB0cnVlLCAvLyBpZiBiaXR3aXNlIG9wZXJhdG9ycyBzaG91bGQgbm90IGJlIGFsbG93ZWQNCiAgICAgICAgICAgIGJvc3MgICAgICAgIDogdHJ1ZSwgLy8gaWYgYWR2YW5jZWQgdXNhZ2Ugb2YgYXNzaWdubWVudHMgc2hvdWxkIGJlIGFsbG93ZWQNCiAgICAgICAgICAgIGJyb3dzZXIgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIHN0YW5kYXJkIGJyb3dzZXIgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgY291Y2ggICAgICAgOiB0cnVlLCAvLyBpZiBDb3VjaERCIGdsb2JhbHMgc2hvdWxkIGJlIHByZWRlZmluZWQNCiAgICAgICAgICAgIGN1cmx5ICAgICAgIDogdHJ1ZSwgLy8gaWYgY3VybHkgYnJhY2VzIGFyb3VuZCBhbGwgYmxvY2tzIHNob3VsZCBiZSByZXF1aXJlZA0KICAgICAgICAgICAgZGVidWcgICAgICAgOiB0cnVlLCAvLyBpZiBkZWJ1Z2dlciBzdGF0ZW1lbnRzIHNob3VsZCBiZSBhbGxvd2VkDQogICAgICAgICAgICBkZXZlbCAgICAgICA6IHRydWUsIC8vIGlmIGxvZ2dpbmcgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZCAoY29uc29sZSwgYWxlcnQsIGV0Yy4pDQogICAgICAgICAgICBkb2pvICAgICAgICA6IHRydWUsIC8vIGlmIERvam8gVG9vbGtpdCBnbG9iYWxzIHNob3VsZCBiZSBwcmVkZWZpbmVkDQogICAgICAgICAgICBlcWVxZXEgICAgICA6IHRydWUsIC8vIGlmID09PSBzaG91bGQgYmUgcmVxdWlyZWQNCiAgICAgICAgICAgIGVxbnVsbCAgICAgIDogdHJ1ZSwgLy8gaWYgPT0gbnVsbCBjb21wYXJpc29ucyBzaG91bGQgYmUgdG9sZXJhdGVkDQogICAgICAgICAgICBlczUgICAgICAgICA6IHRydWUsIC8vIGlmIEVTNSBzeW50YXggc2hvdWxkIGJlIGFsbG93ZWQNCiAgICAgICAgICAgIGV2aWwgICAgICAgIDogdHJ1ZSwgLy8gaWYgZXZhbCBzaG91bGQgYmUgYWxsb3dlZA0KICAgICAgICAgICAgZXhwciAgICAgICAgOiB0cnVlLCAvLyBpZiBFeHByZXNzaW9uU3RhdGVtZW50IHNob3VsZCBiZSBhbGxvd2VkIGFzIFByb2dyYW1zDQogICAgICAgICAgICBmb3JpbiAgICAgICA6IHRydWUsIC8vIGlmIGZvciBpbiBzdGF0ZW1lbnRzIG11c3QgZmlsdGVyDQogICAgICAgICAgICBnbG9iYWxzdHJpY3Q6IHRydWUsIC8vIGlmIGdsb2JhbCAidXNlIHN0cmljdCI7IHNob3VsZCBiZSBhbGxvd2VkIChhbHNvIGVuYWJsZXMgJ3N0cmljdCcpDQogICAgICAgICAgICBpbW1lZCAgICAgICA6IHRydWUsIC8vIGlmIGltbWVkaWF0ZSBpbnZvY2F0aW9ucyBtdXN0IGJlIHdyYXBwZWQgaW4gcGFyZW5zDQogICAgICAgICAgICBpdGVyYXRvciAgICA6IHRydWUsIC8vIGlmIHRoZSBgX19pdGVyYXRvcl9fYCBwcm9wZXJ0eSBzaG91bGQgYmUgZGlzYWxsb3dlZA0KICAgICAgICAgICAganF1ZXJ5ICAgICAgOiB0cnVlLCAvLyBpZiBqUXVlcnkgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgbGF0ZWRlZiAgICAgOiB0cnVlLCAvLyBpZiB0aGUgdXNlIGJlZm9yZSBkZWZpbml0aW9uIHNob3VsZCBub3QgYmUgdG9sZXJhdGVkDQogICAgICAgICAgICBsYXhicmVhayAgICA6IHRydWUsIC8vIGlmIGxpbmUgYnJlYWtzIHNob3VsZCBub3QgYmUgY2hlY2tlZA0KICAgICAgICAgICAgbG9vcGZ1bmMgICAgOiB0cnVlLCAvLyBpZiBmdW5jdGlvbnMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgZGVmaW5lZCB3aXRoaW4gbG9vcHMNCiAgICAgICAgICAgIG1vb3Rvb2xzICAgIDogdHJ1ZSwgLy8gaWYgTW9vVG9vbHMgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgbmV3Y2FwICAgICAgOiB0cnVlLCAvLyBpZiBjb25zdHJ1Y3RvciBuYW1lcyBtdXN0IGJlIGNhcGl0YWxpemVkDQogICAgICAgICAgICBub2FyZyAgICAgICA6IHRydWUsIC8vIGlmIGFyZ3VtZW50cy5jYWxsZXIgYW5kIGFyZ3VtZW50cy5jYWxsZWUgc2hvdWxkIGJlIGRpc2FsbG93ZWQNCiAgICAgICAgICAgIG5vZGUgICAgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIE5vZGUuanMgZW52aXJvbm1lbnQgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgbm9lbXB0eSAgICAgOiB0cnVlLCAvLyBpZiBlbXB0eSBibG9ja3Mgc2hvdWxkIGJlIGRpc2FsbG93ZWQNCiAgICAgICAgICAgIG5vbmV3ICAgICAgIDogdHJ1ZSwgLy8gaWYgdXNpbmcgYG5ld2AgZm9yIHNpZGUtZWZmZWN0cyBzaG91bGQgYmUgZGlzYWxsb3dlZA0KICAgICAgICAgICAgbm9tZW4gICAgICAgOiB0cnVlLCAvLyBpZiBuYW1lcyBzaG91bGQgYmUgY2hlY2tlZA0KICAgICAgICAgICAgb25ldmFyICAgICAgOiB0cnVlLCAvLyBpZiBvbmx5IG9uZSB2YXIgc3RhdGVtZW50IHBlciBmdW5jdGlvbiBzaG91bGQgYmUgYWxsb3dlZA0KICAgICAgICAgICAgcGFzc2ZhaWwgICAgOiB0cnVlLCAvLyBpZiB0aGUgc2NhbiBzaG91bGQgc3RvcCBvbiBmaXJzdCBlcnJvcg0KICAgICAgICAgICAgcGx1c3BsdXMgICAgOiB0cnVlLCAvLyBpZiBpbmNyZW1lbnQvZGVjcmVtZW50IHNob3VsZCBub3QgYmUgYWxsb3dlZA0KICAgICAgICAgICAgcHJvdG8gICAgICAgOiB0cnVlLCAvLyBpZiB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgc2hvdWxkIGJlIGRpc2FsbG93ZWQNCiAgICAgICAgICAgIHByb3RvdHlwZWpzIDogdHJ1ZSwgLy8gaWYgUHJvdG90eXBlIGFuZCBTY3JpcHRhY3Vsb3VzIGdsb2JhbHMgc2hvdWxkIGJlIHByZWRlZmluZWQNCiAgICAgICAgICAgIHJlZ2V4ZGFzaCAgIDogdHJ1ZSwgLy8gaWYgdW5lc2NhcGVkIGxhc3QgZGFzaCAoLSkgaW5zaWRlIGJyYWNrZXRzIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHJlZ2V4cCAgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIC4gc2hvdWxkIG5vdCBiZSBhbGxvd2VkIGluIHJlZ2V4cCBsaXRlcmFscw0KICAgICAgICAgICAgcmhpbm8gICAgICAgOiB0cnVlLCAvLyBpZiB0aGUgUmhpbm8gZW52aXJvbm1lbnQgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZA0KICAgICAgICAgICAgdW5kZWYgICAgICAgOiB0cnVlLCAvLyBpZiB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGJlZm9yZSB1c2VkDQogICAgICAgICAgICBzY3JpcHR1cmwgICA6IHRydWUsIC8vIGlmIHNjcmlwdC10YXJnZXRlZCBVUkxzIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHNoYWRvdyAgICAgIDogdHJ1ZSwgLy8gaWYgdmFyaWFibGUgc2hhZG93aW5nIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHN0cmljdCAgICAgIDogdHJ1ZSwgLy8gcmVxdWlyZSB0aGUgInVzZSBzdHJpY3QiOyBwcmFnbWENCiAgICAgICAgICAgIHN1YiAgICAgICAgIDogdHJ1ZSwgLy8gaWYgYWxsIGZvcm1zIG9mIHN1YnNjcmlwdCBub3RhdGlvbiBhcmUgdG9sZXJhdGVkDQogICAgICAgICAgICBzdXBlcm5ldyAgICA6IHRydWUsIC8vIGlmIGBuZXcgZnVuY3Rpb24gKCkgeyAuLi4gfTtgIGFuZCBgbmV3IE9iamVjdDtgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0b2xlcmF0ZWQNCiAgICAgICAgICAgIHRyYWlsaW5nICAgIDogdHJ1ZSwgLy8gaWYgdHJhaWxpbmcgd2hpdGVzcGFjZSBydWxlcyBhcHBseQ0KICAgICAgICAgICAgd2hpdGUgICAgICAgOiB0cnVlLCAvLyBpZiBzdHJpY3Qgd2hpdGVzcGFjZSBydWxlcyBhcHBseQ0KICAgICAgICAgICAgd3NoICAgICAgICAgOiB0cnVlICAvLyBpZiB0aGUgV2luZG93cyBTY3JpcHRpbmcgSG9zdCBlbnZpcm9ubWVudCBnbG9iYWxzIHNob3VsZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBwcmVkZWZpbmVkDQogICAgICAgIH0sDQoNCi8vIGJyb3dzZXIgY29udGFpbnMgYSBzZXQgb2YgZ2xvYmFsIG5hbWVzIHdoaWNoIGFyZSBjb21tb25seSBwcm92aWRlZCBieSBhDQovLyB3ZWIgYnJvd3NlciBlbnZpcm9ubWVudC4NCg0KICAgICAgICBicm93c2VyID0gew0KICAgICAgICAgICAgQXJyYXlCdWZmZXIgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBcnJheUJ1ZmZlclZpZXcgOiBmYWxzZSwNCiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZhbHNlLA0KICAgICAgICAgICAgYXBwbGljYXRpb25DYWNoZTogZmFsc2UsDQogICAgICAgICAgICBibHVyICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwgICA6IGZhbHNlLA0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0ICAgIDogZmFsc2UsDQogICAgICAgICAgICBjbG9zZSAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGNsb3NlZCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRGF0YVZpZXcgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBkZWZhdWx0U3RhdHVzICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRvY3VtZW50ICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZXZlbnQgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBGaWxlUmVhZGVyICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEZsb2F0MzJBcnJheSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRmxvYXQ2NEFycmF5ICAgIDogZmFsc2UsDQogICAgICAgICAgICBmb2N1cyAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGZyYW1lcyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZTogZmFsc2UsDQogICAgICAgICAgICBIVE1MRWxlbWVudCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGhpc3RvcnkgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSW50MTZBcnJheSAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBJbnQzMkFycmF5ICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEludDhBcnJheSAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSW1hZ2UgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBsZW5ndGggICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgbG9jYXRpb24gICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBtb3ZlQnkgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG1vdmVUbyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBuYXZpZ2F0b3IgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG9uYmVmb3JldW5sb2FkICA6IHRydWUsDQogICAgICAgICAgICBvbmJsdXIgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgb25lcnJvciAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIG9uZm9jdXMgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBvbmxvYWQgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgb25yZXNpemUgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIG9udW5sb2FkICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBvcGVuICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG9wZW5EYXRhYmFzZSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgb3BlbmVyICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBPcHRpb24gICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHBhcmVudCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcHJpbnQgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmYWxzZSwNCiAgICAgICAgICAgIHJlc2l6ZUJ5ICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcmVzaXplVG8gICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzY3JlZW4gICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHNjcm9sbCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2Nyb2xsQnkgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzY3JvbGxUbyAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHNldEludGVydmFsICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2V0VGltZW91dCAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzdGF0dXMgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHRvcCAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgVWludDE2QXJyYXkgICAgIDogZmFsc2UsDQogICAgICAgICAgICBVaW50MzJBcnJheSAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFVpbnQ4QXJyYXkgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgV2ViU29ja2V0ICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICB3aW5kb3cgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFdvcmtlciAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgWE1MSHR0cFJlcXVlc3QgIDogZmFsc2UsDQogICAgICAgICAgICBYUGF0aEV2YWx1YXRvciAgOiBmYWxzZSwNCiAgICAgICAgICAgIFhQYXRoRXhjZXB0aW9uICA6IGZhbHNlLA0KICAgICAgICAgICAgWFBhdGhFeHByZXNzaW9uIDogZmFsc2UsDQogICAgICAgICAgICBYUGF0aE5hbWVzcGFjZSAgOiBmYWxzZSwNCiAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciA6IGZhbHNlLA0KICAgICAgICAgICAgWFBhdGhSZXN1bHQgICAgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBjb3VjaCA9IHsNCiAgICAgICAgICAgICJyZXF1aXJlIiA6IGZhbHNlLA0KICAgICAgICAgICAgcmVzcG9uZCAgIDogZmFsc2UsDQogICAgICAgICAgICBnZXRSb3cgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGVtaXQgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2VuZCAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzdGFydCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHN1bSAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgbG9nICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBleHBvcnRzICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG1vZHVsZSAgICA6IGZhbHNlDQogICAgICAgIH0sDQoNCiAgICAgICAgZGV2ZWwgPSB7DQogICAgICAgICAgICBhbGVydCAgIDogZmFsc2UsDQogICAgICAgICAgICBjb25maXJtIDogZmFsc2UsDQogICAgICAgICAgICBjb25zb2xlIDogZmFsc2UsDQogICAgICAgICAgICBEZWJ1ZyAgIDogZmFsc2UsDQogICAgICAgICAgICBvcGVyYSAgIDogZmFsc2UsDQogICAgICAgICAgICBwcm9tcHQgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBkb2pvID0gew0KICAgICAgICAgICAgZG9qbyAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBkaWppdCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRvam94ICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZGVmaW5lICAgIDogZmFsc2UsDQogICAgICAgICAgICAicmVxdWlyZSIgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIGVzY2FwZXMgPSB7DQogICAgICAgICAgICAnXGInOiAnXFxiJywNCiAgICAgICAgICAgICdcdCc6ICdcXHQnLA0KICAgICAgICAgICAgJ1xuJzogJ1xcbicsDQogICAgICAgICAgICAnXGYnOiAnXFxmJywNCiAgICAgICAgICAgICdccic6ICdcXHInLA0KICAgICAgICAgICAgJyInIDogJ1xcIicsDQogICAgICAgICAgICAnLycgOiAnXFwvJywNCiAgICAgICAgICAgICdcXCc6ICdcXFxcJw0KICAgICAgICB9LA0KDQogICAgICAgIGZ1bmN0LCAgICAgICAgICAvLyBUaGUgY3VycmVudCBmdW5jdGlvbg0KDQogICAgICAgIGZ1bmN0aW9uaWNpdHkgPSBbDQogICAgICAgICAgICAnY2xvc3VyZScsICdleGNlcHRpb24nLCAnZ2xvYmFsJywgJ2xhYmVsJywNCiAgICAgICAgICAgICdvdXRlcicsICd1bnVzZWQnLCAndmFyJw0KICAgICAgICBdLA0KDQogICAgICAgIGZ1bmN0aW9ucywgICAgICAvLyBBbGwgb2YgdGhlIGZ1bmN0aW9ucw0KDQogICAgICAgIGdsb2JhbCwgICAgICAgICAvLyBUaGUgZ2xvYmFsIHNjb3BlDQogICAgICAgIGltcGxpZWQsICAgICAgICAvLyBJbXBsaWVkIGdsb2JhbHMNCiAgICAgICAgaW5ibG9jaywNCiAgICAgICAgaW5kZW50LA0KICAgICAgICBqc29ubW9kZSwNCg0KICAgICAgICBqcXVlcnkgPSB7DQogICAgICAgICAgICAnJCcgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGpRdWVyeSA6IGZhbHNlDQogICAgICAgIH0sDQoNCiAgICAgICAgbGluZXMsDQogICAgICAgIGxvb2thaGVhZCwNCiAgICAgICAgbWVtYmVyLA0KICAgICAgICBtZW1iZXJzT25seSwNCg0KICAgICAgICBtb290b29scyA9IHsNCiAgICAgICAgICAgICckJyAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyQkJyAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBc3NldHMgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEJyb3dzZXIgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQ2hhaW4gICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQ29va2llICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBDb3JlICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERvY3VtZW50ICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRG9tUmVhZHkgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBET01SZWFkeSAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERyYWcgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRWxlbWVudCAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBFbGVtZW50cyAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRXZlbnRzICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBGeCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEdyb3VwICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSGFzaCAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBIdG1sVGFibGUgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIElmcmFtZSAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgSWZyYW1lU2hpbSAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBJbnB1dFZhbGlkYXRvciAgOiBmYWxzZSwNCiAgICAgICAgICAgIGluc3RhbmNlT2YgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgS2V5Ym9hcmQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBMb2NhbGUgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE1hc2sgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgTW9vVG9vbHMgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBOYXRpdmUgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE9wdGlvbnMgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgT3ZlclRleHQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBSZXF1ZXN0ICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNjcm9sbGVyICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU2xpY2sgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBTbGlkZXIgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNvcnRhYmxlcyAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU3Bpbm5lciAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBTd2lmZiAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFRpcHMgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICB0eXBlT2YgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFVSSSAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgV2luZG93ICAgICAgICAgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBuZXh0dG9rZW4sDQoNCiAgICAgICAgbm9kZSA9IHsNCiAgICAgICAgICAgIF9fZmlsZW5hbWUgIDogZmFsc2UsDQogICAgICAgICAgICBfX2Rpcm5hbWUgICA6IGZhbHNlLA0KICAgICAgICAgICAgZXhwb3J0cyAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEJ1ZmZlciAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBHTE9CQUwgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgZ2xvYmFsICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIG1vZHVsZSAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBwcm9jZXNzICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcmVxdWlyZSAgICAgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIG5vcmVhY2gsDQogICAgICAgIG9wdGlvbiwNCiAgICAgICAgcHJlZGVmaW5lZCwgICAgIC8vIEdsb2JhbCB2YXJpYWJsZXMgZGVmaW5lZCBieSBvcHRpb24NCiAgICAgICAgcHJlcmVnLA0KICAgICAgICBwcmV2dG9rZW4sDQoNCiAgICAgICAgcHJvdG90eXBlanMgPSB7DQogICAgICAgICAgICAnJCcgICAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyQkJyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICckQScgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICAnJEYnICAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyRIJyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICckUicgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICAnJGJyZWFrJyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgJyRjb250aW51ZScgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICckdycgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBYnN0cmFjdCAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQWpheCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBFbnVtZXJhYmxlICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBGaWVsZCAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRm9ybSAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEhhc2ggICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBJbnNlcnRpb24gICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgT2JqZWN0UmFuZ2UgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFBlcmlvZGljYWxFeGVjdXRlcjogZmFsc2UsDQogICAgICAgICAgICBQb3NpdGlvbiAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgUHJvdG90eXBlICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNlbGVjdG9yICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBUZW1wbGF0ZSAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgVG9nZ2xlICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFRyeSAgICAgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBBdXRvY29tcGxldGVyICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgQnVpbGRlciAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIENvbnRyb2wgICAgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBEcmFnZ2FibGUgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgRHJhZ2dhYmxlcyAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERyb3BwYWJsZXMgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBFZmZlY3QgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU29ydGFibGUgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFNvcnRhYmxlT2JzZXJ2ZXIgIDogZmFsc2UsDQogICAgICAgICAgICBTb3VuZCAgICAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgU2NyaXB0YWN1bG91cyAgICAgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIHJoaW5vID0gew0KICAgICAgICAgICAgZGVmaW5lQ2xhc3MgOiBmYWxzZSwNCiAgICAgICAgICAgIGRlc2VyaWFsaXplIDogZmFsc2UsDQogICAgICAgICAgICBnYyAgICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgaGVscCAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGxvYWQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBsb2FkQ2xhc3MgICA6IGZhbHNlLA0KICAgICAgICAgICAgcHJpbnQgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHF1aXQgICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICByZWFkRmlsZSAgICA6IGZhbHNlLA0KICAgICAgICAgICAgcmVhZFVybCAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHJ1bkNvbW1hbmQgIDogZmFsc2UsDQogICAgICAgICAgICBzZWFsICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgc2VyaWFsaXplICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHNwYXduICAgICAgIDogZmFsc2UsDQogICAgICAgICAgICBzeW5jICAgICAgICA6IGZhbHNlLA0KICAgICAgICAgICAgdG9pbnQzMiAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHZlcnNpb24gICAgIDogZmFsc2UNCiAgICAgICAgfSwNCg0KICAgICAgICBzY29wZSwgICAgICAvLyBUaGUgY3VycmVudCBzY29wZQ0KICAgICAgICBzcmMsDQogICAgICAgIHN0YWNrLA0KDQovLyBzdGFuZGFyZCBjb250YWlucyB0aGUgZ2xvYmFsIG5hbWVzIHRoYXQgYXJlIHByb3ZpZGVkIGJ5IHRoZQ0KLy8gRUNNQVNjcmlwdCBzdGFuZGFyZC4NCg0KICAgICAgICBzdGFuZGFyZCA9IHsNCiAgICAgICAgICAgIEFycmF5ICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEJvb2xlYW4gICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIERhdGUgICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRlY29kZVVSSSAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudCAgOiBmYWxzZSwNCiAgICAgICAgICAgIGVuY29kZVVSSSAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCAgOiBmYWxzZSwNCiAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgICdldmFsJyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEV2YWxFcnJvciAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGhhc093blByb3BlcnR5ICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGlzRmluaXRlICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIGlzTmFOICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIEpTT04gICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE1hdGggICAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHBhcnNlSW50ICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIHBhcnNlRmxvYXQgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFJhbmdlRXJyb3IgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFJlZmVyZW5jZUVycm9yICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFJlZ0V4cCAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFN5bnRheEVycm9yICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFR5cGVFcnJvciAgICAgICAgICAgOiBmYWxzZSwNCiAgICAgICAgICAgIFVSSUVycm9yICAgICAgICAgICAgOiBmYWxzZQ0KICAgICAgICB9LA0KDQogICAgICAgIHN0YW5kYXJkX21lbWJlciA9IHsNCiAgICAgICAgICAgIEUgICAgICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgTE4yICAgICAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBMTjEwICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIExPRzJFICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgTE9HMTBFICAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBNQVhfVkFMVUUgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIE1JTl9WQUxVRSAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgTkVHQVRJVkVfSU5GSU5JVFkgICA6IHRydWUsDQogICAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIFBPU0lUSVZFX0lORklOSVRZICAgOiB0cnVlLA0KICAgICAgICAgICAgU1FSVDFfMiAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBTUVJUMiAgICAgICAgICAgICAgIDogdHJ1ZQ0KICAgICAgICB9LA0KDQogICAgICAgIHN0cmljdF9tb2RlLA0KICAgICAgICBzeW50YXggPSB7fSwNCiAgICAgICAgdGFiLA0KICAgICAgICB0b2tlbiwNCiAgICAgICAgdXJscywNCiAgICAgICAgd2FybmluZ3MsDQoNCiAgICAgICAgd3NoID0gew0KICAgICAgICAgICAgQWN0aXZlWE9iamVjdCAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBFbnVtZXJhdG9yICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIEdldE9iamVjdCAgICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgU2NyaXB0RW5naW5lICAgICAgICAgICAgICA6IHRydWUsDQogICAgICAgICAgICBTY3JpcHRFbmdpbmVCdWlsZFZlcnNpb24gIDogdHJ1ZSwNCiAgICAgICAgICAgIFNjcmlwdEVuZ2luZU1ham9yVmVyc2lvbiAgOiB0cnVlLA0KICAgICAgICAgICAgU2NyaXB0RW5naW5lTWlub3JWZXJzaW9uICA6IHRydWUsDQogICAgICAgICAgICBWQkFycmF5ICAgICAgICAgICAgICAgICAgIDogdHJ1ZSwNCiAgICAgICAgICAgIFdTSCAgICAgICAgICAgICAgICAgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgV1NjcmlwdCAgICAgICAgICAgICAgICAgICA6IHRydWUNCiAgICAgICAgfTsNCg0KICAgICAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zLiBTb21lIG9mIHRoZXNlIGFyZSBzdHVwaWRseSBsb25nLg0KICAgICAgICB2YXIgYXgsIGN4LCB0eCwgbngsIG54ZywgbHgsIGl4LCBqeCwgZnQ7DQogICAgICAgIChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAvKmpzaGludCBtYXhsZW46MzAwICovDQoNCiAgICAgICAgICAgIC8vIHVuc2FmZSBjb21tZW50IG9yIHN0cmluZw0KICAgICAgICAgICAgYXggPSAvQGNjfDxcLz98c2NyaXB0fFxdXHMqXF18PFxzKiF8Jmx0L2k7DQoNCiAgICAgICAgICAgIC8vIHVuc2FmZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNpbGVudGx5IGRlbGV0ZWQgYnkgb25lIG9yIG1vcmUgYnJvd3NlcnMNCiAgICAgICAgICAgIGN4ID0gL1tcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS87DQoNCiAgICAgICAgICAgIC8vIHRva2VuDQogICAgICAgICAgICB0eCA9IC9eXHMqKFsoKXt9XFsuLDo7JyJ+XD9cXSNAXXw9PT89P3xcLyhcKihqc2hpbnR8anNsaW50fG1lbWJlcnM/fGdsb2JhbCk/fD18XC8pP3xcKltcLz1dP3xcKyg/Oj18XCsrKT98LSg/Oj18LSspP3wlPT98JlsmPV0/fFx8W3w9XT98Pj4/Pj89P3w8KFtcLz0hXXxcIShcW3wtLSk/fDw9Pyk/fFxePT98XCE9Pz0/fFthLXpBLVpfJF1bYS16QS1aMC05XyRdKnxbMC05XSsoW3hYXVswLTlhLWZBLUZdK3xcLlswLTldKik/KFtlRV1bK1wtXT9bMC05XSspPykvOw0KDQogICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgdGhhdCBuZWVkIGVzY2FwZW1lbnQNCiAgICAgICAgICAgIG54ID0gL1tcdTAwMDAtXHUwMDFmJjwiXC9cXFx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vOw0KICAgICAgICAgICAgbnhnID0gL1tcdTAwMDAtXHUwMDFmJjwiXC9cXFx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZzsNCg0KICAgICAgICAgICAgLy8gc3RhciBzbGFzaA0KICAgICAgICAgICAgbHggPSAvXCpcL3xcL1wqLzsNCg0KICAgICAgICAgICAgLy8gaWRlbnRpZmllcg0KICAgICAgICAgICAgaXggPSAvXihbYS16QS1aXyRdW2EtekEtWjAtOV8kXSopJC87DQoNCiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQgdXJsDQogICAgICAgICAgICBqeCA9IC9eKD86amF2YXNjcmlwdHxqc2NyaXB0fGVjbWFzY3JpcHR8dmJzY3JpcHR8bW9jaGF8bGl2ZXNjcmlwdClccyo6L2k7DQoNCiAgICAgICAgICAgIC8vIGNhdGNoZXMgLyogZmFsbHMgdGhyb3VnaCAqLyBjb21tZW50cw0KICAgICAgICAgICAgZnQgPSAvXlxzKlwvXCpccypmYWxsc1xzdGhyb3VnaFxzKlwqXC9ccyokLzsNCiAgICAgICAgfSgpKTsNCg0KICAgIGZ1bmN0aW9uIEYoKSB7fSAgICAgLy8gVXNlZCBieSBPYmplY3QuY3JlYXRlDQoNCiAgICBmdW5jdGlvbiBpc19vd24ob2JqZWN0LCBuYW1lKSB7DQoNCi8vIFRoZSBvYmplY3QuaGFzT3duUHJvcGVydHkgbWV0aG9kIGZhaWxzIHdoZW4gdGhlIHByb3BlcnR5IHVuZGVyIGNvbnNpZGVyYXRpb24NCi8vIGlzIG5hbWVkICdoYXNPd25Qcm9wZXJ0eScuIFNvIHdlIGhhdmUgdG8gdXNlIHRoaXMgbW9yZSBjb252b2x1dGVkIGZvcm0uDQoNCiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIG5hbWUpOw0KICAgIH0NCg0KLy8gUHJvdmlkZSBjcml0aWNhbCBFUzUgZnVuY3Rpb25zIHRvIEVTMy4NCg0KICAgIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG8pID09PSAnW29iamVjdCBBcnJheV0nOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgICAgIEYucHJvdG90eXBlID0gbzsNCiAgICAgICAgICAgIHJldHVybiBuZXcgRigpOw0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGlmICh0eXBlb2YgT2JqZWN0LmtleXMgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiAobykgew0KICAgICAgICAgICAgdmFyIGEgPSBbXSwgazsNCiAgICAgICAgICAgIGZvciAoayBpbiBvKSB7DQogICAgICAgICAgICAgICAgaWYgKGlzX293bihvLCBrKSkgew0KICAgICAgICAgICAgICAgICAgICBhLnB1c2goayk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGE7DQogICAgICAgIH07DQogICAgfQ0KDQovLyBOb24gc3RhbmRhcmQgbWV0aG9kcw0KDQogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmVudGl0eWlmeSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBTdHJpbmcucHJvdG90eXBlLmVudGl0eWlmeSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzDQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JykNCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpDQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBpZiAodHlwZW9mIFN0cmluZy5wcm90b3R5cGUuaXNBbHBoYSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBTdHJpbmcucHJvdG90eXBlLmlzQWxwaGEgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMgPj0gJ2EnICYmIHRoaXMgPD0gJ3pcdWZmZmYnKSB8fA0KICAgICAgICAgICAgICAgICh0aGlzID49ICdBJyAmJiB0aGlzIDw9ICdaXHVmZmZmJyk7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmlzRGlnaXQgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5pc0RpZ2l0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuICh0aGlzID49ICcwJyAmJiB0aGlzIDw9ICc5Jyk7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnN1cHBsYW50ICE9PSAnZnVuY3Rpb24nKSB7DQogICAgICAgIFN0cmluZy5wcm90b3R5cGUuc3VwcGxhbnQgPSBmdW5jdGlvbiAobykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXHsoW157fV0qKVx9L2csIGZ1bmN0aW9uIChhLCBiKSB7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBvW2JdOw0KICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHIgPT09ICdudW1iZXInID8gciA6IGE7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBpZiAodHlwZW9mIFN0cmluZy5wcm90b3R5cGUubmFtZSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBTdHJpbmcucHJvdG90eXBlLm5hbWUgPSBmdW5jdGlvbiAoKSB7DQoNCi8vIElmIHRoZSBzdHJpbmcgbG9va3MgbGlrZSBhbiBpZGVudGlmaWVyLCB0aGVuIHdlIGNhbiByZXR1cm4gaXQgYXMgaXMuDQovLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbnRyb2wgY2hhcmFjdGVycywgbm8gcXVvdGUgY2hhcmFjdGVycywgYW5kIG5vDQovLyBiYWNrc2xhc2ggY2hhcmFjdGVycywgdGhlbiB3ZSBjYW4gc2ltcGx5IHNsYXAgc29tZSBxdW90ZXMgYXJvdW5kIGl0Lg0KLy8gT3RoZXJ3aXNlIHdlIG11c3QgYWxzbyByZXBsYWNlIHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVycyB3aXRoIHNhZmUNCi8vIHNlcXVlbmNlcy4NCg0KICAgICAgICAgICAgaWYgKGl4LnRlc3QodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChueC50ZXN0KHRoaXMpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICciJyArIHRoaXMucmVwbGFjZShueGcsIGZ1bmN0aW9uIChhKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gZXNjYXBlc1thXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFx1JyArICgnMDAwMCcgKyBhLmNoYXJDb2RlQXQoKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsNCiAgICAgICAgICAgICAgICB9KSArICciJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAnIicgKyB0aGlzICsgJyInOw0KICAgICAgICB9Ow0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gY29tYmluZSh0LCBvKSB7DQogICAgICAgIHZhciBuOw0KICAgICAgICBmb3IgKG4gaW4gbykgew0KICAgICAgICAgICAgaWYgKGlzX293bihvLCBuKSkgew0KICAgICAgICAgICAgICAgIHRbbl0gPSBvW25dOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXNzdW1lKCkgew0KICAgICAgICBpZiAob3B0aW9uLmNvdWNoKQ0KICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCBjb3VjaCk7DQoNCiAgICAgICAgaWYgKG9wdGlvbi5yaGlubykNCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgcmhpbm8pOw0KDQogICAgICAgIGlmIChvcHRpb24ucHJvdG90eXBlanMpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIHByb3RvdHlwZWpzKTsNCg0KICAgICAgICBpZiAob3B0aW9uLm5vZGUpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIG5vZGUpOw0KDQogICAgICAgIGlmIChvcHRpb24uZGV2ZWwpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGRldmVsKTsNCg0KICAgICAgICBpZiAob3B0aW9uLmRvam8pDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGRvam8pOw0KDQogICAgICAgIGlmIChvcHRpb24uYnJvd3NlcikNCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgYnJvd3Nlcik7DQoNCiAgICAgICAgaWYgKG9wdGlvbi5qcXVlcnkpDQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGpxdWVyeSk7DQoNCiAgICAgICAgaWYgKG9wdGlvbi5tb290b29scykNCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgbW9vdG9vbHMpOw0KDQogICAgICAgIGlmIChvcHRpb24ud3NoKQ0KICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCB3c2gpOw0KDQogICAgICAgIGlmIChvcHRpb24uZ2xvYmFsc3RyaWN0ICYmIG9wdGlvbi5zdHJpY3QgIT09IGZhbHNlKQ0KICAgICAgICAgICAgb3B0aW9uLnN0cmljdCA9IHRydWU7DQogICAgfQ0KDQoNCi8vIFByb2R1Y2UgYW4gZXJyb3Igd2FybmluZy4NCg0KICAgIGZ1bmN0aW9uIHF1aXQobWVzc2FnZSwgbGluZSwgY2hyKSB7DQogICAgICAgIHZhciBwZXJjZW50YWdlID0gTWF0aC5mbG9vcigobGluZSAvIGxpbmVzLmxlbmd0aCkgKiAxMDApOw0KDQogICAgICAgIHRocm93IHsNCiAgICAgICAgICAgIG5hbWU6ICdKU0hpbnRFcnJvcicsDQogICAgICAgICAgICBsaW5lOiBsaW5lLA0KICAgICAgICAgICAgY2hhcmFjdGVyOiBjaHIsDQogICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlICsgIiAoIiArIHBlcmNlbnRhZ2UgKyAiJSBzY2FubmVkKS4iDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gd2FybmluZyhtLCB0LCBhLCBiLCBjLCBkKSB7DQogICAgICAgIHZhciBjaCwgbCwgdzsNCiAgICAgICAgdCA9IHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAodC5pZCA9PT0gJyhlbmQpJykgeyAgLy8gYH4NCiAgICAgICAgICAgIHQgPSB0b2tlbjsNCiAgICAgICAgfQ0KICAgICAgICBsID0gdC5saW5lIHx8IDA7DQogICAgICAgIGNoID0gdC5mcm9tIHx8IDA7DQogICAgICAgIHcgPSB7DQogICAgICAgICAgICBpZDogJyhlcnJvciknLA0KICAgICAgICAgICAgcmF3OiBtLA0KICAgICAgICAgICAgZXZpZGVuY2U6IGxpbmVzW2wgLSAxXSB8fCAnJywNCiAgICAgICAgICAgIGxpbmU6IGwsDQogICAgICAgICAgICBjaGFyYWN0ZXI6IGNoLA0KICAgICAgICAgICAgYTogYSwNCiAgICAgICAgICAgIGI6IGIsDQogICAgICAgICAgICBjOiBjLA0KICAgICAgICAgICAgZDogZA0KICAgICAgICB9Ow0KICAgICAgICB3LnJlYXNvbiA9IG0uc3VwcGxhbnQodyk7DQogICAgICAgIEpTSElOVC5lcnJvcnMucHVzaCh3KTsNCiAgICAgICAgaWYgKG9wdGlvbi5wYXNzZmFpbCkgew0KICAgICAgICAgICAgcXVpdCgnU3RvcHBpbmcuICcsIGwsIGNoKTsNCiAgICAgICAgfQ0KICAgICAgICB3YXJuaW5ncyArPSAxOw0KICAgICAgICBpZiAod2FybmluZ3MgPj0gb3B0aW9uLm1heGVycikgew0KICAgICAgICAgICAgcXVpdCgiVG9vIG1hbnkgZXJyb3JzLiIsIGwsIGNoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB3YXJuaW5nQXQobSwgbCwgY2gsIGEsIGIsIGMsIGQpIHsNCiAgICAgICAgcmV0dXJuIHdhcm5pbmcobSwgew0KICAgICAgICAgICAgbGluZTogbCwNCiAgICAgICAgICAgIGZyb206IGNoDQogICAgICAgIH0sIGEsIGIsIGMsIGQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGVycm9yKG0sIHQsIGEsIGIsIGMsIGQpIHsNCiAgICAgICAgdmFyIHcgPSB3YXJuaW5nKG0sIHQsIGEsIGIsIGMsIGQpOw0KICAgICAgICBxdWl0KCJTdG9wcGluZywgdW5hYmxlIHRvIGNvbnRpbnVlLiIsIHcubGluZSwgdy5jaGFyYWN0ZXIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGVycm9yQXQobSwgbCwgY2gsIGEsIGIsIGMsIGQpIHsNCiAgICAgICAgcmV0dXJuIGVycm9yKG0sIHsNCiAgICAgICAgICAgIGxpbmU6IGwsDQogICAgICAgICAgICBmcm9tOiBjaA0KICAgICAgICB9LCBhLCBiLCBjLCBkKTsNCiAgICB9DQoNCg0KDQovLyBsZXhpY2FsIGFuYWx5c2lzIGFuZCB0b2tlbiBjb25zdHJ1Y3Rpb24NCg0KICAgIHZhciBsZXggPSAoZnVuY3Rpb24gbGV4KCkgew0KICAgICAgICB2YXIgY2hhcmFjdGVyLCBmcm9tLCBsaW5lLCBzOw0KDQovLyBQcml2YXRlIGxleCBtZXRob2RzDQoNCiAgICAgICAgZnVuY3Rpb24gbmV4dExpbmUoKSB7DQogICAgICAgICAgICB2YXIgYXQsDQogICAgICAgICAgICAgICAgdHc7IC8vIHRyYWlsaW5nIHdoaXRlc3BhY2UgY2hlY2sNCg0KICAgICAgICAgICAgaWYgKGxpbmUgPj0gbGluZXMubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICAgICAgY2hhcmFjdGVyID0gMTsNCiAgICAgICAgICAgIHMgPSBsaW5lc1tsaW5lXTsNCiAgICAgICAgICAgIGxpbmUgKz0gMTsNCiAgICAgICAgICAgIGF0ID0gcy5zZWFyY2goLyBcdC8pOw0KDQogICAgICAgICAgICBpZiAoYXQgPj0gMCkNCiAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIk1peGVkIHNwYWNlcyBhbmQgdGFicy4iLCBsaW5lLCBhdCArIDEpOw0KDQogICAgICAgICAgICBzID0gcy5yZXBsYWNlKC9cdC9nLCB0YWIpOw0KICAgICAgICAgICAgYXQgPSBzLnNlYXJjaChjeCk7DQoNCiAgICAgICAgICAgIGlmIChhdCA+PSAwKQ0KICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5zYWZlIGNoYXJhY3Rlci4iLCBsaW5lLCBhdCk7DQoNCiAgICAgICAgICAgIGlmIChvcHRpb24ubWF4bGVuICYmIG9wdGlvbi5tYXhsZW4gPCBzLmxlbmd0aCkNCiAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkxpbmUgdG9vIGxvbmcuIiwgbGluZSwgcy5sZW5ndGgpOw0KDQogICAgICAgICAgICAvLyBDaGVjayBmb3IgdHJhaWxpbmcgd2hpdGVzcGFjZXMNCiAgICAgICAgICAgIHR3ID0gcy5zZWFyY2goL1xzKyQvKTsNCiAgICAgICAgICAgIGlmIChvcHRpb24udHJhaWxpbmcgJiYgfnR3ICYmICF+cy5zZWFyY2goL15ccyskLykpDQogICAgICAgICAgICAgICAgd2FybmluZ0F0KCJUcmFpbGluZyB3aGl0ZXNwYWNlLiIsIGxpbmUsIHR3KTsNCg0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCg0KLy8gUHJvZHVjZSBhIHRva2VuIG9iamVjdC4gIFRoZSB0b2tlbiBpbmhlcml0cyBmcm9tIGEgc3ludGF4IHN5bWJvbC4NCg0KICAgICAgICBmdW5jdGlvbiBpdCh0eXBlLCB2YWx1ZSkgew0KICAgICAgICAgICAgdmFyIGksIHQ7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJyhjb2xvciknIHx8IHR5cGUgPT09ICcocmFuZ2UpJykgew0KICAgICAgICAgICAgICAgIHQgPSB7dHlwZTogdHlwZX07DQogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICcocHVuY3R1YXRvciknIHx8DQogICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAnKGlkZW50aWZpZXIpJyAmJiBpc19vd24oc3ludGF4LCB2YWx1ZSkpKSB7DQogICAgICAgICAgICAgICAgdCA9IHN5bnRheFt2YWx1ZV0gfHwgc3ludGF4WycoZXJyb3IpJ107DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHQgPSBzeW50YXhbdHlwZV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0ID0gT2JqZWN0LmNyZWF0ZSh0KTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnKHN0cmluZyknIHx8IHR5cGUgPT09ICcocmFuZ2UpJykgew0KICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLnNjcmlwdHVybCAmJiBqeC50ZXN0KHZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlNjcmlwdCBVUkwuIiwgbGluZSwgZnJvbSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICcoaWRlbnRpZmllciknKSB7DQogICAgICAgICAgICAgICAgdC5pZGVudGlmaWVyID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdfX3Byb3RvX18nICYmICFvcHRpb24ucHJvdG8pIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJUaGUgJ3thfScgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSwgdmFsdWUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdfX2l0ZXJhdG9yX18nICYmICFvcHRpb24uaXRlcmF0b3IpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCIne2F9JyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBKYXZhU2NyaXB0IDEuNy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSwgdmFsdWUpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm5vbWVuICYmICh2YWx1ZS5jaGFyQXQoMCkgPT09ICdfJyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCh2YWx1ZS5sZW5ndGggLSAxKSA9PT0gJ18nKSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXhwZWN0ZWQge2F9IGluICd7Yn0nLiIsIGxpbmUsIGZyb20sDQogICAgICAgICAgICAgICAgICAgICAgICAiZGFuZ2xpbmcgJ18nIiwgdmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHQudmFsdWUgPSB2YWx1ZTsNCiAgICAgICAgICAgIHQubGluZSA9IGxpbmU7DQogICAgICAgICAgICB0LmNoYXJhY3RlciA9IGNoYXJhY3RlcjsNCiAgICAgICAgICAgIHQuZnJvbSA9IGZyb207DQogICAgICAgICAgICBpID0gdC5pZDsNCiAgICAgICAgICAgIGlmIChpICE9PSAnKGVuZGxpbmUpJykgew0KICAgICAgICAgICAgICAgIHByZXJlZyA9IGkgJiYNCiAgICAgICAgICAgICAgICAgICAgKCgnKCw9OlshJnw/e307Jy5pbmRleE9mKGkuY2hhckF0KGkubGVuZ3RoIC0gMSkpID49IDApIHx8DQogICAgICAgICAgICAgICAgICAgIGkgPT09ICdyZXR1cm4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0Ow0KICAgICAgICB9DQoNCi8vIFB1YmxpYyBsZXggbWV0aG9kcw0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoc291cmNlKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgICAgICAgICAgIGxpbmVzID0gc291cmNlDQogICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXHJcbi9nLCAnXG4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xyL2csICdcbicpDQogICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBzb3VyY2U7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IGxpbmUgaXMgYSBzaGViYW5nICgjISksIG1ha2UgaXQgYSBibGFuayBhbmQgbW92ZSBvbi4NCiAgICAgICAgICAgICAgICAvLyBTaGViYW5ncyBhcmUgdXNlZCBieSBOb2RlIHNjcmlwdHMuDQogICAgICAgICAgICAgICAgaWYgKGxpbmVzWzBdICYmIGxpbmVzWzBdLnN1YnN0cigwLCAyKSA9PSAnIyEnKQ0KICAgICAgICAgICAgICAgICAgICBsaW5lc1swXSA9ICcnOw0KDQogICAgICAgICAgICAgICAgbGluZSA9IDA7DQogICAgICAgICAgICAgICAgbmV4dExpbmUoKTsNCiAgICAgICAgICAgICAgICBmcm9tID0gMTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIHJhbmdlOiBmdW5jdGlvbiAoYmVnaW4sIGVuZCkgew0KICAgICAgICAgICAgICAgIHZhciBjLCB2YWx1ZSA9ICcnOw0KICAgICAgICAgICAgICAgIGZyb20gPSBjaGFyYWN0ZXI7DQogICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KDApICE9PSBiZWdpbikgew0KICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIGJlZ2luLCBzLmNoYXJBdCgwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSAxOw0KICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQoMCk7DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICcnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiTWlzc2luZyAne2F9Jy4iLCBsaW5lLCBjaGFyYWN0ZXIsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgZW5kOg0KICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHJhbmdlKScsIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmV4cGVjdGVkICd7YX0nLiIsIGxpbmUsIGNoYXJhY3RlciwgYyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gYzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0sDQoNCi8vIHRva2VuIC0tIHRoaXMgaXMgY2FsbGVkIGJ5IGFkdmFuY2UgdG8gZ2V0IHRoZSBuZXh0IHRva2VuLg0KDQogICAgICAgICAgICB0b2tlbjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHZhciBiLCBjLCBjYXB0dXJlcywgZCwgZGVwdGgsIGhpZ2gsIGksIGwsIGxvdywgcSwgdDsNCg0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1hdGNoKHgpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB4LmV4ZWMocyksIHIxOw0KICAgICAgICAgICAgICAgICAgICBpZiAocikgew0KICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHJbMF0ubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSByWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHIxLmNoYXJBdCgwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cihsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBjaGFyYWN0ZXIgKyBsIC0gcjEubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IGw7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdHJpbmcoeCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgYywgaiwgciA9ICcnOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChqc29ubW9kZSAmJiB4ICE9PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiU3RyaW5ncyBtdXN0IHVzZSBkb3VibGVxdW90ZS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXNjKG4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcGFyc2VJbnQocy5zdWJzdHIoaiArIDEsIG4pLCAxNik7DQogICAgICAgICAgICAgICAgICAgICAgICBqICs9IG47DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAzMiAmJiBpIDw9IDEyNiAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9PSAzNCAmJiBpICE9PSA5MiAmJiBpICE9PSAzOSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5uZWNlc3NhcnkgZXNjYXBlbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IG47DQogICAgICAgICAgICAgICAgICAgICAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBqID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRMaW5lKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5jbG9zZWQgc3RyaW5nLiIsIGxpbmUsIGZyb20pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChqKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSB4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKGogKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQoJyhzdHJpbmcpJywgciwgeCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXG4nIHx8IGMgPT09ICdccicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiQ29udHJvbCBjaGFyYWN0ZXIgaW4gc3RyaW5nOiB7YX0uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciArIGosIHMuc2xpY2UoMCwgaikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChqKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxcJy4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1xiJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXGYnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcbic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1xyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXHQnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjKDQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxcdi4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXHYnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxceC0uIiwgbGluZSwgY2hhcmFjdGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MoMik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiQmFkIGVzY2FwZW1lbnQuIiwgbGluZSwgY2hhcmFjdGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByICs9IGM7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQobmV4dExpbmUoKSA/ICcoZW5kbGluZSknIDogJyhlbmQpJywgJycpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHQgPSBtYXRjaCh0eCk7DQogICAgICAgICAgICAgICAgICAgIGlmICghdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHMgJiYgcyA8ICchJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cigxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5leHBlY3RlZCAne2F9Jy4iLCBsaW5lLCBjaGFyYWN0ZXIsIHMuc3Vic3RyKDAsIDEpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCg0KICAgIC8vICAgICAgaWRlbnRpZmllcg0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc0FscGhhKCkgfHwgYyA9PT0gJ18nIHx8IGMgPT09ICckJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKGlkZW50aWZpZXIpJywgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAvLyAgICAgIG51bWJlcg0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc0RpZ2l0KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKE51bWJlcih0KSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJCYWQgbnVtYmVyICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zdWJzdHIoMCwgMSkuaXNBbHBoYSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiTWlzc2luZyBzcGFjZSBhZnRlciAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciwgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnMCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHQuc3Vic3RyKDEsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5pc0RpZ2l0KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi5pZCAhPT0gJy4nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJEb24ndCB1c2UgZXh0cmEgbGVhZGluZyB6ZXJvcyAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25tb2RlICYmIChkID09PSAneCcgfHwgZCA9PT0gJ1gnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJBdm9pZCAweC0uICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciwgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc3Vic3RyKHQubGVuZ3RoIC0gMSkgPT09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiQSB0cmFpbGluZyBkZWNpbWFsIHBvaW50IGNhbiBiZSBjb25mdXNlZCB3aXRoIGEgZG90ICd7YX0nLiIsIGxpbmUsIGNoYXJhY3RlciwgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKG51bWJlciknLCB0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgew0KDQogICAgLy8gICAgICBzdHJpbmcNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICInIjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nKHQpOw0KDQogICAgLy8gICAgICAvLyBjb21tZW50DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8vJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5leHBlY3RlZCBjb21tZW50LiIsIGxpbmUsIGNoYXJhY3Rlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5jb21tZW50ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgIC8vICAgICAgLyogY29tbWVudA0KDQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvKic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXhwZWN0ZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzLnNlYXJjaChseCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmUoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5jbG9zZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSBpICsgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zdWJzdHIoaSwgMSkgPT09ICcvJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJOZXN0ZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIoaSArIDIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmNvbW1lbnQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgLy8gICAgICAvKm1lbWJlcnMgLypqc2hpbnQgLypnbG9iYWwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyptZW1iZXJzJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qbWVtYmVyJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qanNoaW50JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qanNsaW50JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qZ2xvYmFsJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyovJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NwZWNpYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXI6IGNoYXJhY3RlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogZnJvbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgLy8gICAgICAvDQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uaWQgPT09ICcvPScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgNCiJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIGNhbiBiZSBjb25mdXNlZCB3aXRoICcvPScuIiwgbGluZSwgZnJvbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVyZWcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlcyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJVbmNsb3NlZCByZWd1bGFyIGV4cHJlc3Npb24uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCwgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuc3Vic3RyKDAsIGwgLSAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtOiB0cnVlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocVtzLmNoYXJBdChsKV0gPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcVtzLmNoYXJBdChsKV0gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHMuY2hhckF0KDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID09PSAnLycgfHwgcSA9PT0gJyonKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIkNvbmZ1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0KCcocmVnZXhwKScsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiVW5leHBlY3RlZCBjb250cm9sIGNoYXJhY3RlciBpbiByZWd1bGFyIGV4cHJlc3Npb24uIiwgbGluZSwgZnJvbSArIGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJzwnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJVbmV4cGVjdGVkIGVzY2FwZWQgY2hhcmFjdGVyICd7YX0nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4iLCBsaW5lLCBmcm9tICsgbCwgYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChsKSA9PT0gJz8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLmNoYXJBdChsKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsIGxpbmUsIGZyb20gKyBsLCAnOicsIHMuY2hhckF0KGwpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVzICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsICcpJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggLT0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocy5jaGFyQXQobCkgPT09ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJTcGFjZXMgYXJlIGhhcmQgdG8gY291bnQuIFVzZSB7e2F9fS4iLCBsaW5lLCBmcm9tICsgbCwgcSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnJlZ2V4cCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJJbnNlY3VyZSAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCwgYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5jaGFyQXQobCkgPT09ICddJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5lc2NhcGVkICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsICdeJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJFbXB0eSBjbGFzcy4iLCBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKyBsIC0gMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCmtsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ14nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsLCAnLScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxICYmICFvcHRpb24ucmVnZXhkYXNoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsIC0gMSwgJy0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGtsYXNzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJVbmV4cGVjdGVkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4iLCBsaW5lLCBmcm9tICsgbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc8Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJVbmV4cGVjdGVkIGVzY2FwZWQgY2hhcmFjdGVyICd7YX0nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4iLCBsaW5lLCBmcm9tICsgbCwgYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsIC0gMSwgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnJlZ2V4cCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkluc2VjdXJlICd7YX0nLiIsIGxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXNjYXBlZCAne2F9Jy4iLCBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMuY2hhckF0KGwpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KGwpID09PSAnPycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgNCiJFeHBlY3RlZCBhIG51bWJlciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwgbGluZSwgZnJvbSArIGwsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gK2M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9ICtjICsgKGxvdyAqIDEwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gbG93Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gSW5maW5pdHk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICtjOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSArYyArIChoaWdoICogMTApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQobCkgIT09ICd9Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KA0KIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLCBsaW5lLCBmcm9tICsgbCwgJ30nLCBjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQobCkgPT09ICc/Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3cgPiBoaWdoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoDQoiJ3thfScgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gJ3tifScuIiwgbGluZSwgZnJvbSArIGwsIGxvdywgaGlnaCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuc3Vic3RyKDAsIGwgLSAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cihsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0KCcocmVnZXhwKScsIGMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQoJyhwdW5jdHVhdG9yKScsIHQpOw0KDQogICAgLy8gICAgICBwdW5jdHVhdG9yDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHB1bmN0dWF0b3IpJywgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHB1bmN0dWF0b3IpJywgdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSgpKTsNCg0KDQogICAgZnVuY3Rpb24gYWRkbGFiZWwodCwgdHlwZSkgew0KDQogICAgICAgIGlmICh0ID09PSAnaGFzT3duUHJvcGVydHknKSB7DQogICAgICAgICAgICB3YXJuaW5nKCInaGFzT3duUHJvcGVydHknIGlzIGEgcmVhbGx5IGJhZCBuYW1lLiIpOw0KICAgICAgICB9DQoNCi8vIERlZmluZSB0IGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGluIHRoZSBjdXJyZW50IHNjb3BlLg0KDQogICAgICAgIGlmIChpc19vd24oZnVuY3QsIHQpICYmICFmdW5jdFsnKGdsb2JhbCknXSkgew0KICAgICAgICAgICAgaWYgKGZ1bmN0W3RdID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5sYXRlZGVmKQ0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyB3YXMgdXNlZCBiZWZvcmUgaXQgd2FzIGRlZmluZWQuIiwgbmV4dHRva2VuLCB0KTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uc2hhZG93KQ0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBhbHJlYWR5IGRlZmluZWQuIiwgbmV4dHRva2VuLCB0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0W3RdID0gdHlwZTsNCiAgICAgICAgaWYgKGZ1bmN0WycoZ2xvYmFsKSddKSB7DQogICAgICAgICAgICBnbG9iYWxbdF0gPSBmdW5jdDsNCiAgICAgICAgICAgIGlmIChpc19vd24oaW1wbGllZCwgdCkpIHsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmxhdGVkZWYpDQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIHdhcyB1c2VkIGJlZm9yZSBpdCB3YXMgZGVmaW5lZC4iLCBuZXh0dG9rZW4sIHQpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZSBpbXBsaWVkW3RdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc2NvcGVbdF0gPSBmdW5jdDsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gZG9PcHRpb24oKSB7DQogICAgICAgIHZhciBiLCBvYmosIGZpbHRlciwgbyA9IG5leHR0b2tlbi52YWx1ZSwgdCwgdjsNCiAgICAgICAgc3dpdGNoIChvKSB7DQogICAgICAgIGNhc2UgJyovJzoNCiAgICAgICAgICAgIGVycm9yKCJVbmJlZ3VuIGNvbW1lbnQuIik7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnLyptZW1iZXJzJzoNCiAgICAgICAgY2FzZSAnLyptZW1iZXInOg0KICAgICAgICAgICAgbyA9ICcvKm1lbWJlcnMnOw0KICAgICAgICAgICAgaWYgKCFtZW1iZXJzT25seSkgew0KICAgICAgICAgICAgICAgIG1lbWJlcnNPbmx5ID0ge307DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmogPSBtZW1iZXJzT25seTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICcvKmpzaGludCc6DQogICAgICAgIGNhc2UgJy8qanNsaW50JzoNCiAgICAgICAgICAgIG9iaiA9IG9wdGlvbjsNCiAgICAgICAgICAgIGZpbHRlciA9IGJvb2xPcHRpb25zOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJy8qZ2xvYmFsJzoNCiAgICAgICAgICAgIG9iaiA9IHByZWRlZmluZWQ7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGVycm9yKCJXaGF0PyIpOw0KICAgICAgICB9DQogICAgICAgIHQgPSBsZXgudG9rZW4oKTsNCmxvb3A6ICAgZm9yICg7Oykgew0KICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09ICdzcGVjaWFsJyAmJiB0LnZhbHVlID09PSAnKi8nKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh0LmlkICE9PSAnKGVuZGxpbmUpJyAmJiB0LmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHQgPSBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0LnR5cGUgIT09ICcoc3RyaW5nKScgJiYgdC50eXBlICE9PSAnKGlkZW50aWZpZXIpJyAmJg0KICAgICAgICAgICAgICAgICAgICBvICE9PSAnLyptZW1iZXJzJykgew0KICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgb3B0aW9uLiIsIHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdiA9IGxleC50b2tlbigpOw0KICAgICAgICAgICAgaWYgKHYuaWQgPT09ICc6Jykgew0KICAgICAgICAgICAgICAgIHYgPSBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgICAgICBpZiAob2JqID09PSBtZW1iZXJzT25seSkgew0KICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgJyovJywgJzonKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHQudmFsdWUgPT09ICdpbmRlbnQnICYmIChvID09PSAnLypqc2hpbnQnIHx8IG8gPT09ICcvKmpzbGludCcpKSB7DQogICAgICAgICAgICAgICAgICAgIGIgPSArdi52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAnbnVtYmVyJyB8fCAhaXNGaW5pdGUoYikgfHwgYiA8PSAwIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihiKSAhPT0gYikgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgc21hbGwgaW50ZWdlciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgdi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb2JqLndoaXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgb2JqLmluZGVudCA9IGI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0LnZhbHVlID09PSAnbWF4ZXJyJyAmJiAobyA9PT0gJy8qanNoaW50JyB8fCBvID09PSAnLypqc2xpbnQnKSkgew0KICAgICAgICAgICAgICAgICAgICBiID0gK3YudmFsdWU7DQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYiAhPT0gJ251bWJlcicgfHwgIWlzRmluaXRlKGIpIHx8IGIgPD0gMCB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYikgIT09IGIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhIHNtYWxsIGludGVnZXIgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIHYudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG9iai5tYXhlcnIgPSBiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodC52YWx1ZSA9PT0gJ21heGxlbicgJiYgKG8gPT09ICcvKmpzaGludCcgfHwgbyA9PT0gJy8qanNsaW50JykpIHsNCiAgICAgICAgICAgICAgICAgICAgYiA9ICt2LnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGIgIT09ICdudW1iZXInIHx8ICFpc0Zpbml0ZShiKSB8fCBiIDw9IDAgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGIpICE9PSBiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYSBzbWFsbCBpbnRlZ2VyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCB2LnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBvYmoubWF4bGVuID0gYjsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYudmFsdWUgPT09ICd0cnVlJykgew0KICAgICAgICAgICAgICAgICAgICBvYmpbdC52YWx1ZV0gPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodi52YWx1ZSA9PT0gJ2ZhbHNlJykgew0KICAgICAgICAgICAgICAgICAgICBvYmpbdC52YWx1ZV0gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG9wdGlvbiB2YWx1ZS4iLCB2KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdCA9IGxleC50b2tlbigpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAobyA9PT0gJy8qanNoaW50JyB8fCBvID09PSAnLypqc2xpbnQnKSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yKCJNaXNzaW5nIG9wdGlvbiB2YWx1ZS4iLCB0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgb2JqW3QudmFsdWVdID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdCA9IHY7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZpbHRlcikgew0KICAgICAgICAgICAgYXNzdW1lKCk7DQogICAgICAgIH0NCiAgICB9DQoNCg0KLy8gV2UgbmVlZCBhIHBlZWsgZnVuY3Rpb24uIElmIGl0IGhhcyBhbiBhcmd1bWVudCwgaXQgcGVla3MgdGhhdCBtdWNoIGZhcnRoZXINCi8vIGFoZWFkLiBJdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoDQovLyAgICAgZm9yICggdmFyIGkgaW4gLi4uDQovLyBmcm9tDQovLyAgICAgZm9yICggdmFyIGkgPSAuLi4NCg0KICAgIGZ1bmN0aW9uIHBlZWsocCkgew0KICAgICAgICB2YXIgaSA9IHAgfHwgMCwgaiA9IDAsIHQ7DQoNCiAgICAgICAgd2hpbGUgKGogPD0gaSkgew0KICAgICAgICAgICAgdCA9IGxvb2thaGVhZFtqXTsNCiAgICAgICAgICAgIGlmICghdCkgew0KICAgICAgICAgICAgICAgIHQgPSBsb29rYWhlYWRbal0gPSBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGogKz0gMTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdDsNCiAgICB9DQoNCg0KDQovLyBQcm9kdWNlIHRoZSBuZXh0IHRva2VuLiBJdCBsb29rcyBmb3IgcHJvZ3JhbW1pbmcgZXJyb3JzLg0KDQogICAgZnVuY3Rpb24gYWR2YW5jZShpZCwgdCkgew0KICAgICAgICBzd2l0Y2ggKHRva2VuLmlkKSB7DQogICAgICAgIGNhc2UgJyhudW1iZXIpJzoNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcuJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkEgZG90IGZvbGxvd2luZyBhIG51bWJlciBjYW4gYmUgY29uZnVzZWQgd2l0aCBhIGRlY2ltYWwgcG9pbnQuIiwgdG9rZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJy0nOg0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJy0nIHx8IG5leHR0b2tlbi5pZCA9PT0gJy0tJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBtaW51c3Nlcy4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICcrJzoNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcrJyB8fCBuZXh0dG9rZW4uaWQgPT09ICcrKycpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgcGx1c3Nlcy4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnKHN0cmluZyknIHx8IHRva2VuLmlkZW50aWZpZXIpIHsNCiAgICAgICAgICAgIGFub25uYW1lID0gdG9rZW4udmFsdWU7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoaWQgJiYgbmV4dHRva2VuLmlkICE9PSBpZCkgew0KICAgICAgICAgICAgaWYgKHQpIHsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKGVuZCknKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVubWF0Y2hlZCAne2F9Jy4iLCB0LCB0LmlkKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyB0byBtYXRjaCAne2J9JyBmcm9tIGxpbmUge2N9IGFuZCBpbnN0ZWFkIHNhdyAne2R9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgaWQsIHQuaWQsIHQubGluZSwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi50eXBlICE9PSAnKGlkZW50aWZpZXIpJyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbi52YWx1ZSAhPT0gaWQpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgaWQsIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcHJldnRva2VuID0gdG9rZW47DQogICAgICAgIHRva2VuID0gbmV4dHRva2VuOw0KICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICBuZXh0dG9rZW4gPSBsb29rYWhlYWQuc2hpZnQoKSB8fCBsZXgudG9rZW4oKTsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoZW5kKScgfHwgbmV4dHRva2VuLmlkID09PSAnKGVycm9yKScpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLnR5cGUgPT09ICdzcGVjaWFsJykgew0KICAgICAgICAgICAgICAgIGRvT3B0aW9uKCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICcoZW5kbGluZSknKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KDQovLyBUaGlzIGlzIHRoZSBoZWFydCBvZiBKU0hJTlQsIHRoZSBQcmF0dCBwYXJzZXIuIEluIGFkZGl0aW9uIHRvIHBhcnNpbmcsIGl0DQovLyBpcyBsb29raW5nIGZvciBhZCBob2MgbGludCBwYXR0ZXJucy4gV2UgYWRkIC5mdWQgdG8gUHJhdHQncyBtb2RlbCwgd2hpY2ggaXMNCi8vIGxpa2UgLm51ZCBleGNlcHQgdGhhdCBpdCBpcyBvbmx5IHVzZWQgb24gdGhlIGZpcnN0IHRva2VuIG9mIGEgc3RhdGVtZW50Lg0KLy8gSGF2aW5nIC5mdWQgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gZGVmaW5lIHN0YXRlbWVudC1vcmllbnRlZCBsYW5ndWFnZXMgbGlrZQ0KLy8gSmF2YVNjcmlwdC4gSSByZXRhaW5lZCBQcmF0dCdzIG5vbWVuY2xhdHVyZS4NCg0KLy8gLm51ZCAgICAgTnVsbCBkZW5vdGF0aW9uDQovLyAuZnVkICAgICBGaXJzdCBudWxsIGRlbm90YXRpb24NCi8vIC5sZWQgICAgIExlZnQgZGVub3RhdGlvbg0KLy8gIGxicCAgICAgTGVmdCBiaW5kaW5nIHBvd2VyDQovLyAgcmJwICAgICBSaWdodCBiaW5kaW5nIHBvd2VyDQoNCi8vIFRoZXkgYXJlIGVsZW1lbnRzIG9mIHRoZSBwYXJzaW5nIG1ldGhvZCBjYWxsZWQgVG9wIERvd24gT3BlcmF0b3IgUHJlY2VkZW5jZS4NCg0KICAgIGZ1bmN0aW9uIGV4cHJlc3Npb24ocmJwLCBpbml0aWFsKSB7DQogICAgICAgIHZhciBsZWZ0LCBpc0FycmF5ID0gZmFsc2U7DQoNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhlbmQpJykNCiAgICAgICAgICAgIGVycm9yKCJVbmV4cGVjdGVkIGVhcmx5IGVuZCBvZiBwcm9ncmFtLiIsIHRva2VuKTsNCg0KICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgIGlmIChpbml0aWFsKSB7DQogICAgICAgICAgICBhbm9ubmFtZSA9ICdhbm9ueW1vdXMnOw0KICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gdG9rZW4udmFsdWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGluaXRpYWwgPT09IHRydWUgJiYgdG9rZW4uZnVkKSB7DQogICAgICAgICAgICBsZWZ0ID0gdG9rZW4uZnVkKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodG9rZW4ubnVkKSB7DQogICAgICAgICAgICAgICAgbGVmdCA9IHRva2VuLm51ZCgpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLnR5cGUgPT09ICcobnVtYmVyKScgJiYgdG9rZW4uaWQgPT09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJBIGxlYWRpbmcgZGVjaW1hbCBwb2ludCBjYW4gYmUgY29uZnVzZWQgd2l0aCBhIGRvdDogJy57YX0nLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhbiBpZGVudGlmaWVyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2hpbGUgKHJicCA8IG5leHR0b2tlbi5sYnApIHsNCiAgICAgICAgICAgICAgICBpc0FycmF5ID0gdG9rZW4udmFsdWUgPT0gJ0FycmF5JzsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkgJiYgdG9rZW4uaWQgPT0gJygnICYmIG5leHR0b2tlbi5pZCA9PSAnKScpDQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgYXJyYXkgbGl0ZXJhbCBub3RhdGlvbiBbXS4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgaWYgKHRva2VuLmxlZCkgew0KICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdG9rZW4ubGVkKGxlZnQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhbiBvcGVyYXRvciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBsZWZ0Ow0KICAgIH0NCg0KDQovLyBGdW5jdGlvbnMgZm9yIGNvbmZvcm1hbmNlIG9mIHN0eWxlLg0KDQogICAgZnVuY3Rpb24gYWRqYWNlbnQobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAob3B0aW9uLndoaXRlKSB7DQogICAgICAgICAgICBpZiAobGVmdC5jaGFyYWN0ZXIgIT09IHJpZ2h0LmZyb20gJiYgbGVmdC5saW5lID09PSByaWdodC5saW5lKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAne2F9Jy4iLCByaWdodCwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub2JyZWFrKGxlZnQsIHJpZ2h0KSB7DQogICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOw0KICAgICAgICByaWdodCA9IHJpZ2h0IHx8IG5leHR0b2tlbjsNCiAgICAgICAgaWYgKG9wdGlvbi53aGl0ZSAmJiAobGVmdC5jaGFyYWN0ZXIgIT09IHJpZ2h0LmZyb20gfHwgbGVmdC5saW5lICE9PSByaWdodC5saW5lKSkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBiZWZvcmUgJ3thfScuIiwgcmlnaHQsIHJpZ2h0LnZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG5vc3BhY2UobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAob3B0aW9uLndoaXRlICYmICFsZWZ0LmNvbW1lbnQpIHsNCiAgICAgICAgICAgIGlmIChsZWZ0LmxpbmUgPT09IHJpZ2h0LmxpbmUpIHsNCiAgICAgICAgICAgICAgICBhZGphY2VudChsZWZ0LCByaWdodCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub25hZGphY2VudChsZWZ0LCByaWdodCkgew0KICAgICAgICBpZiAob3B0aW9uLndoaXRlKSB7DQogICAgICAgICAgICBsZWZ0ID0gbGVmdCB8fCB0b2tlbjsNCiAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICAgICAgaWYgKGxlZnQubGluZSA9PT0gcmlnaHQubGluZSAmJiBsZWZ0LmNoYXJhY3RlciA9PT0gcmlnaHQuZnJvbSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3Npbmcgc3BhY2UgYWZ0ZXIgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub2JyZWFrbm9uYWRqYWNlbnQobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOw0KICAgICAgICBpZiAoIW9wdGlvbi5sYXhicmVhayAmJiBsZWZ0LmxpbmUgIT09IHJpZ2h0LmxpbmUpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBsaW5lIGJyZWFraW5nIGJlZm9yZSAne2F9Jy4iLCByaWdodCwgcmlnaHQuaWQpOw0KICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi53aGl0ZSkgew0KICAgICAgICAgICAgbGVmdCA9IGxlZnQgfHwgdG9rZW47DQogICAgICAgICAgICByaWdodCA9IHJpZ2h0IHx8IG5leHR0b2tlbjsNCiAgICAgICAgICAgIGlmIChsZWZ0LmNoYXJhY3RlciA9PT0gcmlnaHQuZnJvbSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3Npbmcgc3BhY2UgYWZ0ZXIgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbmRlbnRhdGlvbihiaWFzKSB7DQogICAgICAgIHZhciBpOw0KICAgICAgICBpZiAob3B0aW9uLndoaXRlICYmIG5leHR0b2tlbi5pZCAhPT0gJyhlbmQpJykgew0KICAgICAgICAgICAgaSA9IGluZGVudCArIChiaWFzIHx8IDApOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5mcm9tICE9PSBpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygNCiJFeHBlY3RlZCAne2F9JyB0byBoYXZlIGFuIGluZGVudGF0aW9uIGF0IHtifSBpbnN0ZWFkIGF0IHtjfS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUsIGksIG5leHR0b2tlbi5mcm9tKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG5vbGluZWJyZWFrKHQpIHsNCiAgICAgICAgdCA9IHQgfHwgdG9rZW47DQogICAgICAgIGlmICh0LmxpbmUgIT09IG5leHR0b2tlbi5saW5lKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJMaW5lIGJyZWFraW5nIGVycm9yICd7YX0nLiIsIHQsIHQudmFsdWUpOw0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiBjb21tYSgpIHsNCiAgICAgICAgaWYgKHRva2VuLmxpbmUgIT09IG5leHR0b2tlbi5saW5lKSB7DQogICAgICAgICAgICBpZiAoIW9wdGlvbi5sYXhicmVhaykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBsaW5lIGJyZWFraW5nIGJlZm9yZSAne2F9Jy4iLCB0b2tlbiwgbmV4dHRva2VuLmlkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5jaGFyYWN0ZXIgIT09IG5leHR0b2tlbi5mcm9tICYmIG9wdGlvbi53aGl0ZSkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAne2F9Jy4iLCBuZXh0dG9rZW4sIHRva2VuLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBhZHZhbmNlKCcsJyk7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgIH0NCg0KDQovLyBGdW5jdGlvbmFsIGNvbnN0cnVjdG9ycyBmb3IgbWFraW5nIHRoZSBzeW1ib2xzIHRoYXQgd2lsbCBiZSBpbmhlcml0ZWQgYnkNCi8vIHRva2Vucy4NCg0KICAgIGZ1bmN0aW9uIHN5bWJvbChzLCBwKSB7DQogICAgICAgIHZhciB4ID0gc3ludGF4W3NdOw0KICAgICAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICBzeW50YXhbc10gPSB4ID0gew0KICAgICAgICAgICAgICAgIGlkOiBzLA0KICAgICAgICAgICAgICAgIGxicDogcCwNCiAgICAgICAgICAgICAgICB2YWx1ZTogcw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGRlbGltKHMpIHsNCiAgICAgICAgcmV0dXJuIHN5bWJvbChzLCAwKTsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0bXQocywgZikgew0KICAgICAgICB2YXIgeCA9IGRlbGltKHMpOw0KICAgICAgICB4LmlkZW50aWZpZXIgPSB4LnJlc2VydmVkID0gdHJ1ZTsNCiAgICAgICAgeC5mdWQgPSBmOw0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGJsb2Nrc3RtdChzLCBmKSB7DQogICAgICAgIHZhciB4ID0gc3RtdChzLCBmKTsNCiAgICAgICAgeC5ibG9jayA9IHRydWU7DQogICAgICAgIHJldHVybiB4Ow0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gcmVzZXJ2ZU5hbWUoeCkgew0KICAgICAgICB2YXIgYyA9IHguaWQuY2hhckF0KDApOw0KICAgICAgICBpZiAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSB7DQogICAgICAgICAgICB4LmlkZW50aWZpZXIgPSB4LnJlc2VydmVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHByZWZpeChzLCBmKSB7DQogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIDE1MCk7DQogICAgICAgIHJlc2VydmVOYW1lKHgpOw0KICAgICAgICB4Lm51ZCA9ICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykgPyBmIDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTUwKTsNCiAgICAgICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOw0KICAgICAgICAgICAgaWYgKHRoaXMuaWQgPT09ICcrKycgfHwgdGhpcy5pZCA9PT0gJy0tJykgew0KICAgICAgICAgICAgICAgIGlmIChvcHRpb24ucGx1c3BsdXMpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCB1c2Ugb2YgJ3thfScuIiwgdGhpcywgdGhpcy5pZCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoIXRoaXMucmlnaHQuaWRlbnRpZmllciB8fCB0aGlzLnJpZ2h0LnJlc2VydmVkKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pZCAhPT0gJy4nICYmIHRoaXMucmlnaHQuaWQgIT09ICdbJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJCYWQgb3BlcmFuZC4iLCB0aGlzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIHg7DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiB0eXBlKHMsIGYpIHsNCiAgICAgICAgdmFyIHggPSBkZWxpbShzKTsNCiAgICAgICAgeC50eXBlID0gczsNCiAgICAgICAgeC5udWQgPSBmOw0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHJlc2VydmUocywgZikgew0KICAgICAgICB2YXIgeCA9IHR5cGUocywgZik7DQogICAgICAgIHguaWRlbnRpZmllciA9IHgucmVzZXJ2ZWQgPSB0cnVlOw0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHJlc2VydmV2YXIocywgdikgew0KICAgICAgICByZXR1cm4gcmVzZXJ2ZShzLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICB2KHRoaXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0pOw0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gaW5maXgocywgZiwgcCwgdykgew0KICAgICAgICB2YXIgeCA9IHN5bWJvbChzLCBwKTsNCiAgICAgICAgcmVzZXJ2ZU5hbWUoeCk7DQogICAgICAgIHgubGVkID0gZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgICAgIGlmICghdykgew0KICAgICAgICAgICAgICAgIG5vYnJlYWtub25hZGphY2VudChwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgIHJldHVybiBmKGxlZnQsIHRoaXMpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0Ow0KICAgICAgICAgICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKHApOw0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHJlbGF0aW9uKHMsIGYpIHsNCiAgICAgICAgdmFyIHggPSBzeW1ib2wocywgMTAwKTsNCiAgICAgICAgeC5sZWQgPSBmdW5jdGlvbiAobGVmdCkgew0KICAgICAgICAgICAgbm9icmVha25vbmFkamFjZW50KHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgICAgICB2YXIgcmlnaHQgPSBleHByZXNzaW9uKDEwMCk7DQogICAgICAgICAgICBpZiAoKGxlZnQgJiYgbGVmdC5pZCA9PT0gJ05hTicpIHx8IChyaWdodCAmJiByaWdodC5pZCA9PT0gJ05hTicpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiVXNlIHRoZSBpc05hTiBmdW5jdGlvbiB0byBjb21wYXJlIHdpdGggTmFOLiIsIHRoaXMpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChmKSB7DQogICAgICAgICAgICAgICAgZi5hcHBseSh0aGlzLCBbbGVmdCwgcmlnaHRdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsZWZ0LmlkID09PSAnIScpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgdXNlIG9mICd7YX0nLiIsIGxlZnQsICchJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmlnaHQuaWQgPT09ICchJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyB1c2Ugb2YgJ3thfScuIiwgbGVmdCwgJyEnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7DQogICAgICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIHg7DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiBpc1Bvb3JSZWxhdGlvbihub2RlKSB7DQogICAgICAgIHJldHVybiBub2RlICYmDQogICAgICAgICAgICAgICgobm9kZS50eXBlID09PSAnKG51bWJlciknICYmICtub2RlLnZhbHVlID09PSAwKSB8fA0KICAgICAgICAgICAgICAgKG5vZGUudHlwZSA9PT0gJyhzdHJpbmcpJyAmJiBub2RlLnZhbHVlID09PSAnJykgfHwNCiAgICAgICAgICAgICAgIChub2RlLnR5cGUgPT09ICdudWxsJyAmJiAhb3B0aW9uLmVxbnVsbCkgfHwNCiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPT09ICd0cnVlJyB8fA0KICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ2ZhbHNlJyB8fA0KICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ3VuZGVmaW5lZCcpOw0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gYXNzaWdub3AocywgZikgew0KICAgICAgICBzeW1ib2wocywgMjApLmV4cHMgPSB0cnVlOw0KICAgICAgICByZXR1cm4gaW5maXgocywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsNCiAgICAgICAgICAgIHZhciBsOw0KICAgICAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsNCiAgICAgICAgICAgIGlmIChwcmVkZWZpbmVkW2xlZnQudmFsdWVdID09PSBmYWxzZSAmJg0KICAgICAgICAgICAgICAgICAgICBzY29wZVtsZWZ0LnZhbHVlXVsnKGdsb2JhbCknXSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlJlYWQgb25seS4iLCBsZWZ0KTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFsnZnVuY3Rpb24nXSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIGEgZnVuY3Rpb24uIiwgbGVmdCwgbGVmdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobGVmdCkgew0KICAgICAgICAgICAgICAgIGlmIChsZWZ0LmlkID09PSAnLicgfHwgbGVmdC5pZCA9PT0gJ1snKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghbGVmdC5sZWZ0IHx8IGxlZnQubGVmdC52YWx1ZSA9PT0gJ2FyZ3VtZW50cycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoJ0JhZCBhc3NpZ25tZW50LicsIHRoYXQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoYXQucmlnaHQgPSBleHByZXNzaW9uKDE5KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0LmlkZW50aWZpZXIgJiYgIWxlZnQucmVzZXJ2ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0W2xlZnQudmFsdWVdID09PSAnZXhjZXB0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRG8gbm90IGFzc2lnbiB0byB0aGUgZXhjZXB0aW9uIHBhcmFtZXRlci4iLCBsZWZ0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGF0LnJpZ2h0ID0gZXhwcmVzc2lvbigxOSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGVmdCA9PT0gc3ludGF4WydmdW5jdGlvbiddKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQoiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBpbiBhbiBhc3NpZ25tZW50IGFuZCBpbnN0ZWFkIHNhdyBhIGZ1bmN0aW9uIGludm9jYXRpb24uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yKCJCYWQgYXNzaWdubWVudC4iLCB0aGF0KTsNCiAgICAgICAgfSwgMjApOw0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gYml0d2lzZShzLCBmLCBwKSB7DQogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIHApOw0KICAgICAgICByZXNlcnZlTmFtZSh4KTsNCiAgICAgICAgeC5sZWQgPSAodHlwZW9mIGYgPT09ICdmdW5jdGlvbicpID8gZiA6IGZ1bmN0aW9uIChsZWZ0KSB7DQogICAgICAgICAgICBpZiAob3B0aW9uLmJpdHdpc2UpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHVzZSBvZiAne2F9Jy4iLCB0aGlzLCB0aGlzLmlkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7DQogICAgICAgICAgICB0aGlzLnJpZ2h0ID0gZXhwcmVzc2lvbihwKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGJpdHdpc2Vhc3NpZ25vcChzKSB7DQogICAgICAgIHN5bWJvbChzLCAyMCkuZXhwcyA9IHRydWU7DQogICAgICAgIHJldHVybiBpbmZpeChzLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgew0KICAgICAgICAgICAgaWYgKG9wdGlvbi5iaXR3aXNlKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCB1c2Ugb2YgJ3thfScuIiwgdGhhdCwgdGhhdC5pZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBub25hZGphY2VudChwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgaWYgKGxlZnQpIHsNCiAgICAgICAgICAgICAgICBpZiAobGVmdC5pZCA9PT0gJy4nIHx8IGxlZnQuaWQgPT09ICdbJyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgKGxlZnQuaWRlbnRpZmllciAmJiAhbGVmdC5yZXNlcnZlZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbigxOSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGVmdCA9PT0gc3ludGF4WydmdW5jdGlvbiddKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQoiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBpbiBhbiBhc3NpZ25tZW50LCBhbmQgaW5zdGVhZCBzYXcgYSBmdW5jdGlvbiBpbnZvY2F0aW9uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlcnJvcigiQmFkIGFzc2lnbm1lbnQuIiwgdGhhdCk7DQogICAgICAgIH0sIDIwKTsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN1ZmZpeChzLCBmKSB7DQogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIDE1MCk7DQogICAgICAgIHgubGVkID0gZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgICAgIGlmIChvcHRpb24ucGx1c3BsdXMpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHVzZSBvZiAne2F9Jy4iLCB0aGlzLCB0aGlzLmlkKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFsZWZ0LmlkZW50aWZpZXIgfHwgbGVmdC5yZXNlcnZlZCkgJiYNCiAgICAgICAgICAgICAgICAgICAgbGVmdC5pZCAhPT0gJy4nICYmIGxlZnQuaWQgIT09ICdbJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBvcGVyYW5kLiIsIHRoaXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4geDsNCiAgICB9DQoNCg0KICAgIC8vIGZucGFyYW0gbWVhbnMgdGhhdCB0aGlzIGlkZW50aWZpZXIgaXMgYmVpbmcgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uDQogICAgLy8gYXJndW1lbnQgKHNlZSBpZGVudGlmaWVyKCkpDQogICAgZnVuY3Rpb24gb3B0aW9uYWxpZGVudGlmaWVyKGZucGFyYW0pIHsNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZGVudGlmaWVyKSB7DQogICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICBpZiAodG9rZW4ucmVzZXJ2ZWQgJiYgIW9wdGlvbi5lczUpIHsNCiAgICAgICAgICAgICAgICAvLyBgdW5kZWZpbmVkYCBhcyBhIGZ1bmN0aW9uIHBhcmFtIGlzIGEgY29tbW9uIHBhdHRlcm4gdG8gcHJvdGVjdA0KICAgICAgICAgICAgICAgIC8vIGFnYWluc3QgdGhlIGNhc2Ugd2hlbiBzb21lYm9keSBkb2VzIGB1bmRlZmluZWQgPSB0cnVlYCBhbmQNCiAgICAgICAgICAgICAgICAvLyBoZWxwIHdpdGggbWluaWZpY2F0aW9uLiBNb3JlIGluZm86IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzMxNTkxNg0KICAgICAgICAgICAgICAgIGlmICghZm5wYXJhbSB8fCB0b2tlbi52YWx1ZSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhbiBpZGVudGlmaWVyIGFuZCBpbnN0ZWFkIHNhdyAne2F9JyAoYSByZXNlcnZlZCB3b3JkKS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRva2VuLnZhbHVlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gZm5wYXJhbSBtZWFucyB0aGF0IHRoaXMgaWRlbnRpZmllciBpcyBiZWluZyBkZWZpbmVkIGFzIGEgZnVuY3Rpb24NCiAgICAvLyBhcmd1bWVudA0KICAgIGZ1bmN0aW9uIGlkZW50aWZpZXIoZm5wYXJhbSkgew0KICAgICAgICB2YXIgaSA9IG9wdGlvbmFsaWRlbnRpZmllcihmbnBhcmFtKTsNCiAgICAgICAgaWYgKGkpIHsNCiAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIGlmICh0b2tlbi5pZCA9PT0gJ2Z1bmN0aW9uJyAmJiBuZXh0dG9rZW4uaWQgPT09ICcoJykgew0KICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyBuYW1lIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLiIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGFuIGlkZW50aWZpZXIgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsDQogICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gcmVhY2hhYmxlKHMpIHsNCiAgICAgICAgdmFyIGkgPSAwLCB0Ow0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycgfHwgbm9yZWFjaCkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIHQgPSBwZWVrKGkpOw0KICAgICAgICAgICAgaWYgKHQucmVhY2gpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodC5pZCAhPT0gJyhlbmRsaW5lKScpIHsNCiAgICAgICAgICAgICAgICBpZiAodC5pZCA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKA0KIklubmVyIGZ1bmN0aW9ucyBzaG91bGQgYmUgbGlzdGVkIGF0IHRoZSB0b3Agb2YgdGhlIG91dGVyIGZ1bmN0aW9uLiIsIHQpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgd2FybmluZygiVW5yZWFjaGFibGUgJ3thfScgYWZ0ZXIgJ3tifScuIiwgdCwgdC52YWx1ZSwgcyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpICs9IDE7DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0YXRlbWVudChub2luZGVudCkgew0KICAgICAgICB2YXIgaSA9IGluZGVudCwgciwgcyA9IHNjb3BlLCB0ID0gbmV4dHRva2VuOw0KDQovLyBXZSBkb24ndCBsaWtlIHRoZSBlbXB0eSBzdGF0ZW1lbnQuDQoNCiAgICAgICAgaWYgKHQuaWQgPT09ICc7Jykgew0KICAgICAgICAgICAgd2FybmluZygiVW5uZWNlc3Nhcnkgc2VtaWNvbG9uLiIsIHQpOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCi8vIElzIHRoaXMgYSBsYWJlbGxlZCBzdGF0ZW1lbnQ/DQoNCiAgICAgICAgaWYgKHQuaWRlbnRpZmllciAmJiAhdC5yZXNlcnZlZCAmJiBwZWVrKCkuaWQgPT09ICc6Jykgew0KICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgYWR2YW5jZSgnOicpOw0KICAgICAgICAgICAgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHMpOw0KICAgICAgICAgICAgYWRkbGFiZWwodC52YWx1ZSwgJ2xhYmVsJyk7DQogICAgICAgICAgICBpZiAoIW5leHR0b2tlbi5sYWJlbGxlZCkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIkxhYmVsICd7YX0nIG9uIHtifSBzdGF0ZW1lbnQuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgdC52YWx1ZSwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChqeC50ZXN0KHQudmFsdWUgKyAnOicpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiTGFiZWwgJ3thfScgbG9va3MgbGlrZSBhIGphdmFzY3JpcHQgdXJsLiIsDQogICAgICAgICAgICAgICAgICAgICAgICB0LCB0LnZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG5leHR0b2tlbi5sYWJlbCA9IHQudmFsdWU7DQogICAgICAgICAgICB0ID0gbmV4dHRva2VuOw0KICAgICAgICB9DQoNCi8vIFBhcnNlIHRoZSBzdGF0ZW1lbnQuDQoNCiAgICAgICAgaWYgKCFub2luZGVudCkgew0KICAgICAgICAgICAgaW5kZW50YXRpb24oKTsNCiAgICAgICAgfQ0KICAgICAgICByID0gZXhwcmVzc2lvbigwLCB0cnVlKTsNCg0KLy8gTG9vayBmb3IgdGhlIGZpbmFsIHNlbWljb2xvbi4NCg0KICAgICAgICBpZiAoIXQuYmxvY2spIHsNCiAgICAgICAgICAgIGlmICghb3B0aW9uLmV4cHIgJiYgKCFyIHx8ICFyLmV4cHMpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYW4gYXNzaWdubWVudCBvciBmdW5jdGlvbiBjYWxsIGFuZCBpbnN0ZWFkIHNhdyBhbiBleHByZXNzaW9uLiIsDQogICAgICAgICAgICAgICAgICAgIHRva2VuKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm5vbmV3ICYmIHIuaWQgPT09ICcoJyAmJiByLmxlZnQuaWQgPT09ICduZXcnKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRG8gbm90IHVzZSAnbmV3JyBmb3Igc2lkZSBlZmZlY3RzLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uYXNpICYmICEob3B0aW9uLmxhc3RzZW1pYyAmJiBuZXh0dG9rZW4uaWQgPT0gJ30nICYmDQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4ubGluZSA9PSB0b2tlbi5saW5lKSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIk1pc3Npbmcgc2VtaWNvbG9uLiIsIHRva2VuLmxpbmUsIHRva2VuLmZyb20gKyB0b2tlbi52YWx1ZS5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCi8vIFJlc3RvcmUgdGhlIGluZGVudGF0aW9uLg0KDQogICAgICAgIGluZGVudCA9IGk7DQogICAgICAgIHNjb3BlID0gczsNCiAgICAgICAgcmV0dXJuIHI7DQogICAgfQ0KDQoNCiAgICBmdW5jdGlvbiB1c2Vfc3RyaWN0KCkgew0KICAgICAgICBpZiAobmV4dHRva2VuLnZhbHVlID09PSAndXNlIHN0cmljdCcpIHsNCiAgICAgICAgICAgIGlmIChzdHJpY3RfbW9kZSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVubmVjZXNzYXJ5IFwidXNlIHN0cmljdFwiLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgc3RyaWN0X21vZGUgPSB0cnVlOw0KICAgICAgICAgICAgb3B0aW9uLm5ld2NhcCA9IHRydWU7DQogICAgICAgICAgICBvcHRpb24udW5kZWYgPSB0cnVlOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0YXRlbWVudHMoYmVnaW4pIHsNCiAgICAgICAgdmFyIGEgPSBbXSwgZiwgcDsNCg0KICAgICAgICB3aGlsZSAoIW5leHR0b2tlbi5yZWFjaCAmJiBuZXh0dG9rZW4uaWQgIT09ICcoZW5kKScpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc7Jykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVubmVjZXNzYXJ5IHNlbWljb2xvbi4iKTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCc7Jyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGEucHVzaChzdGF0ZW1lbnQoKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGE7DQogICAgfQ0KDQoNCiAgICAvKg0KICAgICAqIFBhcnNlcyBhIHNpbmdsZSBibG9jay4gQSBibG9jayBpcyBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgd3JhcHBlZCBpbg0KICAgICAqIGJyYWNlcy4NCiAgICAgKg0KICAgICAqIG9yZGluYXJ5IC0gdHJ1ZSBmb3IgZXZlcnl0aGluZyBidXQgZnVuY3Rpb24gYm9kaWVzIGFuZCB0cnkgYmxvY2tzLg0KICAgICAqIHN0bXQgICAgIC0gdHJ1ZSBpZiBibG9jayBjYW4gYmUgYSBzaW5nbGUgc3RhdGVtZW50IChlLmcuIGluIGlmL2Zvci93aGlsZSkuDQogICAgICovDQogICAgZnVuY3Rpb24gYmxvY2sob3JkaW5hcnksIHN0bXQpIHsNCiAgICAgICAgdmFyIGEsDQogICAgICAgICAgICBiID0gaW5ibG9jaywNCiAgICAgICAgICAgIG9sZF9pbmRlbnQgPSBpbmRlbnQsDQogICAgICAgICAgICBtID0gc3RyaWN0X21vZGUsDQogICAgICAgICAgICBzID0gc2NvcGUsDQogICAgICAgICAgICB0Ow0KDQogICAgICAgIGluYmxvY2sgPSBvcmRpbmFyeTsNCiAgICAgICAgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHNjb3BlKTsNCiAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgIHQgPSBuZXh0dG9rZW47DQoNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ3snKSB7DQogICAgICAgICAgICBhZHZhbmNlKCd7Jyk7DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnfScgfHwgdG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmUpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgICAgICB3aGlsZSAoIW9yZGluYXJ5ICYmIG5leHR0b2tlbi5mcm9tID4gaW5kZW50KSB7DQogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIW9yZGluYXJ5ICYmICF1c2Vfc3RyaWN0KCkgJiYgIW0gJiYgb3B0aW9uLnN0cmljdCAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3RbJyhjb250ZXh0KSddWycoZ2xvYmFsKSddKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3NpbmcgXCJ1c2Ugc3RyaWN0XCIgc3RhdGVtZW50LiIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBhID0gc3RhdGVtZW50cygpOw0KICAgICAgICAgICAgICAgIHN0cmljdF9tb2RlID0gbTsNCiAgICAgICAgICAgICAgICBpbmRlbnQgLT0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnfScsIHQpOw0KICAgICAgICAgICAgaW5kZW50ID0gb2xkX2luZGVudDsNCiAgICAgICAgfSBlbHNlIGlmICghb3JkaW5hcnkpIHsNCiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgJ3snLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKCFzdG10IHx8IG9wdGlvbi5jdXJseSkNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgJ3snLCBuZXh0dG9rZW4udmFsdWUpOw0KDQogICAgICAgICAgICBub3JlYWNoID0gdHJ1ZTsNCiAgICAgICAgICAgIGEgPSBbc3RhdGVtZW50KCldOw0KICAgICAgICAgICAgbm9yZWFjaCA9IGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGZ1bmN0WycodmVyYiknXSA9IG51bGw7DQogICAgICAgIHNjb3BlID0gczsNCiAgICAgICAgaW5ibG9jayA9IGI7DQogICAgICAgIGlmIChvcmRpbmFyeSAmJiBvcHRpb24ubm9lbXB0eSAmJiAoIWEgfHwgYS5sZW5ndGggPT09IDApKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJFbXB0eSBibG9jay4iKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gYTsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGNvdW50TWVtYmVyKG0pIHsNCiAgICAgICAgaWYgKG1lbWJlcnNPbmx5ICYmIHR5cGVvZiBtZW1iZXJzT25seVttXSAhPT0gJ2Jvb2xlYW4nKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIC8qbWVtYmVyICd7YX0nLiIsIHRva2VuLCBtKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodHlwZW9mIG1lbWJlclttXSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgIG1lbWJlclttXSArPSAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbWVtYmVyW21dID0gMTsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gbm90ZV9pbXBsaWVkKHRva2VuKSB7DQogICAgICAgIHZhciBuYW1lID0gdG9rZW4udmFsdWUsIGxpbmUgPSB0b2tlbi5saW5lLCBhID0gaW1wbGllZFtuYW1lXTsNCiAgICAgICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICBhID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFhKSB7DQogICAgICAgICAgICBhID0gW2xpbmVdOw0KICAgICAgICAgICAgaW1wbGllZFtuYW1lXSA9IGE7DQogICAgICAgIH0gZWxzZSBpZiAoYVthLmxlbmd0aCAtIDFdICE9PSBsaW5lKSB7DQogICAgICAgICAgICBhLnB1c2gobGluZSk7DQogICAgICAgIH0NCiAgICB9DQoNCi8vIEJ1aWxkIHRoZSBzeW50YXggdGFibGUgYnkgZGVjbGFyaW5nIHRoZSBzeW50YWN0aWMgZWxlbWVudHMgb2YgdGhlIGxhbmd1YWdlLg0KDQogICAgdHlwZSgnKG51bWJlciknLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHR5cGUoJyhzdHJpbmcpJywgZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KICAgIHN5bnRheFsnKGlkZW50aWZpZXIpJ10gPSB7DQogICAgICAgIHR5cGU6ICcoaWRlbnRpZmllciknLA0KICAgICAgICBsYnA6IDAsDQogICAgICAgIGlkZW50aWZpZXI6IHRydWUsDQogICAgICAgIG51ZDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnZhbHVlLA0KICAgICAgICAgICAgICAgIHMgPSBzY29wZVt2XSwNCiAgICAgICAgICAgICAgICBmOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBzID09PSAnZnVuY3Rpb24nKSB7DQoNCi8vIFByb3RlY3Rpb24gYWdhaW5zdCBhY2NpZGVudGFsIGluaGVyaXRhbmNlLg0KDQogICAgICAgICAgICAgICAgcyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgPT09ICdib29sZWFuJykgew0KICAgICAgICAgICAgICAgIGYgPSBmdW5jdDsNCiAgICAgICAgICAgICAgICBmdW5jdCA9IGZ1bmN0aW9uc1swXTsNCiAgICAgICAgICAgICAgICBhZGRsYWJlbCh2LCAndmFyJyk7DQogICAgICAgICAgICAgICAgcyA9IGZ1bmN0Ow0KICAgICAgICAgICAgICAgIGZ1bmN0ID0gZjsNCiAgICAgICAgICAgIH0NCg0KLy8gVGhlIG5hbWUgaXMgaW4gc2NvcGUgYW5kIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uDQoNCiAgICAgICAgICAgIGlmIChmdW5jdCA9PT0gcykgew0KDQovLyAgICAgIENoYW5nZSAndW51c2VkJyB0byAndmFyJywgYW5kIHJlamVjdCBsYWJlbHMuDQoNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ1bmN0W3ZdKSB7DQogICAgICAgICAgICAgICAgY2FzZSAndW51c2VkJzoNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rbdl0gPSAndmFyJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAndW5jdGlvbic6DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gJ2Z1bmN0aW9uJzsNCiAgICAgICAgICAgICAgICAgICAgdGhpc1snZnVuY3Rpb24nXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoNCiAgICAgICAgICAgICAgICAgICAgdGhpc1snZnVuY3Rpb24nXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhYmVsJzoNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgdG9rZW4sIHYpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCi8vIFRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbi4gIElmIHdlIGFyZSBpbiB0aGUgZ2xvYmFsIHNjb3BlLA0KLy8gdGhlbiB3ZSBoYXZlIGFuIHVuZGVmaW5lZCB2YXJpYWJsZS4NCi8vDQovLyBPcGVyYXRvcnMgdHlwZW9mIGFuZCBkZWxldGUgZG8gbm90IHJhaXNlIHJ1bnRpbWUgZXJyb3JzIGV2ZW4gaWYgdGhlIGJhc2UNCi8vIG9iamVjdCBvZiBhIHJlZmVyZW5jZSBpcyBudWxsIHNvIG5vIG5lZWQgdG8gZGlzcGxheSB3YXJuaW5nIGlmIHdlJ3JlDQovLyBpbnNpZGUgb2YgdHlwZW9mIG9yIGRlbGV0ZS4NCg0KICAgICAgICAgICAgfSBlbHNlIGlmIChmdW5jdFsnKGdsb2JhbCknXSkgew0KICAgICAgICAgICAgICAgIGlmIChhbm9ubmFtZSAhPSAndHlwZW9mJyAmJiBhbm9ubmFtZSAhPSAnZGVsZXRlJyAmJg0KICAgICAgICAgICAgICAgICAgICBvcHRpb24udW5kZWYgJiYgdHlwZW9mIHByZWRlZmluZWRbdl0gIT09ICdib29sZWFuJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgZGVmaW5lZC4iLCB0b2tlbiwgdik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG5vdGVfaW1wbGllZCh0b2tlbik7DQoNCi8vIElmIHRoZSBuYW1lIGlzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgY3VycmVudA0KLy8gZnVuY3Rpb24sIGJ1dCBub3QgYXMgb3V0ZXIsIHRoZW4gdGhlcmUgaXMgYSBzY29wZSBlcnJvci4NCg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ1bmN0W3ZdKSB7DQogICAgICAgICAgICAgICAgY2FzZSAnY2xvc3VyZSc6DQogICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOg0KICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6DQogICAgICAgICAgICAgICAgY2FzZSAndW51c2VkJzoNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgdXNlZCBvdXQgb2Ygc2NvcGUuIiwgdG9rZW4sIHYpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdsYWJlbCc6DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIGEgc3RhdGVtZW50IGxhYmVsLiIsIHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnb3V0ZXInOg0KICAgICAgICAgICAgICAgIGNhc2UgJ2dsb2JhbCc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQoNCi8vIElmIHRoZSBuYW1lIGlzIGRlZmluZWQgaW4gYW4gb3V0ZXIgZnVuY3Rpb24sIG1ha2UgYW4gb3V0ZXIgZW50cnksIGFuZCBpZg0KLy8gaXQgd2FzIHVudXNlZCwgbWFrZSBpdCB2YXIuDQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYWxsb3dlZC4iLCB0b2tlbiwgdik7DQogICAgICAgICAgICAgICAgICAgICAgICBub3RlX2ltcGxpZWQodG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzICE9PSAnb2JqZWN0Jykgew0KDQovLyBPcGVyYXRvcnMgdHlwZW9mIGFuZCBkZWxldGUgZG8gbm90IHJhaXNlIHJ1bnRpbWUgZXJyb3JzIGV2ZW4gaWYgdGhlIGJhc2Ugb2JqZWN0IG9mDQovLyBhIHJlZmVyZW5jZSBpcyBudWxsIHNvIG5vIG5lZWQgdG8gZGlzcGxheSB3YXJuaW5nIGlmIHdlJ3JlIGluc2lkZSBvZiB0eXBlb2Ygb3IgZGVsZXRlLg0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5vbm5hbWUgIT0gJ3R5cGVvZicgJiYgYW5vbm5hbWUgIT0gJ2RlbGV0ZScgJiYgb3B0aW9uLnVuZGVmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgbm90IGRlZmluZWQuIiwgdG9rZW4sIHYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdFt2XSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBub3RlX2ltcGxpZWQodG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzW3ZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1bmN0aW9uJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzWydmdW5jdGlvbiddID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3ZdID0gJ2Nsb3N1cmUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1bnVzZWQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbdl0gPSAnY2xvc3VyZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rbdl0gPSBzWycoZ2xvYmFsKSddID8gJ2dsb2JhbCcgOiAnb3V0ZXInOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc3VyZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXJhbWV0ZXInOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhYmVsJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBhIHN0YXRlbWVudCBsYWJlbC4iLCB0b2tlbiwgdik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfSwNCiAgICAgICAgbGVkOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYW4gb3BlcmF0b3IgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsDQogICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHR5cGUoJyhyZWdleHApJywgZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KDQovLyBFQ01BU2NyaXB0IHBhcnNlcg0KDQogICAgZGVsaW0oJyhlbmRsaW5lKScpOw0KICAgIGRlbGltKCcoYmVnaW4pJyk7DQogICAgZGVsaW0oJyhlbmQpJykucmVhY2ggPSB0cnVlOw0KICAgIGRlbGltKCc8LycpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnPCEnKTsNCiAgICBkZWxpbSgnPCEtLScpOw0KICAgIGRlbGltKCctLT4nKTsNCiAgICBkZWxpbSgnKGVycm9yKScpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnfScpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnKScpOw0KICAgIGRlbGltKCddJyk7DQogICAgZGVsaW0oJyInKS5yZWFjaCA9IHRydWU7DQogICAgZGVsaW0oIiciKS5yZWFjaCA9IHRydWU7DQogICAgZGVsaW0oJzsnKTsNCiAgICBkZWxpbSgnOicpLnJlYWNoID0gdHJ1ZTsNCiAgICBkZWxpbSgnLCcpOw0KICAgIGRlbGltKCcjJyk7DQogICAgZGVsaW0oJ0AnKTsNCiAgICByZXNlcnZlKCdlbHNlJyk7DQogICAgcmVzZXJ2ZSgnY2FzZScpLnJlYWNoID0gdHJ1ZTsNCiAgICByZXNlcnZlKCdjYXRjaCcpOw0KICAgIHJlc2VydmUoJ2RlZmF1bHQnKS5yZWFjaCA9IHRydWU7DQogICAgcmVzZXJ2ZSgnZmluYWxseScpOw0KICAgIHJlc2VydmV2YXIoJ2FyZ3VtZW50cycsIGZ1bmN0aW9uICh4KSB7DQogICAgICAgIGlmIChzdHJpY3RfbW9kZSAmJiBmdW5jdFsnKGdsb2JhbCknXSkgew0KICAgICAgICAgICAgd2FybmluZygiU3RyaWN0IHZpb2xhdGlvbi4iLCB4KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJlc2VydmV2YXIoJ2V2YWwnKTsNCiAgICByZXNlcnZldmFyKCdmYWxzZScpOw0KICAgIHJlc2VydmV2YXIoJ0luZmluaXR5Jyk7DQogICAgcmVzZXJ2ZXZhcignTmFOJyk7DQogICAgcmVzZXJ2ZXZhcignbnVsbCcpOw0KICAgIHJlc2VydmV2YXIoJ3RoaXMnLCBmdW5jdGlvbiAoeCkgew0KICAgICAgICBpZiAoc3RyaWN0X21vZGUgJiYgKChmdW5jdFsnKHN0YXRlbWVudCknXSAmJg0KICAgICAgICAgICAgICAgIGZ1bmN0WycobmFtZSknXS5jaGFyQXQoMCkgPiAnWicpIHx8IGZ1bmN0WycoZ2xvYmFsKSddKSkgew0KICAgICAgICAgICAgd2FybmluZygiU3RyaWN0IHZpb2xhdGlvbi4iLCB4KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJlc2VydmV2YXIoJ3RydWUnKTsNCiAgICByZXNlcnZldmFyKCd1bmRlZmluZWQnKTsNCiAgICBhc3NpZ25vcCgnPScsICdhc3NpZ24nLCAyMCk7DQogICAgYXNzaWdub3AoJys9JywgJ2Fzc2lnbmFkZCcsIDIwKTsNCiAgICBhc3NpZ25vcCgnLT0nLCAnYXNzaWduc3ViJywgMjApOw0KICAgIGFzc2lnbm9wKCcqPScsICdhc3NpZ25tdWx0JywgMjApOw0KICAgIGFzc2lnbm9wKCcvPScsICdhc3NpZ25kaXYnLCAyMCkubnVkID0gZnVuY3Rpb24gKCkgew0KICAgICAgICBlcnJvcigiQSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCBjYW4gYmUgY29uZnVzZWQgd2l0aCAnLz0nLiIpOw0KICAgIH07DQogICAgYXNzaWdub3AoJyU9JywgJ2Fzc2lnbm1vZCcsIDIwKTsNCiAgICBiaXR3aXNlYXNzaWdub3AoJyY9JywgJ2Fzc2lnbmJpdGFuZCcsIDIwKTsNCiAgICBiaXR3aXNlYXNzaWdub3AoJ3w9JywgJ2Fzc2lnbmJpdG9yJywgMjApOw0KICAgIGJpdHdpc2Vhc3NpZ25vcCgnXj0nLCAnYXNzaWduYml0eG9yJywgMjApOw0KICAgIGJpdHdpc2Vhc3NpZ25vcCgnPDw9JywgJ2Fzc2lnbnNoaWZ0bGVmdCcsIDIwKTsNCiAgICBiaXR3aXNlYXNzaWdub3AoJz4+PScsICdhc3NpZ25zaGlmdHJpZ2h0JywgMjApOw0KICAgIGJpdHdpc2Vhc3NpZ25vcCgnPj4+PScsICdhc3NpZ25zaGlmdHJpZ2h0dW5zaWduZWQnLCAyMCk7DQogICAgaW5maXgoJz8nLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgew0KICAgICAgICB0aGF0LmxlZnQgPSBsZWZ0Ow0KICAgICAgICB0aGF0LnJpZ2h0ID0gZXhwcmVzc2lvbigxMCk7DQogICAgICAgIGFkdmFuY2UoJzonKTsNCiAgICAgICAgdGhhdFsnZWxzZSddID0gZXhwcmVzc2lvbigxMCk7DQogICAgICAgIHJldHVybiB0aGF0Ow0KICAgIH0sIDMwKTsNCg0KICAgIGluZml4KCd8fCcsICdvcicsIDQwKTsNCiAgICBpbmZpeCgnJiYnLCAnYW5kJywgNTApOw0KICAgIGJpdHdpc2UoJ3wnLCAnYml0b3InLCA3MCk7DQogICAgYml0d2lzZSgnXicsICdiaXR4b3InLCA4MCk7DQogICAgYml0d2lzZSgnJicsICdiaXRhbmQnLCA5MCk7DQogICAgcmVsYXRpb24oJz09JywgZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7DQogICAgICAgIHZhciBlcW51bGwgPSBvcHRpb24uZXFudWxsICYmDQogICAgICAgICAgICAgICAgKGxlZnQudmFsdWUgPT0gJ251bGwnIHx8IHJpZ2h0LnZhbHVlID09ICdudWxsJyk7DQoNCiAgICAgICAgaWYgKCFlcW51bGwgJiYgb3B0aW9uLmVxZXFlcSkgew0KICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsDQogICAgICAgICAgICAgICAgICAgIHRoaXMsICc9PT0nLCAnPT0nKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1Bvb3JSZWxhdGlvbihsZWZ0KSkgew0KICAgICAgICAgICAgd2FybmluZygiVXNlICd7YX0nIHRvIGNvbXBhcmUgd2l0aCAne2J9Jy4iLA0KICAgICAgICAgICAgICAgIHRoaXMsICc9PT0nLCBsZWZ0LnZhbHVlKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1Bvb3JSZWxhdGlvbihyaWdodCkpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIlVzZSAne2F9JyB0byBjb21wYXJlIHdpdGggJ3tifScuIiwNCiAgICAgICAgICAgICAgICB0aGlzLCAnPT09JywgcmlnaHQudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHJlbGF0aW9uKCc9PT0nKTsNCiAgICByZWxhdGlvbignIT0nLCBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsNCiAgICAgICAgdmFyIGVxbnVsbCA9IG9wdGlvbi5lcW51bGwgJiYNCiAgICAgICAgICAgICAgICAobGVmdC52YWx1ZSA9PSAnbnVsbCcgfHwgcmlnaHQudmFsdWUgPT0gJ251bGwnKTsNCg0KICAgICAgICBpZiAoIWVxbnVsbCAmJiBvcHRpb24uZXFlcWVxKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJyE9PScsICchPScpOw0KICAgICAgICB9IGVsc2UgaWYgKGlzUG9vclJlbGF0aW9uKGxlZnQpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJVc2UgJ3thfScgdG8gY29tcGFyZSB3aXRoICd7Yn0nLiIsDQogICAgICAgICAgICAgICAgICAgIHRoaXMsICchPT0nLCBsZWZ0LnZhbHVlKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1Bvb3JSZWxhdGlvbihyaWdodCkpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIlVzZSAne2F9JyB0byBjb21wYXJlIHdpdGggJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJyE9PScsIHJpZ2h0LnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCiAgICByZWxhdGlvbignIT09Jyk7DQogICAgcmVsYXRpb24oJzwnKTsNCiAgICByZWxhdGlvbignPicpOw0KICAgIHJlbGF0aW9uKCc8PScpOw0KICAgIHJlbGF0aW9uKCc+PScpOw0KICAgIGJpdHdpc2UoJzw8JywgJ3NoaWZ0bGVmdCcsIDEyMCk7DQogICAgYml0d2lzZSgnPj4nLCAnc2hpZnRyaWdodCcsIDEyMCk7DQogICAgYml0d2lzZSgnPj4+JywgJ3NoaWZ0cmlnaHR1bnNpZ25lZCcsIDEyMCk7DQogICAgaW5maXgoJ2luJywgJ2luJywgMTIwKTsNCiAgICBpbmZpeCgnaW5zdGFuY2VvZicsICdpbnN0YW5jZW9mJywgMTIwKTsNCiAgICBpbmZpeCgnKycsIGZ1bmN0aW9uIChsZWZ0LCB0aGF0KSB7DQogICAgICAgIHZhciByaWdodCA9IGV4cHJlc3Npb24oMTMwKTsNCiAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYgbGVmdC5pZCA9PT0gJyhzdHJpbmcpJyAmJiByaWdodC5pZCA9PT0gJyhzdHJpbmcpJykgew0KICAgICAgICAgICAgbGVmdC52YWx1ZSArPSByaWdodC52YWx1ZTsNCiAgICAgICAgICAgIGxlZnQuY2hhcmFjdGVyID0gcmlnaHQuY2hhcmFjdGVyOw0KICAgICAgICAgICAgaWYgKCFvcHRpb24uc2NyaXB0dXJsICYmIGp4LnRlc3QobGVmdC52YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJKYXZhU2NyaXB0IFVSTC4iLCBsZWZ0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBsZWZ0Ow0KICAgICAgICB9DQogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7DQogICAgICAgIHRoYXQucmlnaHQgPSByaWdodDsNCiAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgfSwgMTMwKTsNCiAgICBwcmVmaXgoJysnLCAnbnVtJyk7DQogICAgcHJlZml4KCcrKysnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBwbHVzZXMuIik7DQogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDE1MCk7DQogICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCiAgICBpbmZpeCgnKysrJywgZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIHBsdXNlcy4iKTsNCiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsNCiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTMwKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwgMTMwKTsNCiAgICBpbmZpeCgnLScsICdzdWInLCAxMzApOw0KICAgIHByZWZpeCgnLScsICduZWcnKTsNCiAgICBwcmVmaXgoJy0tLScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIG1pbnVzZXMuIik7DQogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDE1MCk7DQogICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCiAgICBpbmZpeCgnLS0tJywgZnVuY3Rpb24gKGxlZnQpIHsNCiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIG1pbnVzZXMuIik7DQogICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7DQogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDEzMCk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sIDEzMCk7DQogICAgaW5maXgoJyonLCAnbXVsdCcsIDE0MCk7DQogICAgaW5maXgoJy8nLCAnZGl2JywgMTQwKTsNCiAgICBpbmZpeCgnJScsICdtb2QnLCAxNDApOw0KDQogICAgc3VmZml4KCcrKycsICdwb3N0aW5jJyk7DQogICAgcHJlZml4KCcrKycsICdwcmVpbmMnKTsNCiAgICBzeW50YXhbJysrJ10uZXhwcyA9IHRydWU7DQoNCiAgICBzdWZmaXgoJy0tJywgJ3Bvc3RkZWMnKTsNCiAgICBwcmVmaXgoJy0tJywgJ3ByZWRlYycpOw0KICAgIHN5bnRheFsnLS0nXS5leHBzID0gdHJ1ZTsNCiAgICBwcmVmaXgoJ2RlbGV0ZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHAgPSBleHByZXNzaW9uKDApOw0KICAgICAgICBpZiAoIXAgfHwgKHAuaWQgIT09ICcuJyAmJiBwLmlkICE9PSAnWycpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJWYXJpYWJsZXMgc2hvdWxkIG5vdCBiZSBkZWxldGVkLiIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyc3QgPSBwOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KS5leHBzID0gdHJ1ZTsNCg0KICAgIHByZWZpeCgnficsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKG9wdGlvbi5iaXR3aXNlKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkICd7YX0nLiIsIHRoaXMsICd+Jyk7DQogICAgICAgIH0NCiAgICAgICAgZXhwcmVzc2lvbigxNTApOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KICAgIHByZWZpeCgnIScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTUwKTsNCiAgICAgICAgdGhpcy5hcml0eSA9ICd1bmFyeSc7DQogICAgICAgIGlmIChiYW5nW3RoaXMucmlnaHQuaWRdID09PSB0cnVlKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgdXNlIG9mICd7YX0nLiIsIHRoaXMsICchJyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSk7DQogICAgcHJlZml4KCd0eXBlb2YnLCAndHlwZW9mJyk7DQogICAgcHJlZml4KCduZXcnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBjID0gZXhwcmVzc2lvbigxNTUpLCBpOw0KICAgICAgICBpZiAoYyAmJiBjLmlkICE9PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICBpZiAoYy5pZGVudGlmaWVyKSB7DQogICAgICAgICAgICAgICAgY1snbmV3J10gPSB0cnVlOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoYy52YWx1ZSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ09iamVjdCc6DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgb2JqZWN0IGxpdGVyYWwgbm90YXRpb24ge30uIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdOdW1iZXInOg0KICAgICAgICAgICAgICAgIGNhc2UgJ1N0cmluZyc6DQogICAgICAgICAgICAgICAgY2FzZSAnQm9vbGVhbic6DQogICAgICAgICAgICAgICAgY2FzZSAnTWF0aCc6DQogICAgICAgICAgICAgICAgY2FzZSAnSlNPTic6DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkRvIG5vdCB1c2Uge2F9IGFzIGEgY29uc3RydWN0b3IuIiwgdG9rZW4sIGMudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdGdW5jdGlvbic6DQogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmV2aWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlRoZSBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpcyBldmFsLiIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ0RhdGUnOg0KICAgICAgICAgICAgICAgIGNhc2UgJ1JlZ0V4cCc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIChjLmlkICE9PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpID0gYy52YWx1ZS5zdWJzdHIoMCwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLm5ld2NhcCAmJiAoaSA8ICdBJyB8fCBpID4gJ1onKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkEgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgc3RhcnQgd2l0aCAiKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gdXBwZXJjYXNlIGxldHRlci4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChjLmlkICE9PSAnLicgJiYgYy5pZCAhPT0gJ1snICYmIGMuaWQgIT09ICcoJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJCYWQgY29uc3RydWN0b3IuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghb3B0aW9uLnN1cGVybmV3KQ0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIldlaXJkIGNvbnN0cnVjdGlvbi4gRGVsZXRlICduZXcnLiIsIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKCcgJiYgIW9wdGlvbi5zdXBlcm5ldykgew0KICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyAnKCknIGludm9raW5nIGEgY29uc3RydWN0b3IuIik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJzdCA9IGM7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHN5bnRheFsnbmV3J10uZXhwcyA9IHRydWU7DQoNCiAgICBwcmVmaXgoJ3ZvaWQnKS5leHBzID0gdHJ1ZTsNCg0KICAgIGluZml4KCcuJywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsNCiAgICAgICAgYWRqYWNlbnQocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIG5vYnJlYWsoKTsNCiAgICAgICAgdmFyIG0gPSBpZGVudGlmaWVyKCk7DQogICAgICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgIGNvdW50TWVtYmVyKG0pOw0KICAgICAgICB9DQogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7DQogICAgICAgIHRoYXQucmlnaHQgPSBtOw0KICAgICAgICBpZiAob3B0aW9uLm5vYXJnICYmIGxlZnQgJiYgbGVmdC52YWx1ZSA9PT0gJ2FyZ3VtZW50cycgJiYNCiAgICAgICAgICAgICAgICAobSA9PT0gJ2NhbGxlZScgfHwgbSA9PT0gJ2NhbGxlcicpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJBdm9pZCBhcmd1bWVudHMue2F9LiIsIGxlZnQsIG0pOw0KICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb24uZXZpbCAmJiBsZWZ0ICYmIGxlZnQudmFsdWUgPT09ICdkb2N1bWVudCcgJiYNCiAgICAgICAgICAgICAgICAobSA9PT0gJ3dyaXRlJyB8fCBtID09PSAnd3JpdGVsbicpKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJkb2N1bWVudC53cml0ZSBjYW4gYmUgYSBmb3JtIG9mIGV2YWwuIiwgbGVmdCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFvcHRpb24uZXZpbCAmJiAobSA9PT0gJ2V2YWwnIHx8IG0gPT09ICdleGVjU2NyaXB0JykpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoJ2V2YWwgaXMgZXZpbC4nKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhhdDsNCiAgICB9LCAxNjAsIHRydWUpOw0KDQogICAgaW5maXgoJygnLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgew0KICAgICAgICBpZiAocHJldnRva2VuLmlkICE9PSAnfScgJiYgcHJldnRva2VuLmlkICE9PSAnKScpIHsNCiAgICAgICAgICAgIG5vYnJlYWsocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIH0NCiAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICBpZiAob3B0aW9uLmltbWVkICYmICFsZWZ0LmltbWVkICYmIGxlZnQuaWQgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIldyYXAgYW4gaW1tZWRpYXRlIGZ1bmN0aW9uIGludm9jYXRpb24gaW4gcGFyZW50aGVzZXMgIiArDQogICAgICAgICAgICAgICAgInRvIGFzc2lzdCB0aGUgcmVhZGVyIGluIHVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgZXhwcmVzc2lvbiAiICsNCiAgICAgICAgICAgICAgICAiaXMgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCBhbmQgbm90IHRoZSBmdW5jdGlvbiBpdHNlbGYuIik7DQogICAgICAgIH0NCiAgICAgICAgdmFyIG4gPSAwLA0KICAgICAgICAgICAgcCA9IFtdOw0KICAgICAgICBpZiAobGVmdCkgew0KICAgICAgICAgICAgaWYgKGxlZnQudHlwZSA9PT0gJyhpZGVudGlmaWVyKScpIHsNCiAgICAgICAgICAgICAgICBpZiAobGVmdC52YWx1ZS5tYXRjaCgvXltBLVpdKFtBLVowLTlfJF0qW2Etel1bQS1aYS16MC05XyRdKik/JC8pKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0LnZhbHVlICE9PSAnTnVtYmVyJyAmJiBsZWZ0LnZhbHVlICE9PSAnU3RyaW5nJyAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgIT09ICdCb29sZWFuJyAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgIT09ICdEYXRlJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQudmFsdWUgPT09ICdNYXRoJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1hdGggaXMgbm90IGEgZnVuY3Rpb24uIiwgbGVmdCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5uZXdjYXApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKA0KIk1pc3NpbmcgJ25ldycgcHJlZml4IHdoZW4gaW52b2tpbmcgYSBjb25zdHJ1Y3Rvci4iLCBsZWZ0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKScpIHsNCiAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICBwW3AubGVuZ3RoXSA9IGV4cHJlc3Npb24oMTApOw0KICAgICAgICAgICAgICAgIG4gKz0gMTsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNvbW1hKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgYWR2YW5jZSgnKScpOw0KICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICBpZiAobGVmdC52YWx1ZSA9PT0gJ3BhcnNlSW50JyAmJiBuID09PSAxKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyByYWRpeCBwYXJhbWV0ZXIuIiwgbGVmdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIW9wdGlvbi5ldmlsKSB7DQogICAgICAgICAgICAgICAgaWYgKGxlZnQudmFsdWUgPT09ICdldmFsJyB8fCBsZWZ0LnZhbHVlID09PSAnRnVuY3Rpb24nIHx8DQogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LnZhbHVlID09PSAnZXhlY1NjcmlwdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiZXZhbCBpcyBldmlsLiIsIGxlZnQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFswXSAmJiBwWzBdLmlkID09PSAnKHN0cmluZyknICYmDQogICAgICAgICAgICAgICAgICAgICAgIChsZWZ0LnZhbHVlID09PSAnc2V0VGltZW91dCcgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgPT09ICdzZXRJbnRlcnZhbCcpKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQogICAgIkltcGxpZWQgZXZhbCBpcyBldmlsLiBQYXNzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIHN0cmluZy4iLCBsZWZ0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWxlZnQuaWRlbnRpZmllciAmJiBsZWZ0LmlkICE9PSAnLicgJiYgbGVmdC5pZCAhPT0gJ1snICYmDQogICAgICAgICAgICAgICAgICAgIGxlZnQuaWQgIT09ICcoJyAmJiBsZWZ0LmlkICE9PSAnJiYnICYmIGxlZnQuaWQgIT09ICd8fCcgJiYNCiAgICAgICAgICAgICAgICAgICAgbGVmdC5pZCAhPT0gJz8nKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiQmFkIGludm9jYXRpb24uIiwgbGVmdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsNCiAgICAgICAgcmV0dXJuIHRoYXQ7DQogICAgfSwgMTU1LCB0cnVlKS5leHBzID0gdHJ1ZTsNCg0KICAgIHByZWZpeCgnKCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICBuZXh0dG9rZW4uaW1tZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIHZhciB2ID0gZXhwcmVzc2lvbigwKTsNCiAgICAgICAgYWR2YW5jZSgnKScsIHRoaXMpOw0KICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICBpZiAob3B0aW9uLmltbWVkICYmIHYuaWQgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoJykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoDQoiTW92ZSB0aGUgaW52b2NhdGlvbiBpbnRvIHRoZSBwYXJlbnMgdGhhdCBjb250YWluIHRoZSBmdW5jdGlvbi4iLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5nKA0KIkRvIG5vdCB3cmFwIGZ1bmN0aW9uIGxpdGVyYWxzIGluIHBhcmVucyB1bmxlc3MgdGhleSBhcmUgdG8gYmUgaW1tZWRpYXRlbHkgaW52b2tlZC4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHY7DQogICAgfSk7DQoNCiAgICBpbmZpeCgnWycsIGZ1bmN0aW9uIChsZWZ0LCB0aGF0KSB7DQogICAgICAgIG5vYnJlYWsocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgdmFyIGUgPSBleHByZXNzaW9uKDApLCBzOw0KICAgICAgICBpZiAoZSAmJiBlLnR5cGUgPT09ICcoc3RyaW5nKScpIHsNCiAgICAgICAgICAgIGlmICghb3B0aW9uLmV2aWwgJiYgKGUudmFsdWUgPT09ICdldmFsJyB8fCBlLnZhbHVlID09PSAnZXhlY1NjcmlwdCcpKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiZXZhbCBpcyBldmlsLiIsIHRoYXQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY291bnRNZW1iZXIoZS52YWx1ZSk7DQogICAgICAgICAgICBpZiAoIW9wdGlvbi5zdWIgJiYgaXgudGVzdChlLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgIHMgPSBzeW50YXhbZS52YWx1ZV07DQogICAgICAgICAgICAgICAgaWYgKCFzIHx8ICFzLnJlc2VydmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlsne2F9J10gaXMgYmV0dGVyIHdyaXR0ZW4gaW4gZG90IG5vdGF0aW9uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgZS52YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGFkdmFuY2UoJ10nLCB0aGF0KTsNCiAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsNCiAgICAgICAgdGhhdC5yaWdodCA9IGU7DQogICAgICAgIHJldHVybiB0aGF0Ow0KICAgIH0sIDE2MCwgdHJ1ZSk7DQoNCiAgICBwcmVmaXgoJ1snLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBiID0gdG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmU7DQogICAgICAgIHRoaXMuZmlyc3QgPSBbXTsNCiAgICAgICAgaWYgKGIpIHsNCiAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5mcm9tID09PSBpbmRlbnQgKyBvcHRpb24uaW5kZW50KSB7DQogICAgICAgICAgICAgICAgaW5kZW50ICs9IG9wdGlvbi5pbmRlbnQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgd2hpbGUgKG5leHR0b2tlbi5pZCAhPT0gJyhlbmQpJykgew0KICAgICAgICAgICAgd2hpbGUgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIik7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnLCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ10nKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYiAmJiB0b2tlbi5saW5lICE9PSBuZXh0dG9rZW4ubGluZSkgew0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmZpcnN0LnB1c2goZXhwcmVzc2lvbigxMCkpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgY29tbWEoKTsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnXScgJiYgIW9wdGlvbi5lczUpIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChiKSB7DQogICAgICAgICAgICBpbmRlbnQgLT0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgIH0NCiAgICAgICAgYWR2YW5jZSgnXScsIHRoaXMpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LCAxNjApOw0KDQoNCiAgICBmdW5jdGlvbiBwcm9wZXJ0eV9uYW1lKCkgew0KICAgICAgICB2YXIgaWQgPSBvcHRpb25hbGlkZW50aWZpZXIodHJ1ZSk7DQogICAgICAgIGlmICghaWQpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoc3RyaW5nKScpIHsNCiAgICAgICAgICAgICAgICBpZCA9IG5leHR0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhudW1iZXIpJykgew0KICAgICAgICAgICAgICAgIGlkID0gbmV4dHRva2VuLnZhbHVlLnRvU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBpZDsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucGFyYW1zKCkgew0KICAgICAgICB2YXIgaSwgdCA9IG5leHR0b2tlbiwgcCA9IFtdOw0KICAgICAgICBhZHZhbmNlKCcoJyk7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyknKSB7DQogICAgICAgICAgICBhZHZhbmNlKCcpJyk7DQogICAgICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIGkgPSBpZGVudGlmaWVyKHRydWUpOw0KICAgICAgICAgICAgcC5wdXNoKGkpOw0KICAgICAgICAgICAgYWRkbGFiZWwoaSwgJ3BhcmFtZXRlcicpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgY29tbWEoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgICAgICAgICAgcmV0dXJuIHA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIGRvRnVuY3Rpb24oaSwgc3RhdGVtZW50KSB7DQogICAgICAgIHZhciBmLA0KICAgICAgICAgICAgb2xkT3B0aW9uID0gb3B0aW9uLA0KICAgICAgICAgICAgb2xkU2NvcGUgID0gc2NvcGU7DQoNCiAgICAgICAgb3B0aW9uID0gT2JqZWN0LmNyZWF0ZShvcHRpb24pOw0KICAgICAgICBzY29wZSA9IE9iamVjdC5jcmVhdGUoc2NvcGUpOw0KDQogICAgICAgIGZ1bmN0ID0gew0KICAgICAgICAgICAgJyhuYW1lKScgICAgIDogaSB8fCAnIicgKyBhbm9ubmFtZSArICciJywNCiAgICAgICAgICAgICcobGluZSknICAgICA6IG5leHR0b2tlbi5saW5lLA0KICAgICAgICAgICAgJyhjb250ZXh0KScgIDogZnVuY3QsDQogICAgICAgICAgICAnKGJyZWFrYWdlKScgOiAwLA0KICAgICAgICAgICAgJyhsb29wYWdlKScgIDogMCwNCiAgICAgICAgICAgICcoc2NvcGUpJyAgICA6IHNjb3BlLA0KICAgICAgICAgICAgJyhzdGF0ZW1lbnQpJzogc3RhdGVtZW50DQogICAgICAgIH07DQogICAgICAgIGYgPSBmdW5jdDsNCiAgICAgICAgdG9rZW4uZnVuY3QgPSBmdW5jdDsNCiAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3QpOw0KICAgICAgICBpZiAoaSkgew0KICAgICAgICAgICAgYWRkbGFiZWwoaSwgJ2Z1bmN0aW9uJyk7DQogICAgICAgIH0NCiAgICAgICAgZnVuY3RbJyhwYXJhbXMpJ10gPSBmdW5jdGlvbnBhcmFtcygpOw0KDQogICAgICAgIGJsb2NrKGZhbHNlKTsNCiAgICAgICAgc2NvcGUgPSBvbGRTY29wZTsNCiAgICAgICAgb3B0aW9uID0gb2xkT3B0aW9uOw0KICAgICAgICBmdW5jdFsnKGxhc3QpJ10gPSB0b2tlbi5saW5lOw0KICAgICAgICBmdW5jdCA9IGZ1bmN0WycoY29udGV4dCknXTsNCiAgICAgICAgcmV0dXJuIGY7DQogICAgfQ0KDQoNCiAgICAoZnVuY3Rpb24gKHgpIHsNCiAgICAgICAgeC5udWQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgYiwgZiwgaSwgaiwgcCwgc2VlbiA9IHt9LCB0Ow0KDQogICAgICAgICAgICBiID0gdG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmU7DQogICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uZnJvbSA9PT0gaW5kZW50ICsgb3B0aW9uLmluZGVudCkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nKSB7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLnZhbHVlID09PSAnZ2V0JyAmJiBwZWVrKCkuaWQgIT09ICc6Jykgew0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCdnZXQnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZXM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiZ2V0L3NldCBhcmUgRVM1IGZlYXR1cmVzLiIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGkgPSBwcm9wZXJ0eV9uYW1lKCk7DQogICAgICAgICAgICAgICAgICAgIGlmICghaSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgcHJvcGVydHkgbmFtZS4iKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0ID0gbmV4dHRva2VuOw0KICAgICAgICAgICAgICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgZiA9IGRvRnVuY3Rpb24oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24ubG9vcGZ1bmMgJiYgZnVuY3RbJyhsb29wYWdlKSddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJEb24ndCBtYWtlIGZ1bmN0aW9ucyB3aXRoaW4gYSBsb29wLiIsIHQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHAgPSBmWycocGFyYW1zKSddOw0KICAgICAgICAgICAgICAgICAgICBpZiAocCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBwYXJhbWV0ZXIgJ3thfScgaW4gZ2V0IHtifSBmdW5jdGlvbi4iLCB0LCBwWzBdLCBpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgnLCcpOw0KICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCdzZXQnKTsNCiAgICAgICAgICAgICAgICAgICAgaiA9IHByb3BlcnR5X25hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCB7YX0gYW5kIGluc3RlYWQgc2F3IHtifS4iLCB0b2tlbiwgaSwgaik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgICAgICAgICAgICAgIGYgPSBkb0Z1bmN0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgIHAgPSBmWycocGFyYW1zKSddOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIXAgfHwgcC5sZW5ndGggIT09IDEgfHwgcFswXSAhPT0gJ3ZhbHVlJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgKHZhbHVlKSBpbiBzZXQge2F9IGZ1bmN0aW9uLiIsIHQsIGkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaSA9IHByb3BlcnR5X25hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpICE9PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgnOicpOw0KICAgICAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbigxMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChzZWVuW2ldID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkR1cGxpY2F0ZSBtZW1iZXIgJ3thfScuIiwgbmV4dHRva2VuLCBpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgc2VlbltpXSA9IHRydWU7DQogICAgICAgICAgICAgICAgY291bnRNZW1iZXIoaSk7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbW1hKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcsJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nICYmICFvcHRpb24uZXM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHRyYSBjb21tYS4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgIGluZGVudCAtPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhZHZhbmNlKCd9JywgdGhpcyk7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfTsNCiAgICAgICAgeC5mdWQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgdG8gc2VlIGEgc3RhdGVtZW50IGFuZCBpbnN0ZWFkIHNhdyBhIGJsb2NrLiIsIHRva2VuKTsNCiAgICAgICAgfTsNCiAgICB9KGRlbGltKCd7JykpKTsNCg0KICAgIHZhciB2YXJzdGF0ZW1lbnQgPSBzdG10KCd2YXInLCBmdW5jdGlvbiAocHJlZml4KSB7DQogICAgICAgIC8vIEphdmFTY3JpcHQgZG9lcyBub3QgaGF2ZSBibG9jayBzY29wZS4gSXQgb25seSBoYXMgZnVuY3Rpb24gc2NvcGUuIFNvLA0KICAgICAgICAvLyBkZWNsYXJpbmcgYSB2YXJpYWJsZSBpbiBhIGJsb2NrIGNhbiBoYXZlIHVuZXhwZWN0ZWQgY29uc2VxdWVuY2VzLg0KICAgICAgICB2YXIgaWQsIG5hbWUsIHZhbHVlOw0KDQogICAgICAgIGlmIChmdW5jdFsnKG9uZXZhciknXSAmJiBvcHRpb24ub25ldmFyKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJUb28gbWFueSB2YXIgc3RhdGVtZW50cy4iKTsNCiAgICAgICAgfSBlbHNlIGlmICghZnVuY3RbJyhnbG9iYWwpJ10pIHsNCiAgICAgICAgICAgIGZ1bmN0Wycob25ldmFyKSddID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcnN0ID0gW107DQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgaWQgPSBpZGVudGlmaWVyKCk7DQogICAgICAgICAgICBpZiAoZnVuY3RbJyhnbG9iYWwpJ10gJiYgcHJlZGVmaW5lZFtpZF0gPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiUmVkZWZpbml0aW9uIG9mICd7YX0nLiIsIHRva2VuLCBpZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhZGRsYWJlbChpZCwgJ3VudXNlZCcpOw0KICAgICAgICAgICAgaWYgKHByZWZpeCkgew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbmFtZSA9IHRva2VuOw0KICAgICAgICAgICAgdGhpcy5maXJzdC5wdXNoKHRva2VuKTsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9Jykgew0KICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgICAgIGFkdmFuY2UoJz0nKTsNCiAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGluaXRpYWxpemUgJ3thfScgdG8gJ3VuZGVmaW5lZCcuIiwgdG9rZW4sIGlkKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHBlZWsoMCkuaWQgPT09ICc9JyAmJiBuZXh0dG9rZW4uaWRlbnRpZmllcikgew0KICAgICAgICAgICAgICAgICAgICBlcnJvcigiVmFyaWFibGUge2F9IHdhcyBub3QgZGVjbGFyZWQgY29ycmVjdGx5LiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV4cHJlc3Npb24oMCk7DQogICAgICAgICAgICAgICAgbmFtZS5maXJzdCA9IHZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb21tYSgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KICAgIHZhcnN0YXRlbWVudC5leHBzID0gdHJ1ZTsNCg0KICAgIGJsb2Nrc3RtdCgnZnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIGlmIChpbmJsb2NrKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJGdW5jdGlvbiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdCBiZSBwbGFjZWQgaW4gYmxvY2tzLiAiICsNCiAgICAgICAgICAgICAgICAiVXNlIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiBvciBtb3ZlIHRoZSBzdGF0ZW1lbnQgdG8gdGhlIHRvcCBvZiAiICsNCiAgICAgICAgICAgICAgICAidGhlIG91dGVyIGZ1bmN0aW9uLiIsIHRva2VuKTsNCg0KICAgICAgICB9DQogICAgICAgIHZhciBpID0gaWRlbnRpZmllcigpOw0KICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgYWRkbGFiZWwoaSwgJ3VuY3Rpb24nKTsNCiAgICAgICAgZG9GdW5jdGlvbihpLCB0cnVlKTsNCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJygnICYmIG5leHR0b2tlbi5saW5lID09PSB0b2tlbi5saW5lKSB7DQogICAgICAgICAgICBlcnJvcigNCiJGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlIG5vdCBpbnZvY2FibGUuIFdyYXAgdGhlIHdob2xlIGZ1bmN0aW9uIGludm9jYXRpb24gaW4gcGFyZW5zLiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KDQogICAgcHJlZml4KCdmdW5jdGlvbicsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIGkgPSBvcHRpb25hbGlkZW50aWZpZXIoKTsNCiAgICAgICAgaWYgKGkpIHsNCiAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7DQogICAgICAgIH0NCiAgICAgICAgZG9GdW5jdGlvbihpKTsNCiAgICAgICAgaWYgKCFvcHRpb24ubG9vcGZ1bmMgJiYgZnVuY3RbJyhsb29wYWdlKSddKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJEb24ndCBtYWtlIGZ1bmN0aW9ucyB3aXRoaW4gYSBsb29wLiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KDQogICAgYmxvY2tzdG10KCdpZicsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW47DQogICAgICAgIGFkdmFuY2UoJygnKTsNCiAgICAgICAgbm9uYWRqYWNlbnQodGhpcywgdCk7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9Jykgew0KICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICBhZHZhbmNlKCc9Jyk7DQogICAgICAgICAgICBleHByZXNzaW9uKDIwKTsNCiAgICAgICAgfQ0KICAgICAgICBhZHZhbmNlKCcpJywgdCk7DQogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnZWxzZScpIHsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnZWxzZScpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ2lmJyB8fCBuZXh0dG9rZW4uaWQgPT09ICdzd2l0Y2gnKSB7DQogICAgICAgICAgICAgICAgc3RhdGVtZW50KHRydWUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBibG9jayh0cnVlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KTsNCg0KICAgIGJsb2Nrc3RtdCgndHJ5JywgZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgYiwgZSwgczsNCg0KICAgICAgICBibG9jayhmYWxzZSk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICdjYXRjaCcpIHsNCiAgICAgICAgICAgIGFkdmFuY2UoJ2NhdGNoJyk7DQogICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgIGFkdmFuY2UoJygnKTsNCiAgICAgICAgICAgIHMgPSBzY29wZTsNCiAgICAgICAgICAgIHNjb3BlID0gT2JqZWN0LmNyZWF0ZShzKTsNCiAgICAgICAgICAgIGUgPSBuZXh0dG9rZW4udmFsdWU7DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLnR5cGUgIT09ICcoaWRlbnRpZmllciknKSB7DQogICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwNCiAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBlKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYWRkbGFiZWwoZSwgJ2V4Y2VwdGlvbicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgYWR2YW5jZSgnKScpOw0KICAgICAgICAgICAgYmxvY2soZmFsc2UpOw0KICAgICAgICAgICAgYiA9IHRydWU7DQogICAgICAgICAgICBzY29wZSA9IHM7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ2ZpbmFsbHknKSB7DQogICAgICAgICAgICBhZHZhbmNlKCdmaW5hbGx5Jyk7DQogICAgICAgICAgICBibG9jayhmYWxzZSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0gZWxzZSBpZiAoIWIpIHsNCiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwNCiAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAnY2F0Y2gnLCBuZXh0dG9rZW4udmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pOw0KDQogICAgYmxvY2tzdG10KCd3aGlsZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW47DQogICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsNCiAgICAgICAgZnVuY3RbJyhsb29wYWdlKSddICs9IDE7DQogICAgICAgIGFkdmFuY2UoJygnKTsNCiAgICAgICAgbm9uYWRqYWNlbnQodGhpcywgdCk7DQogICAgICAgIG5vc3BhY2UoKTsNCiAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9Jykgew0KICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykNCiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICBhZHZhbmNlKCc9Jyk7DQogICAgICAgICAgICBleHByZXNzaW9uKDIwKTsNCiAgICAgICAgfQ0KICAgICAgICBhZHZhbmNlKCcpJywgdCk7DQogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7DQogICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSAtPSAxOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KS5sYWJlbGxlZCA9IHRydWU7DQoNCiAgICByZXNlcnZlKCd3aXRoJyk7DQoNCiAgICBibG9ja3N0bXQoJ3N3aXRjaCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW4sDQogICAgICAgICAgICBnID0gZmFsc2U7DQogICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsNCiAgICAgICAgYWR2YW5jZSgnKCcpOw0KICAgICAgICBub25hZGphY2VudCh0aGlzLCB0KTsNCiAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGV4cHJlc3Npb24oMjApOw0KICAgICAgICBhZHZhbmNlKCcpJywgdCk7DQogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICB0ID0gbmV4dHRva2VuOw0KICAgICAgICBhZHZhbmNlKCd7Jyk7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsNCiAgICAgICAgdGhpcy5jYXNlcyA9IFtdOw0KICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICBzd2l0Y2ggKG5leHR0b2tlbi5pZCkgew0KICAgICAgICAgICAgY2FzZSAnY2FzZSc6DQogICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdFsnKHZlcmIpJ10pIHsNCiAgICAgICAgICAgICAgICBjYXNlICdicmVhayc6DQogICAgICAgICAgICAgICAgY2FzZSAnY2FzZSc6DQogICAgICAgICAgICAgICAgY2FzZSAnY29udGludWUnOg0KICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6DQogICAgICAgICAgICAgICAgY2FzZSAnc3dpdGNoJzoNCiAgICAgICAgICAgICAgICBjYXNlICd0aHJvdyc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIC8vIFlvdSBjYW4gdGVsbCBKU0hpbnQgdGhhdCB5b3UgZG9uJ3QgdXNlIGJyZWFrIGludGVudGlvbmFsbHkgYnkNCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIGEgY29tbWVudCAvKiBmYWxscyB0aHJvdWdoICovIG9uIGEgbGluZSBqdXN0IGJlZm9yZQ0KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBgY2FzZWAuDQogICAgICAgICAgICAgICAgICAgIGlmICghZnQudGVzdChsaW5lc1tuZXh0dG9rZW4ubGluZSAtIDJdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSAnYnJlYWsnIHN0YXRlbWVudCBiZWZvcmUgJ2Nhc2UnLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKC1vcHRpb24uaW5kZW50KTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCdjYXNlJyk7DQogICAgICAgICAgICAgICAgdGhpcy5jYXNlcy5wdXNoKGV4cHJlc3Npb24oMjApKTsNCiAgICAgICAgICAgICAgICBnID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCc6Jyk7DQogICAgICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gJ2Nhc2UnOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnZGVmYXVsdCc6DQogICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdFsnKHZlcmIpJ10pIHsNCiAgICAgICAgICAgICAgICBjYXNlICdicmVhayc6DQogICAgICAgICAgICAgICAgY2FzZSAnY29udGludWUnOg0KICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6DQogICAgICAgICAgICAgICAgY2FzZSAndGhyb3cnOg0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZ0LnRlc3QobGluZXNbbmV4dHRva2VuLmxpbmUgLSAyXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgJ2JyZWFrJyBzdGF0ZW1lbnQgYmVmb3JlICdkZWZhdWx0Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigtb3B0aW9uLmluZGVudCk7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnZGVmYXVsdCcpOw0KICAgICAgICAgICAgICAgIGcgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGFkdmFuY2UoJzonKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ30nOg0KICAgICAgICAgICAgICAgIGluZGVudCAtPSBvcHRpb24uaW5kZW50Ow0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnfScsIHQpOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhc2VzLmxlbmd0aCA9PT0gMSB8fCB0aGlzLmNvbmRpdGlvbi5pZCA9PT0gJ3RydWUnIHx8DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbi5pZCA9PT0gJ2ZhbHNlJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJUaGlzICdzd2l0Y2gnIHNob3VsZCBiZSBhbiAnaWYnLiIsIHRoaXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7DQogICAgICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGNhc2UgJyhlbmQpJzoNCiAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyAne2F9Jy4iLCBuZXh0dG9rZW4sICd9Jyk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZiAoZykgew0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLmlkKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkVhY2ggdmFsdWUgc2hvdWxkIGhhdmUgaXRzIG93biBjYXNlIGxhYmVsLiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJzonIG9uIGEgY2FzZSBjbGF1c2UuIiwgdG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAnY2FzZScsIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSkubGFiZWxsZWQgPSB0cnVlOw0KDQogICAgc3RtdCgnZGVidWdnZXInLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIGlmICghb3B0aW9uLmRlYnVnKSB7DQogICAgICAgICAgICB3YXJuaW5nKCJBbGwgJ2RlYnVnZ2VyJyBzdGF0ZW1lbnRzIHNob3VsZCBiZSByZW1vdmVkLiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pLmV4cHMgPSB0cnVlOw0KDQogICAgKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIHggPSBzdG10KCdkbycsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsNCiAgICAgICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSArPSAxOw0KICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJsb2NrKHRydWUpOw0KICAgICAgICAgICAgYWR2YW5jZSgnd2hpbGUnKTsNCiAgICAgICAgICAgIHZhciB0ID0gbmV4dHRva2VuOw0KICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIHQpOw0KICAgICAgICAgICAgYWR2YW5jZSgnKCcpOw0KICAgICAgICAgICAgbm9zcGFjZSgpOw0KICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnPScpIHsNCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbi5ib3NzKQ0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgnPScpOw0KICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMjApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gLT0gMTsNCiAgICAgICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSAtPSAxOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0pOw0KICAgICAgICB4LmxhYmVsbGVkID0gdHJ1ZTsNCiAgICAgICAgeC5leHBzID0gdHJ1ZTsNCiAgICB9KCkpOw0KDQogICAgYmxvY2tzdG10KCdmb3InLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBzLCB0ID0gbmV4dHRva2VuOw0KICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddICs9IDE7DQogICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSArPSAxOw0KICAgICAgICBhZHZhbmNlKCcoJyk7DQogICAgICAgIG5vbmFkamFjZW50KHRoaXMsIHQpOw0KICAgICAgICBub3NwYWNlKCk7DQogICAgICAgIGlmIChwZWVrKG5leHR0b2tlbi5pZCA9PT0gJ3ZhcicgPyAxIDogMCkuaWQgPT09ICdpbicpIHsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICd2YXInKSB7DQogICAgICAgICAgICAgICAgYWR2YW5jZSgndmFyJyk7DQogICAgICAgICAgICAgICAgdmFyc3RhdGVtZW50LmZ1ZC5jYWxsKHZhcnN0YXRlbWVudCwgdHJ1ZSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHN3aXRjaCAoZnVuY3RbbmV4dHRva2VuLnZhbHVlXSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ3VudXNlZCc6DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0W25leHR0b2tlbi52YWx1ZV0gPSAndmFyJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAndmFyJzoNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiQmFkIGZvciBpbiB2YXJpYWJsZSAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnaW4nKTsNCiAgICAgICAgICAgIGV4cHJlc3Npb24oMjApOw0KICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgcyA9IGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICAgICAgaWYgKG9wdGlvbi5mb3JpbiAmJiAocy5sZW5ndGggPiAxIHx8IHR5cGVvZiBzWzBdICE9PSAnb2JqZWN0JyB8fA0KICAgICAgICAgICAgICAgICAgICBzWzBdLnZhbHVlICE9PSAnaWYnKSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlRoZSBib2R5IG9mIGEgZm9yIGluIHNob3VsZCBiZSB3cmFwcGVkIGluIGFuIGlmIHN0YXRlbWVudCB0byBmaWx0ZXIgIiArDQogICAgICAgICAgICAgICAgICAgICAgICAidW53YW50ZWQgcHJvcGVydGllcyBmcm9tIHRoZSBwcm90b3R5cGUuIiwgdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7DQogICAgICAgICAgICBmdW5jdFsnKGxvb3BhZ2UpJ10gLT0gMTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ3ZhcicpIHsNCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgndmFyJyk7DQogICAgICAgICAgICAgICAgICAgIHZhcnN0YXRlbWVudC5mdWQuY2FsbCh2YXJzdGF0ZW1lbnQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMCwgJ2ZvcicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjb21tYSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbm9saW5lYnJlYWsodG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7DQogICAgICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmJvc3MpDQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7DQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJz0nKTsNCiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbm9saW5lYnJlYWsodG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnOycpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJzsnKSB7DQogICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAnKScsICc7Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKScpIHsNCiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMCwgJ2ZvcicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbW1hKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOw0KICAgICAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsNCiAgICAgICAgICAgIGJsb2NrKHRydWUsIHRydWUpOw0KICAgICAgICAgICAgZnVuY3RbJyhicmVha2FnZSknXSAtPSAxOw0KICAgICAgICAgICAgZnVuY3RbJyhsb29wYWdlKSddIC09IDE7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfQ0KICAgIH0pLmxhYmVsbGVkID0gdHJ1ZTsNCg0KDQogICAgc3RtdCgnYnJlYWsnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB2ID0gbmV4dHRva2VuLnZhbHVlOw0KICAgICAgICBpZiAoZnVuY3RbJyhicmVha2FnZSknXSA9PT0gMCkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIG5vbGluZWJyZWFrKHRoaXMpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycpIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi5saW5lID09PSBuZXh0dG9rZW4ubGluZSkgew0KICAgICAgICAgICAgICAgIGlmIChmdW5jdFt2XSAhPT0gJ2xhYmVsJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlW3ZdICE9PSBmdW5jdCkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBvdXQgb2Ygc2NvcGUuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmVhY2hhYmxlKCdicmVhaycpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9KS5leHBzID0gdHJ1ZTsNCg0KDQogICAgc3RtdCgnY29udGludWUnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB2ID0gbmV4dHRva2VuLnZhbHVlOw0KICAgICAgICBpZiAoZnVuY3RbJyhicmVha2FnZSknXSA9PT0gMCkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIG5vbGluZWJyZWFrKHRoaXMpOw0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycpIHsNCiAgICAgICAgICAgIGlmICh0b2tlbi5saW5lID09PSBuZXh0dG9rZW4ubGluZSkgew0KICAgICAgICAgICAgICAgIGlmIChmdW5jdFt2XSAhPT0gJ2xhYmVsJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlW3ZdICE9PSBmdW5jdCkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBvdXQgb2Ygc2NvcGUuIiwgbmV4dHRva2VuLCB2KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoIWZ1bmN0WycobG9vcGFnZSknXSkgew0KICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIHJlYWNoYWJsZSgnY29udGludWUnKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSkuZXhwcyA9IHRydWU7DQoNCg0KICAgIHN0bXQoJ3JldHVybicsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgbm9saW5lYnJlYWsodGhpcyk7DQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcocmVnZXhwKScpIHsNCiAgICAgICAgICAgIHdhcm5pbmcoIldyYXAgdGhlIC9yZWdleHAvIGxpdGVyYWwgaW4gcGFyZW5zIHRvIGRpc2FtYmlndWF0ZSB0aGUgc2xhc2ggb3BlcmF0b3IuIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnICYmICFuZXh0dG9rZW4ucmVhY2gpIHsNCiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgdGhpcy5maXJzdCA9IGV4cHJlc3Npb24oMjApOw0KICAgICAgICB9DQogICAgICAgIHJlYWNoYWJsZSgncmV0dXJuJyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0pLmV4cHMgPSB0cnVlOw0KDQoNCiAgICBzdG10KCd0aHJvdycsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgbm9saW5lYnJlYWsodGhpcyk7DQogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICB0aGlzLmZpcnN0ID0gZXhwcmVzc2lvbigyMCk7DQogICAgICAgIHJlYWNoYWJsZSgndGhyb3cnKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSkuZXhwcyA9IHRydWU7DQoNCi8vICBTdXBlcmZsdW91cyByZXNlcnZlZCB3b3Jkcw0KDQogICAgcmVzZXJ2ZSgnY2xhc3MnKTsNCiAgICByZXNlcnZlKCdjb25zdCcpOw0KICAgIHJlc2VydmUoJ2VudW0nKTsNCiAgICByZXNlcnZlKCdleHBvcnQnKTsNCiAgICByZXNlcnZlKCdleHRlbmRzJyk7DQogICAgcmVzZXJ2ZSgnaW1wb3J0Jyk7DQogICAgcmVzZXJ2ZSgnc3VwZXInKTsNCg0KICAgIHJlc2VydmUoJ2xldCcpOw0KICAgIHJlc2VydmUoJ3lpZWxkJyk7DQogICAgcmVzZXJ2ZSgnaW1wbGVtZW50cycpOw0KICAgIHJlc2VydmUoJ2ludGVyZmFjZScpOw0KICAgIHJlc2VydmUoJ3BhY2thZ2UnKTsNCiAgICByZXNlcnZlKCdwcml2YXRlJyk7DQogICAgcmVzZXJ2ZSgncHJvdGVjdGVkJyk7DQogICAgcmVzZXJ2ZSgncHVibGljJyk7DQogICAgcmVzZXJ2ZSgnc3RhdGljJyk7DQoNCg0KLy8gUGFyc2UgSlNPTg0KDQogICAgZnVuY3Rpb24ganNvblZhbHVlKCkgew0KDQogICAgICAgIGZ1bmN0aW9uIGpzb25PYmplY3QoKSB7DQogICAgICAgICAgICB2YXIgbyA9IHt9LCB0ID0gbmV4dHRva2VuOw0KICAgICAgICAgICAgYWR2YW5jZSgneycpOw0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJ30nKSB7DQogICAgICAgICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKGVuZCknKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyAnfScgdG8gbWF0Y2ggJ3snIGZyb20gbGluZSB7YX0uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCB0LmxpbmUpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIGNvbW1hLiIsIHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCBjb21tYS4iLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCAhPT0gJyhzdHJpbmcpJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYSBzdHJpbmcgYW5kIGluc3RlYWQgc2F3IHthfS4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKG9bbmV4dHRva2VuLnZhbHVlXSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRHVwbGljYXRlIGtleSAne2F9Jy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG5leHR0b2tlbi52YWx1ZSA9PT0gJ19fcHJvdG9fXycgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICFvcHRpb24ucHJvdG8pIHx8IChuZXh0dG9rZW4udmFsdWUgPT09ICdfX2l0ZXJhdG9yX18nICYmDQogICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9uLml0ZXJhdG9yKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlRoZSAne2F9JyBrZXkgbWF5IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG9bbmV4dHRva2VuLnZhbHVlXSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOw0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCc6Jyk7DQogICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJywnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhZHZhbmNlKCd9Jyk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBqc29uQXJyYXkoKSB7DQogICAgICAgICAgICB2YXIgdCA9IG5leHR0b2tlbjsNCiAgICAgICAgICAgIGFkdmFuY2UoJ1snKTsNCiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICddJykgew0KICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhlbmQpJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJ10nIHRvIG1hdGNoICdbJyBmcm9tIGxpbmUge2F9LiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgdC5saW5lKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0dG9rZW4uaWQgPT09ICddJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBjb21tYS4iLCB0b2tlbik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0dG9rZW4uaWQgPT09ICcsJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgY29tbWEuIiwgbmV4dHRva2VuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCcsJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYWR2YW5jZSgnXScpOw0KICAgICAgICB9DQoNCiAgICAgICAgc3dpdGNoIChuZXh0dG9rZW4uaWQpIHsNCiAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICBqc29uT2JqZWN0KCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnWyc6DQogICAgICAgICAgICBqc29uQXJyYXkoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd0cnVlJzoNCiAgICAgICAgY2FzZSAnZmFsc2UnOg0KICAgICAgICBjYXNlICdudWxsJzoNCiAgICAgICAgY2FzZSAnKG51bWJlciknOg0KICAgICAgICBjYXNlICcoc3RyaW5nKSc6DQogICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnLSc6DQogICAgICAgICAgICBhZHZhbmNlKCctJyk7DQogICAgICAgICAgICBpZiAodG9rZW4uY2hhcmFjdGVyICE9PSBuZXh0dG9rZW4uZnJvbSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgJy0nLiIsIHRva2VuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOw0KICAgICAgICAgICAgYWR2YW5jZSgnKG51bWJlciknKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgSlNPTiB2YWx1ZS4iLCBuZXh0dG9rZW4pOw0KICAgICAgICB9DQogICAgfQ0KDQoNCi8vIFRoZSBhY3R1YWwgSlNISU5UIGZ1bmN0aW9uIGl0c2VsZi4NCg0KICAgIHZhciBpdHNlbGYgPSBmdW5jdGlvbiAocywgbywgZykgew0KICAgICAgICB2YXIgYSwgaSwgazsNCiAgICAgICAgSlNISU5ULmVycm9ycyA9IFtdOw0KICAgICAgICBwcmVkZWZpbmVkID0gT2JqZWN0LmNyZWF0ZShzdGFuZGFyZCk7DQogICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgZyB8fCB7fSk7DQogICAgICAgIGlmIChvKSB7DQogICAgICAgICAgICBhID0gby5wcmVkZWY7DQogICAgICAgICAgICBpZiAoYSkgew0KICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkW2FbaV1dID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICAgICAgICAgIGsgPSBPYmplY3Qua2V5cyhhKTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGsubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWRba1tpXV0gPSAhIWFba1tpXV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvcHRpb24gPSBvOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgb3B0aW9uID0ge307DQogICAgICAgIH0NCiAgICAgICAgb3B0aW9uLmluZGVudCA9IG9wdGlvbi5pbmRlbnQgfHwgNDsNCiAgICAgICAgb3B0aW9uLm1heGVyciA9IG9wdGlvbi5tYXhlcnIgfHwgNTA7DQoNCiAgICAgICAgdGFiID0gJyc7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb24uaW5kZW50OyBpICs9IDEpIHsNCiAgICAgICAgICAgIHRhYiArPSAnICc7DQogICAgICAgIH0NCiAgICAgICAgaW5kZW50ID0gMTsNCiAgICAgICAgZ2xvYmFsID0gT2JqZWN0LmNyZWF0ZShwcmVkZWZpbmVkKTsNCiAgICAgICAgc2NvcGUgPSBnbG9iYWw7DQogICAgICAgIGZ1bmN0ID0gew0KICAgICAgICAgICAgJyhnbG9iYWwpJzogdHJ1ZSwNCiAgICAgICAgICAgICcobmFtZSknOiAnKGdsb2JhbCknLA0KICAgICAgICAgICAgJyhzY29wZSknOiBzY29wZSwNCiAgICAgICAgICAgICcoYnJlYWthZ2UpJzogMCwNCiAgICAgICAgICAgICcobG9vcGFnZSknOiAwDQogICAgICAgIH07DQogICAgICAgIGZ1bmN0aW9ucyA9IFtmdW5jdF07DQogICAgICAgIHVybHMgPSBbXTsNCiAgICAgICAgc3JjID0gZmFsc2U7DQogICAgICAgIHN0YWNrID0gbnVsbDsNCiAgICAgICAgbWVtYmVyID0ge307DQogICAgICAgIG1lbWJlcnNPbmx5ID0gbnVsbDsNCiAgICAgICAgaW1wbGllZCA9IHt9Ow0KICAgICAgICBpbmJsb2NrID0gZmFsc2U7DQogICAgICAgIGxvb2thaGVhZCA9IFtdOw0KICAgICAgICBqc29ubW9kZSA9IGZhbHNlOw0KICAgICAgICB3YXJuaW5ncyA9IDA7DQogICAgICAgIGxleC5pbml0KHMpOw0KICAgICAgICBwcmVyZWcgPSB0cnVlOw0KICAgICAgICBzdHJpY3RfbW9kZSA9IGZhbHNlOw0KDQogICAgICAgIHByZXZ0b2tlbiA9IHRva2VuID0gbmV4dHRva2VuID0gc3ludGF4WycoYmVnaW4pJ107DQogICAgICAgIGFzc3VtZSgpOw0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBhZHZhbmNlKCk7DQogICAgICAgICAgICBzd2l0Y2ggKG5leHR0b2tlbi5pZCkgew0KICAgICAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICBjYXNlICdbJzoNCiAgICAgICAgICAgICAgICBvcHRpb24ubGF4YnJlYWsgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGpzb25tb2RlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBqc29uVmFsdWUoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi52YWx1ZSA9PT0gJ3VzZSBzdHJpY3QnKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmdsb2JhbHN0cmljdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgZnVuY3Rpb24gZm9ybSBvZiBcInVzZSBzdHJpY3RcIi4iKTsNCiAgICAgICAgICAgICAgICAgICAgdXNlX3N0cmljdCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzKCdsaWInKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGFkdmFuY2UoJyhlbmQpJyk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgIGlmIChlKSB7DQogICAgICAgICAgICAgICAgSlNISU5ULmVycm9ycy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcmVhc29uICAgIDogZS5tZXNzYWdlLA0KICAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgOiBlLmxpbmUgfHwgbmV4dHRva2VuLmxpbmUsDQogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA6IGUuY2hhcmFjdGVyIHx8IG5leHR0b2tlbi5mcm9tDQogICAgICAgICAgICAgICAgfSwgbnVsbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIEpTSElOVC5lcnJvcnMubGVuZ3RoID09PSAwOw0KICAgIH07DQoNCg0KLy8gRGF0YSBzdW1tYXJ5Lg0KDQogICAgaXRzZWxmLmRhdGEgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgdmFyIGRhdGEgPSB7ZnVuY3Rpb25zOiBbXX0sIGZ1LCBnbG9iYWxzLCBpbXBsaWVkcyA9IFtdLCBmLCBpLCBqLA0KICAgICAgICAgICAgbWVtYmVycyA9IFtdLCBuLCB1bnVzZWQgPSBbXSwgdjsNCiAgICAgICAgaWYgKGl0c2VsZi5lcnJvcnMubGVuZ3RoKSB7DQogICAgICAgICAgICBkYXRhLmVycm9ycyA9IGl0c2VsZi5lcnJvcnM7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoanNvbm1vZGUpIHsNCiAgICAgICAgICAgIGRhdGEuanNvbiA9IHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKG4gaW4gaW1wbGllZCkgew0KICAgICAgICAgICAgaWYgKGlzX293bihpbXBsaWVkLCBuKSkgew0KICAgICAgICAgICAgICAgIGltcGxpZWRzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLA0KICAgICAgICAgICAgICAgICAgICBsaW5lOiBpbXBsaWVkW25dDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGltcGxpZWRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIGRhdGEuaW1wbGllZHMgPSBpbXBsaWVkczsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh1cmxzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIGRhdGEudXJscyA9IHVybHM7DQogICAgICAgIH0NCg0KICAgICAgICBnbG9iYWxzID0gT2JqZWN0LmtleXMoc2NvcGUpOw0KICAgICAgICBpZiAoZ2xvYmFscy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICBkYXRhLmdsb2JhbHMgPSBnbG9iYWxzOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yIChpID0gMTsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkgKz0gMSkgew0KICAgICAgICAgICAgZiA9IGZ1bmN0aW9uc1tpXTsNCiAgICAgICAgICAgIGZ1ID0ge307DQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnVuY3Rpb25pY2l0eS5sZW5ndGg7IGogKz0gMSkgew0KICAgICAgICAgICAgICAgIGZ1W2Z1bmN0aW9uaWNpdHlbal1dID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKG4gaW4gZikgew0KICAgICAgICAgICAgICAgIGlmIChpc19vd24oZiwgbikgJiYgbi5jaGFyQXQoMCkgIT09ICcoJykgew0KICAgICAgICAgICAgICAgICAgICB2ID0gZltuXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICd1bmN0aW9uJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdiA9ICd1bnVzZWQnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZ1W3ZdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZnVbdl0ucHVzaChuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09PSAndW51c2VkJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZC5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZlsnKGxpbmUpJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbic6IGZbJyhuYW1lKSddDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZnVuY3Rpb25pY2l0eS5sZW5ndGg7IGogKz0gMSkgew0KICAgICAgICAgICAgICAgIGlmIChmdVtmdW5jdGlvbmljaXR5W2pdXS5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGZ1W2Z1bmN0aW9uaWNpdHlbal1dOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZ1Lm5hbWUgPSBmWycobmFtZSknXTsNCiAgICAgICAgICAgIGZ1LnBhcmFtID0gZlsnKHBhcmFtcyknXTsNCiAgICAgICAgICAgIGZ1LmxpbmUgPSBmWycobGluZSknXTsNCiAgICAgICAgICAgIGZ1Lmxhc3QgPSBmWycobGFzdCknXTsNCiAgICAgICAgICAgIGRhdGEuZnVuY3Rpb25zLnB1c2goZnUpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHVudXNlZC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICBkYXRhLnVudXNlZCA9IHVudXNlZDsNCiAgICAgICAgfQ0KDQogICAgICAgIG1lbWJlcnMgPSBbXTsNCiAgICAgICAgZm9yIChuIGluIG1lbWJlcikgew0KICAgICAgICAgICAgaWYgKHR5cGVvZiBtZW1iZXJbbl0gPT09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgZGF0YS5tZW1iZXIgPSBtZW1iZXI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZGF0YTsNCiAgICB9Ow0KDQogICAgaXRzZWxmLnJlcG9ydCA9IGZ1bmN0aW9uIChvcHRpb24pIHsNCiAgICAgICAgdmFyIGRhdGEgPSBpdHNlbGYuZGF0YSgpOw0KDQogICAgICAgIHZhciBhID0gW10sIGMsIGUsIGVyciwgZiwgaSwgaywgbCwgbSA9ICcnLCBuLCBvID0gW10sIHM7DQoNCiAgICAgICAgZnVuY3Rpb24gZGV0YWlsKGgsIGFycmF5KSB7DQogICAgICAgICAgICB2YXIgYiwgaSwgc2luZ3VsYXJpdHk7DQogICAgICAgICAgICBpZiAoYXJyYXkpIHsNCiAgICAgICAgICAgICAgICBvLnB1c2goJzxkaXY+PGk+JyArIGggKyAnPC9pPiAnKTsNCiAgICAgICAgICAgICAgICBhcnJheSA9IGFycmF5LnNvcnQoKTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9PSBzaW5ndWxhcml0eSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXJpdHkgPSBhcnJheVtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaCgoYiA/ICcsICcgOiAnJykgKyBzaW5ndWxhcml0eSk7DQogICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvLnB1c2goJzwvZGl2PicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICBpZiAoZGF0YS5lcnJvcnMgfHwgZGF0YS5pbXBsaWVkcyB8fCBkYXRhLnVudXNlZCkgew0KICAgICAgICAgICAgZXJyID0gdHJ1ZTsNCiAgICAgICAgICAgIG8ucHVzaCgnPGRpdiBpZD1lcnJvcnM+PGk+RXJyb3I6PC9pPicpOw0KICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JzKSB7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEuZXJyb3JzLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgIGMgPSBkYXRhLmVycm9yc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBjLmV2aWRlbmNlIHx8ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKCc8cD5Qcm9ibGVtJyArIChpc0Zpbml0ZShjLmxpbmUpID8gJyBhdCBsaW5lICcgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmxpbmUgKyAnIGNoYXJhY3RlciAnICsgYy5jaGFyYWN0ZXIgOiAnJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnICsgYy5yZWFzb24uZW50aXR5aWZ5KCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9wPjxwIGNsYXNzPWV2aWRlbmNlPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSAmJiAoZS5sZW5ndGggPiA4MCA/IGUuc2xpY2UoMCwgNzcpICsgJy4uLicgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKS5lbnRpdHlpZnkoKSkgKyAnPC9wPicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoZGF0YS5pbXBsaWVkcykgew0KICAgICAgICAgICAgICAgIHMgPSBbXTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5pbXBsaWVkcy5sZW5ndGg7IGkgKz0gMSkgew0KICAgICAgICAgICAgICAgICAgICBzW2ldID0gJzxjb2RlPicgKyBkYXRhLmltcGxpZWRzW2ldLm5hbWUgKyAnPC9jb2RlPiZuYnNwOzxpPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pbXBsaWVkc1tpXS5saW5lICsgJzwvaT4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvLnB1c2goJzxwPjxpPkltcGxpZWQgZ2xvYmFsOjwvaT4gJyArIHMuam9pbignLCAnKSArICc8L3A+Jyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChkYXRhLnVudXNlZCkgew0KICAgICAgICAgICAgICAgIHMgPSBbXTsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS51bnVzZWQubGVuZ3RoOyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgc1tpXSA9ICc8Y29kZT48dT4nICsgZGF0YS51bnVzZWRbaV0ubmFtZSArICc8L3U+PC9jb2RlPiZuYnNwOzxpPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS51bnVzZWRbaV0ubGluZSArICc8L2k+IDxjb2RlPicgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS51bnVzZWRbaV1bJ2Z1bmN0aW9uJ10gKyAnPC9jb2RlPic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPHA+PGk+VW51c2VkIHZhcmlhYmxlOjwvaT4gJyArIHMuam9pbignLCAnKSArICc8L3A+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZGF0YS5qc29uKSB7DQogICAgICAgICAgICAgICAgby5wdXNoKCc8cD5KU09OOiBiYWQuPC9wPicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgby5wdXNoKCc8L2Rpdj4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghb3B0aW9uKSB7DQoNCiAgICAgICAgICAgIG8ucHVzaCgnPGJyPjxkaXYgaWQ9ZnVuY3Rpb25zPicpOw0KDQogICAgICAgICAgICBpZiAoZGF0YS51cmxzKSB7DQogICAgICAgICAgICAgICAgZGV0YWlsKCJVUkxzPGJyPiIsIGRhdGEudXJscywgJzxicj4nKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGRhdGEuanNvbiAmJiAhZXJyKSB7DQogICAgICAgICAgICAgICAgby5wdXNoKCc8cD5KU09OOiBnb29kLjwvcD4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5nbG9iYWxzKSB7DQogICAgICAgICAgICAgICAgby5wdXNoKCc8ZGl2PjxpPkdsb2JhbDwvaT4gJyArDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdsb2JhbHMuc29ydCgpLmpvaW4oJywgJykgKyAnPC9kaXY+Jyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPGRpdj48aT5ObyBuZXcgZ2xvYmFsIHZhcmlhYmxlcyBpbnRyb2R1Y2VkLjwvaT48L2Rpdj4nKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEuZnVuY3Rpb25zLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgZiA9IGRhdGEuZnVuY3Rpb25zW2ldOw0KDQogICAgICAgICAgICAgICAgby5wdXNoKCc8YnI+PGRpdiBjbGFzcz1mdW5jdGlvbj48aT4nICsgZi5saW5lICsgJy0nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGYubGFzdCArICc8L2k+ICcgKyAoZi5uYW1lIHx8ICcnKSArICcoJyArDQogICAgICAgICAgICAgICAgICAgICAgICAoZi5wYXJhbSA/IGYucGFyYW0uam9pbignLCAnKSA6ICcnKSArICcpPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgZGV0YWlsKCc8YmlnPjxiPlVudXNlZDwvYj48L2JpZz4nLCBmLnVudXNlZCk7DQogICAgICAgICAgICAgICAgZGV0YWlsKCdDbG9zdXJlJywgZi5jbG9zdXJlKTsNCiAgICAgICAgICAgICAgICBkZXRhaWwoJ1ZhcmlhYmxlJywgZlsndmFyJ10pOw0KICAgICAgICAgICAgICAgIGRldGFpbCgnRXhjZXB0aW9uJywgZi5leGNlcHRpb24pOw0KICAgICAgICAgICAgICAgIGRldGFpbCgnT3V0ZXInLCBmLm91dGVyKTsNCiAgICAgICAgICAgICAgICBkZXRhaWwoJ0dsb2JhbCcsIGYuZ2xvYmFsKTsNCiAgICAgICAgICAgICAgICBkZXRhaWwoJ0xhYmVsJywgZi5sYWJlbCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChkYXRhLm1lbWJlcikgew0KICAgICAgICAgICAgICAgIGEgPSBPYmplY3Qua2V5cyhkYXRhLm1lbWJlcik7DQogICAgICAgICAgICAgICAgaWYgKGEubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGEgPSBhLnNvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgbSA9ICc8YnI+PHByZSBpZD1tZW1iZXJzPi8qbWVtYmVycyAnOw0KICAgICAgICAgICAgICAgICAgICBsID0gMTA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBrID0gYVtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBrLm5hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsICsgbi5sZW5ndGggPiA3Mikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaChtICsgJzxicj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gJyAgICAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgbCArPSBuLmxlbmd0aCArIDI7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZW1iZXJba10gPT09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJzxpPicgKyBuICsgJzwvaT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBhLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9ICcsICc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBtICs9IG47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgby5wdXNoKG0gKyAnPGJyPiovPC9wcmU+Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPC9kaXY+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG8uam9pbignJyk7DQogICAgfTsNCiAgICBpdHNlbGYuanNoaW50ID0gaXRzZWxmOw0KDQogICAgaXRzZWxmLmVkaXRpb24gPSAnMjAxMS0wNC0xNic7DQoNCiAgICByZXR1cm4gaXRzZWxmOw0KDQp9KCkpOw0KDQovLyBNYWtlIEpTSElOVCBhIE5vZGUgbW9kdWxlLCBpZiBwb3NzaWJsZS4NCmlmICh0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzKQ0KICAgIGV4cG9ydHMuSlNISU5UID0gSlNISU5UOw0KDQp9KTsvKiAtKi0gTW9kZTogSlM7IHRhYi13aWR0aDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0NCiAqIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz03ODoNCiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5hcmNpc3N1cyBKYXZhU2NyaXB0IGVuZ2luZS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4uDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA0DQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgIFRvbSBBdXN0aW4gPHRhdXN0aW5AdWNzYy5lZHU+DQogKiAgIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4NCiAqICAgU2h1LVl1IEd1byA8c2h1QHJmcm4ub3JnPg0KICogICBEYXZlIEhlcm1hbiA8ZGhlcm1hbkBtb3ppbGxhLmNvbT4NCiAqICAgRGltaXRyaXMgVmFyZG91bGFraXMgPGRpbXZhckBjY3MubmV1LmVkdT4NCiAqICAgUGF0cmljayBXYWx0b24gPHBjd2FsdG9uQG1vemlsbGEuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCi8qDQogKiBOYXJjaXNzdXMgLSBKUyBpbXBsZW1lbnRlZCBpbiBKUy4NCiAqDQogKiBQYXJzZXIuDQogKi8NCg0KZGVmaW5lKCdhY2UvbmFyY2lzc3VzL2pzcGFyc2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9uYXJjaXNzdXMvanNsZXgnLCAnYWNlL25hcmNpc3N1cy9qc2RlZnMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCiAgICB2YXIgbGV4ZXIgPSByZXF1aXJlKCIuL2pzbGV4Iik7DQogICAgdmFyIGRlZmluaXRpb25zID0gcmVxdWlyZSgiLi9qc2RlZnMiKTsNCg0KICAgIGNvbnN0IFN0cmluZ01hcCA9IGRlZmluaXRpb25zLlN0cmluZ01hcDsNCiAgICBjb25zdCBTdGFjayA9IGRlZmluaXRpb25zLlN0YWNrOw0KDQogICAgLy8gU2V0IGNvbnN0YW50cyBpbiB0aGUgbG9jYWwgc2NvcGUuDQogICAgZXZhbChkZWZpbml0aW9ucy5jb25zdHMpOw0KDQogICAgLy8gQmFubmVkIHN0YXRlbWVudCB0eXBlcyBieSBsYW5ndWFnZSB2ZXJzaW9uLg0KICAgIGNvbnN0IGJsYWNrTGlzdHMgPSB7IDE2MDoge30sIDE4NToge30sIGhhcm1vbnk6IHt9IH07DQogICAgYmxhY2tMaXN0c1sxNjBdW0lNUE9SVF0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHNbMTYwXVtFWFBPUlRdID0gdHJ1ZTsNCiAgICBibGFja0xpc3RzWzE2MF1bTEVUXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxNjBdW01PRFVMRV0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHNbMTYwXVtZSUVMRF0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHNbMTg1XVtJTVBPUlRdID0gdHJ1ZTsNCiAgICBibGFja0xpc3RzWzE4NV1bRVhQT1JUXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxODVdW01PRFVMRV0gPSB0cnVlOw0KICAgIGJsYWNrTGlzdHMuaGFybW9ueVtXSVRIXSA9IHRydWU7DQoNCiAgICAvKg0KICAgICAqIHB1c2hEZXN0cnVjdHVyaW5nVmFyRGVjbHMgOjogKG5vZGUsIGhvaXN0aW5nIG5vZGUpIC0+IHZvaWQNCiAgICAgKg0KICAgICAqIFJlY3Vyc2l2ZWx5IGFkZCBhbGwgZGVzdHJ1Y3R1cmVkIGRlY2xhcmF0aW9ucyB0byB2YXJEZWNscy4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBwdXNoRGVzdHJ1Y3R1cmluZ1ZhckRlY2xzKG4sIHMpIHsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBuKSB7DQogICAgICAgICAgICB2YXIgc3ViID0gbltpXTsNCiAgICAgICAgICAgIGlmIChzdWIudHlwZSA9PT0gSURFTlRJRklFUikgew0KICAgICAgICAgICAgICAgIHMudmFyRGVjbHMucHVzaChzdWIpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwdXNoRGVzdHJ1Y3R1cmluZ1ZhckRlY2xzKHN1Yiwgcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBTdGF0aWNDb250ZXh0KHBhcmVudFNjcmlwdCwgcGFyZW50QmxvY2ssIGluTW9kdWxlLCBpbkZ1bmN0aW9uKSB7DQogICAgICAgIHRoaXMucGFyZW50U2NyaXB0ID0gcGFyZW50U2NyaXB0Ow0KICAgICAgICB0aGlzLnBhcmVudEJsb2NrID0gcGFyZW50QmxvY2sgfHwgcGFyZW50U2NyaXB0Ow0KICAgICAgICB0aGlzLmluTW9kdWxlID0gaW5Nb2R1bGUgfHwgZmFsc2U7DQogICAgICAgIHRoaXMuaW5GdW5jdGlvbiA9IGluRnVuY3Rpb24gfHwgZmFsc2U7DQogICAgICAgIHRoaXMuaW5Gb3JMb29wSW5pdCA9IGZhbHNlOw0KICAgICAgICB0aGlzLnRvcExldmVsID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5hbGxMYWJlbHMgPSBuZXcgU3RhY2soKTsNCiAgICAgICAgdGhpcy5jdXJyZW50TGFiZWxzID0gbmV3IFN0YWNrKCk7DQogICAgICAgIHRoaXMubGFiZWxlZFRhcmdldHMgPSBuZXcgU3RhY2soKTsNCiAgICAgICAgdGhpcy5kZWZhdWx0TG9vcFRhcmdldCA9IG51bGw7DQogICAgICAgIHRoaXMuZGVmYXVsdFRhcmdldCA9IG51bGw7DQogICAgICAgIHRoaXMuYmxhY2tMaXN0ID0gYmxhY2tMaXN0c1tOYXJjaXNzdXMub3B0aW9ucy52ZXJzaW9uXTsNCiAgICAgICAgTmFyY2lzc3VzLm9wdGlvbnMuZWNtYTNPbmx5TW9kZSAmJiAodGhpcy5lY21hM09ubHlNb2RlID0gdHJ1ZSk7DQogICAgICAgIE5hcmNpc3N1cy5vcHRpb25zLnBhcmVuRnJlZU1vZGUgJiYgKHRoaXMucGFyZW5GcmVlTW9kZSA9IHRydWUpOw0KICAgIH0NCg0KICAgIFN0YXRpY0NvbnRleHQucHJvdG90eXBlID0gew0KICAgICAgICBlY21hM09ubHlNb2RlOiBmYWxzZSwNCiAgICAgICAgcGFyZW5GcmVlTW9kZTogZmFsc2UsDQogICAgICAgIC8vIG5vbi1kZXN0cnVjdGl2ZSB1cGRhdGUgdmlhIHByb3RvdHlwZSBleHRlbnNpb24NCiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihleHQpIHsNCiAgICAgICAgICAgIHZhciBkZXNjID0ge307DQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXh0KSB7DQogICAgICAgICAgICAgICAgZGVzY1trZXldID0gew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXh0W2tleV0sDQogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLCBkZXNjKTsNCiAgICAgICAgfSwNCiAgICAgICAgcHVzaExhYmVsOiBmdW5jdGlvbihsYWJlbCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHsgY3VycmVudExhYmVsczogdGhpcy5jdXJyZW50TGFiZWxzLnB1c2gobGFiZWwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTGFiZWxzOiB0aGlzLmFsbExhYmVscy5wdXNoKGxhYmVsKSB9KTsNCiAgICAgICAgfSwNCiAgICAgICAgcHVzaFRhcmdldDogZnVuY3Rpb24odGFyZ2V0KSB7DQogICAgICAgICAgICB2YXIgaXNEZWZhdWx0TG9vcFRhcmdldCA9IHRhcmdldC5pc0xvb3A7DQogICAgICAgICAgICB2YXIgaXNEZWZhdWx0VGFyZ2V0ID0gaXNEZWZhdWx0TG9vcFRhcmdldCB8fCB0YXJnZXQudHlwZSA9PT0gU1dJVENIOw0KDQogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TGFiZWxzLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgICAgIGlmIChpc0RlZmF1bHRMb29wVGFyZ2V0KSB0aGlzLnVwZGF0ZSh7IGRlZmF1bHRMb29wVGFyZ2V0OiB0YXJnZXQgfSk7DQogICAgICAgICAgICAgICAgaWYgKGlzRGVmYXVsdFRhcmdldCkgdGhpcy51cGRhdGUoeyBkZWZhdWx0VGFyZ2V0OiB0YXJnZXQgfSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRhcmdldC5sYWJlbHMgPSBuZXcgU3RyaW5nTWFwKCk7DQogICAgICAgICAgICB0aGlzLmN1cnJlbnRMYWJlbHMuZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgew0KICAgICAgICAgICAgICAgIHRhcmdldC5sYWJlbHMuc2V0KGxhYmVsLCB0cnVlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHsgY3VycmVudExhYmVsczogbmV3IFN0YWNrKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGVkVGFyZ2V0czogdGhpcy5sYWJlbGVkVGFyZ2V0cy5wdXNoKHRhcmdldCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TG9vcFRhcmdldDogaXNEZWZhdWx0TG9vcFRhcmdldA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFyZ2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRMb29wVGFyZ2V0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRhcmdldDogaXNEZWZhdWx0VGFyZ2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRUYXJnZXQgfSk7DQogICAgICAgIH0sDQogICAgICAgIG5lc3Q6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wTGV2ZWwgPyB0aGlzLnVwZGF0ZSh7IHRvcExldmVsOiBmYWxzZSB9KSA6IHRoaXM7DQogICAgICAgIH0sDQogICAgICAgIGFsbG93OiBmdW5jdGlvbih0eXBlKSB7DQogICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsNCiAgICAgICAgICAgICAgY2FzZSBFWFBPUlQ6DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluTW9kdWxlIHx8IHRoaXMuaW5GdW5jdGlvbiB8fCAhdGhpcy50b3BMZXZlbCkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSA0KDQogICAgICAgICAgICAgIGNhc2UgSU1QT1JUOg0KICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5pbkZ1bmN0aW9uICYmIHRoaXMudG9wTGV2ZWw7DQoNCiAgICAgICAgICAgICAgY2FzZSBNT0RVTEU6DQogICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmluRnVuY3Rpb24gJiYgdGhpcy50b3BMZXZlbDsNCg0KICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8qDQogICAgICogU2NyaXB0IDo6ICh0b2tlbml6ZXIsIGJvb2xlYW4sIGJvb2xlYW4pIC0+IG5vZGUNCiAgICAgKg0KICAgICAqIFBhcnNlcyB0aGUgdG9wbGV2ZWwgYW5kIG1vZHVsZS9mdW5jdGlvbiBib2RpZXMuDQogICAgICovDQogICAgZnVuY3Rpb24gU2NyaXB0KHQsIGluTW9kdWxlLCBpbkZ1bmN0aW9uKSB7DQogICAgICAgIHZhciBuID0gbmV3IE5vZGUodCwgc2NyaXB0SW5pdCgpKTsNCiAgICAgICAgU3RhdGVtZW50cyh0LCBuZXcgU3RhdGljQ29udGV4dChuLCBuLCBpbk1vZHVsZSwgaW5GdW5jdGlvbiksIG4pOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICAvLyBXZSBleHRlbmQgQXJyYXkgc2xpZ2h0bHkgd2l0aCBhIHRvcC1vZi1zdGFjayBtZXRob2QuDQogICAgZGVmaW5pdGlvbnMuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAidG9wIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoICYmIHRoaXNbdGhpcy5sZW5ndGgtMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsNCg0KICAgIC8qDQogICAgICogTm9kZSA6OiAodG9rZW5pemVyLCBvcHRpb25hbCBpbml0IG9iamVjdCkgLT4gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIE5vZGUodCwgaW5pdCkgew0KICAgICAgICB2YXIgdG9rZW4gPSB0LnRva2VuOw0KICAgICAgICBpZiAodG9rZW4pIHsNCiAgICAgICAgICAgIC8vIElmIGluaXQudHlwZSBleGlzdHMgaXQgd2lsbCBvdmVycmlkZSB0b2tlbi50eXBlLg0KICAgICAgICAgICAgdGhpcy50eXBlID0gdG9rZW4udHlwZTsNCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b2tlbi52YWx1ZTsNCiAgICAgICAgICAgIHRoaXMubGluZW5vID0gdG9rZW4ubGluZW5vOw0KDQogICAgICAgICAgICAvLyBTdGFydCBhbmQgZW5kIGFyZSBmaWxlIHBvc2l0aW9ucyBmb3IgZXJyb3IgaGFuZGxpbmcuDQogICAgICAgICAgICB0aGlzLnN0YXJ0ID0gdG9rZW4uc3RhcnQ7DQogICAgICAgICAgICB0aGlzLmVuZCA9IHRva2VuLmVuZDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubGluZW5vID0gdC5saW5lbm87DQogICAgICAgIH0NCg0KICAgICAgICAvLyBOb2RlIHVzZXMgYSB0b2tlbml6ZXIgZm9yIGRlYnVnZ2luZyAoZ2V0U291cmNlLCBmaWxlbmFtZSBnZXR0ZXIpLg0KICAgICAgICB0aGlzLnRva2VuaXplciA9IHQ7DQogICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsNCg0KICAgICAgICBmb3IgKHZhciBwcm9wIGluIGluaXQpDQogICAgICAgICAgICB0aGlzW3Byb3BdID0gaW5pdFtwcm9wXTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFN5bnRoZXRpY05vZGUgOjogKHRva2VuaXplciwgb3B0aW9uYWwgaW5pdCBvYmplY3QpIC0+IG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBTeW50aGV0aWNOb2RlKHQsIGluaXQpIHsNCiAgICAgICAgLy8gcHJpbnQoIlNZTlRIRVRJQyBOT0RFIik7DQogICAgICAgIC8vIGlmIChpbml0LnR5cGUgPT09IENPTU1BKSB7DQogICAgICAgIC8vICAgICBwcmludCgiU1lOVEhFVElDIENPTU1BIik7DQogICAgICAgIC8vICAgICBwcmludChpbml0KTsNCiAgICAgICAgLy8gfQ0KICAgICAgICB0aGlzLnRva2VuaXplciA9IHQ7DQogICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsNCiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBpbml0KQ0KICAgICAgICAgICAgdGhpc1twcm9wXSA9IGluaXRbcHJvcF07DQogICAgICAgIHRoaXMuc3ludGhldGljID0gdHJ1ZTsNCiAgICB9DQoNCiAgICB2YXIgTnAgPSBOb2RlLnByb3RvdHlwZSA9IFN5bnRoZXRpY05vZGUucHJvdG90eXBlID0ge307DQogICAgTnAuY29uc3RydWN0b3IgPSBOb2RlOw0KDQogICAgY29uc3QgVE9fU09VUkNFX1NLSVAgPSB7DQogICAgICAgIHR5cGU6IHRydWUsDQogICAgICAgIHZhbHVlOiB0cnVlLA0KICAgICAgICBsaW5lbm86IHRydWUsDQogICAgICAgIHN0YXJ0OiB0cnVlLA0KICAgICAgICBlbmQ6IHRydWUsDQogICAgICAgIHRva2VuaXplcjogdHJ1ZSwNCiAgICAgICAgYXNzaWduT3A6IHRydWUNCiAgICB9Ow0KICAgIGZ1bmN0aW9uIHVuZXZhbGFibGVDb25zdChjb2RlKSB7DQogICAgICAgIHZhciB0b2tlbiA9IGRlZmluaXRpb25zLnRva2Vuc1tjb2RlXTsNCiAgICAgICAgdmFyIGNvbnN0TmFtZSA9IGRlZmluaXRpb25zLm9wVHlwZU5hbWVzLmhhc093blByb3BlcnR5KHRva2VuKQ0KICAgICAgICAgICAgICAgICAgICAgID8gZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbdG9rZW5dDQogICAgICAgICAgICAgICAgICAgICAgOiB0b2tlbiBpbiBkZWZpbml0aW9ucy5rZXl3b3Jkcw0KICAgICAgICAgICAgICAgICAgICAgID8gdG9rZW4udG9VcHBlckNhc2UoKQ0KICAgICAgICAgICAgICAgICAgICAgIDogdG9rZW47DQogICAgICAgIHJldHVybiB7IHRvU291cmNlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbnN0TmFtZSB9IH07DQogICAgfQ0KICAgIE5wLnRvU291cmNlID0gZnVuY3Rpb24gdG9Tb3VyY2UoKSB7DQogICAgICAgIHZhciBtb2NrID0ge307DQogICAgICAgIHZhciBzZWxmID0gdGhpczsNCiAgICAgICAgbW9jay50eXBlID0gdW5ldmFsYWJsZUNvbnN0KHRoaXMudHlwZSk7DQogICAgICAgIGlmICgidmFsdWUiIGluIHRoaXMpDQogICAgICAgICAgICBtb2NrLnZhbHVlID0gdGhpcy52YWx1ZTsNCiAgICAgICAgaWYgKCJsaW5lbm8iIGluIHRoaXMpDQogICAgICAgICAgICBtb2NrLmxpbmVubyA9IHRoaXMubGluZW5vOw0KICAgICAgICBpZiAoInN0YXJ0IiBpbiB0aGlzKQ0KICAgICAgICAgICAgbW9jay5zdGFydCA9IHRoaXMuc3RhcnQ7DQogICAgICAgIGlmICgiZW5kIiBpbiB0aGlzKQ0KICAgICAgICAgICAgbW9jay5lbmQgPSB0aGlzLmVuZDsNCiAgICAgICAgaWYgKHRoaXMuYXNzaWduT3ApDQogICAgICAgICAgICBtb2NrLmFzc2lnbk9wID0gdW5ldmFsYWJsZUNvbnN0KHRoaXMuYXNzaWduT3ApOw0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgew0KICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhKGtleSBpbiBUT19TT1VSQ0VfU0tJUCkpDQogICAgICAgICAgICAgICAgbW9ja1trZXldID0gdGhpc1trZXldOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtb2NrLnRvU291cmNlKCk7DQogICAgfTsNCg0KICAgIC8vIEFsd2F5cyB1c2UgcHVzaCB0byBhZGQgb3BlcmFuZHMgdG8gYW4gZXhwcmVzc2lvbiwgdG8gdXBkYXRlIHN0YXJ0IGFuZCBlbmQuDQogICAgTnAucHVzaCA9IGZ1bmN0aW9uIChraWQpIHsNCiAgICAgICAgLy8ga2lkIGNhbiBiZSBudWxsIGUuZy4gWzEsICwgMl0uDQogICAgICAgIGlmIChraWQgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChraWQuc3RhcnQgPCB0aGlzLnN0YXJ0KQ0KICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBraWQuc3RhcnQ7DQogICAgICAgICAgICBpZiAodGhpcy5lbmQgPCBraWQuZW5kKQ0KICAgICAgICAgICAgICAgIHRoaXMuZW5kID0ga2lkLmVuZDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5wdXNoKGtpZCk7DQogICAgfQ0KDQogICAgTm9kZS5pbmRlbnRMZXZlbCA9IDA7DQoNCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyh0dCkgew0KICAgICAgICB2YXIgdCA9IGRlZmluaXRpb25zLnRva2Vuc1t0dF07DQogICAgICAgIHJldHVybiAvXlxXLy50ZXN0KHQpID8gZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbdF0gOiB0LnRvVXBwZXJDYXNlKCk7DQogICAgfQ0KDQogICAgTnAudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBhID0gW107DQogICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykgew0KICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaSkgJiYgaSAhPT0gJ3R5cGUnICYmIGkgIT09ICd0YXJnZXQnKQ0KICAgICAgICAgICAgICAgIGEucHVzaCh7aWQ6IGksIHZhbHVlOiB0aGlzW2ldfSk7DQogICAgICAgIH0NCiAgICAgICAgYS5zb3J0KGZ1bmN0aW9uIChhLGIpIHsgcmV0dXJuIChhLmlkIDwgYi5pZCkgPyAtMSA6IDE7IH0pOw0KICAgICAgICBjb25zdCBJTkRFTlRBVElPTiA9ICIgICAgIjsNCiAgICAgICAgdmFyIG4gPSArK05vZGUuaW5kZW50TGV2ZWw7DQogICAgICAgIHZhciBzID0gIntcbiIgKyBJTkRFTlRBVElPTi5yZXBlYXQobikgKyAidHlwZTogIiArIHRva2VuU3RyaW5nKHRoaXMudHlwZSk7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQ0KICAgICAgICAgICAgcyArPSAiLFxuIiArIElOREVOVEFUSU9OLnJlcGVhdChuKSArIGFbaV0uaWQgKyAiOiAiICsgYVtpXS52YWx1ZTsNCiAgICAgICAgbiA9IC0tTm9kZS5pbmRlbnRMZXZlbDsNCiAgICAgICAgcyArPSAiXG4iICsgSU5ERU5UQVRJT04ucmVwZWF0KG4pICsgIn0iOw0KICAgICAgICByZXR1cm4gczsNCiAgICB9DQoNCiAgICBOcC5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzLnRva2VuaXplci5zb3VyY2Uuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5lbmQpOw0KICAgIH07DQoNCiAgICAvKg0KICAgICAqIEhlbHBlciBpbml0IG9iamVjdHMgZm9yIGNvbW1vbiBub2Rlcy4NCiAgICAgKi8NCg0KICAgIGNvbnN0IExPT1BfSU5JVCA9IHsgaXNMb29wOiB0cnVlIH07DQoNCiAgICBmdW5jdGlvbiBibG9ja0luaXQoKSB7DQogICAgICAgIHJldHVybiB7IHR5cGU6IEJMT0NLLCB2YXJEZWNsczogW10gfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzY3JpcHRJbml0KCkgew0KICAgICAgICByZXR1cm4geyB0eXBlOiBTQ1JJUFQsDQogICAgICAgICAgICAgICAgIGZ1bkRlY2xzOiBbXSwNCiAgICAgICAgICAgICAgICAgdmFyRGVjbHM6IFtdLA0KICAgICAgICAgICAgICAgICBtb2REZWZuczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBtb2RBc3NuczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBtb2REZWNsczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBtb2RMb2FkczogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBpbXBEZWNsczogW10sDQogICAgICAgICAgICAgICAgIGV4cERlY2xzOiBbXSwNCiAgICAgICAgICAgICAgICAgZXhwb3J0czogbmV3IFN0cmluZ01hcCgpLA0KICAgICAgICAgICAgICAgICBoYXNFbXB0eVJldHVybjogZmFsc2UsDQogICAgICAgICAgICAgICAgIGhhc1JldHVybldpdGhWYWx1ZTogZmFsc2UsDQogICAgICAgICAgICAgICAgIGlzR2VuZXJhdG9yOiBmYWxzZSB9Ow0KICAgIH0NCg0KICAgIGRlZmluaXRpb25zLmRlZmluZUdldHRlcihOcCwgImZpbGVuYW1lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbml6ZXIuZmlsZW5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgZGVmaW5pdGlvbnMuZGVmaW5lR2V0dGVyKE5wLCAibGVuZ3RoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vZGUucHJvdG90eXBlLmxlbmd0aCBpcyBnb25lOyAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIG4uY2hpbGRyZW4ubGVuZ3RoIGluc3RlYWQiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICBkZWZpbml0aW9ucy5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAicmVwZWF0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gIiIsIHQgPSB0aGlzICsgczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tbiA+PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSB0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSwgZmFsc2UsIHRydWUpOw0KDQogICAgZnVuY3Rpb24gTWF5YmVMZWZ0UGFyZW4odCwgeCkgew0KICAgICAgICBpZiAoeC5wYXJlbkZyZWVNb2RlKQ0KICAgICAgICAgICAgcmV0dXJuIHQubWF0Y2goTEVGVF9QQVJFTikgPyBMRUZUX1BBUkVOIDogRU5EOw0KICAgICAgICByZXR1cm4gdC5tdXN0TWF0Y2goTEVGVF9QQVJFTikudHlwZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBNYXliZVJpZ2h0UGFyZW4odCwgcCkgew0KICAgICAgICBpZiAocCA9PT0gTEVGVF9QQVJFTikNCiAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX1BBUkVOKTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFN0YXRlbWVudHMgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgbm9kZSkgLT4gdm9pZA0KICAgICAqDQogICAgICogUGFyc2VzIGEgc2VxdWVuY2Ugb2YgU3RhdGVtZW50cy4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBTdGF0ZW1lbnRzKHQsIHgsIG4pIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHdoaWxlICghdC5kb25lICYmIHQucGVlayh0cnVlKSAhPT0gUklHSFRfQ1VSTFkpDQogICAgICAgICAgICAgICAgbi5wdXNoKFN0YXRlbWVudCh0LCB4KSk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgIGlmICh0LmRvbmUpDQogICAgICAgICAgICAgICAgdC51bmV4cGVjdGVkRU9GID0gdHJ1ZTsNCiAgICAgICAgICAgIHRocm93IGU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBCbG9jayh0LCB4KSB7DQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfQ1VSTFkpOw0KICAgICAgICB2YXIgbiA9IG5ldyBOb2RlKHQsIGJsb2NrSW5pdCgpKTsNCiAgICAgICAgU3RhdGVtZW50cyh0LCB4LnVwZGF0ZSh7IHBhcmVudEJsb2NrOiBuIH0pLnB1c2hUYXJnZXQobiksIG4pOw0KICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7DQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGNvbnN0IERFQ0xBUkVEX0ZPUk0gPSAwLCBFWFBSRVNTRURfRk9STSA9IDEsIFNUQVRFTUVOVF9GT1JNID0gMjsNCg0KICAgIC8qDQogICAgICogRXhwb3J0IDo6IChiaW5kaW5nIG5vZGUsIGJvb2xlYW4pIC0+IEV4cG9ydA0KICAgICAqDQogICAgICogU3RhdGljIHNlbWFudGljIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kdWxlIGV4cG9ydC4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBFeHBvcnQobm9kZSwgaXNEZWZpbml0aW9uKSB7DQogICAgICAgIHRoaXMubm9kZSA9IG5vZGU7ICAgICAgICAgICAgICAgICAvLyB0aGUgQVNUIG5vZGUgZGVjbGFyaW5nIHRoaXMgaW5kaXZpZHVhbCBleHBvcnQNCiAgICAgICAgdGhpcy5pc0RlZmluaXRpb24gPSBpc0RlZmluaXRpb247IC8vIGlzIHRoZSBub2RlIGFuICdleHBvcnQnLWFubm90YXRlZCBkZWZpbml0aW9uPw0KICAgICAgICB0aGlzLnJlc29sdmVkID0gbnVsbDsgICAgICAgICAgICAgLy8gcmVzb2x2ZWQgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG9mIHRoaXMgZXhwb3J0DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiByZWdpc3RlckV4cG9ydCA6OiAoU3RyaW5nTWFwLCBFWFBPUlQgbm9kZSkgLT4gdm9pZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRXhwb3J0KGV4cG9ydHMsIGRlY2wpIHsNCiAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgZXhwKSB7DQogICAgICAgICAgICBpZiAoZXhwb3J0cy5oYXMobmFtZSkpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJtdWx0aXBsZSBleHBvcnRzIG9mICIgKyBuYW1lKTsNCiAgICAgICAgICAgIGV4cG9ydHMuc2V0KG5hbWUsIGV4cCk7DQogICAgICAgIH0NCg0KICAgICAgICBzd2l0Y2ggKGRlY2wudHlwZSkgew0KICAgICAgICAgIGNhc2UgTU9EVUxFOg0KICAgICAgICAgIGNhc2UgRlVOQ1RJT046DQogICAgICAgICAgICByZWdpc3RlcihkZWNsLm5hbWUsIG5ldyBFeHBvcnQoZGVjbCwgdHJ1ZSkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIFZBUjoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjbC5jaGlsZHJlbi5sZW5ndGg7IGkrKykNCiAgICAgICAgICAgICAgICByZWdpc3RlcihkZWNsLmNoaWxkcmVuW2ldLm5hbWUsIG5ldyBFeHBvcnQoZGVjbC5jaGlsZHJlbltpXSwgdHJ1ZSkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIExFVDoNCiAgICAgICAgICBjYXNlIENPTlNUOg0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOWUk6ICIgKyBkZWZpbml0aW9ucy50b2tlbnNbZGVjbC50eXBlXSk7DQoNCiAgICAgICAgICBjYXNlIEVYUE9SVDoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjbC5wYXRoTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBwYXRoID0gZGVjbC5wYXRoTGlzdFtpXTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgudHlwZSkgew0KICAgICAgICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU5JVDoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXRoLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0IDo6IElERU5USUZJRVIgfCBQUk9QRVJUWV9JTklUDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdCA9IHBhdGguY2hpbGRyZW5bal07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdC50eXBlID09PSBJREVOVElGSUVSKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKGluaXQudmFsdWUsIG5ldyBFeHBvcnQoaW5pdCwgZmFsc2UpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcihpbml0LmNoaWxkcmVuWzBdLnZhbHVlLCBuZXcgRXhwb3J0KGluaXQuY2hpbGRyZW5bMV0sIGZhbHNlKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgIGNhc2UgRE9UOg0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlcihwYXRoLmNoaWxkcmVuWzFdLnZhbHVlLCBuZXcgRXhwb3J0KHBhdGgsIGZhbHNlKSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6DQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHBhdGgudmFsdWUsIG5ldyBFeHBvcnQocGF0aCwgZmFsc2UpKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidW5leHBlY3RlZCBleHBvcnQgcGF0aDogIiArIGRlZmluaXRpb25zLnRva2Vuc1twYXRoLnR5cGVdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQgZXhwb3J0IGRlY2w6ICIgKyBkZWZpbml0aW9ucy50b2tlbnNbZXhwLnR5cGVdKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogTW9kdWxlIDo6IChub2RlKSAtPiBNb2R1bGUNCiAgICAgKg0KICAgICAqIFN0YXRpYyBzZW1hbnRpYyByZXByZXNlbnRhdGlvbiBvZiBhIG1vZHVsZS4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBNb2R1bGUobm9kZSkgew0KICAgICAgICB2YXIgZXhwb3J0cyA9IG5vZGUuYm9keS5leHBvcnRzOw0KICAgICAgICB2YXIgbW9kRGVmbnMgPSBub2RlLmJvZHkubW9kRGVmbnM7DQoNCiAgICAgICAgdmFyIGV4cG9ydGVkTW9kdWxlcyA9IG5ldyBTdHJpbmdNYXAoKTsNCg0KICAgICAgICBleHBvcnRzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgZXhwKSB7DQogICAgICAgICAgICB2YXIgbm9kZSA9IGV4cC5ub2RlOw0KICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gTU9EVUxFKSB7DQogICAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzLnNldChuYW1lLCBub2RlKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4cC5pc0RlZmluaXRpb24gJiYgbm9kZS50eXBlID09PSBJREVOVElGSUVSICYmIG1vZERlZm5zLmhhcyhub2RlLnZhbHVlKSkgew0KICAgICAgICAgICAgICAgIHZhciBtb2QgPSBtb2REZWZucy5nZXQobm9kZS52YWx1ZSk7DQogICAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzLnNldChuYW1lLCBtb2QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICB0aGlzLm5vZGUgPSBub2RlOw0KICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOw0KICAgICAgICB0aGlzLmV4cG9ydGVkTW9kdWxlcyA9IGV4cG9ydGVkTW9kdWxlczsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFN0YXRlbWVudCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlDQogICAgICoNCiAgICAgKiBQYXJzZXMgYSBTdGF0ZW1lbnQuDQogICAgICovDQogICAgZnVuY3Rpb24gU3RhdGVtZW50KHQsIHgpIHsNCiAgICAgICAgdmFyIGksIGxhYmVsLCBuLCBuMiwgcCwgYywgc3MsIHR0ID0gdC5nZXQodHJ1ZSksIHR0MiwgeDIsIHgzOw0KDQogICAgICAgIHZhciBjb21tZW50cyA9IHQuYmxvY2tDb21tZW50czsNCg0KICAgICAgICBpZiAoeC5ibGFja0xpc3RbdHRdKQ0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcihkZWZpbml0aW9ucy50b2tlbnNbdHRdICsgIiBzdGF0ZW1lbnRzIG9ubHkgYWxsb3dlZCBpbiBIYXJtb255Iik7DQogICAgICAgIGlmICgheC5hbGxvdyh0dCkpDQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKGRlZmluaXRpb25zLnRva2Vuc1t0dF0gKyAiIHN0YXRlbWVudCBpbiBpbGxlZ2FsIGNvbnRleHQiKTsNCg0KICAgICAgICAvLyBDYXNlcyBmb3Igc3RhdGVtZW50cyBlbmRpbmcgaW4gYSByaWdodCBjdXJseSByZXR1cm4gZWFybHksIGF2b2lkaW5nIHRoZQ0KICAgICAgICAvLyBjb21tb24gc2VtaWNvbG9uIGluc2VydGlvbiBtYWdpYyBhZnRlciB0aGlzIHN3aXRjaC4NCiAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgIGNhc2UgSU1QT1JUOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5wYXRoTGlzdCA9IEltcG9ydFBhdGhMaXN0KHQsIHgpOw0KICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQuaW1wRGVjbHMucHVzaChuKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBFWFBPUlQ6DQogICAgICAgICAgICBzd2l0Y2ggKHQucGVlaygpKSB7DQogICAgICAgICAgICAgIGNhc2UgTU9EVUxFOg0KICAgICAgICAgICAgICBjYXNlIEZVTkNUSU9OOg0KICAgICAgICAgICAgICBjYXNlIExFVDoNCiAgICAgICAgICAgICAgY2FzZSBWQVI6DQogICAgICAgICAgICAgIGNhc2UgQ09OU1Q6DQogICAgICAgICAgICAgICAgbiA9IFN0YXRlbWVudCh0LCB4KTsNCiAgICAgICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgICAgICBuLmV4cG9ydGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5leHBEZWNscy5wdXNoKG4pOw0KICAgICAgICAgICAgICAgIHJlZ2lzdGVyRXhwb3J0KHgucGFyZW50U2NyaXB0LmV4cG9ydHMsIG4pOw0KICAgICAgICAgICAgICAgIHJldHVybiBuOw0KDQogICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgICAgIG4ucGF0aExpc3QgPSBFeHBvcnRQYXRoTGlzdCh0LCB4KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHgucGFyZW50U2NyaXB0LmV4cERlY2xzLnB1c2gobik7DQogICAgICAgICAgICByZWdpc3RlckV4cG9ydCh4LnBhcmVudFNjcmlwdC5leHBvcnRzLCBuKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBNT0RVTEU6DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgIHQubXVzdE1hdGNoKElERU5USUZJRVIpOw0KICAgICAgICAgICAgbGFiZWwgPSB0LnRva2VuLnZhbHVlOw0KDQogICAgICAgICAgICBpZiAodC5tYXRjaChMRUZUX0NVUkxZKSkgew0KICAgICAgICAgICAgICAgIG4ubmFtZSA9IGxhYmVsOw0KICAgICAgICAgICAgICAgIG4uYm9keSA9IFNjcmlwdCh0LCB0cnVlLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgbi5tb2R1bGUgPSBuZXcgTW9kdWxlKG4pOw0KICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX0NVUkxZKTsNCiAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5tb2REZWZucy5zZXQobi5uYW1lLCBuKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgTW9kdWxlVmFyaWFibGVzKHQsIHgsIG4pOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIEZVTkNUSU9OOg0KICAgICAgICAgICAgLy8gREVDTEFSRURfRk9STSBleHRlbmRzIGZ1bkRlY2xzIG9mIHgsIFNUQVRFTUVOVF9GT1JNIGRvZXNuJ3QuDQogICAgICAgICAgICByZXR1cm4gRnVuY3Rpb25EZWZpbml0aW9uKHQsIHgsIHRydWUsIHgudG9wTGV2ZWwgPyBERUNMQVJFRF9GT1JNIDogU1RBVEVNRU5UX0ZPUk0sIGNvbW1lbnRzKTsNCg0KICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCBibG9ja0luaXQoKSk7DQogICAgICAgICAgICBTdGF0ZW1lbnRzKHQsIHgudXBkYXRlKHsgcGFyZW50QmxvY2s6IG4gfSkucHVzaFRhcmdldChuKS5uZXN0KCksIG4pOw0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfQ1VSTFkpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIElGOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5jb25kaXRpb24gPSBIZWFkRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIHgyID0geC5wdXNoVGFyZ2V0KG4pLm5lc3QoKTsNCiAgICAgICAgICAgIG4udGhlblBhcnQgPSBTdGF0ZW1lbnQodCwgeDIpOw0KICAgICAgICAgICAgbi5lbHNlUGFydCA9IHQubWF0Y2goRUxTRSwgdHJ1ZSkgPyBTdGF0ZW1lbnQodCwgeDIpIDogbnVsbDsNCiAgICAgICAgICAgIHJldHVybiBuOw0KDQogICAgICAgICAgY2FzZSBTV0lUQ0g6DQogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBDQVNFcyBhZnRlciBhIERFRkFVTFQsIHdoaWNoIGlzIGluIHRoZSBzdGFuZGFyZC4NCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IGNhc2VzOiBbXSwgZGVmYXVsdEluZGV4OiAtMSB9KTsNCiAgICAgICAgICAgIG4uZGlzY3JpbWluYW50ID0gSGVhZEV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICB4MiA9IHgucHVzaFRhcmdldChuKS5uZXN0KCk7DQogICAgICAgICAgICB0Lm11c3RNYXRjaChMRUZUX0NVUkxZKTsNCiAgICAgICAgICAgIHdoaWxlICgodHQgPSB0LmdldCgpKSAhPT0gUklHSFRfQ1VSTFkpIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0KSB7DQogICAgICAgICAgICAgICAgICBjYXNlIERFRkFVTFQ6DQogICAgICAgICAgICAgICAgICAgIGlmIChuLmRlZmF1bHRJbmRleCA+PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiTW9yZSB0aGFuIG9uZSBzd2l0Y2ggZGVmYXVsdCIpOw0KICAgICAgICAgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gNCiAgICAgICAgICAgICAgICAgIGNhc2UgQ0FTRToNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR0ID09PSBERUZBVUxUKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbi5kZWZhdWx0SW5kZXggPSBuLmNhc2VzLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgbjIuY2FzZUxhYmVsID0gRXhwcmVzc2lvbih0LCB4MiwgQ09MT04pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBzd2l0Y2ggY2FzZSIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChDT0xPTik7DQogICAgICAgICAgICAgICAgbjIuc3RhdGVtZW50cyA9IG5ldyBOb2RlKHQsIGJsb2NrSW5pdCgpKTsNCiAgICAgICAgICAgICAgICB3aGlsZSAoKHR0PXQucGVlayh0cnVlKSkgIT09IENBU0UgJiYgdHQgIT09IERFRkFVTFQgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgIHR0ICE9PSBSSUdIVF9DVVJMWSkNCiAgICAgICAgICAgICAgICAgICAgbjIuc3RhdGVtZW50cy5wdXNoKFN0YXRlbWVudCh0LCB4MikpOw0KICAgICAgICAgICAgICAgIG4uY2FzZXMucHVzaChuMik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbjsNCg0KICAgICAgICAgIGNhc2UgRk9SOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIExPT1BfSU5JVCk7DQogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKElERU5USUZJRVIpKSB7DQogICAgICAgICAgICAgICAgaWYgKHQudG9rZW4udmFsdWUgPT09ICJlYWNoIikNCiAgICAgICAgICAgICAgICAgICAgbi5pc0VhY2ggPSB0cnVlOw0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCF4LnBhcmVuRnJlZU1vZGUpDQogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goTEVGVF9QQVJFTik7DQogICAgICAgICAgICB4MiA9IHgucHVzaFRhcmdldChuKS5uZXN0KCk7DQogICAgICAgICAgICB4MyA9IHgudXBkYXRlKHsgaW5Gb3JMb29wSW5pdDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIG4yID0gbnVsbDsNCiAgICAgICAgICAgIGlmICgodHQgPSB0LnBlZWsodHJ1ZSkpICE9PSBTRU1JQ09MT04pIHsNCiAgICAgICAgICAgICAgICBpZiAodHQgPT09IFZBUiB8fCB0dCA9PT0gQ09OU1QpIHsNCiAgICAgICAgICAgICAgICAgICAgdC5nZXQoKTsNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBWYXJpYWJsZXModCwgeDMpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHQgPT09IExFVCkgew0KICAgICAgICAgICAgICAgICAgICB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodC5wZWVrKCkgPT09IExFRlRfUEFSRU4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG4yID0gTGV0QmxvY2sodCwgeDMsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCBpbiBmb3IgaGVhZCwgd2UgbmVlZCB0byBhZGQgYW4gaW1wbGljaXQgYmxvY2sNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyb3VuZCB0aGUgcmVzdCBvZiB0aGUgZm9yLg0KICAgICAgICAgICAgICAgICAgICAgICAgeDMucGFyZW50QmxvY2sgPSBuOw0KICAgICAgICAgICAgICAgICAgICAgICAgbi52YXJEZWNscyA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBWYXJpYWJsZXModCwgeDMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBFeHByZXNzaW9uKHQsIHgzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobjIgJiYgdC5tYXRjaChJTikpIHsNCiAgICAgICAgICAgICAgICBuLnR5cGUgPSBGT1JfSU47DQogICAgICAgICAgICAgICAgbi5vYmplY3QgPSBFeHByZXNzaW9uKHQsIHgzKTsNCiAgICAgICAgICAgICAgICBpZiAobjIudHlwZSA9PT0gVkFSIHx8IG4yLnR5cGUgPT09IExFVCkgew0KICAgICAgICAgICAgICAgICAgICBjID0gbjIuY2hpbGRyZW47DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmluZyB0dXJucyBvbmUgZGVjbCBpbnRvIG11bHRpcGxlcywgc28gZWl0aGVyDQogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgb25seSBvbmUgZGVzdHJ1Y3R1cmluZyBvciBvbmx5IG9uZQ0KICAgICAgICAgICAgICAgICAgICAvLyBkZWNsLg0KICAgICAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggIT09IDEgJiYgbjIuZGVzdHJ1Y3R1cmluZ3MubGVuZ3RoICE9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkludmFsaWQgZm9yLi5pbiBsZWZ0LWhhbmQgc2lkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5maWxlbmFtZSwgbjIubGluZW5vKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAobjIuZGVzdHJ1Y3R1cmluZ3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IG4yLmRlc3RydWN0dXJpbmdzWzBdOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IGNbMF07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbi52YXJEZWNsID0gbjI7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IEFSUkFZX0lOSVQgfHwgbjIudHlwZSA9PT0gT0JKRUNUX0lOSVQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG4yLmRlc3RydWN0dXJlZE5hbWVzID0gY2hlY2tEZXN0cnVjdHVyaW5nKHQsIHgzLCBuMik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IG4yOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgeDMuaW5Gb3JMb29wSW5pdCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIG4uc2V0dXAgPSBuMjsNCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChTRU1JQ09MT04pOw0KICAgICAgICAgICAgICAgIGlmIChuLmlzRWFjaCkNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBmb3IgZWFjaC4uaW4gbG9vcCIpOw0KICAgICAgICAgICAgICAgIG4uY29uZGl0aW9uID0gKHQucGVlayh0cnVlKSA9PT0gU0VNSUNPTE9OKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEV4cHJlc3Npb24odCwgeDMpOw0KICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFNFTUlDT0xPTik7DQogICAgICAgICAgICAgICAgdHQyID0gdC5wZWVrKHRydWUpOw0KICAgICAgICAgICAgICAgIG4udXBkYXRlID0gKHgucGFyZW5GcmVlTW9kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdHQyID09PSBMRUZUX0NVUkxZIHx8IGRlZmluaXRpb25zLmlzU3RhdGVtZW50U3RhcnRDb2RlW3R0Ml0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHR0MiA9PT0gUklHSFRfUEFSRU4pDQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXhwcmVzc2lvbih0LCB4Myk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIXgucGFyZW5GcmVlTW9kZSkNCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7DQogICAgICAgICAgICBuLmJvZHkgPSBTdGF0ZW1lbnQodCwgeDIpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIFdISUxFOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgaXNMb29wOiB0cnVlIH0pOw0KICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgICAgICBuLmNvbmRpdGlvbiA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgbi5ib2R5ID0gU3RhdGVtZW50KHQsIHgucHVzaFRhcmdldChuKS5uZXN0KCkpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQoNCiAgICAgICAgICBjYXNlIERPOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgaXNMb29wOiB0cnVlIH0pOw0KICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgICAgICBuLmJvZHkgPSBTdGF0ZW1lbnQodCwgeC5wdXNoVGFyZ2V0KG4pLm5lc3QoKSk7DQogICAgICAgICAgICB0Lm11c3RNYXRjaChXSElMRSk7DQogICAgICAgICAgICBuLmNvbmRpdGlvbiA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgaWYgKCF4LmVjbWFTdHJpY3RNb2RlKSB7DQogICAgICAgICAgICAgICAgLy8gPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+ICh3aXRob3V0IHZlcnNpb24gaGludHMpIG1heSBuZWVkDQogICAgICAgICAgICAgICAgLy8gYXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24gd2l0aG91dCBhIG5ld2xpbmUgYWZ0ZXIgZG8td2hpbGUuDQogICAgICAgICAgICAgICAgLy8gU2VlIGh0dHA6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM4OTQ1Lg0KICAgICAgICAgICAgICAgIHQubWF0Y2goU0VNSUNPTE9OKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBCUkVBSzoNCiAgICAgICAgICBjYXNlIENPTlRJTlVFOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQoNCiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgfGZvbzogYnJlYWsgZm9vO3wgY29ybmVyIGNhc2UNCiAgICAgICAgICAgIHgyID0geC5wdXNoVGFyZ2V0KG4pOw0KDQogICAgICAgICAgICBpZiAodC5wZWVrT25TYW1lTGluZSgpID09PSBJREVOVElGSUVSKSB7DQogICAgICAgICAgICAgICAgdC5nZXQoKTsNCiAgICAgICAgICAgICAgICBuLmxhYmVsID0gdC50b2tlbi52YWx1ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG4ubGFiZWwpIHsNCiAgICAgICAgICAgICAgICBuLnRhcmdldCA9IHgyLmxhYmVsZWRUYXJnZXRzLmZpbmQoZnVuY3Rpb24odGFyZ2V0KSB7IHJldHVybiB0YXJnZXQubGFiZWxzLmhhcyhuLmxhYmVsKSB9KTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHQgPT09IENPTlRJTlVFKSB7DQogICAgICAgICAgICAgICAgbi50YXJnZXQgPSB4Mi5kZWZhdWx0TG9vcFRhcmdldDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbi50YXJnZXQgPSB4Mi5kZWZhdWx0VGFyZ2V0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIW4udGFyZ2V0KQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgIiArICgodHQgPT09IEJSRUFLKSA/ICJicmVhayIgOiAiY29udGludWUiKSk7DQogICAgICAgICAgICBpZiAoIW4udGFyZ2V0LmlzTG9vcCAmJiB0dCA9PT0gQ09OVElOVUUpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBjb250aW51ZSIpOw0KDQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgVFJZOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgY2F0Y2hDbGF1c2VzOiBbXSB9KTsNCiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOw0KICAgICAgICAgICAgbi50cnlCbG9jayA9IEJsb2NrKHQsIHgpOw0KICAgICAgICAgICAgd2hpbGUgKHQubWF0Y2goQ0FUQ0gpKSB7DQogICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgICAgICBwID0gTWF5YmVMZWZ0UGFyZW4odCwgeCk7DQogICAgICAgICAgICAgICAgc3dpdGNoICh0LmdldCgpKSB7DQogICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoNCiAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmVkIGNhdGNoIGlkZW50aWZpZXJzLg0KICAgICAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgIG4yLnZhck5hbWUgPSBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6DQogICAgICAgICAgICAgICAgICAgIG4yLnZhck5hbWUgPSB0LnRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgaWRlbnRpZmllciBpbiBjYXRjaCIpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goSUYpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh4LmVjbWEzT25seU1vZGUpDQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbGxlZ2FsIGNhdGNoIGd1YXJkIik7DQogICAgICAgICAgICAgICAgICAgIGlmIChuLmNhdGNoQ2xhdXNlcy5sZW5ndGggJiYgIW4uY2F0Y2hDbGF1c2VzLnRvcCgpLmd1YXJkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR3VhcmRlZCBjYXRjaCBhZnRlciB1bmd1YXJkZWQiKTsNCiAgICAgICAgICAgICAgICAgICAgbjIuZ3VhcmQgPSBFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBNYXliZVJpZ2h0UGFyZW4odCwgcCk7DQogICAgICAgICAgICAgICAgbjIuYmxvY2sgPSBCbG9jayh0LCB4KTsNCiAgICAgICAgICAgICAgICBuLmNhdGNoQ2xhdXNlcy5wdXNoKG4yKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKEZJTkFMTFkpKQ0KICAgICAgICAgICAgICAgIG4uZmluYWxseUJsb2NrID0gQmxvY2sodCwgeCk7DQogICAgICAgICAgICBpZiAoIW4uY2F0Y2hDbGF1c2VzLmxlbmd0aCAmJiAhbi5maW5hbGx5QmxvY2spDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCB0cnkgc3RhdGVtZW50Iik7DQogICAgICAgICAgICByZXR1cm4gbjsNCg0KICAgICAgICAgIGNhc2UgQ0FUQ0g6DQogICAgICAgICAgY2FzZSBGSU5BTExZOg0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcihkZWZpbml0aW9ucy50b2tlbnNbdHRdICsgIiB3aXRob3V0IHByZWNlZGluZyB0cnkiKTsNCg0KICAgICAgICAgIGNhc2UgVEhST1c6DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuLmV4Y2VwdGlvbiA9IEV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgUkVUVVJOOg0KICAgICAgICAgICAgbiA9IFJldHVybk9yWWllbGQodCwgeCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgV0lUSDoNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOw0KICAgICAgICAgICAgbi5vYmplY3QgPSBIZWFkRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIG4uYm9keSA9IFN0YXRlbWVudCh0LCB4LnB1c2hUYXJnZXQobikubmVzdCgpKTsNCiAgICAgICAgICAgIHJldHVybiBuOw0KDQogICAgICAgICAgY2FzZSBWQVI6DQogICAgICAgICAgY2FzZSBDT05TVDoNCiAgICAgICAgICAgIG4gPSBWYXJpYWJsZXModCwgeCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgTEVUOg0KICAgICAgICAgICAgaWYgKHQucGVlaygpID09PSBMRUZUX1BBUkVOKQ0KICAgICAgICAgICAgICAgIG4gPSBMZXRCbG9jayh0LCB4LCB0cnVlKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBuID0gVmFyaWFibGVzKHQsIHgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIERFQlVHR0VSOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIE5FV0xJTkU6DQogICAgICAgICAgY2FzZSBTRU1JQ09MT046DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBTRU1JQ09MT04gfSk7DQogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgIG4uZXhwcmVzc2lvbiA9IG51bGw7DQogICAgICAgICAgICByZXR1cm4gbjsNCg0KICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICBpZiAodHQgPT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICB0dCA9IHQucGVlaygpOw0KICAgICAgICAgICAgICAgIC8vIExhYmVsZWQgc3RhdGVtZW50Lg0KICAgICAgICAgICAgICAgIGlmICh0dCA9PT0gQ09MT04pIHsNCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0LnRva2VuLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoeC5hbGxMYWJlbHMuaGFzKGxhYmVsKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkR1cGxpY2F0ZSBsYWJlbCIpOw0KICAgICAgICAgICAgICAgICAgICB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBMQUJFTCwgbGFiZWw6IGxhYmVsIH0pOw0KICAgICAgICAgICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgICAgICAgICAgICAgbi5zdGF0ZW1lbnQgPSBTdGF0ZW1lbnQodCwgeC5wdXNoTGFiZWwobGFiZWwpLm5lc3QoKSk7DQogICAgICAgICAgICAgICAgICAgIG4udGFyZ2V0ID0gKG4uc3RhdGVtZW50LnR5cGUgPT09IExBQkVMKSA/IG4uc3RhdGVtZW50LnRhcmdldCA6IG4uc3RhdGVtZW50Ow0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIEV4cHJlc3Npb24gc3RhdGVtZW50Lg0KICAgICAgICAgICAgLy8gV2UgdW5nZXQgdGhlIGN1cnJlbnQgdG9rZW4gdG8gcGFyc2UgdGhlIGV4cHJlc3Npb24gYXMgYSB3aG9sZS4NCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFNFTUlDT0xPTiB9KTsNCiAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOw0KICAgICAgICAgICAgbi5leHByZXNzaW9uID0gRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIG4uZW5kID0gbi5leHByZXNzaW9uLmVuZDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgIE1hZ2ljYWxTZW1pY29sb24odCk7DQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogTWFnaWNhbFNlbWljb2xvbiA6OiAodG9rZW5pemVyKSAtPiB2b2lkDQogICAgICovDQogICAgZnVuY3Rpb24gTWFnaWNhbFNlbWljb2xvbih0KSB7DQogICAgICAgIHZhciB0dDsNCiAgICAgICAgaWYgKHQubGluZW5vID09PSB0LnRva2VuLmxpbmVubykgew0KICAgICAgICAgICAgdHQgPSB0LnBlZWtPblNhbWVMaW5lKCk7DQogICAgICAgICAgICBpZiAodHQgIT09IEVORCAmJiB0dCAhPT0gTkVXTElORSAmJiB0dCAhPT0gU0VNSUNPTE9OICYmIHR0ICE9PSBSSUdIVF9DVVJMWSkNCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIDsgYmVmb3JlIHN0YXRlbWVudCIpOw0KICAgICAgICB9DQogICAgICAgIHQubWF0Y2goU0VNSUNPTE9OKTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFJldHVybk9yWWllbGQgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gKFJFVFVSTiB8IFlJRUxEKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gUmV0dXJuT3JZaWVsZCh0LCB4KSB7DQogICAgICAgIHZhciBuLCBiLCB0dCA9IHQudG9rZW4udHlwZSwgdHQyOw0KDQogICAgICAgIHZhciBwYXJlbnRTY3JpcHQgPSB4LnBhcmVudFNjcmlwdDsNCg0KICAgICAgICBpZiAodHQgPT09IFJFVFVSTikgew0KICAgICAgICAgICAgaWYgKCF4LmluRnVuY3Rpb24pDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiUmV0dXJuIG5vdCBpbiBmdW5jdGlvbiIpOw0KICAgICAgICB9IGVsc2UgLyogaWYgKHR0ID09PSBZSUVMRCkgKi8gew0KICAgICAgICAgICAgaWYgKCF4LmluRnVuY3Rpb24pDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiWWllbGQgbm90IGluIGZ1bmN0aW9uIik7DQogICAgICAgICAgICBwYXJlbnRTY3JpcHQuaXNHZW5lcmF0b3IgPSB0cnVlOw0KICAgICAgICB9DQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHZhbHVlOiB1bmRlZmluZWQgfSk7DQoNCiAgICAgICAgdHQyID0gKHR0ID09PSBSRVRVUk4pID8gdC5wZWVrT25TYW1lTGluZSh0cnVlKSA6IHQucGVlayh0cnVlKTsNCiAgICAgICAgaWYgKHR0MiAhPT0gRU5EICYmIHR0MiAhPT0gTkVXTElORSAmJg0KICAgICAgICAgICAgdHQyICE9PSBTRU1JQ09MT04gJiYgdHQyICE9PSBSSUdIVF9DVVJMWQ0KICAgICAgICAgICAgJiYgKHR0ICE9PSBZSUVMRCB8fA0KICAgICAgICAgICAgICAgICh0dDIgIT09IHR0ICYmIHR0MiAhPT0gUklHSFRfQlJBQ0tFVCAmJiB0dDIgIT09IFJJR0hUX1BBUkVOICYmDQogICAgICAgICAgICAgICAgIHR0MiAhPT0gQ09MT04gJiYgdHQyICE9PSBDT01NQSkpKSB7DQogICAgICAgICAgICBpZiAodHQgPT09IFJFVFVSTikgew0KICAgICAgICAgICAgICAgIG4udmFsdWUgPSBFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIHBhcmVudFNjcmlwdC5oYXNSZXR1cm5XaXRoVmFsdWUgPSB0cnVlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBuLnZhbHVlID0gQXNzaWduRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh0dCA9PT0gUkVUVVJOKSB7DQogICAgICAgICAgICBwYXJlbnRTY3JpcHQuaGFzRW1wdHlSZXR1cm4gPSB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gRGlzYWxsb3cgcmV0dXJuIHY7IGluIGdlbmVyYXRvci4NCiAgICAgICAgaWYgKHBhcmVudFNjcmlwdC5oYXNSZXR1cm5XaXRoVmFsdWUgJiYgcGFyZW50U2NyaXB0LmlzR2VuZXJhdG9yKQ0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR2VuZXJhdG9yIHJldHVybnMgYSB2YWx1ZSIpOw0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogTW9kdWxlRXhwcmVzc2lvbiA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoU1RSSU5HIHwgSURFTlRJRklFUiB8IERPVCkgbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIE1vZHVsZUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICByZXR1cm4gdC5tYXRjaChTVFJJTkcpID8gbmV3IE5vZGUodCkgOiBRdWFsaWZpZWRQYXRoKHQsIHgpOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogSW1wb3J0UGF0aExpc3QgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gQXJyYXlbRE9UIG5vZGVdDQogICAgICovDQogICAgZnVuY3Rpb24gSW1wb3J0UGF0aExpc3QodCwgeCkgew0KICAgICAgICB2YXIgYSA9IFtdOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBhLnB1c2goSW1wb3J0UGF0aCh0LCB4KSk7DQogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgcmV0dXJuIGE7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBJbXBvcnRQYXRoIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQpIC0+IERPVCBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gSW1wb3J0UGF0aCh0LCB4KSB7DQogICAgICAgIHZhciBuID0gUXVhbGlmaWVkUGF0aCh0LCB4KTsNCiAgICAgICAgaWYgKCF0Lm1hdGNoKERPVCkpIHsNCiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IElERU5USUZJRVIpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiY2Fubm90IGltcG9ydCBsb2NhbCB2YXJpYWJsZSIpOw0KICAgICAgICAgICAgcmV0dXJuIG47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgbjIucHVzaChJbXBvcnRTcGVjaWZpZXJTZXQodCwgeCkpOw0KICAgICAgICByZXR1cm4gbjI7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBFeHBsaWNpdFNwZWNpZmllclNldCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0LCAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlKQ0KICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0+IE9CSkVDVF9JTklUIG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBFeHBsaWNpdFNwZWNpZmllclNldCh0LCB4LCBTcGVjaWZpZXJSSFMpIHsNCiAgICAgICAgdmFyIG4sIG4yLCBpZCwgdHQ7DQoNCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogT0JKRUNUX0lOSVQgfSk7DQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfQ1VSTFkpOw0KDQogICAgICAgIGlmICghdC5tYXRjaChSSUdIVF9DVVJMWSkpIHsNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICBpZCA9IElkZW50aWZpZXIodCwgeCk7DQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goQ09MT04pKSB7DQogICAgICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBQUk9QRVJUWV9JTklUIH0pOw0KICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKGlkKTsNCiAgICAgICAgICAgICAgICAgICAgbjIucHVzaChTcGVjaWZpZXJSSFModCwgeCkpOw0KICAgICAgICAgICAgICAgICAgICBuLnB1c2gobjIpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIG4ucHVzaChpZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSB3aGlsZSAoIXQubWF0Y2goUklHSFRfQ1VSTFkpICYmIHQubXVzdE1hdGNoKENPTU1BKSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIEltcG9ydFNwZWNpZmllclNldCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoSURFTlRJRklFUiB8IE9CSkVDVF9JTklUKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gSW1wb3J0U3BlY2lmaWVyU2V0KHQsIHgpIHsNCiAgICAgICAgcmV0dXJuIHQubWF0Y2goTVVMKQ0KICAgICAgICAgICAgID8gbmV3IE5vZGUodCwgeyB0eXBlOiBJREVOVElGSUVSLCBuYW1lOiAiKiIgfSkNCiAgICAgICAgICAgICA6IEV4cGxpY2l0U3BlY2lmaWVyU2V0KHQsIHgsIElkZW50aWZpZXIpOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogSWRlbnRpZmllciA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBJREVOVElGSUVSIG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBJZGVudGlmaWVyKHQsIHgpIHsNCiAgICAgICAgdC5tdXN0TWF0Y2goSURFTlRJRklFUik7DQogICAgICAgIHJldHVybiBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBJZGVudGlmaWVyTmFtZSA6OiAodG9rZW5pemVyKSAtPiBJREVOVElGSUVSIG5vZGUNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBJZGVudGlmaWVyTmFtZSh0KSB7DQogICAgICAgIGlmICh0Lm1hdGNoKElERU5USUZJRVIpKQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsNCiAgICAgICAgdC5nZXQoKTsNCiAgICAgICAgaWYgKHQudG9rZW4udmFsdWUgaW4gZGVmaW5pdGlvbnMua2V5d29yZHMpDQogICAgICAgICAgICByZXR1cm4gbmV3IE5vZGUodCwgeyB0eXBlOiBJREVOVElGSUVSIH0pOw0KICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIElkZW50aWZpZXJOYW1lIik7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBRdWFsaWZpZWRQYXRoIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQpIC0+IChJREVOVElGSUVSIHwgRE9UKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gUXVhbGlmaWVkUGF0aCh0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gSWRlbnRpZmllcih0LCB4KTsNCg0KICAgICAgICB3aGlsZSAodC5tYXRjaChET1QpKSB7DQogICAgICAgICAgICBpZiAodC5wZWVrKCkgIT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICAvLyBVbmdldCB0aGUgJy4nIHRva2VuLCB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZSBRdWFsaWZpZWRQYXRoLg0KICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChJZGVudGlmaWVyKHQsIHgpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogRXhwb3J0UGF0aCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoSURFTlRJRklFUiB8IERPVCB8IE9CSkVDVF9JTklUKSBub2RlDQogICAgICovDQogICAgZnVuY3Rpb24gRXhwb3J0UGF0aCh0LCB4KSB7DQogICAgICAgIGlmICh0LnBlZWsoKSA9PT0gTEVGVF9DVVJMWSkNCiAgICAgICAgICAgIHJldHVybiBFeHBsaWNpdFNwZWNpZmllclNldCh0LCB4LCBRdWFsaWZpZWRQYXRoKTsNCiAgICAgICAgcmV0dXJuIFF1YWxpZmllZFBhdGgodCwgeCk7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBFeHBvcnRQYXRoTGlzdCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KQ0KICAgICAqICAgICAgICAgICAgICAgIC0+IEFycmF5WyhJREVOVElGSUVSIHwgRE9UIHwgT0JKRUNUX0lOSVQpIG5vZGVdDQogICAgICovDQogICAgZnVuY3Rpb24gRXhwb3J0UGF0aExpc3QodCwgeCkgew0KICAgICAgICB2YXIgYSA9IFtdOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBhLnB1c2goRXhwb3J0UGF0aCh0LCB4KSk7DQogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgcmV0dXJuIGE7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBGdW5jdGlvbkRlZmluaXRpb24gOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgYm9vbGVhbiwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkVEX0ZPUk0gb3IgRVhQUkVTU0VEX0ZPUk0gb3IgU1RBVEVNRU5UX0ZPUk0sDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBbc3RyaW5nXSBvciBudWxsIG9yIHVuZGVmaW5lZCkNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgLT4gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIEZ1bmN0aW9uRGVmaW5pdGlvbih0LCB4LCByZXF1aXJlTmFtZSwgZnVuY3Rpb25Gb3JtLCBjb21tZW50cykgew0KICAgICAgICB2YXIgdHQ7DQogICAgICAgIHZhciBmID0gbmV3IE5vZGUodCwgeyBwYXJhbXM6IFtdLCBwYXJhbUNvbW1lbnRzOiBbXSB9KTsNCiAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ID09PSAidW5kZWZpbmVkIikNCiAgICAgICAgICAgIGNvbW1lbnQgPSBudWxsOw0KICAgICAgICBmLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsNCiAgICAgICAgaWYgKGYudHlwZSAhPT0gRlVOQ1RJT04pDQogICAgICAgICAgICBmLnR5cGUgPSAoZi52YWx1ZSA9PT0gImdldCIpID8gR0VUVEVSIDogU0VUVEVSOw0KICAgICAgICBpZiAodC5tYXRjaChJREVOVElGSUVSKSkNCiAgICAgICAgICAgIGYubmFtZSA9IHQudG9rZW4udmFsdWU7DQogICAgICAgIGVsc2UgaWYgKHJlcXVpcmVOYW1lKQ0KICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBmdW5jdGlvbiBpZGVudGlmaWVyIik7DQoNCiAgICAgICAgdmFyIGluTW9kdWxlID0geCA/IHguaW5Nb2R1bGUgOiBmYWxzZTsNCiAgICAgICAgdmFyIHgyID0gbmV3IFN0YXRpY0NvbnRleHQobnVsbCwgbnVsbCwgaW5Nb2R1bGUsIHRydWUpOw0KDQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfUEFSRU4pOw0KICAgICAgICBpZiAoIXQubWF0Y2goUklHSFRfUEFSRU4pKSB7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgdHQgPSB0LmdldCgpOw0KICAgICAgICAgICAgICAgIGYucGFyYW1Db21tZW50cy5wdXNoKHQubGFzdEJsb2NrQ29tbWVudCgpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0KSB7DQogICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoNCiAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmVkIGZvcm1hbCBwYXJhbWV0ZXJzLg0KICAgICAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7DQogICAgICAgICAgICAgICAgICAgIGYucGFyYW1zLnB1c2goRGVzdHJ1Y3R1cmluZ0V4cHJlc3Npb24odCwgeDIpKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6DQogICAgICAgICAgICAgICAgICAgIGYucGFyYW1zLnB1c2godC50b2tlbi52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBmb3JtYWwgcGFyYW1ldGVyIik7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX1BBUkVOKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIERvIHdlIGhhdmUgYW4gZXhwcmVzc2lvbiBjbG9zdXJlIG9yIGEgbm9ybWFsIGJvZHk/DQogICAgICAgIHR0ID0gdC5nZXQoKTsNCiAgICAgICAgaWYgKHR0ICE9PSBMRUZUX0NVUkxZKQ0KICAgICAgICAgICAgdC51bmdldCgpOw0KDQogICAgICAgIGlmICh0dCAhPT0gTEVGVF9DVVJMWSkgew0KICAgICAgICAgICAgZi5ib2R5ID0gQXNzaWduRXhwcmVzc2lvbih0LCB4Mik7DQogICAgICAgICAgICBpZiAoZi5ib2R5LmlzR2VuZXJhdG9yKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkdlbmVyYXRvciByZXR1cm5zIGEgdmFsdWUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGYuYm9keSA9IFNjcmlwdCh0LCBpbk1vZHVsZSwgdHJ1ZSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodHQgPT09IExFRlRfQ1VSTFkpDQogICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7DQoNCiAgICAgICAgZi5lbmQgPSB0LnRva2VuLmVuZDsNCiAgICAgICAgZi5mdW5jdGlvbkZvcm0gPSBmdW5jdGlvbkZvcm07DQogICAgICAgIGlmIChmdW5jdGlvbkZvcm0gPT09IERFQ0xBUkVEX0ZPUk0pDQogICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5mdW5EZWNscy5wdXNoKGYpOw0KICAgICAgICByZXR1cm4gZjsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIE1vZHVsZVZhcmlhYmxlcyA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0LCBNT0RVTEUgbm9kZSkgLT4gdm9pZA0KICAgICAqDQogICAgICogUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYW5kIG1heWJlDQogICAgICogaW5pdGlhbGl6YXRpb25zKS4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBNb2R1bGVWYXJpYWJsZXModCwgeCwgbikgew0KICAgICAgICB2YXIgbjEsIG4yOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBuMSA9IElkZW50aWZpZXIodCwgeCk7DQogICAgICAgICAgICBpZiAodC5tYXRjaChBU1NJR04pKSB7DQogICAgICAgICAgICAgICAgbjIgPSBNb2R1bGVFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIG4xLmluaXRpYWxpemVyID0gbjI7DQogICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IFNUUklORykNCiAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQubW9kTG9hZHMuc2V0KG4xLnZhbHVlLCBuMi52YWx1ZSk7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5tb2RBc3Nucy5zZXQobjEudmFsdWUsIG4xKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG4ucHVzaChuMSk7DQogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIFZhcmlhYmxlcyA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlDQogICAgICoNCiAgICAgKiBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YXIgZGVjbGFyYXRpb25zIChhbmQgbWF5YmUNCiAgICAgKiBpbml0aWFsaXphdGlvbnMpLg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIFZhcmlhYmxlcyh0LCB4LCBsZXRCbG9jaykgew0KICAgICAgICB2YXIgbiwgbjIsIHNzLCBpLCBzLCB0dDsNCg0KICAgICAgICB0dCA9IHQudG9rZW4udHlwZTsNCiAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgIGNhc2UgVkFSOg0KICAgICAgICAgIGNhc2UgQ09OU1Q6DQogICAgICAgICAgICBzID0geC5wYXJlbnRTY3JpcHQ7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICBjYXNlIExFVDoNCiAgICAgICAgICAgIHMgPSB4LnBhcmVudEJsb2NrOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgY2FzZSBMRUZUX1BBUkVOOg0KICAgICAgICAgICAgdHQgPSBMRVQ7DQogICAgICAgICAgICBzID0gbGV0QmxvY2s7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IHR0LCBkZXN0cnVjdHVyaW5nczogW10gfSk7DQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgdHQgPSB0LmdldCgpOw0KICAgICAgICAgICAgaWYgKHR0ID09PSBMRUZUX0JSQUNLRVQgfHwgdHQgPT09IExFRlRfQ1VSTFkpIHsNCiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHVuZ2V0IHRvIHBhcnNlIHRoZSBmdWxsIGRlc3RydWN0dXJlZCBleHByZXNzaW9uLg0KICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCg0KICAgICAgICAgICAgICAgIHZhciBkZXhwID0gRGVzdHJ1Y3R1cmluZ0V4cHJlc3Npb24odCwgeCwgdHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGV4cCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IG4udHlwZSA9PT0gQ09OU1QgfSk7DQogICAgICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgICAgICAgICBwdXNoRGVzdHJ1Y3R1cmluZ1ZhckRlY2xzKG4yLm5hbWUuZGVzdHJ1Y3R1cmVkTmFtZXMsIHMpOw0KICAgICAgICAgICAgICAgIG4uZGVzdHJ1Y3R1cmluZ3MucHVzaCh7IGV4cDogZGV4cCwgZGVjbDogbjIgfSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoeC5pbkZvckxvb3BJbml0ICYmIHQucGVlaygpID09PSBJTikgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChBU1NJR04pOw0KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLmFzc2lnbk9wKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIik7DQoNCiAgICAgICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnQgPSB0Lmxhc3RCbG9ja0NvbW1lbnQoKTsNCiAgICAgICAgICAgICAgICBuMi5pbml0aWFsaXplciA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQoNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHR0ICE9PSBJREVOVElGSUVSKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgdmFyaWFibGUgbmFtZSIpOw0KDQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LnRva2VuLnZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiBuLnR5cGUgPT09IENPTlNUIH0pOw0KICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgICAgIHMudmFyRGVjbHMucHVzaChuMik7DQoNCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKEFTU0lHTikpIHsNCiAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHQubGFzdEJsb2NrQ29tbWVudCgpOw0KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLmFzc2lnbk9wKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIik7DQoNCiAgICAgICAgICAgICAgICBuMi5pbml0aWFsaXplciA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdC5sYXN0QmxvY2tDb21tZW50KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnQgPSBjb21tZW50Ow0KICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBMZXRCbG9jayA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0LCBib29sZWFuKSAtPiBub2RlDQogICAgICoNCiAgICAgKiBEb2VzIG5vdCBoYW5kbGUgbGV0IGluc2lkZSBvZiBmb3IgbG9vcCBpbml0Lg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIExldEJsb2NrKHQsIHgsIGlzU3RhdGVtZW50KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICAvLyB0LnRva2VuLnR5cGUgbXVzdCBiZSBMRVQNCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogTEVUX0JMT0NLLCB2YXJEZWNsczogW10gfSk7DQogICAgICAgIHQubXVzdE1hdGNoKExFRlRfUEFSRU4pOw0KICAgICAgICBuLnZhcmlhYmxlcyA9IFZhcmlhYmxlcyh0LCB4LCBuKTsNCiAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfUEFSRU4pOw0KDQogICAgICAgIGlmIChpc1N0YXRlbWVudCAmJiB0LnBlZWsoKSAhPT0gTEVGVF9DVVJMWSkgew0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAqIElmIHRoaXMgaXMgcmVhbGx5IGFuIGV4cHJlc3Npb24gaW4gbGV0IHN0YXRlbWVudCBndWlzZSwgdGhlbiB3ZQ0KICAgICAgICAgICAgICogbmVlZCB0byB3cmFwIHRoZSBMRVRfQkxPQ0sgbm9kZSBpbiBhIFNFTUlDT0xPTiBub2RlIHNvIHRoYXQgd2UgcG9wDQogICAgICAgICAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogU0VNSUNPTE9OLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IG4gfSk7DQogICAgICAgICAgICBpc1N0YXRlbWVudCA9IGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlzU3RhdGVtZW50KQ0KICAgICAgICAgICAgbi5ibG9jayA9IEJsb2NrKHQsIHgpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBuLmV4cHJlc3Npb24gPSBBc3NpZ25FeHByZXNzaW9uKHQsIHgpOw0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBuLCBzaW1wbGVOYW1lc09ubHkpIHsNCiAgICAgICAgaWYgKG4udHlwZSA9PT0gQVJSQVlfQ09NUCkNCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgYXJyYXkgY29tcHJlaGVuc2lvbiBsZWZ0LWhhbmQgc2lkZSIpOw0KICAgICAgICBpZiAobi50eXBlICE9PSBBUlJBWV9JTklUICYmIG4udHlwZSAhPT0gT0JKRUNUX0lOSVQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdmFyIGxoc3MgPSB7fTsNCiAgICAgICAgdmFyIG5uLCBuMiwgaWR4LCBzdWIsIGNjLCBjID0gbi5jaGlsZHJlbjsNCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBjLmxlbmd0aDsgaSA8IGo7IGkrKykgew0KICAgICAgICAgICAgaWYgKCEobm4gPSBjW2ldKSkNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIGlmIChubi50eXBlID09PSBQUk9QRVJUWV9JTklUKSB7DQogICAgICAgICAgICAgICAgY2MgPSBubi5jaGlsZHJlbjsNCiAgICAgICAgICAgICAgICBzdWIgPSBjY1sxXTsNCiAgICAgICAgICAgICAgICBpZHggPSBjY1swXS52YWx1ZTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobi50eXBlID09PSBPQkpFQ1RfSU5JVCkgew0KICAgICAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgZGVzdHJ1Y3R1cmluZyBzaG9ydGhhbmQge2ZvbywgYmFyfT8NCiAgICAgICAgICAgICAgICBzdWIgPSBubjsNCiAgICAgICAgICAgICAgICBpZHggPSBubi52YWx1ZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc3ViID0gbm47DQogICAgICAgICAgICAgICAgaWR4ID0gaTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHN1Yi50eXBlID09PSBBUlJBWV9JTklUIHx8IHN1Yi50eXBlID09PSBPQkpFQ1RfSU5JVCkgew0KICAgICAgICAgICAgICAgIGxoc3NbaWR4XSA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBzdWIsIHNpbXBsZU5hbWVzT25seSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChzaW1wbGVOYW1lc09ubHkgJiYgc3ViLnR5cGUgIT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gSW4gZGVjbGFyYXRpb25zLCBsaHMgbXVzdCBiZSBzaW1wbGUgbmFtZXMNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBuYW1lIGluIHBhdHRlcm4iKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsaHNzW2lkeF0gPSBzdWI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbGhzczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCBzaW1wbGVOYW1lc09ubHkpIHsNCiAgICAgICAgdmFyIG4gPSBQcmltYXJ5RXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgLy8gS2VlcCB0aGUgbGlzdCBvZiBsZWZ0aGFuZCBzaWRlcyBmb3IgdmFyRGVjbHMNCiAgICAgICAgbi5kZXN0cnVjdHVyZWROYW1lcyA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBuLCBzaW1wbGVOYW1lc09ubHkpOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBHZW5lcmF0b3JFeHByZXNzaW9uKHQsIHgsIGUpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHQsIHsgdHlwZTogR0VORVJBVE9SLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsOiBDb21wcmVoZW5zaW9uVGFpbCh0LCB4KSB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBDb21wcmVoZW5zaW9uVGFpbCh0LCB4KSB7DQogICAgICAgIHZhciBib2R5LCBuLCBuMiwgbjMsIHA7DQoNCiAgICAgICAgLy8gdC50b2tlbi50eXBlIG11c3QgYmUgRk9SDQogICAgICAgIGJvZHkgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IENPTVBfVEFJTCB9KTsNCg0KICAgICAgICBkbyB7DQogICAgICAgICAgICAvLyBDb21wcmVoZW5zaW9uIHRhaWxzIGFyZSBhbHdheXMgZm9yLi5pbiBsb29wcy4NCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEZPUl9JTiwgaXNMb29wOiB0cnVlIH0pOw0KICAgICAgICAgICAgaWYgKHQubWF0Y2goSURFTlRJRklFUikpIHsNCiAgICAgICAgICAgICAgICAvLyBCdXQgc29tZXRpbWVzIHRoZXkncmUgZm9yIGVhY2guLmluLg0KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLnZhbHVlID09PSAiZWFjaCIpDQogICAgICAgICAgICAgICAgICAgIG4uaXNFYWNoID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHAgPSBNYXliZUxlZnRQYXJlbih0LCB4KTsNCiAgICAgICAgICAgIHN3aXRjaCh0LmdldCgpKSB7DQogICAgICAgICAgICAgIGNhc2UgTEVGVF9CUkFDS0VUOg0KICAgICAgICAgICAgICBjYXNlIExFRlRfQ1VSTFk6DQogICAgICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgICAgIC8vIERlc3RydWN0dXJlZCBsZWZ0IHNpZGUgb2YgZm9yIGluIGNvbXByZWhlbnNpb24gdGFpbHMuDQogICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IERlc3RydWN0dXJpbmdFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoNCiAgICAgICAgICAgICAgICBuLml0ZXJhdG9yID0gbjMgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7DQogICAgICAgICAgICAgICAgbjMubmFtZSA9IG4zLnZhbHVlOw0KICAgICAgICAgICAgICAgIG4udmFyRGVjbCA9IG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBWQVIgfSk7DQogICAgICAgICAgICAgICAgbjIucHVzaChuMyk7DQogICAgICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQudmFyRGVjbHMucHVzaChuMyk7DQogICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIHRvIHZhckRlY2xzIHNpbmNlIHRoZSBzZW1hbnRpY3Mgb2YgY29tcHJlaGVuc2lvbnMgaXMNCiAgICAgICAgICAgICAgICAvLyBzdWNoIHRoYXQgdGhlIHZhcmlhYmxlcyBhcmUgaW4gdGhlaXIgb3duIGZ1bmN0aW9uIHdoZW4NCiAgICAgICAgICAgICAgICAvLyBkZXN1Z2FyZWQuDQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIGlkZW50aWZpZXIiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHQubXVzdE1hdGNoKElOKTsNCiAgICAgICAgICAgIG4ub2JqZWN0ID0gRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgICAgIE1heWJlUmlnaHRQYXJlbih0LCBwKTsNCiAgICAgICAgICAgIGJvZHkucHVzaChuKTsNCiAgICAgICAgfSB3aGlsZSAodC5tYXRjaChGT1IpKTsNCg0KICAgICAgICAvLyBPcHRpb25hbCBndWFyZC4NCiAgICAgICAgaWYgKHQubWF0Y2goSUYpKQ0KICAgICAgICAgICAgYm9keS5ndWFyZCA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOw0KDQogICAgICAgIHJldHVybiBib2R5Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIEhlYWRFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIHAgPSBNYXliZUxlZnRQYXJlbih0LCB4KTsNCiAgICAgICAgdmFyIG4gPSBQYXJlbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIE1heWJlUmlnaHRQYXJlbih0LCBwKTsNCiAgICAgICAgaWYgKHAgPT09IEVORCAmJiAhbi5wYXJlbnRoZXNpemVkKSB7DQogICAgICAgICAgICB2YXIgdHQgPSB0LnBlZWsoKTsNCiAgICAgICAgICAgIGlmICh0dCAhPT0gTEVGVF9DVVJMWSAmJiAhZGVmaW5pdGlvbnMuaXNTdGF0ZW1lbnRTdGFydENvZGVbdHRdKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIlVucGFyZW50aGVzaXplZCBoZWFkIGZvbGxvd2VkIGJ5IHVuYnJhY2VkIGJvZHkiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBQYXJlbkV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICAvLyBBbHdheXMgYWNjZXB0IHRoZSAnaW4nIG9wZXJhdG9yIGluIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLA0KICAgICAgICAvLyB3aGVyZSBpdCdzIHVuYW1iaWd1b3VzLCBldmVuIGlmIHdlIG1pZ2h0IGJlIHBhcnNpbmcgdGhlIGluaXQgb2YgYQ0KICAgICAgICAvLyBmb3Igc3RhdGVtZW50Lg0KICAgICAgICB2YXIgbiA9IEV4cHJlc3Npb24odCwgeC51cGRhdGUoeyBpbkZvckxvb3BJbml0OiB4LmluRm9yTG9vcEluaXQgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQudG9rZW4udHlwZSA9PT0gTEVGVF9QQVJFTikgfSkpOw0KDQogICAgICAgIGlmICh0Lm1hdGNoKEZPUikpIHsNCiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IFlJRUxEICYmICFuLnBhcmVudGhlc2l6ZWQpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiWWllbGQgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQiKTsNCiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IENPTU1BICYmICFuLnBhcmVudGhlc2l6ZWQpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR2VuZXJhdG9yIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkIik7DQogICAgICAgICAgICBuID0gR2VuZXJhdG9yRXhwcmVzc2lvbih0LCB4LCBuKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogRXhwcmVzc2lvbiA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlDQogICAgICoNCiAgICAgKiBUb3AtZG93biBleHByZXNzaW9uIHBhcnNlciBtYXRjaGVkIGFnYWluc3QgU3BpZGVyTW9ua2V5Lg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIEV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIGlmICh0Lm1hdGNoKENPTU1BKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IENPTU1BIH0pOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICBuMiA9IG4uY2hpbGRyZW5bbi5jaGlsZHJlbi5sZW5ndGgtMV07DQogICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IFlJRUxEICYmICFuMi5wYXJlbnRoZXNpemVkKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJZaWVsZCBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCIpOw0KICAgICAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIEFzc2lnbkV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbGhzOw0KDQogICAgICAgIC8vIEhhdmUgdG8gdHJlYXQgeWllbGQgbGlrZSBhbiBvcGVyYW5kIGJlY2F1c2UgaXQgY291bGQgYmUgdGhlIGxlZnRtb3N0DQogICAgICAgIC8vIG9wZXJhbmQgb2YgdGhlIGV4cHJlc3Npb24uDQogICAgICAgIGlmICh0Lm1hdGNoKFlJRUxELCB0cnVlKSkNCiAgICAgICAgICAgIHJldHVybiBSZXR1cm5PcllpZWxkKHQsIHgpOw0KDQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEFTU0lHTiB9KTsNCiAgICAgICAgbGhzID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uKHQsIHgpOw0KDQogICAgICAgIGlmICghdC5tYXRjaChBU1NJR04pKSB7DQogICAgICAgICAgICByZXR1cm4gbGhzOw0KICAgICAgICB9DQoNCiAgICAgICAgbi5ibG9ja0NvbW1lbnQgPSB0Lmxhc3RCbG9ja0NvbW1lbnQoKTsNCg0KICAgICAgICBzd2l0Y2ggKGxocy50eXBlKSB7DQogICAgICAgICAgY2FzZSBPQkpFQ1RfSU5JVDoNCiAgICAgICAgICBjYXNlIEFSUkFZX0lOSVQ6DQogICAgICAgICAgICBsaHMuZGVzdHJ1Y3R1cmVkTmFtZXMgPSBjaGVja0Rlc3RydWN0dXJpbmcodCwgeCwgbGhzKTsNCiAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSA0KICAgICAgICAgIGNhc2UgSURFTlRJRklFUjogY2FzZSBET1Q6IGNhc2UgSU5ERVg6IGNhc2UgQ0FMTDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJCYWQgbGVmdC1oYW5kIHNpZGUgb2YgYXNzaWdubWVudCIpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICBuLmFzc2lnbk9wID0gbGhzLmFzc2lnbk9wID0gdC50b2tlbi5hc3NpZ25PcDsNCiAgICAgICAgbi5wdXNoKGxocyk7DQogICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBDb25kaXRpb25hbEV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IE9yRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgaWYgKHQubWF0Y2goSE9PSykpIHsNCiAgICAgICAgICAgIG4yID0gbjsNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEhPT0sgfSk7DQogICAgICAgICAgICBuLnB1c2gobjIpOw0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAqIEFsd2F5cyBhY2NlcHQgdGhlICdpbicgb3BlcmF0b3IgaW4gdGhlIG1pZGRsZSBjbGF1c2Ugb2YgYSB0ZXJuYXJ5LA0KICAgICAgICAgICAgICogd2hlcmUgaXQncyB1bmFtYmlndW91cywgZXZlbiBpZiB3ZSBtaWdodCBiZSBwYXJzaW5nIHRoZSBpbml0IG9mIGENCiAgICAgICAgICAgICAqIGZvciBzdGF0ZW1lbnQuDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgudXBkYXRlKHsgaW5Gb3JMb29wSW5pdDogZmFsc2UgfSkpKTsNCiAgICAgICAgICAgIGlmICghdC5tYXRjaChDT0xPTikpDQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyA6IGFmdGVyID8iKTsNCiAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIE9yRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gQW5kRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goT1IpKSB7DQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4yLnB1c2goQW5kRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBBbmRFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBCaXR3aXNlT3JFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICB3aGlsZSAodC5tYXRjaChBTkQpKSB7DQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4yLnB1c2goQml0d2lzZU9yRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBCaXR3aXNlT3JFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goQklUV0lTRV9PUikpIHsNCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gQml0d2lzZUFuZEV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIHdoaWxlICh0Lm1hdGNoKEJJVFdJU0VfWE9SKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKEJpdHdpc2VBbmRFeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIEJpdHdpc2VBbmRFeHByZXNzaW9uKHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBFcXVhbGl0eUV4cHJlc3Npb24odCwgeCk7DQogICAgICAgIHdoaWxlICh0Lm1hdGNoKEJJVFdJU0VfQU5EKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKEVxdWFsaXR5RXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBFcXVhbGl0eUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IFJlbGF0aW9uYWxFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICB3aGlsZSAodC5tYXRjaChFUSkgfHwgdC5tYXRjaChORSkgfHwNCiAgICAgICAgICAgICAgIHQubWF0Y2goU1RSSUNUX0VRKSB8fCB0Lm1hdGNoKFNUUklDVF9ORSkpIHsNCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChSZWxhdGlvbmFsRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBSZWxhdGlvbmFsRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICAvKg0KICAgICAgICAgKiBVc2VzIG9mIHRoZSBpbiBvcGVyYXRvciBpbiBzaGlmdEV4cHJzIGFyZSBhbHdheXMgdW5hbWJpZ3VvdXMsDQogICAgICAgICAqIHNvIHVuc2V0IHRoZSBmbGFnIHRoYXQgcHJvaGliaXRzIHJlY29nbml6aW5nIGl0Lg0KICAgICAgICAgKi8NCiAgICAgICAgdmFyIHgyID0geC51cGRhdGUoeyBpbkZvckxvb3BJbml0OiBmYWxzZSB9KTsNCiAgICAgICAgbiA9IFNoaWZ0RXhwcmVzc2lvbih0LCB4Mik7DQogICAgICAgIHdoaWxlICgodC5tYXRjaChMVCkgfHwgdC5tYXRjaChMRSkgfHwgdC5tYXRjaChHRSkgfHwgdC5tYXRjaChHVCkgfHwNCiAgICAgICAgICAgICAgICgheC5pbkZvckxvb3BJbml0ICYmIHQubWF0Y2goSU4pKSB8fA0KICAgICAgICAgICAgICAgdC5tYXRjaChJTlNUQU5DRU9GKSkpIHsNCiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgbjIucHVzaChTaGlmdEV4cHJlc3Npb24odCwgeDIpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIFNoaWZ0RXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gQWRkRXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goTFNIKSB8fCB0Lm1hdGNoKFJTSCkgfHwgdC5tYXRjaChVUlNIKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKEFkZEV4cHJlc3Npb24odCwgeCkpOw0KICAgICAgICAgICAgbiA9IG4yOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gQWRkRXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMjsNCg0KICAgICAgICBuID0gTXVsdGlwbHlFeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICB3aGlsZSAodC5tYXRjaChQTFVTKSB8fCB0Lm1hdGNoKE1JTlVTKSkgew0KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICBuMi5wdXNoKE11bHRpcGx5RXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICBuID0gbjI7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBNdWx0aXBseUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjI7DQoNCiAgICAgICAgbiA9IFVuYXJ5RXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgd2hpbGUgKHQubWF0Y2goTVVMKSB8fCB0Lm1hdGNoKERJVikgfHwgdC5tYXRjaChNT0QpKSB7DQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgIG4yLnB1c2goVW5hcnlFeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIFVuYXJ5RXhwcmVzc2lvbih0LCB4KSB7DQogICAgICAgIHZhciBuLCBuMiwgdHQ7DQoNCiAgICAgICAgc3dpdGNoICh0dCA9IHQuZ2V0KHRydWUpKSB7DQogICAgICAgICAgY2FzZSBERUxFVEU6IGNhc2UgVk9JRDogY2FzZSBUWVBFT0Y6DQogICAgICAgICAgY2FzZSBOT1Q6IGNhc2UgQklUV0lTRV9OT1Q6IGNhc2UgUExVUzogY2FzZSBNSU5VUzoNCiAgICAgICAgICAgIGlmICh0dCA9PT0gUExVUykNCiAgICAgICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBVTkFSWV9QTFVTIH0pOw0KICAgICAgICAgICAgZWxzZSBpZiAodHQgPT09IE1JTlVTKQ0KICAgICAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFVOQVJZX01JTlVTIH0pOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIG4ucHVzaChVbmFyeUV4cHJlc3Npb24odCwgeCkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIElOQ1JFTUVOVDoNCiAgICAgICAgICBjYXNlIERFQ1JFTUVOVDoNCiAgICAgICAgICAgIC8vIFByZWZpeCBpbmNyZW1lbnQvZGVjcmVtZW50Lg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5wdXNoKE1lbWJlckV4cHJlc3Npb24odCwgeCwgdHJ1ZSkpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgdC51bmdldCgpOw0KICAgICAgICAgICAgbiA9IE1lbWJlckV4cHJlc3Npb24odCwgeCwgdHJ1ZSk7DQoNCiAgICAgICAgICAgIC8vIERvbid0IGxvb2sgYWNyb3NzIGEgbmV3bGluZSBib3VuZGFyeSBmb3IgYSBwb3N0Zml4IHtpbixkZX1jcmVtZW50Lg0KICAgICAgICAgICAgaWYgKHQudG9rZW5zWyh0LnRva2VuSW5kZXggKyB0Lmxvb2thaGVhZCAtIDEpICYgM10ubGluZW5vID09PQ0KICAgICAgICAgICAgICAgIHQubGluZW5vKSB7DQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goSU5DUkVNRU5UKSB8fCB0Lm1hdGNoKERFQ1JFTUVOVCkpIHsNCiAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHBvc3RmaXg6IHRydWUgfSk7DQogICAgICAgICAgICAgICAgICAgIG4yLnB1c2gobik7DQogICAgICAgICAgICAgICAgICAgIG4gPSBuMjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIE1lbWJlckV4cHJlc3Npb24odCwgeCwgYWxsb3dDYWxsU3ludGF4KSB7DQogICAgICAgIHZhciBuLCBuMiwgbmFtZSwgdHQ7DQoNCiAgICAgICAgaWYgKHQubWF0Y2goTkVXKSkgew0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOw0KICAgICAgICAgICAgbi5wdXNoKE1lbWJlckV4cHJlc3Npb24odCwgeCwgZmFsc2UpKTsNCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKExFRlRfUEFSRU4pKSB7DQogICAgICAgICAgICAgICAgbi50eXBlID0gTkVXX1dJVEhfQVJHUzsNCiAgICAgICAgICAgICAgICBuLnB1c2goQXJndW1lbnRMaXN0KHQsIHgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG4gPSBQcmltYXJ5RXhwcmVzc2lvbih0LCB4KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlICgodHQgPSB0LmdldCgpKSAhPT0gRU5EKSB7DQogICAgICAgICAgICBzd2l0Y2ggKHR0KSB7DQogICAgICAgICAgICAgIGNhc2UgRE9UOg0KICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7DQogICAgICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgICAgICBuMi5wdXNoKElkZW50aWZpZXJOYW1lKHQpKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoNCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSU5ERVggfSk7DQogICAgICAgICAgICAgICAgbjIucHVzaChuKTsNCiAgICAgICAgICAgICAgICBuMi5wdXNoKEV4cHJlc3Npb24odCwgeCkpOw0KICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX0JSQUNLRVQpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgIGNhc2UgTEVGVF9QQVJFTjoNCiAgICAgICAgICAgICAgICBpZiAoYWxsb3dDYWxsU3ludGF4KSB7DQogICAgICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBDQUxMIH0pOw0KICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKG4pOw0KICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKEFyZ3VtZW50TGlzdCh0LCB4KSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSA0KICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHQudW5nZXQoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbiA9IG4yOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gQXJndW1lbnRMaXN0KHQsIHgpIHsNCiAgICAgICAgdmFyIG4sIG4yOw0KDQogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IExJU1QgfSk7DQogICAgICAgIGlmICh0Lm1hdGNoKFJJR0hUX1BBUkVOLCB0cnVlKSkNCiAgICAgICAgICAgIHJldHVybiBuOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBuMiA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7DQogICAgICAgICAgICBpZiAobjIudHlwZSA9PT0gWUlFTEQgJiYgIW4yLnBhcmVudGhlc2l6ZWQgJiYgdC5wZWVrKCkgPT09IENPTU1BKQ0KICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIllpZWxkIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkIik7DQogICAgICAgICAgICBpZiAodC5tYXRjaChGT1IpKSB7DQogICAgICAgICAgICAgICAgbjIgPSBHZW5lcmF0b3JFeHByZXNzaW9uKHQsIHgsIG4yKTsNCiAgICAgICAgICAgICAgICBpZiAobi5jaGlsZHJlbi5sZW5ndGggPiAxIHx8IHQucGVlayh0cnVlKSA9PT0gQ09NTUEpDQogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgfSB3aGlsZSAodC5tYXRjaChDT01NQSkpOw0KICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7DQoNCiAgICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gUHJpbWFyeUV4cHJlc3Npb24odCwgeCkgew0KICAgICAgICB2YXIgbiwgbjIsIHR0ID0gdC5nZXQodHJ1ZSk7DQoNCiAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgIGNhc2UgRlVOQ1RJT046DQogICAgICAgICAgICBuID0gRnVuY3Rpb25EZWZpbml0aW9uKHQsIHgsIGZhbHNlLCBFWFBSRVNTRURfRk9STSk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgTEVGVF9CUkFDS0VUOg0KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogQVJSQVlfSU5JVCB9KTsNCiAgICAgICAgICAgIHdoaWxlICgodHQgPSB0LnBlZWsodHJ1ZSkpICE9PSBSSUdIVF9CUkFDS0VUKSB7DQogICAgICAgICAgICAgICAgaWYgKHR0ID09PSBDT01NQSkgew0KICAgICAgICAgICAgICAgICAgICB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBuLnB1c2gobnVsbCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBuLnB1c2goQXNzaWduRXhwcmVzc2lvbih0LCB4KSk7DQogICAgICAgICAgICAgICAgaWYgKHR0ICE9PSBDT01NQSAmJiAhdC5tYXRjaChDT01NQSkpDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBJZiB3ZSBtYXRjaGVkIGV4YWN0bHkgb25lIGVsZW1lbnQgYW5kIGdvdCBhIEZPUiwgd2UgaGF2ZSBhbg0KICAgICAgICAgICAgLy8gYXJyYXkgY29tcHJlaGVuc2lvbi4NCiAgICAgICAgICAgIGlmIChuLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiB0Lm1hdGNoKEZPUikpIHsNCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogQVJSQVlfQ09NUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbi5jaGlsZHJlblswXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbDogQ29tcHJlaGVuc2lvblRhaWwodCwgeCkgfSk7DQogICAgICAgICAgICAgICAgbiA9IG4yOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfQlJBQ0tFVCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToNCiAgICAgICAgICAgIHZhciBpZCwgZmQ7DQogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBPQkpFQ1RfSU5JVCB9KTsNCg0KICAgICAgICAgIG9iamVjdF9pbml0Og0KICAgICAgICAgICAgaWYgKCF0Lm1hdGNoKFJJR0hUX0NVUkxZKSkgew0KICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgdHQgPSB0LmdldCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKHQudG9rZW4udmFsdWUgPT09ICJnZXQiIHx8IHQudG9rZW4udmFsdWUgPT09ICJzZXQiKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgdC5wZWVrKCkgPT09IElERU5USUZJRVIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4LmVjbWEzT25seU1vZGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCBwcm9wZXJ0eSBhY2Nlc3NvciIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKEZ1bmN0aW9uRGVmaW5pdGlvbih0LCB4LCB0cnVlLCBFWFBSRVNTRURfRk9STSkpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRzID0gdC5ibG9ja0NvbW1lbnRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0dCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6IGNhc2UgTlVNQkVSOiBjYXNlIFNUUklORzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9DVVJMWToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5lY21hM09ubHlNb2RlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbGxlZ2FsIHRyYWlsaW5nICwiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvYmplY3RfaW5pdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC50b2tlbi52YWx1ZSBpbiBkZWZpbml0aW9ucy5rZXl3b3Jkcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgcHJvcGVydHkgbmFtZSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goQ09MT04pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFBST1BFUlRZX0lOSVQgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIucHVzaChpZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKG4yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydCwgZS5nLiwgfHZhciB7eCwgeX0gPSBvfCBhcyBkZXN0cnVjdHVyaW5nIHNob3J0aGFuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB8dmFyIHt4OiB4LCB5OiB5fSA9IG98LCBwZXIgcHJvcG9zZWQgSlMyL0VTNCBmb3IgSlMxLjguDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucGVlaygpICE9PSBDT01NQSAmJiB0LnBlZWsoKSAhPT0gUklHSFRfQ1VSTFkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgOiBhZnRlciBwcm9wZXJ0eSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChpZCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7DQogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfQ1VSTFkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIExFRlRfUEFSRU46DQogICAgICAgICAgICBuID0gUGFyZW5FeHByZXNzaW9uKHQsIHgpOw0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfUEFSRU4pOw0KICAgICAgICAgICAgbi5wYXJlbnRoZXNpemVkID0gdHJ1ZTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSBMRVQ6DQogICAgICAgICAgICBuID0gTGV0QmxvY2sodCwgeCwgZmFsc2UpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIE5VTEw6IGNhc2UgVEhJUzogY2FzZSBUUlVFOiBjYXNlIEZBTFNFOg0KICAgICAgICAgIGNhc2UgSURFTlRJRklFUjogY2FzZSBOVU1CRVI6IGNhc2UgU1RSSU5HOiBjYXNlIFJFR0VYUDoNCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3Npbmcgb3BlcmFuZCIpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIHBhcnNlIDo6IChzb3VyY2UsIGZpbGVuYW1lLCBsaW5lIG51bWJlcikgLT4gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHBhcnNlKHMsIGYsIGwpIHsNCiAgICAgICAgdmFyIHQgPSBuZXcgbGV4ZXIuVG9rZW5pemVyKHMsIGYsIGwpOw0KICAgICAgICB2YXIgbiA9IFNjcmlwdCh0LCBmYWxzZSwgZmFsc2UpOw0KICAgICAgICBpZiAoIXQuZG9uZSkNCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIlN5bnRheCBlcnJvciIpOw0KDQogICAgICAgIHJldHVybiBuOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogcGFyc2VTdGRpbiA6OiAoc291cmNlLCB7bGluZSBudW1iZXJ9LCBzdHJpbmcsIChzdHJpbmcpIC0+IGJvb2xlYW4pIC0+IHByb2dyYW0gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHBhcnNlU3RkaW4ocywgbG4sIHByZWZpeCwgaXNDb21tYW5kKSB7DQogICAgICAgIC8vIHRoZSBzcGVjaWFsIC5iZWdpbiBjb21tYW5kIGlzIG9ubHkgcmVjb2duaXplZCBhdCB0aGUgYmVnaW5uaW5nDQogICAgICAgIGlmIChzLm1hdGNoKC9eW1xzXSpcLmJlZ2luW1xzXSokLykpIHsNCiAgICAgICAgICAgICsrbG4udmFsdWU7DQogICAgICAgICAgICByZXR1cm4gcGFyc2VNdWx0aWxpbmUobG4sIHByZWZpeCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBjb21tYW5kcyBhdCB0aGUgYmVnaW5uaW5nIGFyZSB0cmVhdGVkIGFzIHRoZSBlbnRpcmUgaW5wdXQNCiAgICAgICAgaWYgKGlzQ29tbWFuZChzLnRyaW0oKSkpDQogICAgICAgICAgICBzID0gIiI7DQoNCiAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBsZXhlci5Ub2tlbml6ZXIocywgInN0ZGluIiwgbG4udmFsdWUpOw0KICAgICAgICAgICAgICAgIHZhciBuID0gU2NyaXB0KHQsIGZhbHNlLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgbG4udmFsdWUgPSB0LmxpbmVubzsNCiAgICAgICAgICAgICAgICByZXR1cm4gbjsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoIXQudW5leHBlY3RlZEVPRikNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCg0KICAgICAgICAgICAgICAgIC8vIGNvbW1hbmRzIGluIHRoZSBtaWRkbGUgYXJlIG5vdCB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIGlucHV0DQogICAgICAgICAgICAgICAgdmFyIG1vcmU7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcHV0c3RyKHByZWZpeCk7DQogICAgICAgICAgICAgICAgICAgIG1vcmUgPSByZWFkbGluZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vcmUpDQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzQ29tbWFuZChtb3JlLnRyaW0oKSkpOw0KDQogICAgICAgICAgICAgICAgcyArPSAiXG4iICsgbW9yZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogcGFyc2VNdWx0aWxpbmUgOjogKHtsaW5lIG51bWJlcn0sIHN0cmluZyB8IG51bGwpIC0+IHByb2dyYW0gbm9kZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHBhcnNlTXVsdGlsaW5lKGxuLCBwcmVmaXgpIHsNCiAgICAgICAgdmFyIHMgPSAiIjsNCiAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgaWYgKHByZWZpeCkNCiAgICAgICAgICAgICAgICBwdXRzdHIocHJlZml4KTsNCiAgICAgICAgICAgIHZhciBtb3JlID0gcmVhZGxpbmUoKTsNCiAgICAgICAgICAgIGlmIChtb3JlID09PSBudWxsKQ0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgLy8gdGhlIG9ubHkgY29tbWFuZCByZWNvZ25pemVkIGluIG11bHRpbGluZSBtb2RlIGlzIC5lbmQNCiAgICAgICAgICAgIGlmIChtb3JlLm1hdGNoKC9eW1xzXSpcLmVuZFtcc10qJC8pKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgcyArPSAiXG4iICsgbW9yZTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgdCA9IG5ldyBsZXhlci5Ub2tlbml6ZXIocywgInN0ZGluIiwgbG4udmFsdWUpOw0KICAgICAgICB2YXIgbiA9IFNjcmlwdCh0LCBmYWxzZSwgZmFsc2UpOw0KICAgICAgICBsbi52YWx1ZSA9IHQubGluZW5vOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9DQoNCiAgICBtb2R1bGUuZXhwb3J0cyA9IHsNCiAgICAgICAgcGFyc2U6IHBhcnNlLA0KICAgICAgICBwYXJzZVN0ZGluOiBwYXJzZVN0ZGluLA0KICAgICAgICBOb2RlOiBOb2RlLA0KICAgICAgICBTeW50aGV0aWNOb2RlOiBTeW50aGV0aWNOb2RlLA0KICAgICAgICBERUNMQVJFRF9GT1JNOiBERUNMQVJFRF9GT1JNLA0KICAgICAgICBFWFBSRVNTRURfRk9STTogRVhQUkVTU0VEX0ZPUk0sDQogICAgICAgIFNUQVRFTUVOVF9GT1JNOiBTVEFURU1FTlRfRk9STSwNCiAgICAgICAgVG9rZW5pemVyOiBsZXhlci5Ub2tlbml6ZXIsDQogICAgICAgIEZ1bmN0aW9uRGVmaW5pdGlvbjogRnVuY3Rpb25EZWZpbml0aW9uLA0KICAgICAgICBNb2R1bGU6IE1vZHVsZSwNCiAgICAgICAgRXhwb3J0OiBFeHBvcnQNCiAgICB9Ow0KDQp9KTsvKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9Nzg6ICovDQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5hcmNpc3N1cyBKYXZhU2NyaXB0IGVuZ2luZS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4uDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA0DQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgIFRvbSBBdXN0aW4gPHRhdXN0aW5AdWNzYy5lZHU+DQogKiAgIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4NCiAqICAgU2h1LVl1IEd1byA8c2h1QHJmcm4ub3JnPg0KICogICBEYXZlIEhlcm1hbiA8ZGhlcm1hbkBtb3ppbGxhLmNvbT4NCiAqICAgRGltaXRyaXMgVmFyZG91bGFraXMgPGRpbXZhckBjY3MubmV1LmVkdT4NCiAqICAgUGF0cmljayBXYWx0b24gPHBjd2FsdG9uQG1vemlsbGEuY29tPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCi8qDQogKiBOYXJjaXNzdXMgLSBKUyBpbXBsZW1lbnRlZCBpbiBKUy4NCiAqDQogKiBMZXhpY2FsIHNjYW5uZXIuDQogKi8NCg0KIGRlZmluZSgnYWNlL25hcmNpc3N1cy9qc2xleCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL25hcmNpc3N1cy9qc2RlZnMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCiAgICB2YXIgZGVmaW5pdGlvbnMgPSByZXF1aXJlKCIuL2pzZGVmcyIpOw0KDQogICAgLy8gU2V0IGNvbnN0YW50cyBpbiB0aGUgbG9jYWwgc2NvcGUuDQogICAgZXZhbChkZWZpbml0aW9ucy5jb25zdHMpOw0KDQogICAgLy8gQmFubmVkIGtleXdvcmRzIGJ5IGxhbmd1YWdlIHZlcnNpb24NCiAgICBjb25zdCBibGFja0xpc3RzID0geyAxNjA6IHt9LCAxODU6IHt9LCBoYXJtb255OiB7fSB9Ow0KICAgIGJsYWNrTGlzdHNbMTYwXVtMRVRdID0gdHJ1ZTsNCiAgICBibGFja0xpc3RzWzE2MF1bTU9EVUxFXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxNjBdW1lJRUxEXSA9IHRydWU7DQogICAgYmxhY2tMaXN0c1sxODVdW01PRFVMRV0gPSB0cnVlOw0KDQogICAgLy8gQnVpbGQgdXAgYSB0cmllIG9mIG9wZXJhdG9yIHRva2Vucy4NCiAgICB2YXIgb3BUb2tlbnMgPSB7fTsNCiAgICBmb3IgKHZhciBvcCBpbiBkZWZpbml0aW9ucy5vcFR5cGVOYW1lcykgew0KICAgICAgICBpZiAob3AgPT09ICdcbicgfHwgb3AgPT09ICcuJykNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KDQogICAgICAgIHZhciBub2RlID0gb3BUb2tlbnM7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3AubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaCA9IG9wW2ldOw0KICAgICAgICAgICAgaWYgKCEoY2ggaW4gbm9kZSkpDQogICAgICAgICAgICAgICAgbm9kZVtjaF0gPSB7fTsNCiAgICAgICAgICAgIG5vZGUgPSBub2RlW2NoXTsNCiAgICAgICAgICAgIG5vZGUub3AgPSBvcDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogVG9rZW5pemVyIDo6IChzb3VyY2UsIGZpbGVuYW1lLCBsaW5lIG51bWJlcikgLT4gVG9rZW5pemVyDQogICAgICovDQogICAgZnVuY3Rpb24gVG9rZW5pemVyKHMsIGYsIGwpIHsNCiAgICAgICAgdGhpcy5jdXJzb3IgPSAwOw0KICAgICAgICB0aGlzLnNvdXJjZSA9IFN0cmluZyhzKTsNCiAgICAgICAgdGhpcy50b2tlbnMgPSBbXTsNCiAgICAgICAgdGhpcy50b2tlbkluZGV4ID0gMDsNCiAgICAgICAgdGhpcy5sb29rYWhlYWQgPSAwOw0KICAgICAgICB0aGlzLnNjYW5OZXdsaW5lcyA9IGZhbHNlOw0KICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFT0YgPSBmYWxzZTsNCiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGYgfHwgIiI7DQogICAgICAgIHRoaXMubGluZW5vID0gbCB8fCAxOw0KICAgICAgICB0aGlzLmJsYWNrTGlzdCA9IGJsYWNrTGlzdHNbTmFyY2lzc3VzLm9wdGlvbnMudmVyc2lvbl07DQogICAgICAgIHRoaXMuYmxvY2tDb21tZW50cyA9IG51bGw7DQogICAgfQ0KDQogICAgVG9rZW5pemVyLnByb3RvdHlwZSA9IHsNCiAgICAgICAgZ2V0IGRvbmUoKSB7DQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCBzY2FuT3BlcmFuZCB0byB0cnVlIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgdGhpbmcNCiAgICAgICAgICAgIC8vIG1pZ2h0IGJlIGEgcmVnZXhwLg0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVlayh0cnVlKSA9PT0gRU5EOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldCB0b2tlbigpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdOw0KICAgICAgICB9LA0KDQogICAgICAgIG1hdGNoOiBmdW5jdGlvbiAodHQsIHNjYW5PcGVyYW5kKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoc2Nhbk9wZXJhbmQpID09PSB0dCB8fCB0aGlzLnVuZ2V0KCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgbXVzdE1hdGNoOiBmdW5jdGlvbiAodHQpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCh0dCkpIHsNCiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJNaXNzaW5nICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMudG9rZW5zW3R0XS50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuOw0KICAgICAgICB9LA0KDQogICAgICAgIHBlZWs6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgew0KICAgICAgICAgICAgdmFyIHR0LCBuZXh0Ow0KICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkKSB7DQogICAgICAgICAgICAgICAgbmV4dCA9IHRoaXMudG9rZW5zWyh0aGlzLnRva2VuSW5kZXggKyB0aGlzLmxvb2thaGVhZCkgJiAzXTsNCiAgICAgICAgICAgICAgICB0dCA9ICh0aGlzLnNjYW5OZXdsaW5lcyAmJiBuZXh0LmxpbmVubyAhPT0gdGhpcy5saW5lbm8pDQogICAgICAgICAgICAgICAgICAgICA/IE5FV0xJTkUNCiAgICAgICAgICAgICAgICAgICAgIDogbmV4dC50eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0dCA9IHRoaXMuZ2V0KHNjYW5PcGVyYW5kKTsNCiAgICAgICAgICAgICAgICB0aGlzLnVuZ2V0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgcGVla09uU2FtZUxpbmU6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgew0KICAgICAgICAgICAgdGhpcy5zY2FuTmV3bGluZXMgPSB0cnVlOw0KICAgICAgICAgICAgdmFyIHR0ID0gdGhpcy5wZWVrKHNjYW5PcGVyYW5kKTsNCiAgICAgICAgICAgIHRoaXMuc2Nhbk5ld2xpbmVzID0gZmFsc2U7DQogICAgICAgICAgICByZXR1cm4gdHQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgbGFzdEJsb2NrQ29tbWVudDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5ibG9ja0NvbW1lbnRzLmxlbmd0aDsNCiAgICAgICAgICAgIHJldHVybiBsZW5ndGggPyB0aGlzLmJsb2NrQ29tbWVudHNbbGVuZ3RoIC0gMV0gOiBudWxsOw0KICAgICAgICB9LA0KDQogICAgICAgIC8vIEVhdCBjb21tZW50cyBhbmQgd2hpdGVzcGFjZS4NCiAgICAgICAgc2tpcDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5zb3VyY2U7DQogICAgICAgICAgICB0aGlzLmJsb2NrQ29tbWVudHMgPSBbXTsNCiAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICB2YXIgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsNCiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgXHIsIFxyXG4gYW5kIChhbHdheXMgcHJlZmVyYWJsZSkgXG4NCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdccicpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIFxuLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgYXQgYWxsDQogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXG4nKSBjb250aW51ZTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHdlIHdhbnQgdG8gY29uc2lkZXIgdGhpcyBhcyBhIG5ld2xpbmUNCiAgICAgICAgICAgICAgICAgICAgY2ggPSAnXG4nOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xuJyAmJiAhdGhpcy5zY2FuTmV3bGluZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lbm8rKzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50U3RhcnQgPSArK3RoaXMuY3Vyc29yOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnKicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRFbmQgPSB0aGlzLmN1cnNvciAtIDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcbicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVubysrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tDb21tZW50cy5wdXNoKGlucHV0LnN1YnN0cmluZyhjb21tZW50U3RhcnQsIGNvbW1lbnRFbmQpKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLycgJiYgbmV4dCA9PT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107DQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdccicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgXHJcbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnXG4nKSBjaCA9ICdcbic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5OZXdsaW5lcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZW5vKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGNoIGluIGRlZmluaXRpb25zLndoaXRlc3BhY2UpKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgLy8gTGV4IHRoZSBleHBvbmVudGlhbCBwYXJ0IG9mIGEgbnVtYmVyLCBpZiBwcmVzZW50LiBSZXR1cm4gdHJ1ZSBpZmYgYW4NCiAgICAgICAgLy8gZXhwb25lbnRpYWwgcGFydCB3YXMgZm91bmQuDQogICAgICAgIGxleEV4cG9uZW50OiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgdmFyIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07DQogICAgICAgICAgICBpZiAobmV4dCA9PT0gJ2UnIHx8IG5leHQgPT09ICdFJykgew0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcrJyB8fCBjaCA9PT0gJy0nKQ0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KDQogICAgICAgICAgICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJNaXNzaW5nIGV4cG9uZW50Iik7DQoNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107DQogICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7DQogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3ItLTsNCg0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0sDQoNCiAgICAgICAgbGV4WmVyb051bWJlcjogZnVuY3Rpb24gKGNoKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgdG9rZW4udHlwZSA9IE5VTUJFUjsNCg0KICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOw0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07DQoNCiAgICAgICAgICAgICAgICB0aGlzLmxleEV4cG9uZW50KCk7DQogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBwYXJzZUZsb2F0KHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAneCcgfHwgY2ggPT09ICdYJykgew0KICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICB9IHdoaWxlICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpKTsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KDQogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBwYXJzZUludChpbnB1dC5zdWJzdHJpbmcodG9rZW4uc3RhcnQsIHRoaXMuY3Vyc29yKSk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107DQogICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc3Jyk7DQogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3ItLTsNCg0KICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VJbnQoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KICAgICAgICAgICAgICAgIHRoaXMubGV4RXhwb25lbnQoKTsgICAgIC8vIDBFMSwgJmMuDQogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIGxleE51bWJlcjogZnVuY3Rpb24gKGNoKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgdG9rZW4udHlwZSA9IE5VTUJFUjsNCg0KICAgICAgICAgICAgdmFyIGZsb2F0aW5nID0gZmFsc2U7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcuJyAmJiAhZmxvYXRpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmcgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOw0KDQogICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KDQogICAgICAgICAgICB2YXIgZXhwb25lbnQgPSB0aGlzLmxleEV4cG9uZW50KCk7DQogICAgICAgICAgICBmbG9hdGluZyA9IGZsb2F0aW5nIHx8IGV4cG9uZW50Ow0KDQogICAgICAgICAgICB2YXIgc3RyID0gaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcik7DQogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGZsb2F0aW5nID8gcGFyc2VGbG9hdChzdHIpIDogcGFyc2VJbnQoc3RyKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBsZXhEb3Q6IGZ1bmN0aW9uIChjaCkgew0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy50b2tlbiwgaW5wdXQgPSB0aGlzLnNvdXJjZTsNCiAgICAgICAgICAgIHZhciBuZXh0ID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KICAgICAgICAgICAgaWYgKG5leHQgPj0gJzAnICYmIG5leHQgPD0gJzknKSB7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOw0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOw0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07DQoNCiAgICAgICAgICAgICAgICB0aGlzLmxleEV4cG9uZW50KCk7DQoNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gTlVNQkVSOw0KICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VGbG9hdCh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gRE9UOw0KICAgICAgICAgICAgICAgIHRva2VuLmFzc2lnbk9wID0gbnVsbDsNCiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICcuJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICBsZXhTdHJpbmc6IGZ1bmN0aW9uIChjaCkgew0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy50b2tlbiwgaW5wdXQgPSB0aGlzLnNvdXJjZTsNCiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBTVFJJTkc7DQoNCiAgICAgICAgICAgIHZhciBoYXNFc2NhcGVzID0gZmFsc2U7DQogICAgICAgICAgICB2YXIgZGVsaW0gPSBjaDsNCiAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPD0gdGhpcy5jdXJzb3IpDQogICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsIik7DQogICAgICAgICAgICB3aGlsZSAoKGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK10pICE9PSBkZWxpbSkgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciA9PSBpbnB1dC5sZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubmV3U3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCIpOw0KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgew0KICAgICAgICAgICAgICAgICAgICBoYXNFc2NhcGVzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCsrdGhpcy5jdXJzb3IgPT0gaW5wdXQubGVuZ3RoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGhhc0VzY2FwZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmFsKGlucHV0LnN1YnN0cmluZyh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnN1YnN0cmluZyh0b2tlbi5zdGFydCArIDEsIHRoaXMuY3Vyc29yIC0gMSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgbGV4UmVnRXhwOiBmdW5jdGlvbiAoY2gpIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW4sIGlucHV0ID0gdGhpcy5zb3VyY2U7DQogICAgICAgICAgICB0b2tlbi50eXBlID0gUkVHRVhQOw0KDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnWycpIHsNCiAgICAgICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT09ICddJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubmV3U3ludGF4RXJyb3IoIlVudGVybWluYXRlZCByZWdleCIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKGNoICE9PSAnLycpOw0KDQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsNCiAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICdhJyAmJiBjaCA8PSAneicpOw0KDQogICAgICAgICAgICB0aGlzLmN1cnNvci0tOw0KDQogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGV2YWwoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOw0KICAgICAgICB9LA0KDQogICAgICAgIGxleE9wOiBmdW5jdGlvbiAoY2gpIHsNCiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW4sIGlucHV0ID0gdGhpcy5zb3VyY2U7DQoNCiAgICAgICAgICAgIC8vIEEgYml0IHVnbHksIGJ1dCBpdCBzZWVtcyB3YXN0ZWZ1bCB0byB3cml0ZSBhIHRyaWUgbG9va3VwIHJvdXRpbmUNCiAgICAgICAgICAgIC8vIGZvciBvbmx5IDMgY2hhcmFjdGVycy4uLg0KICAgICAgICAgICAgdmFyIG5vZGUgPSBvcFRva2Vuc1tjaF07DQogICAgICAgICAgICB2YXIgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsNCiAgICAgICAgICAgIGlmIChuZXh0IGluIG5vZGUpIHsNCiAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtuZXh0XTsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcisrOw0KICAgICAgICAgICAgICAgIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07DQogICAgICAgICAgICAgICAgaWYgKG5leHQgaW4gbm9kZSkgew0KICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtuZXh0XTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBvcCA9IG5vZGUub3A7DQogICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMuYXNzaWduT3BzW29wXSAmJiBpbnB1dFt0aGlzLmN1cnNvcl0gPT09ICc9Jykgew0KICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7DQogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IEFTU0lHTjsNCiAgICAgICAgICAgICAgICB0b2tlbi5hc3NpZ25PcCA9IGRlZmluaXRpb25zLnRva2VuSWRzW2RlZmluaXRpb25zLm9wVHlwZU5hbWVzW29wXV07DQogICAgICAgICAgICAgICAgb3AgKz0gJz0nOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gZGVmaW5pdGlvbnMudG9rZW5JZHNbZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbb3BdXTsNCiAgICAgICAgICAgICAgICB0b2tlbi5hc3NpZ25PcCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gb3A7DQogICAgICAgIH0sDQoNCiAgICAgICAgLy8gRklYTUU6IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcw0KICAgICAgICBsZXhJZGVudDogZnVuY3Rpb24gKGNoKSB7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuOw0KICAgICAgICAgICAgdmFyIGlkID0gY2g7DQoNCiAgICAgICAgICAgIHdoaWxlICgoY2ggPSB0aGlzLmdldFZhbGlkSWRlbnRpZmllckNoYXIoZmFsc2UpKSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGlkICs9IGNoOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0b2tlbi50eXBlID0gZGVmaW5pdGlvbnMua2V5d29yZHNbaWRdIHx8IElERU5USUZJRVI7DQogICAgICAgICAgICBpZiAodG9rZW4udHlwZSBpbiB0aGlzLmJsYWNrTGlzdCkgew0KICAgICAgICAgICAgICAgIC8vIGJhbm5lZCBrZXl3b3JkLCB0aGlzIGlzIGFuIGlkZW50aWZpZXINCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gSURFTlRJRklFUjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gaWQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoNCiAgICAgICAgICogVG9rZW5pemVyLmdldCA6OiB2b2lkIC0+IHRva2VuIHR5cGUNCiAgICAgICAgICoNCiAgICAgICAgICogQ29uc3VtZSBpbnB1dCAqb25seSogaWYgdGhlcmUgaXMgbm8gbG9va2FoZWFkLg0KICAgICAgICAgKiBEaXNwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgbGV4aW5nIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQuDQogICAgICAgICAqLw0KICAgICAgICBnZXQ6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgew0KICAgICAgICAgICAgdmFyIHRva2VuOw0KICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkKSB7DQogICAgICAgICAgICAgICAgLS10aGlzLmxvb2thaGVhZDsNCiAgICAgICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSAodGhpcy50b2tlbkluZGV4ICsgMSkgJiAzOw0KICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy50b2tlbnNbdGhpcy50b2tlbkluZGV4XTsNCiAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gTkVXTElORSB8fCB0aGlzLnNjYW5OZXdsaW5lcykNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuLnR5cGU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuc2tpcCgpOw0KDQogICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSAodGhpcy50b2tlbkluZGV4ICsgMSkgJiAzOw0KICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdOw0KICAgICAgICAgICAgaWYgKCF0b2tlbikNCiAgICAgICAgICAgICAgICB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdID0gdG9rZW4gPSB7fTsNCg0KICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5zb3VyY2U7DQogICAgICAgICAgICBpZiAodGhpcy5jdXJzb3IgPj0gaW5wdXQubGVuZ3RoKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlID0gRU5EOw0KDQogICAgICAgICAgICB0b2tlbi5zdGFydCA9IHRoaXMuY3Vyc29yOw0KICAgICAgICAgICAgdG9rZW4ubGluZW5vID0gdGhpcy5saW5lbm87DQoNCiAgICAgICAgICAgIHZhciBpY2ggPSB0aGlzLmdldFZhbGlkSWRlbnRpZmllckNoYXIodHJ1ZSk7DQogICAgICAgICAgICB2YXIgY2ggPSAoaWNoID09PSBudWxsKSA/IGlucHV0W3RoaXMuY3Vyc29yKytdIDogbnVsbDsNCiAgICAgICAgICAgIGlmIChpY2ggIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleElkZW50KGljaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHNjYW5PcGVyYW5kICYmIGNoID09PSAnLycpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleFJlZ0V4cChjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoIGluIG9wVG9rZW5zKSB7DQogICAgICAgICAgICAgICAgdGhpcy5sZXhPcChjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleERvdChjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49ICcxJyAmJiBjaCA8PSAnOScpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleE51bWJlcihjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnMCcpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleFplcm9OdW1iZXIoY2gpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmxleFN0cmluZyhjaCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nhbk5ld2xpbmVzICYmIChjaCA9PT0gJ1xuJyB8fCBjaCA9PT0gJ1xyJykpIHsNCiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHdhcyBhIFxyLCBsb29rIGZvciBcclxuDQogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXHInICYmIGlucHV0W3RoaXMuY3Vyc29yXSA9PT0gJ1xuJykgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gTkVXTElORTsNCiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICdcbic7DQogICAgICAgICAgICAgICAgdGhpcy5saW5lbm8rKzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCB0b2tlbiIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0b2tlbi5lbmQgPSB0aGlzLmN1cnNvcjsNCiAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlOw0KICAgICAgICB9LA0KDQogICAgICAgIC8qDQogICAgICAgICAqIFRva2VuaXplci51bmdldCA6OiB2b2lkIC0+IHVuZGVmaW5lZA0KICAgICAgICAgKg0KICAgICAgICAgKiBNYXRjaCBkZXBlbmRzIG9uIHVuZ2V0IHJldHVybmluZyB1bmRlZmluZWQuDQogICAgICAgICAqLw0KICAgICAgICB1bmdldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCsrdGhpcy5sb29rYWhlYWQgPT09IDQpIHRocm93ICJQQU5JQzogdG9vIG11Y2ggbG9va2FoZWFkISI7DQogICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSAodGhpcy50b2tlbkluZGV4IC0gMSkgJiAzOw0KICAgICAgICB9LA0KDQogICAgICAgIG5ld1N5bnRheEVycm9yOiBmdW5jdGlvbiAobSkgew0KICAgICAgICAgICAgbSA9ICh0aGlzLmZpbGVuYW1lID8gdGhpcy5maWxlbmFtZSArICI6IiA6ICIiKSArIHRoaXMubGluZW5vICsgIjogIiArIG07DQogICAgICAgICAgICB2YXIgZSA9IG5ldyBTeW50YXhFcnJvcihtLCB0aGlzLmZpbGVuYW1lLCB0aGlzLmxpbmVubyk7DQogICAgICAgICAgICBlLnNvdXJjZSA9IHRoaXMuc291cmNlOw0KICAgICAgICAgICAgZS5jdXJzb3IgPSB0aGlzLmxvb2thaGVhZA0KICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMudG9rZW5zWyh0aGlzLnRva2VuSW5kZXggKyB0aGlzLmxvb2thaGVhZCkgJiAzXS5zdGFydA0KICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY3Vyc29yOw0KICAgICAgICAgICAgcmV0dXJuIGU7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyogR2V0cyBhIHNpbmdsZSB2YWxpZCBpZGVudGlmaWVyIGNoYXIgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBudWxsDQogICAgICAgICAqIGlmIHRoZXJlIGlzIG5vbmUuDQogICAgICAgICAqIFNpbmNlIEphdmFTY3JpcHQgcHJvdmlkZXMgbm8gY29udmVuaWVudCB3YXkgdG8gZGV0ZXJtaW5lIGlmIGENCiAgICAgICAgICogY2hhcmFjdGVyIGlzIGluIGEgcGFydGljdWxhciBVbmljb2RlIGNhdGVnb3J5LCB3ZSB1c2UNCiAgICAgICAgICogbWV0YWNpcmN1bGFyaXR5IHRvIGFjY29tcGxpc2ggdGhpcyAob2ggeWVhYWFhaCEpICovDQogICAgICAgIGdldFZhbGlkSWRlbnRpZmllckNoYXI6IGZ1bmN0aW9uKGZpcnN0KSB7DQogICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNvdXJjZTsNCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciA+PSBpbnB1dC5sZW5ndGgpIHJldHVybiBudWxsOw0KICAgICAgICAgICAgdmFyIGNoID0gaW5wdXRbdGhpcy5jdXJzb3JdOw0KDQogICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgXHUgZXNjYXBlcw0KICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnICYmIGlucHV0W3RoaXMuY3Vyc29yKzFdID09PSAndScpIHsNCiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB2YWx1ZQ0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCgNCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnN1YnN0cmluZyh0aGlzLmN1cnNvciArIDIsIHRoaXMuY3Vyc29yICsgNiksDQogICAgICAgICAgICAgICAgICAgICAgICAxNikpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciArPSA1Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBjaGVjayBkaXJlY3RseSBmb3IgQVNDSUkNCiAgICAgICAgICAgIGlmIChjaCA8PSAiXHUwMDdGIikgew0KICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHx8IGNoID09PSAnJCcgfHwgY2ggPT09ICdfJyB8fA0KICAgICAgICAgICAgICAgICAgICAoIWZpcnN0ICYmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgdG8gdGVzdCB0aGlzIGluDQogICAgICAgICAgICB2YXIgeCA9IHt9Ow0KICAgICAgICAgICAgeFsieCIrY2hdID0gdHJ1ZTsNCiAgICAgICAgICAgIHhbY2hdID0gdHJ1ZTsNCiAgICANCiAgICAgICAgICAgIC8vIHRoZW4gdXNlIGV2YWwgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSB2YWxpZCBjaGFyYWN0ZXINCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB2YWxpZCA9IChGdW5jdGlvbigieCIsICJyZXR1cm4gKHguIiArIChmaXJzdD8iIjoieCIpICsgY2ggKyAiKTsiKSh4KSA9PT0gdHJ1ZSk7DQogICAgICAgICAgICB9IGNhdGNoIChleCkge30NCiAgICAgICAgICAgIGlmICh2YWxpZCkgdGhpcy5jdXJzb3IrKzsNCiAgICAgICAgICAgIHJldHVybiAodmFsaWQgPyBjaCA6IG51bGwpOw0KICAgICAgICB9LA0KICAgIH07DQoNCg0KICAgIG1vZHVsZS5leHBvcnRzID0geyBUb2tlbml6ZXI6IFRva2VuaXplciB9Ow0KDQp9KTsNCi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz03ODogKi8NCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyB0aGUgTmFyY2lzc3VzIEphdmFTY3JpcHQgZW5naW5lLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQnJlbmRhbiBFaWNoIDxicmVuZGFuQG1vemlsbGEub3JnPi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDQNCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgVG9tIEF1c3RpbiA8dGF1c3RpbkB1Y3NjLmVkdT4NCiAqICAgQnJlbmRhbiBFaWNoIDxicmVuZGFuQG1vemlsbGEub3JnPg0KICogICBTaHUtWXUgR3VvIDxzaHVAcmZybi5vcmc+DQogKiAgIERhdmUgSGVybWFuIDxkaGVybWFuQG1vemlsbGEuY29tPg0KICogICBEaW1pdHJpcyBWYXJkb3VsYWtpcyA8ZGltdmFyQGNjcy5uZXUuZWR1Pg0KICogICBQYXRyaWNrIFdhbHRvbiA8cGN3YWx0b25AbW96aWxsYS5jb20+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KLyoNCiAqIE5hcmNpc3N1cyAtIEpTIGltcGxlbWVudGVkIGluIEpTLg0KICoNCiAqIFdlbGwta25vd24gY29uc3RhbnRzIGFuZCBsb29rdXAgdGFibGVzLiAgTWFueSBjb25zdHMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZQ0KICogdG9rZW5zIHRhYmxlIHZpYSBldmFsIHRvIG1pbmltaXplIHJlZHVuZGFuY3ksIHNvIGNvbnN1bWVycyBtdXN0IGJlIGNvbXBpbGVkDQogKiBzZXBhcmF0ZWx5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzaW1wbGUgc3dpdGNoLWNhc2UgY29uc3RhbnQgcHJvcGFnYXRpb24NCiAqIGRvbmUgYnkgU3BpZGVyTW9ua2V5Lg0KICovDQoNCmRlZmluZSgnYWNlL25hcmNpc3N1cy9qc2RlZnMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KDQogICAgdmFyIG5hcmNpc3N1cyA9IHsNCiAgICAgICAgb3B0aW9uczogew0KICAgICAgICAgICAgdmVyc2lvbjogMTg1LA0KICAgICAgICAgICAgLy8gR2xvYmFsIHZhcmlhYmxlcyB0byBoaWRlIGZyb20gdGhlIGludGVycHJldGVyDQogICAgICAgICAgICBoaWRkZW5Ib3N0R2xvYmFsczogeyBOYXJjaXNzdXM6IHRydWUgfSwNCiAgICAgICAgICAgIC8vIERlc3VnYXIgU3BpZGVyTW9ua2V5IGxhbmd1YWdlIGV4dGVuc2lvbnM/DQogICAgICAgICAgICBkZXN1Z2FyRXh0ZW5zaW9uczogZmFsc2UNCiAgICAgICAgfSwNCiAgICAgICAgaG9zdFN1cHBvcnRzRXZhbENvbnN0OiAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBldmFsKCIoZnVuY3Rpb24ocykgeyBldmFsKHMpOyByZXR1cm4geCB9KSgnY29uc3QgeCA9IHRydWU7JykiKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0pKCksDQogICAgICAgIGhvc3RHbG9iYWw6IHRoaXMNCiAgICB9Ow0KICAgIE5hcmNpc3N1cyA9IG5hcmNpc3N1czsNCg0KICAgIHZhciB0b2tlbnMgPSBbDQogICAgICAgIC8vIEVuZCBvZiBzb3VyY2UuDQogICAgICAgICJFTkQiLA0KDQogICAgICAgIC8vIE9wZXJhdG9ycyBhbmQgcHVuY3R1YXRvcnMuICBTb21lIHBhaXItd2lzZSBvcmRlciBtYXR0ZXJzLCBlLmcuICgrLCAtKQ0KICAgICAgICAvLyBhbmQgKFVOQVJZX1BMVVMsIFVOQVJZX01JTlVTKS4NCiAgICAgICAgIlxuIiwgIjsiLA0KICAgICAgICAiLCIsDQogICAgICAgICI9IiwNCiAgICAgICAgIj8iLCAiOiIsICJDT05ESVRJT05BTCIsDQogICAgICAgICJ8fCIsDQogICAgICAgICImJiIsDQogICAgICAgICJ8IiwNCiAgICAgICAgIl4iLA0KICAgICAgICAiJiIsDQogICAgICAgICI9PSIsICIhPSIsICI9PT0iLCAiIT09IiwNCiAgICAgICAgIjwiLCAiPD0iLCAiPj0iLCAiPiIsDQogICAgICAgICI8PCIsICI+PiIsICI+Pj4iLA0KICAgICAgICAiKyIsICItIiwNCiAgICAgICAgIioiLCAiLyIsICIlIiwNCiAgICAgICAgIiEiLCAifiIsICJVTkFSWV9QTFVTIiwgIlVOQVJZX01JTlVTIiwNCiAgICAgICAgIisrIiwgIi0tIiwNCiAgICAgICAgIi4iLA0KICAgICAgICAiWyIsICJdIiwNCiAgICAgICAgInsiLCAifSIsDQogICAgICAgICIoIiwgIikiLA0KDQogICAgICAgIC8vIE5vbnRlcm1pbmFsIHRyZWUgbm9kZSB0eXBlIGNvZGVzLg0KICAgICAgICAiU0NSSVBUIiwgIkJMT0NLIiwgIkxBQkVMIiwgIkZPUl9JTiIsICJDQUxMIiwgIk5FV19XSVRIX0FSR1MiLCAiSU5ERVgiLA0KICAgICAgICAiQVJSQVlfSU5JVCIsICJPQkpFQ1RfSU5JVCIsICJQUk9QRVJUWV9JTklUIiwgIkdFVFRFUiIsICJTRVRURVIiLA0KICAgICAgICAiR1JPVVAiLCAiTElTVCIsICJMRVRfQkxPQ0siLCAiQVJSQVlfQ09NUCIsICJHRU5FUkFUT1IiLCAiQ09NUF9UQUlMIiwNCg0KICAgICAgICAvLyBUZXJtaW5hbHMuDQogICAgICAgICJJREVOVElGSUVSIiwgIk5VTUJFUiIsICJTVFJJTkciLCAiUkVHRVhQIiwNCg0KICAgICAgICAvLyBLZXl3b3Jkcy4NCiAgICAgICAgImJyZWFrIiwNCiAgICAgICAgImNhc2UiLCAiY2F0Y2giLCAiY29uc3QiLCAiY29udGludWUiLA0KICAgICAgICAiZGVidWdnZXIiLCAiZGVmYXVsdCIsICJkZWxldGUiLCAiZG8iLA0KICAgICAgICAiZWxzZSIsICJleHBvcnQiLA0KICAgICAgICAiZmFsc2UiLCAiZmluYWxseSIsICJmb3IiLCAiZnVuY3Rpb24iLA0KICAgICAgICAiaWYiLCAiaW1wb3J0IiwgImluIiwgImluc3RhbmNlb2YiLA0KICAgICAgICAibGV0IiwgIm1vZHVsZSIsDQogICAgICAgICJuZXciLCAibnVsbCIsDQogICAgICAgICJyZXR1cm4iLA0KICAgICAgICAic3dpdGNoIiwNCiAgICAgICAgInRoaXMiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAidHlwZW9mIiwNCiAgICAgICAgInZhciIsICJ2b2lkIiwNCiAgICAgICAgInlpZWxkIiwNCiAgICAgICAgIndoaWxlIiwgIndpdGgiLA0KICAgIF07DQoNCiAgICB2YXIgc3RhdGVtZW50U3RhcnRUb2tlbnMgPSBbDQogICAgICAgICJicmVhayIsDQogICAgICAgICJjb25zdCIsICJjb250aW51ZSIsDQogICAgICAgICJkZWJ1Z2dlciIsICJkbyIsDQogICAgICAgICJmb3IiLA0KICAgICAgICAiaWYiLA0KICAgICAgICAicmV0dXJuIiwNCiAgICAgICAgInN3aXRjaCIsDQogICAgICAgICJ0aHJvdyIsICJ0cnkiLA0KICAgICAgICAidmFyIiwNCiAgICAgICAgInlpZWxkIiwNCiAgICAgICAgIndoaWxlIiwgIndpdGgiLA0KICAgIF07DQoNCiAgICAvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgKHNlZSBFQ01BLTI2MiA3LjIpDQogICAgdmFyIHdoaXRlc3BhY2VDaGFycyA9IFsNCiAgICAgICAgLy8gbm9ybWFsIHdoaXRlc3BhY2U6DQogICAgICAgICJcdTAwMDkiLCAiXHUwMDBCIiwgIlx1MDAwQyIsICJcdTAwMjAiLCAiXHUwMEEwIiwgIlx1RkVGRiIsIA0KDQogICAgICAgIC8vIGhpZ2gtVW5pY29kZSB3aGl0ZXNwYWNlOg0KICAgICAgICAiXHUxNjgwIiwgIlx1MTgwRSIsDQogICAgICAgICJcdTIwMDAiLCAiXHUyMDAxIiwgIlx1MjAwMiIsICJcdTIwMDMiLCAiXHUyMDA0IiwgIlx1MjAwNSIsICJcdTIwMDYiLA0KICAgICAgICAiXHUyMDA3IiwgIlx1MjAwOCIsICJcdTIwMDkiLCAiXHUyMDBBIiwNCiAgICAgICAgIlx1MjAyRiIsICJcdTIwNUYiLCAiXHUzMDAwIg0KICAgIF07DQoNCiAgICB2YXIgd2hpdGVzcGFjZSA9IHt9Ow0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2hpdGVzcGFjZUNoYXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHdoaXRlc3BhY2Vbd2hpdGVzcGFjZUNoYXJzW2ldXSA9IHRydWU7DQogICAgfQ0KDQogICAgLy8gT3BlcmF0b3IgYW5kIHB1bmN0dWF0b3IgbWFwcGluZyBmcm9tIHRva2VuIHRvIHRyZWUgbm9kZSB0eXBlIG5hbWUuDQogICAgLy8gTkI6IGJlY2F1c2UgdGhlIGxleGVyIGRvZXNuJ3QgYmFja3RyYWNrLCBhbGwgdG9rZW4gcHJlZml4ZXMgbXVzdCB0aGVtc2VsdmVzDQogICAgLy8gYmUgdmFsaWQgdG9rZW5zIChlLmcuICE9PSBpcyBhY2NlcHRhYmxlIGJlY2F1c2UgaXRzIHByZWZpeGVzIGFyZSB0aGUgdmFsaWQNCiAgICAvLyB0b2tlbnMgIT0gYW5kICEpLg0KICAgIHZhciBvcFR5cGVOYW1lcyA9IHsNCiAgICAgICAgJ1xuJzogICAiTkVXTElORSIsDQogICAgICAgICc7JzogICAgIlNFTUlDT0xPTiIsDQogICAgICAgICcsJzogICAgIkNPTU1BIiwNCiAgICAgICAgJz8nOiAgICAiSE9PSyIsDQogICAgICAgICc6JzogICAgIkNPTE9OIiwNCiAgICAgICAgJ3x8JzogICAiT1IiLA0KICAgICAgICAnJiYnOiAgICJBTkQiLA0KICAgICAgICAnfCc6ICAgICJCSVRXSVNFX09SIiwNCiAgICAgICAgJ14nOiAgICAiQklUV0lTRV9YT1IiLA0KICAgICAgICAnJic6ICAgICJCSVRXSVNFX0FORCIsDQogICAgICAgICc9PT0nOiAgIlNUUklDVF9FUSIsDQogICAgICAgICc9PSc6ICAgIkVRIiwNCiAgICAgICAgJz0nOiAgICAiQVNTSUdOIiwNCiAgICAgICAgJyE9PSc6ICAiU1RSSUNUX05FIiwNCiAgICAgICAgJyE9JzogICAiTkUiLA0KICAgICAgICAnPDwnOiAgICJMU0giLA0KICAgICAgICAnPD0nOiAgICJMRSIsDQogICAgICAgICc8JzogICAgIkxUIiwNCiAgICAgICAgJz4+Pic6ICAiVVJTSCIsDQogICAgICAgICc+Pic6ICAgIlJTSCIsDQogICAgICAgICc+PSc6ICAgIkdFIiwNCiAgICAgICAgJz4nOiAgICAiR1QiLA0KICAgICAgICAnKysnOiAgICJJTkNSRU1FTlQiLA0KICAgICAgICAnLS0nOiAgICJERUNSRU1FTlQiLA0KICAgICAgICAnKyc6ICAgICJQTFVTIiwNCiAgICAgICAgJy0nOiAgICAiTUlOVVMiLA0KICAgICAgICAnKic6ICAgICJNVUwiLA0KICAgICAgICAnLyc6ICAgICJESVYiLA0KICAgICAgICAnJSc6ICAgICJNT0QiLA0KICAgICAgICAnISc6ICAgICJOT1QiLA0KICAgICAgICAnfic6ICAgICJCSVRXSVNFX05PVCIsDQogICAgICAgICcuJzogICAgIkRPVCIsDQogICAgICAgICdbJzogICAgIkxFRlRfQlJBQ0tFVCIsDQogICAgICAgICddJzogICAgIlJJR0hUX0JSQUNLRVQiLA0KICAgICAgICAneyc6ICAgICJMRUZUX0NVUkxZIiwNCiAgICAgICAgJ30nOiAgICAiUklHSFRfQ1VSTFkiLA0KICAgICAgICAnKCc6ICAgICJMRUZUX1BBUkVOIiwNCiAgICAgICAgJyknOiAgICAiUklHSFRfUEFSRU4iDQogICAgfTsNCg0KICAgIC8vIEhhc2ggb2Yga2V5d29yZCBpZGVudGlmaWVyIHRvIHRva2VucyBpbmRleC4gIE5COiB3ZSBtdXN0IG51bGwgX19wcm90b19fIHRvDQogICAgLy8gYXZvaWQgdG9TdHJpbmcsIGV0Yy4gbmFtZXNwYWNlIHBvbGx1dGlvbi4NCiAgICB2YXIga2V5d29yZHMgPSB7X19wcm90b19fOiBudWxsfTsNCg0KICAgIC8vIERlZmluZSBjb25zdCBFTkQsIGV0Yy4sIGJhc2VkIG9uIHRoZSB0b2tlbiBuYW1lcy4gIEFsc28gbWFwIG5hbWUgdG8gaW5kZXguDQogICAgdmFyIHRva2VuSWRzID0ge307DQoNCiAgICAvLyBCdWlsZGluZyB1cCBhIHN0cmluZyB0byBiZSBldmFsJ2QgaW4gZGlmZmVyZW50IGNvbnRleHRzLg0KICAgIHZhciBjb25zdHMgPSBOYXJjaXNzdXMuaG9zdFN1cHBvcnRzRXZhbENvbnN0ID8gImNvbnN0ICIgOiAidmFyICI7DQogICAgZm9yICh2YXIgaSA9IDAsIGogPSB0b2tlbnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7DQogICAgICAgIGlmIChpID4gMCkNCiAgICAgICAgICAgIGNvbnN0cyArPSAiLCAiOw0KICAgICAgICB2YXIgdCA9IHRva2Vuc1tpXTsNCiAgICAgICAgdmFyIG5hbWU7DQogICAgICAgIGlmICgvXlthLXpdLy50ZXN0KHQpKSB7DQogICAgICAgICAgICBuYW1lID0gdC50b1VwcGVyQ2FzZSgpOw0KICAgICAgICAgICAga2V5d29yZHNbdF0gPSBpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbmFtZSA9ICgvXlxXLy50ZXN0KHQpID8gb3BUeXBlTmFtZXNbdF0gOiB0KTsNCiAgICAgICAgfQ0KICAgICAgICBjb25zdHMgKz0gbmFtZSArICIgPSAiICsgaTsNCiAgICAgICAgdG9rZW5JZHNbbmFtZV0gPSBpOw0KICAgICAgICB0b2tlbnNbdF0gPSBpOw0KICAgIH0NCiAgICBjb25zdHMgKz0gIjsiOw0KDQogICAgdmFyIGlzU3RhdGVtZW50U3RhcnRDb2RlID0ge19fcHJvdG9fXzogbnVsbH07DQogICAgZm9yIChpID0gMCwgaiA9IHN0YXRlbWVudFN0YXJ0VG9rZW5zLmxlbmd0aDsgaSA8IGo7IGkrKykNCiAgICAgICAgaXNTdGF0ZW1lbnRTdGFydENvZGVba2V5d29yZHNbc3RhdGVtZW50U3RhcnRUb2tlbnNbaV1dXSA9IHRydWU7DQoNCiAgICAvLyBNYXAgYXNzaWdubWVudCBvcGVyYXRvcnMgdG8gdGhlaXIgaW5kZXhlcyBpbiB0aGUgdG9rZW5zIGFycmF5Lg0KICAgIHZhciBhc3NpZ25PcHMgPSBbJ3wnLCAnXicsICcmJywgJzw8JywgJz4+JywgJz4+PicsICcrJywgJy0nLCAnKicsICcvJywgJyUnXTsNCg0KICAgIGZvciAoaSA9IDAsIGogPSBhc3NpZ25PcHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7DQogICAgICAgIHQgPSBhc3NpZ25PcHNbaV07DQogICAgICAgIGFzc2lnbk9wc1t0XSA9IHRva2Vuc1t0XTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWZpbmVHZXR0ZXIob2JqLCBwcm9wLCBmbiwgZG9udERlbGV0ZSwgZG9udEVudW0pIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ2V0OiBmbiwgY29uZmlndXJhYmxlOiAhZG9udERlbGV0ZSwgZW51bWVyYWJsZTogIWRvbnRFbnVtIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRlZmluZUdldHRlclNldHRlcihvYmosIHByb3AsIGdldHRlciwgc2V0dGVyLCBkb250RGVsZXRlLCBkb250RW51bSkgew0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7DQogICAgICAgICAgICBnZXQ6IGdldHRlciwNCiAgICAgICAgICAgIHNldDogc2V0dGVyLA0KICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhZG9udERlbGV0ZSwNCiAgICAgICAgICAgIGVudW1lcmFibGU6ICFkb250RW51bQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWZpbmVNZW1vR2V0dGVyKG9iaiwgcHJvcCwgZm4sIGRvbnREZWxldGUsIGRvbnRFbnVtKSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHsNCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IGZuKCk7DQogICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB2YWwsIGRvbnREZWxldGUsIHRydWUsIGRvbnRFbnVtKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwNCiAgICAgICAgICAgIGVudW1lcmFibGU6ICFkb250RW51bQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHZhbCwgZG9udERlbGV0ZSwgcmVhZE9ubHksIGRvbnRFbnVtKSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiB2YWwsIHdyaXRhYmxlOiAhcmVhZE9ubHksIGNvbmZpZ3VyYWJsZTogIWRvbnREZWxldGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICFkb250RW51bSB9KTsNCiAgICB9DQoNCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgZm4gaXMgYSBuYXRpdmUgZnVuY3Rpb24uICAoTm90ZTogU3BpZGVyTW9ua2V5IHNwZWNpZmljLikNCiAgICBmdW5jdGlvbiBpc05hdGl2ZUNvZGUoZm4pIHsNCiAgICAgICAgLy8gUmVsaWVzIG9uIHRoZSB0b1N0cmluZyBtZXRob2QgdG8gaWRlbnRpZnkgbmF0aXZlIGNvZGUuDQogICAgICAgIHJldHVybiAoKHR5cGVvZiBmbikgPT09ICJmdW5jdGlvbiIpICYmIGZuLnRvU3RyaW5nKCkubWF0Y2goL1xbbmF0aXZlIGNvZGVcXS8pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmosIG5hbWUpIHsNCiAgICAgICAgd2hpbGUgKG9iaikgew0KICAgICAgICAgICAgaWYgKCh7fSkuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIG5hbWUpKQ0KICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7DQogICAgICAgICAgICBvYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZXMob2JqKSB7DQogICAgICAgIHZhciB0YWJsZSA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICB3aGlsZSAob2JqKSB7DQogICAgICAgICAgICB2YXIgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGkgPCBuOyBpKyspDQogICAgICAgICAgICAgICAgdGFibGVbbmFtZXNbaV1dID0gdHJ1ZTsNCiAgICAgICAgICAgIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0YWJsZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0T3duUHJvcGVydGllcyhvYmopIHsNCiAgICAgICAgdmFyIG1hcCA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikpDQogICAgICAgICAgICBtYXBbbmFtZV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7DQogICAgICAgIHJldHVybiBtYXA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmxhY2tsaXN0SGFuZGxlcih0YXJnZXQsIGJsYWNrbGlzdCkgew0KICAgICAgICB2YXIgbWFzayA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICB2YXIgcmVkaXJlY3QgPSBTdHJpbmdNYXAuY3JlYXRlKGJsYWNrbGlzdCkubWFwT2JqZWN0KGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIG1hc2s7IH0pOw0KICAgICAgICByZXR1cm4gbWl4aW5IYW5kbGVyKHJlZGlyZWN0LCB0YXJnZXQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHdoaXRlbGlzdEhhbmRsZXIodGFyZ2V0LCB3aGl0ZWxpc3QpIHsNCiAgICAgICAgdmFyIGNhdGNoYWxsID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7DQogICAgICAgIHZhciByZWRpcmVjdCA9IFN0cmluZ01hcC5jcmVhdGUod2hpdGVsaXN0KS5tYXBPYmplY3QoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gdGFyZ2V0OyB9KTsNCiAgICAgICAgcmV0dXJuIG1peGluSGFuZGxlcihyZWRpcmVjdCwgY2F0Y2hhbGwpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1pcnJvckhhbmRsZXIodGFyZ2V0LCB3cml0YWJsZSkgew0KICAgICAgICB2YXIgaGFuZGxlciA9IG1ha2VQYXNzdGhydUhhbmRsZXIodGFyZ2V0KTsNCg0KICAgICAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSBoYW5kbGVyLmRlZmluZVByb3BlcnR5Ow0KICAgICAgICBoYW5kbGVyLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgZGVzYykgew0KICAgICAgICAgICAgaWYgKCFkZXNjLmVudW1lcmFibGUpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXJyb3IgcHJvcGVydHkgbXVzdCBiZSBlbnVtZXJhYmxlIik7DQogICAgICAgICAgICBpZiAoIWRlc2MuY29uZmlndXJhYmxlKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibWlycm9yIHByb3BlcnR5IG11c3QgYmUgY29uZmlndXJhYmxlIik7DQogICAgICAgICAgICBpZiAoZGVzYy53cml0YWJsZSAhPT0gd3JpdGFibGUpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXJyb3IgcHJvcGVydHkgbXVzdCAiICsgKHdyaXRhYmxlID8gIiIgOiAibm90ICIpICsgImJlIHdyaXRhYmxlIik7DQogICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShuYW1lLCBkZXNjKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBoYW5kbGVyLmZpeCA9IGZ1bmN0aW9uKCkgeyB9Ow0KICAgICAgICBoYW5kbGVyLmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGhhbmRsZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yOw0KICAgICAgICBoYW5kbGVyLmdldE93blByb3BlcnR5TmFtZXMgPSBnZXRQcm9wZXJ0eU5hbWVzLmJpbmQoaGFuZGxlciwgdGFyZ2V0KTsNCiAgICAgICAgaGFuZGxlci5rZXlzID0gaGFuZGxlci5lbnVtZXJhdGU7DQogICAgICAgIGhhbmRsZXJbImRlbGV0ZSJdID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfTsNCiAgICAgICAgaGFuZGxlci5oYXNPd24gPSBoYW5kbGVyLmhhczsNCiAgICAgICAgcmV0dXJuIGhhbmRsZXI7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBNaXhpbiBwcm94aWVzIGJyZWFrIHRoZSBzaW5nbGUtaW5oZXJpdGFuY2UgbW9kZWwgb2YgcHJvdG90eXBlcywgc28NCiAgICAgKiB0aGUgaGFuZGxlciB0cmVhdHMgYWxsIHByb3BlcnRpZXMgYXMgb3duLXByb3BlcnRpZXM6DQogICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgIFgNCiAgICAgKiAgICAgICAgICAgICAgICAgIHwNCiAgICAgKiAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rDQogICAgICogICAgIHwgICAgICAgICAgICAgICAgIE8gICAgICAgfA0KICAgICAqICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgIHwNCiAgICAgKiAgICAgfCAgTyAgICAgICAgIE8gICAgTyAgICAgICB8DQogICAgICogICAgIHwgIHwgICAgICAgICB8ICAgIHwgICAgICAgfA0KICAgICAqICAgICB8ICBPICAgIE8gICAgTyAgICBPICAgICAgIHwNCiAgICAgKiAgICAgfCAgfCAgICB8ICAgIHwgICAgfCAgICAgICB8DQogICAgICogICAgIHwgIE8gICAgTyAgICBPICAgIE8gICAgTyAgfA0KICAgICAqICAgICB8ICB8ICAgIHwgICAgfCAgICB8ICAgIHwgIHwNCiAgICAgKiAgICAgKy0oKiktLSh3KS0tKHgpLS0oeSktLSh6KS0rDQogICAgICovDQoNCiAgICBmdW5jdGlvbiBtaXhpbkhhbmRsZXIocmVkaXJlY3QsIGNhdGNoYWxsKSB7DQogICAgICAgIGZ1bmN0aW9uIHRhcmdldEZvcihuYW1lKSB7DQogICAgICAgICAgICByZXR1cm4gaGFzT3duKHJlZGlyZWN0LCBuYW1lKSA/IHJlZGlyZWN0W25hbWVdIDogY2F0Y2hhbGw7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBnZXRNdXhQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSkgew0KICAgICAgICAgICAgdmFyIGRlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0Rm9yKG5hbWUpLCBuYW1lKTsNCiAgICAgICAgICAgIGlmIChkZXNjKQ0KICAgICAgICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTsNCiAgICAgICAgICAgIHJldHVybiBkZXNjOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0TXV4UHJvcGVydHlOYW1lcygpIHsNCiAgICAgICAgICAgIHZhciBuYW1lczEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyZWRpcmVjdCkuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSBpbiByZWRpcmVjdFtuYW1lXTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdmFyIG5hbWVzMiA9IGdldFByb3BlcnR5TmFtZXMoY2F0Y2hhbGwpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICFoYXNPd24ocmVkaXJlY3QsIG5hbWUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gbmFtZXMxLmNvbmNhdChuYW1lczIpOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZW51bWVyYXRlTXV4KCkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJlZGlyZWN0KS5maWx0ZXIoZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBuYW1lIGluIHJlZGlyZWN0W25hbWVdOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBmb3IgKG5hbWUgaW4gY2F0Y2hhbGwpIHsNCiAgICAgICAgICAgICAgICBpZiAoIWhhc093bihyZWRpcmVjdCwgbmFtZSkpDQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5hbWUpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBoYXNNdXgobmFtZSkgew0KICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gdGFyZ2V0Rm9yKG5hbWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZ2V0TXV4UHJvcGVydHlEZXNjcmlwdG9yLA0KICAgICAgICAgICAgZ2V0UHJvcGVydHlEZXNjcmlwdG9yOiBnZXRNdXhQcm9wZXJ0eURlc2NyaXB0b3IsDQogICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBnZXRNdXhQcm9wZXJ0eU5hbWVzLA0KICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIGRlc2MpIHsNCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0Rm9yKG5hbWUpLCBuYW1lLCBkZXNjKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAiZGVsZXRlIjogZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRGb3IobmFtZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSB0YXJnZXRbbmFtZV07DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRklYTUU6IGhhIGhhIGhhDQogICAgICAgICAgICBmaXg6IGZ1bmN0aW9uKCkgeyB9LA0KICAgICAgICAgICAgaGFzOiBoYXNNdXgsDQogICAgICAgICAgICBoYXNPd246IGhhc011eCwNCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24ocmVjZWl2ZXIsIG5hbWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGFyZ2V0Rm9yKG5hbWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV07DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihyZWNlaXZlciwgbmFtZSwgdmFsKSB7DQogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRhcmdldEZvcihuYW1lKTsNCiAgICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWw7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZW51bWVyYXRlOiBlbnVtZXJhdGVNdXgsDQogICAgICAgICAgICBrZXlzOiBlbnVtZXJhdGVNdXgNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBtYWtlUGFzc3RocnVIYW5kbGVyKG9iaikgew0KICAgICAgICAvLyBIYW5kbGVyIGNvcGllZCBmcm9tDQogICAgICAgIC8vIGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWhhcm1vbnk6cHJveGllcyZzPXByb3h5JTIwb2JqZWN0I2V4YW1wbGVhX25vLW9wX2ZvcndhcmRpbmdfcHJveHkNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG5hbWUpOw0KDQogICAgICAgICAgICAgICAgLy8gYSB0cmFwcGluZyBwcm94eSdzIHByb3BlcnRpZXMgbXVzdCBhbHdheXMgYmUgY29uZmlndXJhYmxlDQogICAgICAgICAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGdldFByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24obmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBkZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAvLyBhIHRyYXBwaW5nIHByb3h5J3MgcHJvcGVydGllcyBtdXN0IGFsd2F5cyBiZSBjb25maWd1cmFibGUNCiAgICAgICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIGRlc2MpIHsNCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCBkZXNjKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAiZGVsZXRlIjogZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gZGVsZXRlIG9ialtuYW1lXTsgfSwNCiAgICAgICAgICAgIGZpeDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihvYmopKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0aWVzKG9iaik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyBvYmogaXMgbm90IGZyb3plbiwgdGhlIHByb3h5IHdvbid0IGFsbG93IGl0c2VsZiB0byBiZSBmaXhlZC4NCiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyB3aWxsIGNhdXNlIGEgVHlwZUVycm9yIHRvIGJlIHRocm93bg0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgaGFzOiBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBuYW1lIGluIG9iajsgfSwNCiAgICAgICAgICAgIGhhc093bjogZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSk7IH0sDQogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKHJlY2VpdmVyLCBuYW1lKSB7IHJldHVybiBvYmpbbmFtZV07IH0sDQoNCiAgICAgICAgICAgIC8vIGJhZCBiZWhhdmlvciB3aGVuIHNldCBmYWlscyBpbiBub24tc3RyaWN0IG1vZGUNCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24ocmVjZWl2ZXIsIG5hbWUsIHZhbCkgeyBvYmpbbmFtZV0gPSB2YWw7IHJldHVybiB0cnVlOyB9LA0KICAgICAgICAgICAgZW51bWVyYXRlOiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107DQogICAgICAgICAgICAgICAgZm9yIChuYW1lIGluIG9iaikgeyByZXN1bHQucHVzaChuYW1lKTsgfTsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGtleXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsgfQ0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9ICh7fSkuaGFzT3duUHJvcGVydHk7DQoNCiAgICBmdW5jdGlvbiBoYXNPd24ob2JqLCBuYW1lKSB7DQogICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gU3RyaW5nTWFwKHRhYmxlLCBzaXplKSB7DQogICAgICAgIHRoaXMudGFibGUgPSB0YWJsZSB8fCBPYmplY3QuY3JlYXRlKG51bGwsIHt9KTsNCiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwOw0KICAgIH0NCg0KICAgIFN0cmluZ01hcC5jcmVhdGUgPSBmdW5jdGlvbih0YWJsZSkgew0KICAgICAgICB2YXIgaW5pdCA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICB2YXIgc2l6ZSA9IDA7DQogICAgICAgIHZhciBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhYmxlKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBuYW1lID0gbmFtZXNbaV07DQogICAgICAgICAgICBpbml0W25hbWVdID0gdGFibGVbbmFtZV07DQogICAgICAgICAgICBzaXplKys7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdNYXAoaW5pdCwgc2l6ZSk7DQogICAgfTsNCg0KICAgIFN0cmluZ01hcC5wcm90b3R5cGUgPSB7DQogICAgICAgIGhhczogZnVuY3Rpb24oeCkgeyByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnRhYmxlLCB4KTsgfSwNCiAgICAgICAgc2V0OiBmdW5jdGlvbih4LCB2KSB7DQogICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpDQogICAgICAgICAgICAgICAgdGhpcy5zaXplKys7DQogICAgICAgICAgICB0aGlzLnRhYmxlW3hdID0gdjsNCiAgICAgICAgfSwNCiAgICAgICAgZ2V0OiBmdW5jdGlvbih4KSB7IHJldHVybiB0aGlzLnRhYmxlW3hdOyB9LA0KICAgICAgICBnZXREZWY6IGZ1bmN0aW9uKHgsIHRodW5rKSB7DQogICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNpemUrKzsNCiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlW3hdID0gdGh1bmsoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlW3hdOw0KICAgICAgICB9LA0KICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQogICAgICAgICAgICB2YXIgdGFibGUgPSB0aGlzLnRhYmxlOw0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRhYmxlKQ0KICAgICAgICAgICAgICAgIGYuY2FsbCh0aGlzLCBrZXksIHRhYmxlW2tleV0pOw0KICAgICAgICB9LA0KICAgICAgICBtYXA6IGZ1bmN0aW9uKGYpIHsNCiAgICAgICAgICAgIHZhciB0YWJsZTEgPSB0aGlzLnRhYmxlOw0KICAgICAgICAgICAgdmFyIHRhYmxlMiA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOw0KICAgICAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsKSB7DQogICAgICAgICAgICAgICAgdGFibGUyW2tleV0gPSBmLmNhbGwodGhpcywgdmFsLCBrZXkpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ01hcCh0YWJsZTIsIHRoaXMuc2l6ZSk7DQogICAgICAgIH0sDQogICAgICAgIG1hcE9iamVjdDogZnVuY3Rpb24oZikgew0KICAgICAgICAgICAgdmFyIHRhYmxlMSA9IHRoaXMudGFibGU7DQogICAgICAgICAgICB2YXIgdGFibGUyID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7DQogICAgICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWwpIHsNCiAgICAgICAgICAgICAgICB0YWJsZTJba2V5XSA9IGYuY2FsbCh0aGlzLCB2YWwsIGtleSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybiB0YWJsZTI7DQogICAgICAgIH0sDQogICAgICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcE9iamVjdChmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHZhbDsgfSk7DQogICAgICAgIH0sDQogICAgICAgIGNob29zZTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy50YWJsZSlbMF07DQogICAgICAgIH0sDQogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oeCkgew0KICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNpemUtLTsNCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YWJsZVt4XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgY29weTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgdGFibGUgPSBPYmplY3QuY3JlYXRlKG51bGwsIHt9KTsNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnRhYmxlKQ0KICAgICAgICAgICAgICAgIHRhYmxlW2tleV0gPSB0aGlzLnRhYmxlW2tleV07DQogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ01hcCh0YWJsZSwgdGhpcy5zaXplKTsNCiAgICAgICAgfSwNCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIltvYmplY3QgU3RyaW5nTWFwXSIgfQ0KICAgIH07DQoNCiAgICAvLyBhbiBvYmplY3Qta2V5IHRhYmxlIHdpdGggcG9vciBhc3ltcHRvdGljcyAocmVwbGFjZSB3aXRoIFdlYWtNYXAgd2hlbiBwb3NzaWJsZSkNCiAgICBmdW5jdGlvbiBPYmplY3RNYXAoYXJyYXkpIHsNCiAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5IHx8IFtdOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNlYXJjaE1hcChtYXAsIGtleSwgZm91bmQsIG5vdEZvdW5kKSB7DQogICAgICAgIHZhciBhID0gbWFwLmFycmF5Ow0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICB2YXIgcGFpciA9IGFbaV07DQogICAgICAgICAgICBpZiAocGFpci5rZXkgPT09IGtleSkNCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQocGFpciwgaSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG5vdEZvdW5kKCk7DQogICAgfQ0KDQogICAgT2JqZWN0TWFwLnByb3RvdHlwZSA9IHsNCiAgICAgICAgaGFzOiBmdW5jdGlvbih4KSB7DQogICAgICAgICAgICByZXR1cm4gc2VhcmNoTWFwKHRoaXMsIHgsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9LCBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlIH0pOw0KICAgICAgICB9LA0KICAgICAgICBzZXQ6IGZ1bmN0aW9uKHgsIHYpIHsNCiAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTsNCiAgICAgICAgICAgIHNlYXJjaE1hcCh0aGlzLCB4LA0KICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcGFpci52YWx1ZSA9IHYgfSwNCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgYS5wdXNoKHsga2V5OiB4LCB2YWx1ZTogdiB9KSB9KTsNCiAgICAgICAgfSwNCiAgICAgICAgZ2V0OiBmdW5jdGlvbih4KSB7DQogICAgICAgICAgICByZXR1cm4gc2VhcmNoTWFwKHRoaXMsIHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXIudmFsdWUgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0pOw0KICAgICAgICB9LA0KICAgICAgICBnZXREZWY6IGZ1bmN0aW9uKHgsIHRodW5rKSB7DQogICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7DQogICAgICAgICAgICByZXR1cm4gc2VhcmNoTWFwKHRoaXMsIHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXIudmFsdWUgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHRodW5rKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goeyBrZXk6IHgsIHZhbHVlOiB2IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICB9LA0KICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQogICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIHBhaXIgPSBhW2ldOw0KICAgICAgICAgICAgICAgIGYuY2FsbCh0aGlzLCBwYWlyLmtleSwgcGFpci52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGNob29zZTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVswXS5rZXk7DQogICAgICAgIH0sDQogICAgICAgIGdldCBzaXplKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoOw0KICAgICAgICB9LA0KICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTsNCiAgICAgICAgICAgIHNlYXJjaE1hcCh0aGlzLCB4LA0KICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIsIGkpIHsgYS5zcGxpY2UoaSwgMSkgfSwNCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgfSk7DQogICAgICAgIH0sDQogICAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXAodGhpcy5hcnJheS5tYXAoZnVuY3Rpb24ocGFpcikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7IGtleTogcGFpci5rZXksIHZhbHVlOiBwYWlyLnZhbHVlIH0NCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSwNCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5hcnJheSA9IFtdOw0KICAgICAgICB9LA0KICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7IHJldHVybiAiW29iamVjdCBPYmplY3RNYXBdIiB9DQogICAgfTsNCg0KICAgIC8vIG5vbi1kZXN0cnVjdGl2ZSBzdGFjaw0KICAgIGZ1bmN0aW9uIFN0YWNrKGVsdHMpIHsNCiAgICAgICAgdGhpcy5lbHRzID0gZWx0cyB8fCBudWxsOw0KICAgIH0NCg0KICAgIFN0YWNrLnByb3RvdHlwZSA9IHsNCiAgICAgICAgcHVzaDogZnVuY3Rpb24oeCkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGFjayh7IHRvcDogeCwgcmVzdDogdGhpcy5lbHRzIH0pOw0KICAgICAgICB9LA0KICAgICAgICB0b3A6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLmVsdHMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJlbXB0eSBzdGFjayIpOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWx0cy50b3A7DQogICAgICAgIH0sDQogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wID09PSBudWxsOw0KICAgICAgICB9LA0KICAgICAgICBmaW5kOiBmdW5jdGlvbih0ZXN0KSB7DQogICAgICAgICAgICBmb3IgKHZhciBlbHRzID0gdGhpcy5lbHRzOyBlbHRzOyBlbHRzID0gZWx0cy5yZXN0KSB7DQogICAgICAgICAgICAgICAgaWYgKHRlc3QoZWx0cy50b3ApKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0cy50b3A7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfSwNCiAgICAgICAgaGFzOiBmdW5jdGlvbih4KSB7DQogICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmZpbmQoZnVuY3Rpb24oZWx0KSB7IHJldHVybiBlbHQgPT09IHggfSkpOw0KICAgICAgICB9LA0KICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQogICAgICAgICAgICBmb3IgKHZhciBlbHRzID0gdGhpcy5lbHRzOyBlbHRzOyBlbHRzID0gZWx0cy5yZXN0KSB7DQogICAgICAgICAgICAgICAgZihlbHRzLnRvcCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgbW9kdWxlLmV4cG9ydHMgPSB7DQogICAgICAgIHRva2VuczogdG9rZW5zLA0KICAgICAgICB3aGl0ZXNwYWNlOiB3aGl0ZXNwYWNlLA0KICAgICAgICBvcFR5cGVOYW1lczogb3BUeXBlTmFtZXMsDQogICAgICAgIGtleXdvcmRzOiBrZXl3b3JkcywNCiAgICAgICAgaXNTdGF0ZW1lbnRTdGFydENvZGU6IGlzU3RhdGVtZW50U3RhcnRDb2RlLA0KICAgICAgICB0b2tlbklkczogdG9rZW5JZHMsDQogICAgICAgIGNvbnN0czogY29uc3RzLA0KICAgICAgICBhc3NpZ25PcHM6IGFzc2lnbk9wcywNCiAgICAgICAgZGVmaW5lR2V0dGVyOiBkZWZpbmVHZXR0ZXIsDQogICAgICAgIGRlZmluZUdldHRlclNldHRlcjogZGVmaW5lR2V0dGVyU2V0dGVyLA0KICAgICAgICBkZWZpbmVNZW1vR2V0dGVyOiBkZWZpbmVNZW1vR2V0dGVyLA0KICAgICAgICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHksDQogICAgICAgIGlzTmF0aXZlQ29kZTogaXNOYXRpdmVDb2RlLA0KICAgICAgICBtaXJyb3JIYW5kbGVyOiBtaXJyb3JIYW5kbGVyLA0KICAgICAgICBtaXhpbkhhbmRsZXI6IG1peGluSGFuZGxlciwNCiAgICAgICAgd2hpdGVsaXN0SGFuZGxlcjogd2hpdGVsaXN0SGFuZGxlciwNCiAgICAgICAgYmxhY2tsaXN0SGFuZGxlcjogYmxhY2tsaXN0SGFuZGxlciwNCiAgICAgICAgbWFrZVBhc3N0aHJ1SGFuZGxlcjogbWFrZVBhc3N0aHJ1SGFuZGxlciwNCiAgICAgICAgU3RyaW5nTWFwOiBTdHJpbmdNYXAsDQogICAgICAgIE9iamVjdE1hcDogT2JqZWN0TWFwLA0KICAgICAgICBTdGFjazogU3RhY2sNCiAgICB9Ow0KfSk7]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-json.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOw0KDQp2YXIgY29uc29sZSA9IHsNCiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgew0KICAgICAgICBwb3N0TWVzc2FnZSh7dHlwZTogImxvZyIsIGRhdGE6IG1zZ30pOw0KICAgIH0NCn07DQp2YXIgd2luZG93ID0gew0KICAgIGNvbnNvbGU6IGNvbnNvbGUNCn07DQoNCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgew0KICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMNCiAgICBpZiAobW9kdWxlTmFtZS5pbmRleE9mKCIhIikgIT09IC0xKSB7DQogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7DQogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7DQogICAgfQ0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcw0KICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsNCiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7DQogICAgICAgIHZhciBtb2R1bGVOYW1lID0gYmFzZSArICIvIiArIG1vZHVsZU5hbWU7DQogICAgICAgIA0KICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgew0KICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gbW9kdWxlTmFtZTsNCiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHJldHVybiBtb2R1bGVOYW1lOw0KfTsNCg0KdmFyIHJlcXVpcmUgPSBmdW5jdGlvbihwYXJlbnRJZCwgaWQpIHsNCiAgICB2YXIgaWQgPSBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGlkKTsNCiAgICANCiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5tb2R1bGVzW2lkXTsNCiAgICBpZiAobW9kdWxlKSB7DQogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7DQogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vZHVsZS5mYWN0b3J5KCkuZXhwb3J0czsNCiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOw0KICAgIH0NCiAgICANCiAgICB2YXIgY2h1bmtzID0gaWQuc3BsaXQoIi8iKTsNCiAgICBjaHVua3NbMF0gPSByZXF1aXJlLnRsbnNbY2h1bmtzWzBdXSB8fCBjaHVua3NbMF07DQogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7DQogICAgDQogICAgcmVxdWlyZS5pZCA9IGlkOw0KICAgIGltcG9ydFNjcmlwdHMocGF0aCk7DQogICAgcmV0dXJuIHJlcXVpcmUocGFyZW50SWQsIGlkKTsgICAgDQp9Ow0KDQpyZXF1aXJlLm1vZHVsZXMgPSB7fTsNCnJlcXVpcmUudGxucyA9IHt9Ow0KDQp2YXIgZGVmaW5lID0gZnVuY3Rpb24oaWQsIGRlcHMsIGZhY3RvcnkpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7DQogICAgICAgIGZhY3RvcnkgPSBkZXBzOw0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICAgIGZhY3RvcnkgPSBpZDsNCiAgICAgICAgaWQgPSByZXF1aXJlLmlkOw0KICAgIH0NCg0KICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSANCiAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7DQogICAgICAgIHJldHVybiByZXF1aXJlKGlkLCBkZXBzLCBmYWN0b3J5KTsNCiAgICB9Ow0KDQogICAgcmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsNCiAgICAgICAgZmFjdG9yeTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgbW9kdWxlID0gew0KICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7DQogICAgICAgICAgICBpZiAocmV0dXJuRXhwb3J0cykNCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7DQogICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCmZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsNCiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7DQp9DQoNCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7DQoNCiAgICB2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShudWxsLCAiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOw0KICAgIA0KICAgIHZhciBTZW5kZXIgPSBmdW5jdGlvbigpIHt9Ow0KICAgIA0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgDQogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrSWQpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiY2FsbCIsDQogICAgICAgICAgICAgICAgaWQ6IGNhbGxiYWNrSWQsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgDQogICAgICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHsNCiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLA0KICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7DQogICAgDQogICAgcmV0dXJuIG5ldyBTZW5kZXIoKTsNCn0NCg0KdmFyIG1haW47DQp2YXIgc2VuZGVyOw0KDQpvbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgdmFyIG1zZyA9IGUuZGF0YTsNCiAgICBpZiAobXNnLmNvbW1hbmQpIHsNCiAgICAgICAgbWFpblttc2cuY29tbWFuZF0uYXBwbHkobWFpbiwgbXNnLmFyZ3MpOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2cuaW5pdCkgeyAgICAgICAgDQogICAgICAgIGluaXRCYXNlVXJscyhtc2cudGxucyk7DQogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsNCiAgICAgICAgc2VuZGVyID0gaW5pdFNlbmRlcigpOw0KICAgICAgICB2YXIgY2xhenogPSByZXF1aXJlKG51bGwsIG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOw0KICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7DQogICAgfSANCiAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgc2VuZGVyKSB7DQogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsNCiAgICB9DQp9Ow0KLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6DQovLyAtLSBrcmlza293YWwgS3JpcyBLb3dhbCBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNSVQgTGljZW5zZQ0KLy8gLS0gdGxyb2JpbnNvbiBUb20gUm9iaW5zb24gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTUlUIExpY2Vuc2UgKE5hcndoYWwgUHJvamVjdCkNCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkDQovLyAtLSBmc2NoYWVmZXIgRmxvcmlhbiBTY2jDpGZlciBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIElyYWtsaSBHb3phbGlzaHZpbGkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KcmVxdWlyZSgiLi9yZWdleHAiKTsNCnJlcXVpcmUoIi4vZXM1LXNoaW0iKTsNCg0KfSk7LyoqDQogKiAgQmFzZWQgb24gY29kZSBmcm9tOg0KICoNCiAqIFhSZWdFeHAgMS41LjANCiAqIChjKSAyMDA3LTIwMTAgU3RldmVuIExldml0aGFuDQogKiBNSVQgTGljZW5zZQ0KICogPGh0dHA6Ly94cmVnZXhwLmNvbT4NCiAqIFByb3ZpZGVzIGFuIGF1Z21lbnRlZCwgZXh0ZW5zaWJsZSwgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICogaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc3ludGF4LCBmbGFncywgYW5kIG1ldGhvZHMNCiAqLw0KIA0KZGVmaW5lKCdhY2UvbGliL3JlZ2V4cCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB2YXIgcmVhbCA9IHsNCiAgICAgICAgICAgIGV4ZWM6IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywNCiAgICAgICAgICAgIHRlc3Q6IFJlZ0V4cC5wcm90b3R5cGUudGVzdCwNCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLA0KICAgICAgICAgICAgcmVwbGFjZTogU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLA0KICAgICAgICAgICAgc3BsaXQ6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQNCiAgICAgICAgfSwNCiAgICAgICAgY29tcGxpYW50RXhlY05wY2cgPSByZWFsLmV4ZWMuY2FsbCgvKCk/Py8sICIiKVsxXSA9PT0gdW5kZWZpbmVkLCAvLyBjaGVjayBgZXhlY2AgaGFuZGxpbmcgb2Ygbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzDQogICAgICAgIGNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB4ID0gL14vZzsNCiAgICAgICAgICAgIHJlYWwudGVzdC5jYWxsKHgsICIiKTsNCiAgICAgICAgICAgIHJldHVybiAheC5sYXN0SW5kZXg7DQogICAgICAgIH0oKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcw0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bw0KICAgIC8vIGNyb3NzLWJyb3dzZXIgaXNzdWVzIHBlciBFUzM6DQogICAgLy8gLSBDYXB0dXJlZCB2YWx1ZXMgZm9yIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYHVuZGVmaW5lZGAsDQogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLg0KICAgIC8vIC0gYGxhc3RJbmRleGAgc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciB6ZXJvLWxlbmd0aCBtYXRjaGVzLg0KICAgIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgICAgICBuYW1lLCByMjsNCiAgICAgICAgaWYgKCB0eXBlb2Yoc3RyKSA9PSAnc3RyaW5nJyAmJiBtYXRjaCkgew0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yDQogICAgICAgICAgICAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgew0KICAgICAgICAgICAgICAgIHIyID0gUmVnRXhwKHRoaXMuc291cmNlLCByZWFsLnJlcGxhY2UuY2FsbChnZXROYXRpdmVGbGFncyh0aGlzKSwgImciLCAiIikpOw0KICAgICAgICAgICAgICAgIC8vIFVzaW5nIGBzdHIuc2xpY2UobWF0Y2guaW5kZXgpYCByYXRoZXIgdGhhbiBgbWF0Y2hbMF1gIGluIGNhc2UgbG9va2FoZWFkIGFsbG93ZWQNCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaA0KICAgICAgICAgICAgICAgIHJlYWwucmVwbGFjZS5jYWxsKHN0ci5zbGljZShtYXRjaC5pbmRleCksIHIyLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW2ldID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBBdHRhY2ggbmFtZWQgY2FwdHVyZSBwcm9wZXJ0aWVzDQogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWF0Y2gubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2kgLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW25hbWVdID0gbWF0Y2hbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHRoYXQgaW5jcmVtZW50IGBsYXN0SW5kZXhgIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMNCiAgICAgICAgICAgIGlmICghY29tcGxpYW50TGFzdEluZGV4SW5jcmVtZW50ICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG1hdGNoOw0KICAgIH07DQoNCiAgICAvLyBEb24ndCBvdmVycmlkZSBgdGVzdGAgaWYgaXQgd29uJ3QgY2hhbmdlIGFueXRoaW5nDQogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsNCiAgICAgICAgLy8gRml4IGJyb3dzZXIgYnVnIGluIG5hdGl2ZSBtZXRob2QNCiAgICAgICAgUmVnRXhwLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHN0cikgew0KICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuDQogICAgICAgICAgICAvLyBgZXhlY2Agd291bGQgdGFrZSBjYXJlIG9mIHRoZSBgbGFzdEluZGV4YCBmaXgNCiAgICAgICAgICAgIHZhciBtYXRjaCA9IHJlYWwuZXhlYy5jYWxsKHRoaXMsIHN0cik7DQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcw0KICAgICAgICAgICAgaWYgKG1hdGNoICYmIHRoaXMuZ2xvYmFsICYmICFtYXRjaFswXS5sZW5ndGggJiYgKHRoaXMubGFzdEluZGV4ID4gbWF0Y2guaW5kZXgpKQ0KICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07DQogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIC8vICBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgZnVuY3Rpb24gZ2V0TmF0aXZlRmxhZ3MgKHJlZ2V4KSB7DQogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguaWdub3JlQ2FzZSA/ICJpIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXgubXVsdGlsaW5lICA/ICJtIiA6ICIiKSArDQogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMw0KICAgICAgICAgICAgICAgKHJlZ2V4LnN0aWNreSAgICAgPyAieSIgOiAiIik7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGluZGV4T2YgKGFycmF5LCBpdGVtLCBmcm9tKSB7DQogICAgICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgLy8gVXNlIHRoZSBuYXRpdmUgYXJyYXkgbWV0aG9kIGlmIGF2YWlsYWJsZQ0KICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7DQogICAgICAgIGZvciAodmFyIGkgPSBmcm9tIHx8IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKQ0KICAgICAgICAgICAgICAgIHJldHVybiBpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9Ow0KDQp9KTsNCi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYg0KLy8gLS0ga3Jpc2tvd2FsIEtyaXMgS293YWwgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpDQovLyAtLSBkYW50bWFuIERhbmllbCBGcmllc2VuIENvcHlyaWdodCAoQykgMjAxMCBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQ0KLy8gLS0gZnNjaGFlZmVyIEZsb3JpYW4gU2Now6RmZXIgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UNCi8vIC0tIGtpdGNhbWJyaWRnZSBLaXQgQ2FtYnJpZGdlIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0ga29zc25vY29ycCBTYXNoYSBLb3NzIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEENCi8vIC0tIGtpbGxkcmVhbSBRdWlsZHJlZW4gTW90dGEgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbmNlDQovLyAtLSBtaWNoYWVsZmljYXJyYSBNaWNoYWVsIEZpY2FycmEgQ29weXJpZ2h0IChDKSAyMDExIDMtY2xhdXNlIEJTRCBMaWNlbnNlDQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIGJicXNyYyBCcmVuZGFuIE1vbGxveSAoQykgMjAxMSBDcmVhdGl2ZSBDb21tb25zIFplcm8gKHB1YmxpYyBkb21haW4pDQovLyAtLSBpd3lnIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UNCi8vIC0tIHhhdmllcm0wMiBNb250aWxsZXQgWGF2aWVyIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBSYXlub3MgUmF5bm9zIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlDQovLyAtLSByd2xkcm4gUmljayBXYWxkcm9uIENvcHlyaWdodCAoQykgMjAxMSBNSVQgTGljZW5zZQ0KLy8gLS0gbGV4ZXIgQWxleGV5IFpha2hhcm92IFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBDQoNCi8qIQ0KICAgIENvcHlyaWdodCAoYykgMjAwOSwgMjgwIE5vcnRoIEluYy4gaHR0cDovLzI4MG5vcnRoLmNvbS8NCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQNCiovDQoNCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoNCi8qKg0KICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlDQogKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLg0KICoNCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQ0KICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGYNCiAqDQogKiBAbW9kdWxlDQogKi8NCg0KLyp3aGF0c3VwZG9jKi8NCg0KLy8NCi8vIEZ1bmN0aW9uDQovLyA9PT09PT09PQ0KLy8NCg0KLy8gRVMtNSAxNS4zLjQuNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjUNCg0KaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkgew0KICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMQ0KICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLg0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpczsNCiAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uDQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZQ0KICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLg0KICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciAiQSIgaWYgdXNlZA0KICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsDQogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4NCiAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZA0KICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLg0KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbg0KICAgICAgICAvLyAgIDE1LjMuNC41LjEuDQogICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLg0KICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW4NCiAgICAgICAgLy8gICAxNS4zLjQuNS4zLg0KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7DQoNCiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsNCiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0NCiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwNCiAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQ0KICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXQ0KICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuDQogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQ0KICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQogICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlDQogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZQ0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIA0KICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307DQogICAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlOw0KICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICBzZWxmLA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMSBbW0NhbGxdXQ0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwNCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhDQogICAgICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46DQogICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5Lg0KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyAzLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dIGludGVybmFsDQogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4NCiAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSANCiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lIA0KICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4NCiAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QgDQogICAgICAgICAgICAgICAgLy8gICBvZiB0YXJnZXQgcHJvdmlkaW5nIGJvdW5kVGhpcyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgDQogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLg0KDQogICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncykNCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KA0KICAgICAgICAgICAgICAgICAgICB0aGF0LA0KICAgICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH07DQogICAgICAgIC8vIFhYWCBib3VuZC5sZW5ndGggaXMgbmV2ZXIgd3JpdGFibGUsIHNvIGRvbid0IGV2ZW4gdHJ5DQogICAgICAgIC8vDQogICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyAiRnVuY3Rpb24iLCB0aGVuDQogICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuDQogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgDQogICAgICAgIC8vICAgICAgIGxhcmdlci4NCiAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC4NCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMNCiAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuDQoNCiAgICAgICAgLy8gVE9ETw0KICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuDQogICAgICAgIA0KICAgICAgICAvLyBUT0RPDQogICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS4NCiAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoIA0KICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOg0KICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmQgDQogICAgICAgIC8vICAgZmFsc2UuDQogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCANCiAgICAgICAgLy8gICBhcmd1bWVudHMgImFyZ3VtZW50cyIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgDQogICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sDQogICAgICAgIC8vICAgYW5kIGZhbHNlLg0KDQogICAgICAgIC8vIFRPRE8NCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IA0KICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZA0KICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy4NCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4NCg0KICAgICAgICAvLyAyMi4gUmV0dXJuIEYuDQogICAgICAgIHJldHVybiBib3VuZDsNCiAgICB9Ow0KfQ0KDQovLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZQ0KLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4NCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UNCi8vIHVzIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy4NCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBwcm90b3R5cGVPZk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGU7DQp2YXIgc2xpY2UgPSBwcm90b3R5cGVPZkFycmF5LnNsaWNlOw0KdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsNCnZhciBvd25zID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Lmhhc093blByb3BlcnR5KTsNCg0KLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuDQp2YXIgZGVmaW5lR2V0dGVyOw0KdmFyIGRlZmluZVNldHRlcjsNCnZhciBsb29rdXBHZXR0ZXI7DQp2YXIgbG9va3VwU2V0dGVyOw0KdmFyIHN1cHBvcnRzQWNjZXNzb3JzOw0KaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7DQogICAgZGVmaW5lR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18pOw0KICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTsNCiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7DQogICAgbG9va3VwU2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwU2V0dGVyX18pOw0KfQ0KDQovLw0KLy8gQXJyYXkNCi8vID09PT09DQovLw0KDQovLyBFUzUgMTUuNC4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5DQppZiAoIUFycmF5LmlzQXJyYXkpIHsNCiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShvYmopIHsNCiAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG9iaikgPT0gIltvYmplY3QgQXJyYXldIjsNCiAgICB9Ow0KfQ0KDQovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMNCi8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlDQovLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmUNCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyDQovLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZA0KLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgImZ1bmN0aW9uIi4gIE9ubHkgaW4NCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzDQovLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZQ0KLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZQ0KLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXINCi8vIGV4cHJlc3Npb25zLg0KDQovLyBFUzUgMTUuNC40LjE4DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTgNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2gNCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZnVuIC8qLCB0aGlzcCovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwNCiAgICAgICAgICAgIGkgPSAwLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7DQogICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOg0KICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQNCiAgICAgICAgICAgICAgICBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjE5DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkNCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwDQppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsNCiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDAsDQogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcg0KaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE2DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiBldmVyeShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS40LjQuMTcNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNw0KLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUuc29tZSkgew0KICAgIEFycmF5LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gc29tZShmdW4gLyosIHRoaXNwICovKSB7DQogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksDQogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwNCiAgICAgICAgICAgIHRoaXNwID0gYXJndW1lbnRzWzFdOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4yMQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxDQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZQ0KaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24NCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQ0KICAgICAgICBpZiAoIWxlbmd0aCAmJiBhcmd1bWVudHMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KDQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuNC40LjIyDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjINCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQNCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7DQogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gcmVkdWNlUmlnaHQoZnVuIC8qLCBpbml0aWFsKi8pIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwNCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOw0KDQogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uDQogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCg0KICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXkNCiAgICAgICAgaWYgKCFsZW5ndGggJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UNCg0KICAgICAgICB2YXIgcmVzdWx0LCBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuDQogICAgICAgICAgICAgICAgaWYgKC0taSA8IDApDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIGlmIChpIGluIHRoaXMpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuLmNhbGwodm9pZCAwLCByZXN1bHQsIHNlbGZbaV0sIGksIHNlbGYpOw0KICAgICAgICB9IHdoaWxlIChpLS0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mDQppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7DQogICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHNvdWdodCAvKiwgZnJvbUluZGV4ICovICkgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpDQogICAgICAgICAgICBpID0gdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7DQoNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBNYXRoLm1heCgwLCBsZW5ndGggKyBpKTsNCiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjQuNC4xNQ0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1DQovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZg0KaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIHsNCiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgew0KICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLA0KICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7DQoNCiAgICAgICAgaWYgKCFsZW5ndGgpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTsNCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMNCiAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBNYXRoLmFicyhpKTsNCiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfTsNCn0NCg0KLy8NCi8vIE9iamVjdA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuMi4zLjINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4yDQppZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikgew0KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzINCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvb2JqZWN0Z2V0cHJvdG90eXBlb2YvDQogICAgLy8gcmVjb21tZW5kZWQgYnkgZnNjaGFlZmVyIG9uIGdpdGh1Yg0KICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcHJvdG9fXyB8fCAoDQogICAgICAgICAgICBvYmplY3QuY29uc3RydWN0b3IgPw0KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6DQogICAgICAgICAgICBwcm90b3R5cGVPZk9iamVjdA0KICAgICAgICApOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMw0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjMNCmlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikgew0KICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICJub24tb2JqZWN0OiAiOw0KICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUICsgb2JqZWN0KTsNCiAgICAgICAgLy8gSWYgb2JqZWN0IGRvZXMgbm90IG93bnMgcHJvcGVydHkgcmV0dXJuIHVuZGVmaW5lZCBpbW1lZGlhdGVseS4NCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsNCg0KICAgICAgICAvLyBJZiBvYmplY3QgaGFzIGEgcHJvcGVydHkgdGhlbiBpdCdzIGZvciBzdXJlIGJvdGggYGVudW1lcmFibGVgIGFuZA0KICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4NCiAgICAgICAgZGVzY3JpcHRvciA9ICB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9Ow0KDQogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGENCiAgICAgICAgLy8gZ2V0dGVyIG9yIHNldHRlci4NCiAgICAgICAgaWYgKHN1cHBvcnRzQWNjZXNzb3JzKSB7DQogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuDQogICAgICAgICAgICAvLyBpZiBvYmplY3QgaGFzIG93biBub24gZ2V0dGVyIHByb3BlcnR5IGFsb25nIHdpdGggYSBzYW1lIG5hbWVkDQogICAgICAgICAgICAvLyBpbmhlcml0ZWQgZ2V0dGVyLiBUbyBhdm9pZCBtaXNiZWhhdmlvciB3ZSB0ZW1wb3JhcnkgcmVtb3ZlDQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQ0KICAgICAgICAgICAgLy8gaWYgaXQncyBvd25lZCBieSBhbiBvYmplY3QuDQogICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsNCiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsNCg0KICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTsNCiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7DQoNCiAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLg0KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCg0KICAgICAgICAgICAgaWYgKGdldHRlciB8fCBzZXR0ZXIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsNCiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSBkZXNjcmlwdG9yLnNldCA9IHNldHRlcjsNCg0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQ0KICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZyBgdmFsdWVgIHRvIHRoZSBkZXNjcmlwdG9yLg0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzDQogICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuDQogICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmplY3RbcHJvcGVydHldOw0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy40DQppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7DQogICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgew0KICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjUNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy41DQppZiAoIU9iamVjdC5jcmVhdGUpIHsNCiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgew0KICAgICAgICB2YXIgb2JqZWN0Ow0KICAgICAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7DQogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPSAib2JqZWN0IikNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7DQogICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9Ow0KICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOw0KICAgICAgICAgICAgLy8gSUUgaGFzIG5vIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgDQogICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGwNCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoDQogICAgICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgDQogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB2b2lkIDApDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpOw0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuNg0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjYNCg0KLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGUNCi8vIERlc2lnbmVkIGJ5IGhheCA8aGF4LmdpdGh1Yi5jb20+DQovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81DQovLyBJRTggUmVmZXJlbmNlOg0KLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4DQovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgNCi8vIFdlYktpdCBCdWdzOg0KLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyMw0KDQpmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkgew0KICAgIHRyeSB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsNCiAgICAgICAgcmV0dXJuICJzZW50aW5lbCIgaW4gb2JqZWN0Ow0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgew0KICAgICAgICAvLyByZXR1cm5zIGZhbHN5DQogICAgfQ0KfQ0KDQovLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSwNCi8vIHNoaW0gcGFydGlhbGx5Lg0KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgew0KICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTsNCiAgICB2YXIgZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiIHx8DQogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIGlmICghZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IHx8ICFkZWZpbmVQcm9wZXJ0eVdvcmtzT25Eb20pIHsNCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5RmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7DQogICAgfQ0KfQ0KDQppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAiUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICI7DQogICAgdmFyIEVSUl9OT05fT0JKRUNUX1RBUkdFVCA9ICJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICINCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiOw0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUl9OT05fT0JKRUNUX1RBUkdFVCArIG9iamVjdCk7DQogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpOw0KDQogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5DQogICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy4NCiAgICAgICAgaWYgKGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7DQogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIGl0J3MgYSBkYXRhIHByb3BlcnR5Lg0KICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAidmFsdWUiKSkgew0KICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiDQogICAgICAgICAgICAvLyBhcmUgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOg0KICAgICAgICAgICAgaWYgKCAvLyBjYW4ndCBpbXBsZW1lbnQgdGhlc2UgZmVhdHVyZXM7IGFsbG93IGZhbHNlIGJ1dCBub3QgdHJ1ZQ0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAid3JpdGFibGUiKSA/IGRlc2NyaXB0b3Iud3JpdGFibGUgOiB0cnVlKSB8fA0KICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwNCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgImNvbmZpZ3VyYWJsZSIpID8gZGVzY3JpcHRvci5jb25maWd1cmFibGUgOiB0cnVlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKA0KICAgICAgICAgICAgICAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3QgIiArDQogICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcNCiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCB3ZSBjYW4gc2FmZWx5IG92ZXJyaWRlIGBfX3Byb3RvX19gIHdoaWxlIGRlZmluaW5nDQogICAgICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoaXQgYW4gaW5oZXJpdGVkDQogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuDQogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187DQogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZU9mT2JqZWN0Ow0KICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUNCiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIG9uIG9iamVjdCBpdHNlbGYuDQogICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7DQogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBvcmlnaW5hbCBgX19wcm90b19fYCBiYWNrIG5vdy4NCiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMpDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfQUNDRVNTT1JTX05PVF9TVVBQT1JURUQpOw0KICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQ0KICAgICAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgImdldCIpKQ0KICAgICAgICAgICAgICAgIGRlZmluZUdldHRlcihvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yLmdldCk7DQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpDQogICAgICAgICAgICAgICAgZGVmaW5lU2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3Iuc2V0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy43DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNw0KaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydGllcykgew0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHsNCiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgew0KICAgICAgICAgICAgaWYgKG93bnMocHJvcGVydGllcywgcHJvcGVydHkpKQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBwcm9wZXJ0aWVzW3Byb3BlcnR5XSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iamVjdDsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjgNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44DQppZiAoIU9iamVjdC5zZWFsKSB7DQogICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkgew0KICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0DQogICAgICAgIC8vIGFsbG93cyAic2VjdXJhYmxlIiBjb2RlIHRvICJncmFjZWZ1bGx5IiBkZWdyYWRlIHRvIHdvcmtpbmcNCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuDQogICAgICAgIHJldHVybiBvYmplY3Q7DQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjIuMy45DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOQ0KaWYgKCFPYmplY3QuZnJlZXplKSB7DQogICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQNCnRyeSB7DQogICAgT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoKSB7fSk7DQp9IGNhdGNoIChleGNlcHRpb24pIHsNCiAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIGZyZWV6ZShmcmVlemVPYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHsNCiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSkoT2JqZWN0LmZyZWV6ZSk7DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTANCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMA0KaWYgKCFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHsNCiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsNCiAgICAgICAgLy8gdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCBicmVha3MgZmVhdHVyZS1kZXRlY3Rpb24sIGJ1dA0KICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nDQogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLg0KICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTENCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQ0KaWYgKCFPYmplY3QuaXNTZWFsZWQpIHsNCiAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTINCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMg0KaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsNCiAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS4yLjMuMTMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMw0KaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKSB7DQogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsNCiAgICAgICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0IHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKE9iamVjdChvYmplY3QpID09PSBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gMi4gUmV0dXJuIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBPLg0KICAgICAgICB2YXIgbmFtZSA9ICcnOw0KICAgICAgICB3aGlsZSAob3ducyhvYmplY3QsIG5hbWUpKSB7DQogICAgICAgICAgICBuYW1lICs9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICBvYmplY3RbbmFtZV0gPSB0cnVlOw0KICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvd25zKG9iamVjdCwgbmFtZSk7DQogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07DQogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCiAgICB9Ow0KfQ0KDQovLyBFUzUgMTUuMi4zLjE0DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQNCmlmICghT2JqZWN0LmtleXMpIHsNCiAgICAvLyBodHRwOi8vd2hhdHRoZWhlYWRzYWlkLmNvbS8yMDEwLzEwL2Etc2FmZXItb2JqZWN0LWtleXMtY29tcGF0aWJpbGl0eS1pbXBsZW1lbnRhdGlvbg0KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsDQogICAgICAgIGRvbnRFbnVtcyA9IFsNCiAgICAgICAgICAgICJ0b1N0cmluZyIsDQogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLA0KICAgICAgICAgICAgInZhbHVlT2YiLA0KICAgICAgICAgICAgImhhc093blByb3BlcnR5IiwNCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwNCiAgICAgICAgICAgICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsDQogICAgICAgICAgICAiY29uc3RydWN0b3IiDQogICAgICAgIF0sDQogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQ0KICAgICAgICBoYXNEb250RW51bUJ1ZyA9IGZhbHNlOw0KDQogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgew0KDQogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsNCg0KICAgICAgICB2YXIga2V5cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgew0KICAgICAgICAgICAgaWYgKG93bnMob2JqZWN0LCBuYW1lKSkgew0KICAgICAgICAgICAgICAgIGtleXMucHVzaChuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChoYXNEb250RW51bUJ1Zykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZG9udEVudW1zTGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBkb250RW51bSA9IGRvbnRFbnVtc1tpXTsNCiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgew0KICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZG9udEVudW0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBrZXlzOw0KICAgIH07DQoNCn0NCg0KLy8NCi8vIERhdGUNCi8vID09PT0NCi8vDQoNCi8vIEVTNSAxNS45LjUuNDMNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40Mw0KLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSANCi8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lIA0KLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLiANCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIA0KLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4NCmlmICghRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgfHwgKG5ldyBEYXRlKC02MjE5ODc1NTIwMDAwMCkudG9JU09TdHJpbmcoKS5pbmRleE9mKCctMDAwMDAxJykgPT09IC0xKSkgew0KICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7DQogICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgdmFsdWUsIHllYXI7DQogICAgICAgIGlmICghaXNGaW5pdGUodGhpcykpDQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsNCg0KICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS4NCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLA0KICAgICAgICAgICAgdGhpcy5nZXRVVENIb3VycygpLCB0aGlzLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5nZXRVVENTZWNvbmRzKCldOw0KICAgICAgICB5ZWFyID0gdGhpcy5nZXRVVENGdWxsWWVhcigpOw0KICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsNCg0KICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOw0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsNCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W2xlbmd0aF07DQogICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLg0KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApDQogICAgICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSAiMCIgKyB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLg0KICAgICAgICByZXR1cm4geWVhciArICItIiArIHJlc3VsdC5zbGljZSgwLCAyKS5qb2luKCItIikgKyAiVCIgKyByZXN1bHQuc2xpY2UoMikuam9pbigiOiIpICsgIi4iICsNCiAgICAgICAgICAgICgiMDAwIiArIHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSArICJaIjsNCiAgICB9DQp9DQoNCi8vIEVTNSAxNS45LjQuNA0KLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjQNCmlmICghRGF0ZS5ub3cpIHsNCiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIH07DQp9DQoNCi8vIEVTNSAxNS45LjUuNDQNCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NA0KLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnkgDQovLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuDQppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgew0KICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsNCiAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmcgDQogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoNCg0KICAgICAgICAvLyAxLiAgTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0LCBnaXZpbmcgaXQgdGhlIHRoaXMNCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50Lg0KICAgICAgICAvLyAyLiBMZXQgdHYgYmUgVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLg0KICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuDQogICAgICAgIC8vIFhYWA0KICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZg0KICAgICAgICAvLyBPIHdpdGggYXJndW1lbnQgInRvSVNPU3RyaW5nIi4NCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4NCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nICE9ICJmdW5jdGlvbiIpDQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQ0KICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YNCiAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4NCiAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTsNCg0KICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuDQoNCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdA0KICAgICAgICAvLyByZXF1aXJlIHRoYXQgaXRzIHRoaXMgdmFsdWUgYmUgYSBEYXRlIG9iamVjdC4gVGhlcmVmb3JlLCBpdCBjYW4gYmUNCiAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLA0KICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4NCiAgICAgICAgLy8gb2JqZWN0IGlzIGZyZWUgdG8gdXNlIHRoZSBhcmd1bWVudCBrZXkgdG8gZmlsdGVyIGl0cw0KICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uDQogICAgfTsNCn0NCg0KLy8gRVM1IDE1LjkuNC4yDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuMg0KLy8gYmFzZWQgb24gd29yayBzaGFyZWQgYnkgRGFuaWVsIEZyaWVzZW4gKGRhbnRtYW4pDQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQ0KaWYgKERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpICE9PSA4LjY0ZTE1KSB7DQogICAgLy8gWFhYIGdsb2JhbCBhc3NpZ25tZW50IHdvbid0IHdvcmsgaW4gZW1iZWRkaW5ncyB0aGF0IHVzZQ0KICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0Lg0KICAgIERhdGUgPSAoZnVuY3Rpb24oTmF0aXZlRGF0ZSkgew0KDQogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3DQogICAgICAgIHZhciBEYXRlID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgew0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7DQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGxlbmd0aCA9PSAxICYmIFN0cmluZyhZKSA9PT0gWSA/IC8vIGlzU3RyaW5nKFkpDQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOg0KICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnQNCiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmUNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHMpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOg0KICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpIDoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKSA6DQogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVEYXRlKCk7DQogICAgICAgICAgICAgICAgLy8gUHJldmVudCBtaXh1cHMgd2l0aCB1bmZpeGVkIERhdGUgb2JqZWN0DQogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KDQogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4NCiAgICAgICAgdmFyIGlzb0RhdGVFeHByZXNzaW9uID0gbmV3IFJlZ0V4cCgiXiIgKw0KICAgICAgICAgICAgIihcXGR7NH18W1wrXC1dXFxkezZ9KSIgKyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyDQogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUNCiAgICAgICAgICAgICIoPzotKFxcZHsyfSkiICsgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmUNCiAgICAgICAgICAgICIoPzoiICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIjooXFxkezJ9KSIgKyAvLyBtaW51dGVzIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAiKD86IiArIC8vIG9wdGlvbmFsIDpzZWNvbmRzLm1pbGxpc2Vjb25kcw0KICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICAgICAiKD86XFwuKFxcZHszfSkpPyIgKyAvLyBtaWxsaXNlY29uZHMgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpPyIgKw0KICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50DQogICAgICAgICAgICAgICAgIlp8IiArIC8vIFVUQyBjYXB0dXJlDQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXMNCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUNCiAgICAgICAgICAgICAgICAgICAgIihcXGR7Mn0pIiArIC8vIGhvdXJzIG9mZnNldCBjYXB0dXJlDQogICAgICAgICAgICAgICAgICAgICI6KFxcZHsyfSkiICsgLy8gbWludXRlcyBvZmZzZXQgY2FwdHVyZQ0KICAgICAgICAgICAgICAgICIpIiArDQogICAgICAgICAgICAiKT8pPyk/KT8iICsNCiAgICAgICAgIiQiKTsNCg0KICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkDQogICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKQ0KICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOw0KDQogICAgICAgIC8vIENvcHkgIm5hdGl2ZSIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZQ0KICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93Ow0KICAgICAgICBEYXRlLlVUQyA9IE5hdGl2ZURhdGUuVVRDOw0KICAgICAgICBEYXRlLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlOw0KICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7DQoNCiAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3MNCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgew0KICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpOw0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSArKG1hdGNoW2ldIHx8IChpIDwgMyA/IDEgOiAwKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzFdIGlzIHRoZSBtb250aC4gTW9udGhzIGFyZSAwLTExIGluIEphdmFTY3JpcHQNCiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UNCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50Lg0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQNCiAgICAgICAgICAgICAgICB2YXIgbWludXRlT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBob3VyT2Zmc2V0ID0gK21hdGNoLnBvcCgpLCBzaWduID0gbWF0Y2gucG9wKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChzaWduKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQ0KICAgICAgICAgICAgICAgICAgICBpZiAoaG91ck9mZnNldCA+IDIzIHx8IG1pbnV0ZU9mZnNldCA+IDU5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzIHRoZSBwcm92aWRlZCB0aW1lIHpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuIFRoZSBvZmZzZXQgaXMNCiAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZm9yIHRpbWUgem9uZXMgd2VzdCBvZiBVVEM7IHBvc2l0aXZlIG90aGVyd2lzZS4NCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXINCiAgICAgICAgICAgICAgICAvLyBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyIGhhcyBhIDQwMC15ZWFyIGN5Y2xlLCBzbyANCiAgICAgICAgICAgICAgICAvLyB0byBEYXRlLlVUQyh5ZWFyICsgNDAwLCAuLi4uICkgLSAxMjYyMjc4MDgwMDAwMCA9PSBEYXRlLlVUQyh5ZWFyLCAuLi4pLA0KICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzDQogICAgICAgICAgICAgICAgdmFyIHllYXIgPSArbWF0Y2hbMF07DQogICAgICAgICAgICAgICAgaWYgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5KSB7DQogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldCAtIDEyNjIyNzgwODAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBuZXcgVVRDIGRhdGUgdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBvcHRpb25hbCBvZmZzZXQNCiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gRGF0ZTsNCiAgICB9KShEYXRlKTsNCn0NCg0KLy8NCi8vIFN0cmluZw0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgMTUuNS40LjIwDQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMjANCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArDQogICAgIlx1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOCIgKw0KICAgICJcdTIwMjlcdUZFRkYiOw0KaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7DQogICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHQNCiAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvDQogICAgd3MgPSAiWyIgKyB3cyArICJdIjsNCiAgICB2YXIgdHJpbUJlZ2luUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyB3cyArIHdzICsgIioiKSwNCiAgICAgICAgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3MgKyB3cyArICIqJCIpOw0KICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcodGhpcykucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICIiKS5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICIiKTsNCiAgICB9Ow0KfQ0KDQovLw0KLy8gVXRpbA0KLy8gPT09PT09DQovLw0KDQovLyBFUzUgOS40DQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjQNCi8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXINCnZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAobikgew0KICAgIG4gPSArbjsNCiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4NCiAgICAgICAgbiA9IDA7DQogICAgZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMS8wKSAmJiBuICE9PSAtKDEvMCkpDQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7DQogICAgcmV0dXJuIG47DQp9Ow0KDQp2YXIgcHJlcGFyZVN0cmluZyA9ICJhIlswXSAhPSAiYSIsDQogICAgLy8gRVM1IDkuOQ0KICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQ0KICAgIHRvT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWQNCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlDQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBieS1pbmRleCBhY2Nlc3Mgb2YNCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nDQogICAgICAgIGlmIChwcmVwYXJlU3RyaW5nICYmIHR5cGVvZiBvID09ICJzdHJpbmciICYmIG8pIHsNCiAgICAgICAgICAgIHJldHVybiBvLnNwbGl0KCIiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gT2JqZWN0KG8pOw0KICAgIH07DQp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00Og0KICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkNCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsNCg0KRXZlbnRFbWl0dGVyLl9lbWl0ID0NCkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgew0KICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9Ow0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsNCg0KICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gfHwgW107DQogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07DQogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikNCiAgICAgICAgcmV0dXJuOw0KDQogICAgZSA9IGUgfHwge307DQogICAgZS50eXBlID0gZXZlbnROYW1lOw0KICAgIA0KICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCiAgICAgICAgfTsNCiAgICB9DQogICAgDQogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBsaXN0ZW5lcnNbaV0oZSk7DQogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkNCiAgICAgICAgZGVmYXVsdEhhbmRsZXIoZSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIuc2V0RGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9Ow0KICAgIA0KICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSkNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7DQogICAgICAgIA0KICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gY2FsbGJhY2s7DQp9Ow0KDQpFdmVudEVtaXR0ZXIub24gPQ0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107DQoNCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQ0KICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPQ0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7DQogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307DQoNCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOw0KICAgIGlmICghbGlzdGVuZXJzKQ0KICAgICAgICByZXR1cm47DQoNCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7DQogICAgaWYgKGluZGV4ICE9PSAtMSkNCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7DQp9Ow0KDQpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOw0KfTsNCg0KZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7DQoNCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KICoNCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCiAqDQogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KICogTGljZW5zZS4NCiAqDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4NCiAqDQogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMNCiAqIEFqYXgub3JnIEIuVi4NCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTANCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBDb250cmlidXRvcihzKToNCiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4NCiAqDQogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yDQogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwNCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkDQogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQ0KICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bw0KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXINCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlDQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQ0KICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4NCiAqDQogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLw0KDQpkZWZpbmUoJ2FjZS9saWIvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KZXhwb3J0cy5pbmhlcml0cyA9IChmdW5jdGlvbigpIHsNCiAgICB2YXIgdGVtcEN0b3IgPSBmdW5jdGlvbigpIHt9Ow0KICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsNCiAgICAgICAgdGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsNCiAgICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3IucHJvdG90eXBlOw0KICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOw0KICAgICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7DQogICAgfTsNCn0oKSk7DQoNCmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbihvYmosIG1peGluKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7DQogICAgICAgIG9ialtrZXldID0gbWl4aW5ba2V5XTsNCiAgICB9DQp9Ow0KDQpleHBvcnRzLmltcGxlbWVudCA9IGZ1bmN0aW9uKHByb3RvLCBtaXhpbikgew0KICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsNCn07DQoNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL21vZGUvanNvbl93b3JrZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS93b3JrZXIvbWlycm9yJywgJ2FjZS9tb2RlL2pzb24vanNvbl9wYXJzZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsNCnZhciBNaXJyb3IgPSByZXF1aXJlKCIuLi93b3JrZXIvbWlycm9yIikuTWlycm9yOw0KdmFyIHBhcnNlID0gcmVxdWlyZSgiLi9qc29uL2pzb25fcGFyc2UiKTsNCg0KdmFyIEpzb25Xb3JrZXIgPSBleHBvcnRzLkpzb25Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsNCiAgICBNaXJyb3IuY2FsbCh0aGlzLCBzZW5kZXIpOw0KICAgIHRoaXMuc2V0VGltZW91dCgyMDApOw0KfTsNCg0Kb29wLmluaGVyaXRzKEpzb25Xb3JrZXIsIE1pcnJvcik7DQoNCihmdW5jdGlvbigpIHsNCg0KICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kb2MuZ2V0VmFsdWUoKTsNCg0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlKHZhbHVlKTsNCiAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuY2hhclRvRG9jdW1lbnRQb3NpdGlvbihlLmF0LTEpOw0KICAgICAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgiZXJyb3IiLCB7DQogICAgICAgICAgICAgICAgcm93OiBwb3Mucm93LA0KICAgICAgICAgICAgICAgIGNvbHVtbjogcG9zLmNvbHVtbiwNCiAgICAgICAgICAgICAgICB0ZXh0OiBlLm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgib2siKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jaGFyVG9Eb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24oY2hhclBvcykgew0KICAgICAgICB2YXIgaSA9IDA7DQogICAgICAgIHZhciBsZW4gPSB0aGlzLmRvYy5nZXRMZW5ndGgoKTsNCiAgICAgICAgdmFyIG5sID0gdGhpcy5kb2MuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDsNCg0KICAgICAgICBpZiAoIWxlbikgew0KICAgICAgICAgICAgcmV0dXJuIHsgcm93OiAwLCBjb2x1bW46IDB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGxpbmVTdGFydCA9IDA7DQogICAgICAgIHdoaWxlIChpIDwgbGVuKSB7DQogICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuZG9jLmdldExpbmUoaSk7DQogICAgICAgICAgICB2YXIgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoICsgbmw7DQogICAgICAgICAgICBpZiAobGluZVN0YXJ0ICsgbGluZUxlbmd0aCA+IGNoYXJQb3MpDQogICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgcm93OiBpLA0KICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNoYXJQb3MgLSBsaW5lU3RhcnQNCiAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBsaW5lU3RhcnQgKz0gbGluZUxlbmd0aDsNCiAgICAgICAgICAgIGkgKz0gMTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICByb3c6IGktMSwNCiAgICAgICAgICAgIGNvbHVtbjogbGluZS5sZW5ndGgNCiAgICAgICAgfTsNCiAgICB9Ow0KDQp9KS5jYWxsKEpzb25Xb3JrZXIucHJvdG90eXBlKTsNCg0KfSk7ZGVmaW5lKCdhY2Uvd29ya2VyL21pcnJvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2RvY3VtZW50JywgJ2FjZS9saWIvbGFuZyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsNCiJ1c2Ugc3RyaWN0IjsNCg0KdmFyIERvY3VtZW50ID0gcmVxdWlyZSgiLi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsNCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsNCiAgICANCnZhciBNaXJyb3IgPSBleHBvcnRzLk1pcnJvciA9IGZ1bmN0aW9uKHNlbmRlcikgew0KICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOw0KICAgIHZhciBkb2MgPSB0aGlzLmRvYyA9IG5ldyBEb2N1bWVudCgiIik7DQogICAgDQogICAgdmFyIGRlZmVycmVkVXBkYXRlID0gdGhpcy5kZWZlcnJlZFVwZGF0ZSA9IGxhbmcuZGVmZXJyZWRDYWxsKHRoaXMub25VcGRhdGUuYmluZCh0aGlzKSk7DQogICAgDQogICAgdmFyIF9zZWxmID0gdGhpczsNCiAgICBzZW5kZXIub24oImNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgZG9jLmFwcGx5RGVsdGFzKFtlLmRhdGFdKTsgICAgICAgIA0KICAgICAgICBkZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZShfc2VsZi4kdGltZW91dCk7DQogICAgfSk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQogICAgDQogICAgdGhpcy4kdGltZW91dCA9IDUwMDsNCiAgICANCiAgICB0aGlzLnNldFRpbWVvdXQgPSBmdW5jdGlvbih0aW1lb3V0KSB7DQogICAgICAgIHRoaXMuJHRpbWVvdXQgPSB0aW1lb3V0Ow0KICAgIH07DQogICAgDQogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgIHRoaXMuZG9jLnNldFZhbHVlKHZhbHVlKTsNCiAgICAgICAgdGhpcy5kZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZSh0aGlzLiR0aW1lb3V0KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbihjYWxsYmFja0lkKSB7DQogICAgICAgIHRoaXMuc2VuZGVyLmNhbGxiYWNrKHRoaXMuZG9jLmdldFZhbHVlKCksIGNhbGxiYWNrSWQpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAvLyBhYnN0cmFjdCBtZXRob2QNCiAgICB9Ow0KICAgIA0KfSkuY2FsbChNaXJyb3IucHJvdG90eXBlKTsNCg0KfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2RvY3VtZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL3JhbmdlJywgJ2FjZS9hbmNob3InXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsNCnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOw0KdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOw0KdmFyIEFuY2hvciA9IHJlcXVpcmUoIi4vYW5jaG9yIikuQW5jaG9yOw0KDQp2YXIgRG9jdW1lbnQgPSBmdW5jdGlvbih0ZXh0KSB7DQogICAgdGhpcy4kbGluZXMgPSBbXTsNCg0KICAgIGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7DQogICAgICAgIHRoaXMuaW5zZXJ0TGluZXMoMCwgdGV4dCk7DQogICAgfQ0KICAgIC8vIFRoZXJlIGhhcyB0byBiZSBvbmUgbGluZSBhdCBsZWFzdCBpbiB0aGUgZG9jdW1lbnQuIElmIHlvdSBwYXNzIGFuIGVtcHR5DQogICAgLy8gc3RyaW5nIHRvIHRoZSBpbnNlcnQgZnVuY3Rpb24sIG5vdGhpbmcgd2lsbCBoYXBwZW4uIFdvcmthcm91bmQuDQogICAgZWxzZSBpZiAodGV4dC5sZW5ndGggPT0gMCkgew0KICAgICAgICB0aGlzLiRsaW5lcyA9IFsiIl07DQogICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5pbnNlcnQoe3JvdzogMCwgY29sdW1uOjB9LCB0ZXh0KTsNCiAgICB9DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQoNCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICB2YXIgbGVuID0gdGhpcy5nZXRMZW5ndGgoKTsNCiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKDAsIDAsIGxlbiwgdGhpcy5nZXRMaW5lKGxlbi0xKS5sZW5ndGgpKTsNCiAgICAgICAgdGhpcy5pbnNlcnQoe3JvdzogMCwgY29sdW1uOjB9LCB0ZXh0KTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxMaW5lcygpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOw0KICAgIH07DQoNCiAgICB0aGlzLmNyZWF0ZUFuY2hvciA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMsIHJvdywgY29sdW1uKTsNCiAgICB9Ow0KDQogICAgLy8gY2hlY2sgZm9yIElFIHNwbGl0IGJ1Zw0KICAgIGlmICgiYWFhIi5zcGxpdCgvYS8pLmxlbmd0aCA9PSAwKQ0KICAgICAgICB0aGlzLiRzcGxpdCA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xyXG58XHIvZywgIlxuIikuc3BsaXQoIlxuIik7DQogICAgICAgIH0NCiAgICBlbHNlDQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgew0KICAgICAgICAgICAgcmV0dXJuIHRleHQuc3BsaXQoL1xyXG58XHJ8XG4vKTsNCiAgICAgICAgfTsNCg0KDQogICAgdGhpcy4kZGV0ZWN0TmV3TGluZSA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoWzFdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSAiXG4iOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlciA9IGZ1bmN0aW9uKCkgew0KICAgICAgc3dpdGNoICh0aGlzLiRuZXdMaW5lTW9kZSkgew0KICAgICAgICAgIGNhc2UgIndpbmRvd3MiOg0KICAgICAgICAgICAgICByZXR1cm4gIlxyXG4iOw0KDQogICAgICAgICAgY2FzZSAidW5peCI6DQogICAgICAgICAgICAgIHJldHVybiAiXG4iOw0KDQogICAgICAgICAgY2FzZSAiYXV0byI6DQogICAgICAgICAgICAgIHJldHVybiB0aGlzLiRhdXRvTmV3TGluZTsNCiAgICAgIH0NCiAgICB9Ow0KDQogICAgdGhpcy4kYXV0b05ld0xpbmUgPSAiXG4iOw0KICAgIHRoaXMuJG5ld0xpbmVNb2RlID0gImF1dG8iOw0KICAgIHRoaXMuc2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbihuZXdMaW5lTW9kZSkgew0KICAgICAgICBpZiAodGhpcy4kbmV3TGluZU1vZGUgPT09IG5ld0xpbmVNb2RlKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHRoaXMuJG5ld0xpbmVNb2RlID0gbmV3TGluZU1vZGU7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG5ld0xpbmVNb2RlOw0KICAgIH07DQoNCiAgICB0aGlzLmlzTmV3TGluZSA9IGZ1bmN0aW9uKHRleHQpIHsNCiAgICAgICAgcmV0dXJuICh0ZXh0ID09ICJcclxuIiB8fCB0ZXh0ID09ICJcciIgfHwgdGV4dCA9PSAiXG4iKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogR2V0IGEgdmVyYmF0aW0gY29weSBvZiB0aGUgZ2l2ZW4gbGluZSBhcyBpdCBpcyBpbiB0aGUgZG9jdW1lbnQNCiAgICAgKi8NCiAgICB0aGlzLmdldExpbmUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3Jvd10gfHwgIiI7DQogICAgfTsNCg0KICAgIHRoaXMuZ2V0TGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTsNCiAgICB9Ow0KDQogICAgLyoqDQogICAgICogUmV0dXJucyBhbGwgbGluZXMgaW4gdGhlIGRvY3VtZW50IGFzIHN0cmluZyBhcnJheS4gV2FybmluZzogVGhlIGNhbGxlcg0KICAgICAqIHNob3VsZCBub3QgbW9kaWZ5IHRoaXMgYXJyYXkhDQogICAgICovDQogICAgdGhpcy5nZXRBbGxMaW5lcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExlbmd0aCgpKTsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRMZW5ndGggPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLmxlbmd0aDsNCiAgICB9Ow0KDQogICAgdGhpcy5nZXRUZXh0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyYW5nZS5zdGFydC5yb3ddLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IFtdOw0KICAgICAgICAgICAgbGluZXMucHVzaCh0aGlzLiRsaW5lc1tyYW5nZS5zdGFydC5yb3ddLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4pKTsNCiAgICAgICAgICAgIGxpbmVzLnB1c2guYXBwbHkobGluZXMsIHRoaXMuZ2V0TGluZXMocmFuZ2Uuc3RhcnQucm93KzEsIHJhbmdlLmVuZC5yb3ctMSkpOw0KICAgICAgICAgICAgbGluZXMucHVzaCh0aGlzLiRsaW5lc1tyYW5nZS5lbmQucm93XS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kLmNvbHVtbikpOw0KICAgICAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMuJGNsaXBQb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmdldExlbmd0aCgpOw0KICAgICAgICBpZiAocG9zaXRpb24ucm93ID49IGxlbmd0aCkgew0KICAgICAgICAgICAgcG9zaXRpb24ucm93ID0gTWF0aC5tYXgoMCwgbGVuZ3RoIC0gMSk7DQogICAgICAgICAgICBwb3NpdGlvbi5jb2x1bW4gPSB0aGlzLmdldExpbmUobGVuZ3RoLTEpLmxlbmd0aDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcG9zaXRpb247DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24ocG9zaXRpb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApDQogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247DQoNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOw0KDQogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpDQogICAgICAgICAgICB0aGlzLiRkZXRlY3ROZXdMaW5lKHRleHQpOw0KDQogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJHNwbGl0KHRleHQpOw0KICAgICAgICB2YXIgZmlyc3RMaW5lID0gbGluZXMuc3BsaWNlKDAsIDEpWzBdOw0KICAgICAgICB2YXIgbGFzdExpbmUgPSBsaW5lcy5sZW5ndGggPT0gMCA/IG51bGwgOiBsaW5lcy5zcGxpY2UobGluZXMubGVuZ3RoIC0gMSwgMSlbMF07DQoNCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgZmlyc3RMaW5lKTsNCiAgICAgICAgaWYgKGxhc3RMaW5lICE9PSBudWxsKSB7DQogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0TmV3TGluZShwb3NpdGlvbik7IC8vIHRlcm1pbmF0ZSBmaXJzdCBsaW5lDQogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0TGluZXMocG9zaXRpb24ucm93LCBsaW5lcyk7DQogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBsYXN0TGluZSB8fCAiIik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KICAgIH07DQoNCiAgICB0aGlzLmluc2VydExpbmVzID0gZnVuY3Rpb24ocm93LCBsaW5lcykgew0KICAgICAgICBpZiAobGluZXMubGVuZ3RoID09IDApDQogICAgICAgICAgICByZXR1cm4ge3Jvdzogcm93LCBjb2x1bW46IDB9Ow0KDQogICAgICAgIHZhciBhcmdzID0gW3JvdywgMF07DQogICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBsaW5lcyk7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZS5hcHBseSh0aGlzLiRsaW5lcywgYXJncyk7DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgMCwgcm93ICsgbGluZXMubGVuZ3RoLCAwKTsNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0TGluZXMiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgbGluZXM6IGxpbmVzDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByYW5nZS5lbmQ7DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0TmV3TGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgICAgIHBvc2l0aW9uID0gdGhpcy4kY2xpcFBvc2l0aW9uKHBvc2l0aW9uKTsNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddIHx8ICIiOw0KDQogICAgICAgIHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gPSBsaW5lLnN1YnN0cmluZygwLCBwb3NpdGlvbi5jb2x1bW4pOw0KICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UocG9zaXRpb24ucm93ICsgMSwgMCwgbGluZS5zdWJzdHJpbmcocG9zaXRpb24uY29sdW1uLCBsaW5lLmxlbmd0aCkpOw0KDQogICAgICAgIHZhciBlbmQgPSB7DQogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3cgKyAxLA0KICAgICAgICAgICAgY29sdW1uIDogMA0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksDQogICAgICAgICAgICB0ZXh0OiB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KDQogICAgICAgIHJldHVybiBlbmQ7DQogICAgfTsNCg0KICAgIHRoaXMuaW5zZXJ0SW5MaW5lID0gZnVuY3Rpb24ocG9zaXRpb24sIHRleHQpIHsNCiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApDQogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247DQoNCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddIHx8ICIiOw0KDQogICAgICAgIHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gPSBsaW5lLnN1YnN0cmluZygwLCBwb3NpdGlvbi5jb2x1bW4pICsgdGV4dA0KICAgICAgICAgICAgICAgICsgbGluZS5zdWJzdHJpbmcocG9zaXRpb24uY29sdW1uKTsNCg0KICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93LA0KICAgICAgICAgICAgY29sdW1uIDogcG9zaXRpb24uY29sdW1uICsgdGV4dC5sZW5ndGgNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgZGVsdGEgPSB7DQogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwNCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLA0KICAgICAgICAgICAgdGV4dDogdGV4dA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KDQogICAgICAgIHJldHVybiBlbmQ7DQogICAgfTsNCg0KICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgLy8gY2xpcCB0byBkb2N1bWVudA0KICAgICAgICByYW5nZS5zdGFydCA9IHRoaXMuJGNsaXBQb3NpdGlvbihyYW5nZS5zdGFydCk7DQogICAgICAgIHJhbmdlLmVuZCA9IHRoaXMuJGNsaXBQb3NpdGlvbihyYW5nZS5lbmQpOw0KDQogICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpDQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQoNCiAgICAgICAgdmFyIGZpcnN0Um93ID0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICB2YXIgbGFzdFJvdyA9IHJhbmdlLmVuZC5yb3c7DQoNCiAgICAgICAgaWYgKHJhbmdlLmlzTXVsdGlMaW5lKCkpIHsNCiAgICAgICAgICAgIHZhciBmaXJzdEZ1bGxSb3cgPSByYW5nZS5zdGFydC5jb2x1bW4gPT0gMCA/IGZpcnN0Um93IDogZmlyc3RSb3cgKyAxOw0KICAgICAgICAgICAgdmFyIGxhc3RGdWxsUm93ID0gbGFzdFJvdyAtIDE7DQoNCiAgICAgICAgICAgIGlmIChyYW5nZS5lbmQuY29sdW1uID4gMCkNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShsYXN0Um93LCAwLCByYW5nZS5lbmQuY29sdW1uKTsNCg0KICAgICAgICAgICAgaWYgKGxhc3RGdWxsUm93ID49IGZpcnN0RnVsbFJvdykNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKGZpcnN0RnVsbFJvdywgbGFzdEZ1bGxSb3cpOw0KDQogICAgICAgICAgICBpZiAoZmlyc3RGdWxsUm93ICE9IGZpcnN0Um93KSB7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUoZmlyc3RSb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgdGhpcy5nZXRMaW5lKGZpcnN0Um93KS5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTmV3TGluZShyYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUoZmlyc3RSb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Ow0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZUluTGluZSA9IGZ1bmN0aW9uKHJvdywgc3RhcnRDb2x1bW4sIGVuZENvbHVtbikgew0KICAgICAgICBpZiAoc3RhcnRDb2x1bW4gPT0gZW5kQ29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIHN0YXJ0Q29sdW1uLCByb3csIGVuZENvbHVtbik7DQogICAgICAgIHZhciBsaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7DQogICAgICAgIHZhciByZW1vdmVkID0gbGluZS5zdWJzdHJpbmcoc3RhcnRDb2x1bW4sIGVuZENvbHVtbik7DQogICAgICAgIHZhciBuZXdMaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgbGluZS5zdWJzdHJpbmcoZW5kQ29sdW1uLCBsaW5lLmxlbmd0aCk7DQogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDEsIG5ld0xpbmUpOw0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLA0KICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLA0KICAgICAgICAgICAgdGV4dDogcmVtb3ZlZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFJlbW92ZXMgYSByYW5nZSBvZiBmdWxsIGxpbmVzDQogICAgICoNCiAgICAgKiBAcGFyYW0gZmlyc3RSb3cge0ludGVnZXJ9IFRoZSBmaXJzdCByb3cgdG8gYmUgcmVtb3ZlZA0KICAgICAqIEBwYXJhbSBsYXN0Um93IHtJbnRlZ2VyfSBUaGUgbGFzdCByb3cgdG8gYmUgcmVtb3ZlZA0KICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfSBUaGUgcmVtb3ZlZCBsaW5lcw0KICAgICAqLw0KICAgIHRoaXMucmVtb3ZlTGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgew0KICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2UoZmlyc3RSb3csIDAsIGxhc3RSb3cgKyAxLCAwKTsNCiAgICAgICAgdmFyIHJlbW92ZWQgPSB0aGlzLiRsaW5lcy5zcGxpY2UoZmlyc3RSb3csIGxhc3RSb3cgLSBmaXJzdFJvdyArIDEpOw0KDQogICAgICAgIHZhciBkZWx0YSA9IHsNCiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZUxpbmVzIiwNCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwNCiAgICAgICAgICAgIG5sOiB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSwNCiAgICAgICAgICAgIGxpbmVzOiByZW1vdmVkDQogICAgICAgIH07DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7DQogICAgICAgIHJldHVybiByZW1vdmVkOw0KICAgIH07DQoNCiAgICB0aGlzLnJlbW92ZU5ld0xpbmUgPSBmdW5jdGlvbihyb3cpIHsNCiAgICAgICAgdmFyIGZpcnN0TGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOw0KICAgICAgICB2YXIgc2Vjb25kTGluZSA9IHRoaXMuZ2V0TGluZShyb3crMSk7DQoNCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgZmlyc3RMaW5lLmxlbmd0aCwgcm93KzEsIDApOw0KICAgICAgICB2YXIgbGluZSA9IGZpcnN0TGluZSArIHNlY29uZExpbmU7DQoNCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMiwgbGluZSk7DQoNCiAgICAgICAgdmFyIGRlbHRhID0gew0KICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsDQogICAgICAgICAgICByYW5nZTogcmFuZ2UsDQogICAgICAgICAgICB0ZXh0OiB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOw0KICAgIH07DQoNCiAgICB0aGlzLnJlcGxhY2UgPSBmdW5jdGlvbihyYW5nZSwgdGV4dCkgew0KICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCAmJiByYW5nZS5pc0VtcHR5KCkpDQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7DQoNCiAgICAgICAgLy8gU2hvcnRjdXQ6IElmIHRoZSB0ZXh0IHdlIHdhbnQgdG8gaW5zZXJ0IGlzIHRoZSBzYW1lIGFzIGl0IGlzIGFscmVhZHkNCiAgICAgICAgLy8gaW4gdGhlIGRvY3VtZW50LCB3ZSBkb24ndCBoYXZlIHRvIHJlcGxhY2UgYW55dGhpbmcuDQogICAgICAgIGlmICh0ZXh0ID09IHRoaXMuZ2V0VGV4dFJhbmdlKHJhbmdlKSkNCiAgICAgICAgICAgIHJldHVybiByYW5nZS5lbmQ7DQoNCiAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICBpZiAodGV4dCkgew0KICAgICAgICAgICAgdmFyIGVuZCA9IHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCB0ZXh0KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGVuZCA9IHJhbmdlLnN0YXJ0Ow0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGVuZDsNCiAgICB9Ow0KDQogICAgdGhpcy5hcHBseURlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgew0KICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGVsdGFzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07DQogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOw0KDQogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpDQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHRoaXMucmV2ZXJ0RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7DQogICAgICAgIGZvciAodmFyIGk9ZGVsdGFzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsNCiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsNCg0KICAgICAgICAgICAgdmFyIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2UuZW5kKTsNCg0KICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gMSk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7DQogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQ0KICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsNCiAgICAgICAgfQ0KICAgIH07DQoNCn0pLmNhbGwoRG9jdW1lbnQucHJvdG90eXBlKTsNCg0KZXhwb3J0cy5Eb2N1bWVudCA9IERvY3VtZW50Ow0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvcmFuZ2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgUmFuZ2UgPSBmdW5jdGlvbihzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKSB7DQogICAgdGhpcy5zdGFydCA9IHsNCiAgICAgICAgcm93OiBzdGFydFJvdywNCiAgICAgICAgY29sdW1uOiBzdGFydENvbHVtbg0KICAgIH07DQoNCiAgICB0aGlzLmVuZCA9IHsNCiAgICAgICAgcm93OiBlbmRSb3csDQogICAgICAgIGNvbHVtbjogZW5kQ29sdW1uDQogICAgfTsNCn07DQoNCihmdW5jdGlvbigpIHsNCiAgICB0aGlzLmlzRWVxdWFsID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09IHJhbmdlLnN0YXJ0LnJvdyAmJg0KICAgICAgICAgICAgdGhpcy5lbmQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYNCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID09IHJhbmdlLnN0YXJ0LmNvbHVtbiAmJg0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID09IHJhbmdlLmVuZC5jb2x1bW4NCiAgICB9Ow0KDQogICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKCJSYW5nZTogWyIgKyB0aGlzLnN0YXJ0LnJvdyArICIvIiArIHRoaXMuc3RhcnQuY29sdW1uICsNCiAgICAgICAgICAgICJdIC0+IFsiICsgdGhpcy5lbmQucm93ICsgIi8iICsgdGhpcy5lbmQuY29sdW1uICsgIl0iKTsNCiAgICB9Ow0KDQogICAgdGhpcy5jb250YWlucyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDA7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIENvbXBhcmVzIHRoaXMgcmFuZ2UgKEEpIHdpdGggYW5vdGhlciByYW5nZSAoQiksIHdoZXJlIEIgaXMgdGhlIHBhc3NlZCBpbg0KICAgICAqIHJhbmdlLg0KICAgICAqDQogICAgICogUmV0dXJuIHZhbHVlczoNCiAgICAgKiAgLTI6IChCKSBpcyBpbmZyb250IG9mIChBKSBhbmQgZG9lc24ndCBpbnRlcnNlY3Qgd2l0aCAoQSkNCiAgICAgKiAgLTE6IChCKSBiZWdpbnMgYmVmb3JlIChBKSBidXQgZW5kcyBpbnNpZGUgb2YgKEEpDQogICAgICogICAwOiAoQikgaXMgY29tcGxldGx5IGluc2lkZSBvZiAoQSkgT1IgKEEpIGlzIGNvbXBsZXR5IGluc2lkZSBvZiAoQikNCiAgICAgKiAgKzE6IChCKSBiZWdpbnMgaW5zaWRlIG9mIChBKSBidXQgZW5kcyBvdXRzaWRlIG9mIChBKQ0KICAgICAqICArMjogKEIpIGlzIGFmdGVyIChBKSBhbmQgZG9lc24ndCBpbnRlcnNlY3Qgd2l0aCAoQSkNCiAgICAgKg0KICAgICAqICA0MjogRlRXIHN0YXRlOiAoQikgZW5kcyBpbiAoQSkgYnV0IHN0YXJ0cyBvdXRzaWRlIG9mIChBKQ0KICAgICAqLw0KICAgIHRoaXMuY29tcGFyZVJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICAgICAgdmFyIGNtcCwNCiAgICAgICAgICAgIGVuZCA9IHJhbmdlLmVuZCwNCiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7DQoNCiAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKGVuZC5yb3csIGVuZC5jb2x1bW4pOw0KICAgICAgICBpZiAoY21wID09IDEpIHsNCiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7DQogICAgICAgICAgICBpZiAoY21wID09IDEpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICByZXR1cm4gLTI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOw0KICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDEpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gNDI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlUG9pbnQgPSBmdW5jdGlvbihwKSB7DQogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocC5yb3csIHAuY29sdW1uKTsNCiAgICB9DQoNCiAgICB0aGlzLmNvbnRhaW5zUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgew0KICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlUG9pbnQocmFuZ2Uuc3RhcnQpID09IDAgJiYgdGhpcy5jb21wYXJlUG9pbnQocmFuZ2UuZW5kKSA9PSAwOw0KICAgIH0NCg0KICAgIHRoaXMuaXNFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICByZXR1cm4gdGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uOw0KICAgIH0NCg0KICAgIHRoaXMuaXNTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uOw0KICAgIH0NCg0KICAgIHRoaXMuc2V0U3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0Iikgew0KICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSByb3cuY29sdW1uOw0KICAgICAgICAgICAgdGhpcy5zdGFydC5yb3cgPSByb3cucm93Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5zdGFydC5yb3cgPSByb3c7DQogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGNvbHVtbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuc2V0RW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHR5cGVvZiByb3cgPT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IHJvdy5jb2x1bW47DQogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3cucm93Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gcm93Ow0KICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gY29sdW1uOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5pbnNpZGUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7DQogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikgfHwgdGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHRoaXMuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgew0KICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7DQogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB0aGlzLmluc2lkZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgdGhpcy5jb21wYXJlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlMaW5lKCkpIHsNCiAgICAgICAgICAgIGlmIChyb3cgPT09IHRoaXMuc3RhcnQucm93KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8IHRoaXMuc3RhcnQuY29sdW1uID8gLTEgOiAoY29sdW1uID4gdGhpcy5lbmQuY29sdW1uID8gMSA6IDApOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykNCiAgICAgICAgICAgIHJldHVybiAtMTsNCg0KICAgICAgICBpZiAocm93ID4gdGhpcy5lbmQucm93KQ0KICAgICAgICAgICAgcmV0dXJuIDE7DQoNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09PSByb3cpDQogICAgICAgICAgICByZXR1cm4gY29sdW1uID49IHRoaXMuc3RhcnQuY29sdW1uID8gMCA6IC0xOw0KDQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykNCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPD0gdGhpcy5lbmQuY29sdW1uID8gMCA6IDE7DQoNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzU3RhcnQgaXMgdHJ1ZSwgcmV0dXJuIC0xOw0KICAgICAqLw0KICAgIHRoaXMuY29tcGFyZVN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNFbmQgaXMgdHJ1ZSwgcmV0dXJuIDE7DQogICAgICovDQogICAgdGhpcy5jb21wYXJlRW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgew0KICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHRoaXMuY29tcGFyZUluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5jbGlwUm93cyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7DQogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPiBsYXN0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogbGFzdFJvdysxLA0KICAgICAgICAgICAgICAgIGNvbHVtbjogMA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA+IGxhc3RSb3cpIHsNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHsNCiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwNCiAgICAgICAgICAgICAgICBjb2x1bW46IDANCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPCBmaXJzdFJvdykgew0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gew0KICAgICAgICAgICAgICAgIHJvdzogZmlyc3RSb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA8IGZpcnN0Um93KSB7DQogICAgICAgICAgICB2YXIgZW5kID0gew0KICAgICAgICAgICAgICAgIHJvdzogZmlyc3RSb3csDQogICAgICAgICAgICAgICAgY29sdW1uOiAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7DQogICAgfTsNCg0KICAgIHRoaXMuZXh0ZW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsNCiAgICAgICAgdmFyIGNtcCA9IHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7DQoNCiAgICAgICAgaWYgKGNtcCA9PSAwKQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIGVsc2UgaWYgKGNtcCA9PSAtMSkNCiAgICAgICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59Ow0KICAgICAgICBlbHNlDQogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn07DQoNCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsNCiAgICB9Ow0KDQogICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgPT0gdGhpcy5lbmQucm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IHRoaXMuZW5kLmNvbHVtbik7DQogICAgfTsNCg0KICAgIHRoaXMuaXNNdWx0aUxpbmUgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyAhPT0gdGhpcy5lbmQucm93KTsNCiAgICB9Ow0KDQogICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7DQogICAgfTsNCg0KICAgIHRoaXMuY29sbGFwc2VSb3dzID0gZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh0aGlzLmVuZC5jb2x1bW4gPT0gMCkNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIE1hdGgubWF4KHRoaXMuc3RhcnQucm93LCB0aGlzLmVuZC5yb3ctMSksIDApDQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIHRoaXMuZW5kLnJvdywgMCkNCiAgICB9Ow0KDQogICAgdGhpcy50b1NjcmVlblJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbikgew0KICAgICAgICB2YXIgc2NyZWVuUG9zU3RhcnQgPQ0KICAgICAgICAgICAgc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zdGFydCk7DQogICAgICAgIHZhciBzY3JlZW5Qb3NFbmQgPQ0KICAgICAgICAgICAgc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5lbmQpOw0KDQogICAgICAgIHJldHVybiBuZXcgUmFuZ2UoDQogICAgICAgICAgICBzY3JlZW5Qb3NTdGFydC5yb3csIHNjcmVlblBvc1N0YXJ0LmNvbHVtbiwNCiAgICAgICAgICAgIHNjcmVlblBvc0VuZC5yb3csIHNjcmVlblBvc0VuZC5jb2x1bW4NCiAgICAgICAgKTsNCiAgICB9Ow0KDQp9KS5jYWxsKFJhbmdlLnByb3RvdHlwZSk7DQoNCg0KUmFuZ2UuZnJvbVBvaW50cyA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsNCn07DQoNCmV4cG9ydHMuUmFuZ2UgPSBSYW5nZTsNCn0pOw0KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKg0KICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xDQogKg0KICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uDQogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLw0KICoNCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsDQogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlDQogKiBMaWNlbnNlLg0KICoNCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLg0KICoNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcw0KICogQWpheC5vcmcgQi5WLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMA0KICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICoNCiAqIENvbnRyaWJ1dG9yKHMpOg0KICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPg0KICoNCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3INCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLA0KICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQNCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5DQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvDQogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cg0KICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UNCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlDQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyDQogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLg0KICoNCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovDQoNCmRlZmluZSgnYWNlL2FuY2hvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7DQp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsNCg0KLyoqDQogKiBBbiBBbmNob3IgaXMgYSBmbG9hdGluZyBwb2ludGVyIGluIHRoZSBkb2N1bWVudC4gV2hlbmV2ZXIgdGV4dCBpcyBpbnNlcnRlZCBvcg0KICogZGVsZXRlZCBiZWZvcmUgdGhlIGN1cnNvciwgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgaXMgdXBkYXRlZA0KICovDQp2YXIgQW5jaG9yID0gZXhwb3J0cy5BbmNob3IgPSBmdW5jdGlvbihkb2MsIHJvdywgY29sdW1uKSB7DQogICAgdGhpcy5kb2N1bWVudCA9IGRvYzsNCiAgICANCiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PSAidW5kZWZpbmVkIikNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3cucm93LCByb3cuY29sdW1uKTsNCiAgICBlbHNlDQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOw0KDQogICAgdGhpcy4kb25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7DQogICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7DQp9Ow0KDQooZnVuY3Rpb24oKSB7DQoNCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7DQogICAgDQogICAgdGhpcy5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCh0aGlzLnJvdywgdGhpcy5jb2x1bW4pOw0KICAgIH07DQogICAgDQogICAgdGhpcy5nZXREb2N1bWVudCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7DQogICAgICAgIHZhciBkZWx0YSA9IGUuZGF0YTsNCiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyAhPSB0aGlzLnJvdykNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIA0KICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID4gdGhpcy5yb3cpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICANCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSB0aGlzLnJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPiB0aGlzLmNvbHVtbikNCiAgICAgICAgICAgIHJldHVybjsNCiAgICANCiAgICAgICAgdmFyIHJvdyA9IHRoaXMucm93Ow0KICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW47DQogICAgICAgIA0KICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0VGV4dCIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPD0gY29sdW1uKSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdykgew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gKz0gcmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiAtPSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRMaW5lcyIpIHsNCiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7DQogICAgICAgICAgICAgICAgcm93ICs9IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0Iikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDwgY29sdW1uKSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPj0gY29sdW1uKQ0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSByYW5nZS5zdGFydC5jb2x1bW47DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSAocmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbikpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7DQogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByb3cgLT0gKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsNCiAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsNCiAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSByYW5nZS5lbmQuY29sdW1uKSArIHJhbmdlLnN0YXJ0LmNvbHVtbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgew0KICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsNCiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA8PSByb3cpDQogICAgICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93Ow0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByb3cgPSByYW5nZS5zdGFydC5yb3c7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbiwgdHJ1ZSk7DQogICAgfTsNCg0KICAgIHRoaXMuc2V0UG9zaXRpb24gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgbm9DbGlwKSB7DQogICAgICAgIHZhciBwb3M7DQogICAgICAgIGlmIChub0NsaXApIHsNCiAgICAgICAgICAgIHBvcyA9IHsNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHBvcyA9IHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQocm93LCBjb2x1bW4pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgDQogICAgICAgIHZhciBvbGQgPSB7DQogICAgICAgICAgICByb3c6IHRoaXMucm93LA0KICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbg0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgdGhpcy5yb3cgPSBwb3Mucm93Ow0KICAgICAgICB0aGlzLmNvbHVtbiA9IHBvcy5jb2x1bW47DQogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsNCiAgICAgICAgICAgIG9sZDogb2xkLA0KICAgICAgICAgICAgdmFsdWU6IHBvcw0KICAgICAgICB9KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuZGV0YWNoID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOw0KICAgIH07DQogICAgDQogICAgdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7DQogICAgICAgIHZhciBwb3MgPSB7fTsNCiAgICANCiAgICAgICAgaWYgKHJvdyA+PSB0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpKSB7DQogICAgICAgICAgICBwb3Mucm93ID0gTWF0aC5tYXgoMCwgdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOw0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAocm93IDwgMCkgew0KICAgICAgICAgICAgcG9zLnJvdyA9IDA7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHBvcy5yb3cgPSByb3c7DQogICAgICAgICAgICBwb3MuY29sdW1uID0gTWF0aC5taW4odGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aCwgTWF0aC5tYXgoMCwgY29sdW1uKSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChjb2x1bW4gPCAwKQ0KICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7DQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIHBvczsNCiAgICB9Ow0KICAgIA0KfSkuY2FsbChBbmNob3IucHJvdG90eXBlKTsNCg0KfSk7DQovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqDQogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjENCiAqDQogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24NCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvDQogKg0KICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywNCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQ0KICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUNCiAqIExpY2Vuc2UuDQogKg0KICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuDQogKg0KICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQogKiBBamF4Lm9yZyBCLlYuDQogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwDQogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKg0KICogQ29udHJpYnV0b3Iocyk6DQogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+DQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQogKg0KICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8NCg0KZGVmaW5lKCdhY2UvbGliL2xhbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgew0KInVzZSBzdHJpY3QiOw0KDQpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsNCiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik7DQp9Ow0KDQpleHBvcnRzLnN0cmluZ1JlcGVhdCA9IGZ1bmN0aW9uIChzdHJpbmcsIGNvdW50KSB7DQogICAgIHJldHVybiBuZXcgQXJyYXkoY291bnQgKyAxKS5qb2luKHN0cmluZyk7DQp9Ow0KDQp2YXIgdHJpbUJlZ2luUmVnZXhwID0gL15cc1xzKi87DQp2YXIgdHJpbUVuZFJlZ2V4cCA9IC9cc1xzKiQvOw0KDQpleHBvcnRzLnN0cmluZ1RyaW1MZWZ0ID0gZnVuY3Rpb24gKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsNCn07DQoNCmV4cG9ydHMuc3RyaW5nVHJpbVJpZ2h0ID0gZnVuY3Rpb24gKHN0cmluZykgew0KICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltRW5kUmVnZXhwLCAnJyk7DQp9Ow0KDQpleHBvcnRzLmNvcHlPYmplY3QgPSBmdW5jdGlvbihvYmopIHsNCiAgICB2YXIgY29weSA9IHt9Ow0KICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsNCiAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5jb3B5QXJyYXkgPSBmdW5jdGlvbihhcnJheSl7DQogICAgdmFyIGNvcHkgPSBbXTsNCiAgICBmb3IgKHZhciBpPTAsIGw9YXJyYXkubGVuZ3RoOyBpPGw7IGkrKykgew0KICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQ0KICAgICAgICAgICAgY29weVtpXSA9IHRoaXMuY29weU9iamVjdCggYXJyYXlbaV0gKTsNCiAgICAgICAgZWxzZSANCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsNCiAgICB9DQogICAgcmV0dXJuIGNvcHk7DQp9Ow0KDQpleHBvcnRzLmRlZXBDb3B5ID0gZnVuY3Rpb24gKG9iaikgew0KICAgIGlmICh0eXBlb2Ygb2JqICE9ICJvYmplY3QiKSB7DQogICAgICAgIHJldHVybiBvYmo7DQogICAgfQ0KICAgIA0KICAgIHZhciBjb3B5ID0gb2JqLmNvbnN0cnVjdG9yKCk7DQogICAgZm9yICh2YXIga2V5IGluIG9iaikgew0KICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09ICJvYmplY3QiKSB7DQogICAgICAgICAgICBjb3B5W2tleV0gPSB0aGlzLmRlZXBDb3B5KG9ialtrZXldKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBjb3B5Ow0KfTsNCg0KZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24oYXJyKSB7DQogICAgdmFyIG1hcCA9IHt9Ow0KICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgbWFwW2FycltpXV0gPSAxOw0KICAgIH0NCiAgICByZXR1cm4gbWFwOw0KDQp9Ow0KDQovKioNCiAqIHNwbGljZSBvdXQgb2YgJ2FycmF5JyBhbnl0aGluZyB0aGF0ID09PSAndmFsdWUnDQogKi8NCmV4cG9ydHMuYXJyYXlSZW1vdmUgPSBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7DQogICAgICBhcnJheS5zcGxpY2UoaSwgMSk7DQogICAgfQ0KICB9DQp9Ow0KDQpleHBvcnRzLmVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uKHN0cikgew0KICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOw0KfTsNCg0KZXhwb3J0cy5kZWZlcnJlZENhbGwgPSBmdW5jdGlvbihmY24pIHsNCg0KICAgIHZhciB0aW1lciA9IG51bGw7DQogICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7DQogICAgICAgIHRpbWVyID0gbnVsbDsNCiAgICAgICAgZmNuKCk7DQogICAgfTsNCg0KICAgIHZhciBkZWZlcnJlZCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsNCiAgICAgICAgZGVmZXJyZWQuY2FuY2VsKCk7DQogICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCB8fCAwKTsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICBkZWZlcnJlZC5zY2hlZHVsZSA9IGRlZmVycmVkOw0KDQogICAgZGVmZXJyZWQuY2FsbCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmNhbmNlbCgpOw0KICAgICAgICBmY24oKTsNCiAgICAgICAgcmV0dXJuIGRlZmVycmVkOw0KICAgIH07DQoNCiAgICBkZWZlcnJlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsNCiAgICAgICAgdGltZXIgPSBudWxsOw0KICAgICAgICByZXR1cm4gZGVmZXJyZWQ7DQogICAgfTsNCg0KICAgIHJldHVybiBkZWZlcnJlZDsNCn07DQoNCn0pOw0KLyoNCiAgICBodHRwOi8vd3d3LkpTT04ub3JnL2pzb25fcGFyc2UuanMNCiAgICAyMDA4LTA5LTE4DQoNCiAgICBQdWJsaWMgRG9tYWluLg0KDQogICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLg0KDQogICAgVGhpcyBmaWxlIGNyZWF0ZXMgYSBqc29uX3BhcnNlIGZ1bmN0aW9uLg0KDQogICAgICAgIGpzb25fcGFyc2UodGV4dCwgcmV2aXZlcikNCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIHBhcnNlcyBhIEpTT04gdGV4dCB0byBwcm9kdWNlIGFuIG9iamVjdCBvciBhcnJheS4NCiAgICAgICAgICAgIEl0IGNhbiB0aHJvdyBhIFN5bnRheEVycm9yIGV4Y2VwdGlvbi4NCg0KICAgICAgICAgICAgVGhlIG9wdGlvbmFsIHJldml2ZXIgcGFyYW1ldGVyIGlzIGEgZnVuY3Rpb24gdGhhdCBjYW4gZmlsdGVyIGFuZA0KICAgICAgICAgICAgdHJhbnNmb3JtIHRoZSByZXN1bHRzLiBJdCByZWNlaXZlcyBlYWNoIG9mIHRoZSBrZXlzIGFuZCB2YWx1ZXMsDQogICAgICAgICAgICBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlLg0KICAgICAgICAgICAgSWYgaXQgcmV0dXJucyB3aGF0IGl0IHJlY2VpdmVkLCB0aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgbm90IG1vZGlmaWVkLg0KICAgICAgICAgICAgSWYgaXQgcmV0dXJucyB1bmRlZmluZWQgdGhlbiB0aGUgbWVtYmVyIGlzIGRlbGV0ZWQuDQoNCiAgICAgICAgICAgIEV4YW1wbGU6DQoNCiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSB0ZXh0LiBWYWx1ZXMgdGhhdCBsb29rIGxpa2UgSVNPIGRhdGUgc3RyaW5ncyB3aWxsDQogICAgICAgICAgICAvLyBiZSBjb252ZXJ0ZWQgdG8gRGF0ZSBvYmplY3RzLg0KDQogICAgICAgICAgICBteURhdGEgPSBqc29uX3BhcnNlKHRleHQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgdmFyIGE7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICAgICAgYSA9DQovXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pVChcZHsyfSk6KFxkezJ9KTooXGR7Mn0oPzpcLlxkKik/KVokLy5leGVjKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQygrYVsxXSwgK2FbMl0gLSAxLCArYVszXSwgK2FbNF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgK2FbNV0sICthWzZdKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCiAgICBUaGlzIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiBZb3UgYXJlIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBvcg0KICAgIHJlZGlzdHJpYnV0ZS4NCg0KICAgIFRoaXMgY29kZSBzaG91bGQgYmUgbWluaWZpZWQgYmVmb3JlIGRlcGxveW1lbnQuDQogICAgU2VlIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vanNtaW4uaHRtbA0KDQogICAgVVNFIFlPVVIgT1dOIENPUFkuIElUIElTIEVYVFJFTUVMWSBVTldJU0UgVE8gTE9BRCBDT0RFIEZST00gU0VSVkVSUyBZT1UgRE8NCiAgICBOT1QgQ09OVFJPTC4NCiovDQoNCi8qbWVtYmVycyAiIiwgIlwiIiwgIlwvIiwgIlxcIiwgYXQsIGIsIGNhbGwsIGNoYXJBdCwgZiwgZnJvbUNoYXJDb2RlLA0KICAgIGhhc093blByb3BlcnR5LCBtZXNzYWdlLCBuLCBuYW1lLCBwdXNoLCByLCB0LCB0ZXh0DQoqLw0KDQpkZWZpbmUoJ2FjZS9tb2RlL2pzb24vanNvbl9wYXJzZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7DQoidXNlIHN0cmljdCI7DQoNCi8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBwYXJzZSBhIEpTT04gdGV4dCwgcHJvZHVjaW5nIGEgSmF2YVNjcmlwdA0KLy8gZGF0YSBzdHJ1Y3R1cmUuIEl0IGlzIGEgc2ltcGxlLCByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuIEl0IGRvZXMgbm90IHVzZQ0KLy8gZXZhbCBvciByZWd1bGFyIGV4cHJlc3Npb25zLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1vZGVsIGZvciBpbXBsZW1lbnRpbmcNCi8vIGEgSlNPTiBwYXJzZXIgaW4gb3RoZXIgbGFuZ3VhZ2VzLg0KDQovLyBXZSBhcmUgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIGluc2lkZSBvZiBhbm90aGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nDQovLyBnbG9iYWwgdmFyaWFibGVzLg0KDQogICAgdmFyIGF0LCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3Rlcg0KICAgICAgICBjaCwgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3Rlcg0KICAgICAgICBlc2NhcGVlID0gew0KICAgICAgICAgICAgJyInOiAgJyInLA0KICAgICAgICAgICAgJ1xcJzogJ1xcJywNCiAgICAgICAgICAgICcvJzogICcvJywNCiAgICAgICAgICAgIGI6ICAgICdcYicsDQogICAgICAgICAgICBmOiAgICAnXGYnLA0KICAgICAgICAgICAgbjogICAgJ1xuJywNCiAgICAgICAgICAgIHI6ICAgICdccicsDQogICAgICAgICAgICB0OiAgICAnXHQnDQogICAgICAgIH0sDQogICAgICAgIHRleHQsDQoNCiAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgew0KDQovLyBDYWxsIGVycm9yIHdoZW4gc29tZXRoaW5nIGlzIHdyb25nLg0KDQogICAgICAgICAgICB0aHJvdyB7DQogICAgICAgICAgICAgICAgbmFtZTogICAgJ1N5bnRheEVycm9yJywNCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtLA0KICAgICAgICAgICAgICAgIGF0OiAgICAgIGF0LA0KICAgICAgICAgICAgICAgIHRleHQ6ICAgIHRleHQNCiAgICAgICAgICAgIH07DQogICAgICAgIH0sDQoNCiAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIChjKSB7DQoNCi8vIElmIGEgYyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHZlcmlmeSB0aGF0IGl0IG1hdGNoZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLg0KDQogICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBjaCkgew0KICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIGMgKyAiJyBpbnN0ZWFkIG9mICciICsgY2ggKyAiJyIpOw0KICAgICAgICAgICAgfQ0KDQovLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMsDQovLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4NCg0KICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7DQogICAgICAgICAgICBhdCArPSAxOw0KICAgICAgICAgICAgcmV0dXJuIGNoOw0KICAgICAgICB9LA0KDQogICAgICAgIG51bWJlciA9IGZ1bmN0aW9uICgpIHsNCg0KLy8gUGFyc2UgYSBudW1iZXIgdmFsdWUuDQoNCiAgICAgICAgICAgIHZhciBudW1iZXIsDQogICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7DQoNCiAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nKSB7DQogICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOw0KICAgICAgICAgICAgICAgIG5leHQoJy0nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQogICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOw0KICAgICAgICAgICAgICAgIG5leHQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7DQogICAgICAgICAgICAgICAgc3RyaW5nICs9ICcuJzsNCiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHsNCiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7DQogICAgICAgICAgICAgICAgbmV4dCgpOw0KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOw0KICAgICAgICAgICAgICAgICAgICBuZXh0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsNCiAgICAgICAgICAgICAgICAgICAgbmV4dCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG51bWJlciA9ICtzdHJpbmc7DQogICAgICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkgew0KICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgbnVtYmVyIik7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgew0KDQovLyBQYXJzZSBhIHN0cmluZyB2YWx1ZS4NCg0KICAgICAgICAgICAgdmFyIGhleCwNCiAgICAgICAgICAgICAgICBpLA0KICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnLA0KICAgICAgICAgICAgICAgIHVmZmZmOw0KDQovLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgIiBhbmQgXCBjaGFyYWN0ZXJzLg0KDQogICAgICAgICAgICBpZiAoY2ggPT09ICciJykgew0KICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWZmZmYgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICs9IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gcGFyc2VJbnQobmV4dCgpLCAxNik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoaGV4KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWZmZmYgPSB1ZmZmZiAqIDE2ICsgaGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1ZmZmZik7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlc2NhcGVlW2NoXSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gZXNjYXBlZVtjaF07DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZXJyb3IoIkJhZCBzdHJpbmciKTsNCiAgICAgICAgfSwNCg0KICAgICAgICB3aGl0ZSA9IGZ1bmN0aW9uICgpIHsNCg0KLy8gU2tpcCB3aGl0ZXNwYWNlLg0KDQogICAgICAgICAgICB3aGlsZSAoY2ggJiYgY2ggPD0gJyAnKSB7DQogICAgICAgICAgICAgICAgbmV4dCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIHdvcmQgPSBmdW5jdGlvbiAoKSB7DQoNCi8vIHRydWUsIGZhbHNlLCBvciBudWxsLg0KDQogICAgICAgICAgICBzd2l0Y2ggKGNoKSB7DQogICAgICAgICAgICBjYXNlICd0JzoNCiAgICAgICAgICAgICAgICBuZXh0KCd0Jyk7DQogICAgICAgICAgICAgICAgbmV4dCgncicpOw0KICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsNCiAgICAgICAgICAgICAgICBuZXh0KCdlJyk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICBjYXNlICdmJzoNCiAgICAgICAgICAgICAgICBuZXh0KCdmJyk7DQogICAgICAgICAgICAgICAgbmV4dCgnYScpOw0KICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsNCiAgICAgICAgICAgICAgICBuZXh0KCdzJyk7DQogICAgICAgICAgICAgICAgbmV4dCgnZScpOw0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIGNhc2UgJ24nOg0KICAgICAgICAgICAgICAgIG5leHQoJ24nKTsNCiAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7DQogICAgICAgICAgICAgICAgbmV4dCgnbCcpOw0KICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yKCJVbmV4cGVjdGVkICciICsgY2ggKyAiJyIpOw0KICAgICAgICB9LA0KDQogICAgICAgIHZhbHVlLCAgLy8gUGxhY2UgaG9sZGVyIGZvciB0aGUgdmFsdWUgZnVuY3Rpb24uDQoNCiAgICAgICAgYXJyYXkgPSBmdW5jdGlvbiAoKSB7DQoNCi8vIFBhcnNlIGFuIGFycmF5IHZhbHVlLg0KDQogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsNCg0KICAgICAgICAgICAgaWYgKGNoID09PSAnWycpIHsNCiAgICAgICAgICAgICAgICBuZXh0KCdbJyk7DQogICAgICAgICAgICAgICAgd2hpdGUoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgew0KICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsgICAvLyBlbXB0eSBhcnJheQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB3aGlsZSAoY2gpIHsNCiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBuZXh0KCcsJyk7DQogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZXJyb3IoIkJhZCBhcnJheSIpOw0KICAgICAgICB9LA0KDQogICAgICAgIG9iamVjdCA9IGZ1bmN0aW9uICgpIHsNCg0KLy8gUGFyc2UgYW4gb2JqZWN0IHZhbHVlLg0KDQogICAgICAgICAgICB2YXIga2V5LA0KICAgICAgICAgICAgICAgIG9iamVjdCA9IHt9Ow0KDQogICAgICAgICAgICBpZiAoY2ggPT09ICd7Jykgew0KICAgICAgICAgICAgICAgIG5leHQoJ3snKTsNCiAgICAgICAgICAgICAgICB3aGl0ZSgpOw0KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ30nKSB7DQogICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsgICAvLyBlbXB0eSBvYmplY3QNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7DQogICAgICAgICAgICAgICAgICAgIGtleSA9IHN0cmluZygpOw0KICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOw0KICAgICAgICAgICAgICAgICAgICBuZXh0KCc6Jyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdEdXBsaWNhdGUga2V5ICInICsga2V5ICsgJyInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlKCk7DQogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ30nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsNCiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlcnJvcigiQmFkIG9iamVjdCIpOw0KICAgICAgICB9Ow0KDQogICAgdmFsdWUgPSBmdW5jdGlvbiAoKSB7DQoNCi8vIFBhcnNlIGEgSlNPTiB2YWx1ZS4gSXQgY291bGQgYmUgYW4gb2JqZWN0LCBhbiBhcnJheSwgYSBzdHJpbmcsIGEgbnVtYmVyLA0KLy8gb3IgYSB3b3JkLg0KDQogICAgICAgIHdoaXRlKCk7DQogICAgICAgIHN3aXRjaCAoY2gpIHsNCiAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICByZXR1cm4gb2JqZWN0KCk7DQogICAgICAgIGNhc2UgJ1snOg0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgICAgIGNhc2UgJyInOg0KICAgICAgICAgICAgcmV0dXJuIHN0cmluZygpOw0KICAgICAgICBjYXNlICctJzoNCiAgICAgICAgICAgIHJldHVybiBudW1iZXIoKTsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknID8gbnVtYmVyKCkgOiB3b3JkKCk7DQogICAgICAgIH0NCiAgICB9Ow0KDQovLyBSZXR1cm4gdGhlIGpzb25fcGFyc2UgZnVuY3Rpb24uIEl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBhYm92ZQ0KLy8gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuDQoNCiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSwgcmV2aXZlcikgew0KICAgICAgICB2YXIgcmVzdWx0Ow0KDQogICAgICAgIHRleHQgPSBzb3VyY2U7DQogICAgICAgIGF0ID0gMDsNCiAgICAgICAgY2ggPSAnICc7DQogICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7DQogICAgICAgIHdoaXRlKCk7DQogICAgICAgIGlmIChjaCkgew0KICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOw0KICAgICAgICB9DQoNCi8vIElmIHRoZXJlIGlzIGEgcmV2aXZlciBmdW5jdGlvbiwgd2UgcmVjdXJzaXZlbHkgd2FsayB0aGUgbmV3IHN0cnVjdHVyZSwNCi8vIHBhc3NpbmcgZWFjaCBuYW1lL3ZhbHVlIHBhaXIgdG8gdGhlIHJldml2ZXIgZnVuY3Rpb24gZm9yIHBvc3NpYmxlDQovLyB0cmFuc2Zvcm1hdGlvbiwgc3RhcnRpbmcgd2l0aCBhIHRlbXBvcmFyeSByb290IG9iamVjdCB0aGF0IGhvbGRzIHRoZSByZXN1bHQNCi8vIGluIGFuIGVtcHR5IGtleS4gSWYgdGhlcmUgaXMgbm90IGEgcmV2aXZlciBmdW5jdGlvbiwgd2Ugc2ltcGx5IHJldHVybiB0aGUNCi8vIHJlc3VsdC4NCg0KICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiB3YWxrKGhvbGRlciwga2V5KSB7DQogICAgICAgICAgICB2YXIgaywgdiwgdmFsdWUgPSBob2xkZXJba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICAgICAgZm9yIChrIGluIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgaykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB3YWxrKHZhbHVlLCBrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtrXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiByZXZpdmVyLmNhbGwoaG9sZGVyLCBrZXksIHZhbHVlKTsNCiAgICAgICAgfSh7Jyc6IHJlc3VsdH0sICcnKSA6IHJlc3VsdDsNCiAgICB9Ow0KfSk7]]></data>
	</file>
	<file>
	  <filename>/AceEditor.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2xhc3MgQWNlRWRpdG9yIGV4dGVuZHMgQ01TTW9kdWxlIHsNCg0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkjIEF0dHJpYnV0ZXMNCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQ0KDQogICAgcHJvdGVjdGVkICRub2VkaXRvcnMgPSAwOw0KICAgIHB1YmxpYyAkaGVhZGVyaW5mb3NlbnQgPSBmYWxzZTsNCiAgICBwcml2YXRlICRfaHRtbGFjdGl2ZSA9IGZhbHNlOw0KICAgIHByaXZhdGUgJF9qYXZhc2NyaXB0YWN0aXZlID0gZmFsc2U7DQogICAgcHJpdmF0ZSAkX2Nzc2FjdGl2ZSA9IGZhbHNlOw0KICAgIHByaXZhdGUgJF9waHBhY3RpdmUgPSBmYWxzZTsNCiAgICBwcml2YXRlICRfZGVmYXVsdGFjdGl2ZSA9IGZhbHNlOw0KDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCSMgTW9kdWxlIGFwaSBtZXRob2RzDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJDQoJDQogICAgcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKSB7DQogICAgICAgIHJldHVybiAnQWNlRWRpdG9yJzsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgew0KICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KICAgICAgICByZXR1cm4gJzAuMi4zLjInOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgew0KDQogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsNCiAgICAgICAgJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOyAgICAgICAgIA0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ21vZHVsZV9wYXRoJywgKCR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkpKTsNCiAgICAgICAgDQogICAgICAgICRzbWFydHktPmFzc2lnbignaGVscF9nZW5lcmFsX3RpdGxlJywgJHRoaXMtPkxhbmcoJ2hlbHBfZ2VuZXJhbF90aXRsZScpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2dlbmVyYWxfdGV4dCcsICR0aGlzLT5MYW5nKCdoZWxwX2dlbmVyYWxfdGV4dCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJywgJHRoaXMtPkxhbmcoJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50JywgJHRoaXMtPkxhbmcoJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2Zyb250ZW5kX3RpdGxlJywgJHRoaXMtPkxhbmcoJ2hlbHBfZnJvbnRlbmRfdGl0bGUnKSk7ICAgICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2Zyb250ZW5kX2NvbnRlbnQnLCAkdGhpcy0+TGFuZygnaGVscF9mcm9udGVuZF9jb250ZW50JykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlbHBfZnJvbnRlbmRfc2FtcGxlJywgY21zX2h0bWxlbnRpdGllcygkdGhpcy0+TGFuZygnaGVscF9mcm9udGVuZF9zYW1wbGUnKSkpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlbHBfYWJvdXRfdGl0bGUnLCAkdGhpcy0+TGFuZygnaGVscF9hYm91dF90aXRsZScpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2Fib3V0X3RleHQnLCAkdGhpcy0+TGFuZygnaGVscF9hYm91dF90ZXh0JykpOw0KDQogICAgICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdoZWxwLnRwbCcpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSB7DQogICAgICAgIHJldHVybiAnR29yYW4gSWxpYyc7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgew0KICAgICAgICByZXR1cm4gJ3VuaXF1M2VAZ21haWwuY29tJzsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgew0KICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpDQogICAgew0KICAgICAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsNCiAgICAgICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOw0KICAgICAgICANCiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2FjdGlvbicsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdtb2RlcycsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd0aGVtZXMnLCBDTEVBTl9TVFJJTkcpOw0KICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbW9kZScsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd0aGVtZScsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd3aWR0aCcsIENMRUFOX1NUUklORyk7DQogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdoZWlnaHQnLCBDTEVBTl9TVFJJTkcpOw0KICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZGl2aWQnLCBDTEVBTl9TVFJJTkcpOw0KDQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVBZG1pbigpDQogICAgew0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdhY3Rpb24nLCAnZGVmYXVsdCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX2FjdGlvbicpKTsNCiAgICAgICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbW9kZXMnLCAnaHRtbCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX21vZGVzJykpOw0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCd0aGVtZXMnLCAndGV4dG1hdGUnLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV90aGVtZXMnKSk7DQogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ21vZGUnLCAnaHRtbCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX21vZGUnKSk7DQogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3RoZW1lJywgJ3RleHRtYXRlJywgJHRoaXMtPkxhbmcoJ2hlbHBfcGFyYW1fdGhlbWUnKSk7DQogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3dpZHRoJywgJzQwMCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX3dpZHRoJykpOw0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdoZWlnaHQnLCAnNDAwJywgJHRoaXMtPkxhbmcoJ2hlbHBfcGFyYW1faGVpZ2h0JykpOw0KICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdkaXZpZCcsICdlZGl0b3InLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV9kaXZpZCcpKTsNCg0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkgDQogICAgew0KICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKENNU19WRVJTSU9OLCAnMS4xMCcpIDwgMCkgew0KICAgICAgICAgICAgJHRoaXMtPkluaXRpYWxpemVGcm9udGVuZCgpOw0KICAgICAgICAgICAgJHRoaXMtPkluaXRpYWxpemVBZG1pbigpOw0KICAgICAgICB9ICAgICAgIA0KICAgIH0gICAgICAgDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gTGF6eUxvYWRGcm9udGVuZCgpIA0KICAgIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIExhenlMb2FkQWRtaW4oKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0gICAgDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAnbXlwcmVmcyc7DQogICAgfSAgIA0KDQogICAgcHVibGljIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnYWRtaW5kZXNjcmlwdGlvbicpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpfHwNCiAgICAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UnKXx8DQogICAgICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgVGVtcGxhdGVzJyk7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgew0KICAgICAgICByZXR1cm4gIjEuOSI7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIE1heGltdW1DTVNWZXJzaW9uKCkgew0KICAgICAgICByZXR1cm4gIjEuMTEiOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7DQogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgew0KICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gSGFzQ2FwYWJpbGl0eSgkY2FwYWJpbGl0eSwgJHBhcmFtcyA9IGFycmF5KCkpIHsNCiAgICAgICAgc3dpdGNoKCRjYXBhYmlsaXR5KQ0KICAgICAgICB7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAnd3lzaXd5Zyc6DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICdzeW50YXhoaWdobGlnaHRpbmcnOg0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIElzV1lTSVdZRygpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBJc1N5bnRheEhpZ2hsaWdodGVyKCkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gU3ludGF4UGFnZUZvcm1TdWJtaXQoKSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gU3ludGF4VGV4dGFyZWEoJG5hbWUgPSAndGV4dGFyZWEnLCAkc3ludGF4ID0gJ2h0bWwnLCAkY29sdW1ucyA9ICc4MCcsICRyb3dzID0gJzE1JywgJGVuY29kaW5nID0gJycsICRjb250ZW50ID0gJycsICRzdHlsZXNoZWV0ID0gJycsICRhZGR0ZXh0ID0gJycpDQogICAgew0KICAgICAgICAkdGV4dGFyZWEgPSAnJzsNCiAgICAgICAgJHRoaXMtPnN5bnRheGFjdGl2ZSA9IHRydWU7DQogICAgICAgICRzbWFydHkgPSAkdGhpcy0+c21hcnR5Ow0KICAgICAgICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndGV4dGFyZWFpZCcsICJlZGl0b3IiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VkaXRvcmlkJywgImFjZS1lZGl0b3IiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3RleHRhcmVhbmFtZScsICRuYW1lKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzeW50YXhfY29udGVudCcsICRjb250ZW50KTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdpZCcsICR0aGlzLT5ub2VkaXRvcnMpOyAgICANCiAgICAgICAgDQoJCS8vIEFzc2lnbiBwcmVmcw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3dpZHRoJywgJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3dpZHRoJywgJzgwJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlaWdodCcsICR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdoZWlnaHQnLCAnNDAnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndGhlbWUnLCAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgndGhlbWUnKSk7IA0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2ZvbnRzaXplJywgJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ2ZvbnRzaXplJykpOyAJCQ0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3NvZnRfd3JhcCcsICR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdzb2Z0X3dyYXAnKSk7IA0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdlbmFibGVfaWUnKSl7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZScsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZScsICdmYWxzZScpOw0KICAgICAgICB9DQoJCSAgICAgICAgICANCiAgICAgICAgaWYgKCR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdmdWxsX2xpbmUnKSl7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2Z1bGxfbGluZScsICdsaW5lJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2Z1bGxfbGluZScsICd0ZXh0Jyk7DQogICAgICAgIH0NCgkJDQogICAgICAgIGlmICgkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnaGlnaGxpZ2h0X2FjdGl2ZScpKXsNCiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbignaGlnaGxpZ2h0X2FjdGl2ZScsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9hY3RpdmUnLCAnZmFsc2UnKTsNCiAgICAgICAgfSANCgkJDQogICAgICAgIGlmICgkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnc2hvd19pbnZpc2libGVzJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2ludmlzaWJsZXMnLCAndHJ1ZScpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2ludmlzaWJsZXMnLCAnZmFsc2UnKTsNCiAgICAgICAgfSANCgkJDQogICAgICAgIGlmICgkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgncGVyc2lzdGVudF9oc2Nyb2xsJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAndHJ1ZScpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAnZmFsc2UnKTsNCiAgICAgICAgfQ0KIA0KICAgICAgICBpZiAoJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3Nob3dfZ3V0dGVyJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2d1dHRlcicsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3Nob3dfZ3V0dGVyJywgJ2ZhbHNlJyk7DQogICAgICAgIH0gICAgICAgIA0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5BY2VHZXRQcmVmZXJlbmNlKCdwcmludF9tYXJnaW4nKSl7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3ByaW50X21hcmdpbicsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3ByaW50X21hcmdpbicsICdmYWxzZScpOw0KICAgICAgICB9ICAgDQoJCQ0KICAgICAgICBpZiAoJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3NvZnRfdGFiJykpew0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzb2Z0X3RhYicsICd0cnVlJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3NvZnRfdGFiJywgJ2ZhbHNlJyk7DQogICAgICAgIH0gDQoJCQ0KICAgICAgICBpZiAoJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9zZWxlY3RlZCcpKXsNCiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbignaGlnaGxpZ2h0X3NlbGVjdGVkJywgJ3RydWUnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbignaGlnaGxpZ2h0X3NlbGVjdGVkJywgJ2ZhbHNlJyk7DQogICAgICAgIH0gDQogICAgICAgIHN3aXRjaCAoJHN5bnRheCkgew0KICAgICAgICAgICAgY2FzZSAnaHRtbCcgOiAkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCdodG1sJyk7ICR0aGlzLT5faHRtbGFjdGl2ZSA9IHRydWU7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnanMnOiBjYXNlICdqYXZhc2NyaXB0JyA6ICRzbWFydHktPmFzc2lnbignbW9kZScsJ2phdmFzY3JpcHQnKTsgJHRoaXMtPl9qYXZhc2NyaXB0YWN0aXZlID0gdHJ1ZTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdjc3MnIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywnY3NzJyk7ICR0aGlzLT5fY3NzYWN0aXZlID0gdHJ1ZTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdwaHAnIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywncGhwJyk7ICR0aGlzIC0+IF9waHBhY3RpdmUgPSB0cnVlOyBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQgOiAkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnbW9kZScpKTsgJHRoaXMtPl9kZWZhdWx0YWN0aXZlID0gdHJ1ZTsgYnJlYWs7ICAgIA0KICAgICAgICB9DQoJCQ0KICAgICAgICAkdGV4dGFyZWEgPSAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhY2UudHBsJyk7DQogICAgICAgICR0aGlzLT5ub2VkaXRvcnMrKzsNCg0KICAgICAgICByZXR1cm4gJHRleHRhcmVhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gU3ludGF4R2VuZXJhdGVIZWFkZXIoJGh0bWxyZXN1bHQgPSAnJykgew0KICAgICAgICANCiAgICAgICAgaWYgKCR0aGlzLT5oZWFkZXJpbmZvc2VudCkgcmV0dXJuICcnOw0KCQkkdGhlbWUgPSAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgndGhlbWUnKTsNCgkJJGNvbXByZXNzaW9uID0gJHRoaXMtPkFjZUdldFByZWZlcmVuY2UoJ3VzZV91bmNvbXByZXNzZWQnKSA/ICctdW5jb21wcmVzc2VkJyA6ICcnOw0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5fY3NzYWN0aXZlKSB7DQogICAgICAgICAgICAkc3ludGF4ID0gJ2Nzcyc7DQogICAgICAgIH0NCgkJDQogICAgICAgIGlmICgkdGhpcy0+X2phdmFzY3JpcHRhY3RpdmUpIHsNCiAgICAgICAgICAgICRzeW50YXggPSAnamF2YXNjcmlwdCc7DQogICAgICAgIH0NCgkJDQogICAgICAgIGlmICgkdGhpcy0+X3BocGFjdGl2ZSkgew0KICAgICAgICAgICAgJHN5bnRheCA9ICdwaHAnOw0KICAgICAgICB9DQoJCQ0KICAgICAgICBpZiAoJHRoaXMtPl9odG1sYWN0aXZlKSB7DQogICAgICAgICAgICAkc3ludGF4ID0gJ2h0bWwnOw0KICAgICAgICB9DQoJCQ0KCQkNCiAgICAgICAgaWYgKCR0aGlzLT5fZGVmYXVsdGFjdGl2ZSl7DQoNCgkJCSRzeW50YXggPSAkdGhpcy0+QWNlR2V0UHJlZmVyZW5jZSgnbW9kZScpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGhlYWRlciA9ICcNCiAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyAuICR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkgLiAnL2Nzcy9qcXVlcnktdWktMS44LjE2LmN1c3RvbS5jc3MiIC8+DQogICAgICAgIDxzY3JpcHQgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy9hY2UnIC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQogICAgICAgIDxzY3JpcHQgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy90aGVtZS0nIC4gJHRoZW1lIC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+JzsNCg0KICAgICAgICBpZiAoJHN5bnRheCAhPSAncGxhaW4nKSB7DQogICAgICAgICAgICAkaGVhZGVyIC49ICcNCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSInIC4gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy9tb2RlLScgLiAkc3ludGF4IC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+JzsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5oZWFkZXJpbmZvc2VudCA9IHRydWU7DQogICAgICAgIHJldHVybiAkaGVhZGVyOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWFkZXJIVE1MKCkgew0KICAgICAgICAkaW5jZGlyID0gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKTsNCiAgICAgICAgJHRtcGwgPSA8PDxFT1QNCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JGluY2Rpcn0vanMvZnVuY3Rpb25zLmpzIj48L3NjcmlwdD4NCkVPVDsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YSgkdG1wbCk7DQogICAgfQ0KCQ0KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkjIE1vZHVsZSBtZXRob2RzDQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCg0KCWZpbmFsIHByaXZhdGUgZnVuY3Rpb24gQWNlR2V0UHJlZmVyZW5jZSgkbmFtZSkgew0KCQ0KCQkkdXNlcmlkID0gZ2V0X3VzZXJpZCgpOw0KCQkkcmVzdWx0ID0gY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nXycuJG5hbWUpOw0KCQkNCiAgICAgICAgaWYgKCRyZXN1bHQgPT09ICcnKSB7DQoJCQkNCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkbmFtZSk7DQogICAgICAgIH0NCg0KCQlyZXR1cm4gJHJlc3VsdDsNCgkJDQoJfQ0KCQ0KfSAvLyBlbmQgb2YgY2xhc3MNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCiRkaXZpZCA9ICcnOw0KJGZvbnRzaXplID0gJzEycHgnOw0KJHRoZW1lID0gJ3R3aWxpZ2h0JzsNCg0KaWYgKCFpc3NldCgkcGFyYW1zWydkaXZpZCddKSkNCglyZXR1cm47DQoJLy8gaWQgb2Ygd3JhcHBpbmcgZWxlbWVudA0KCSRkaXZpZCA9IHRyaW0oJHBhcmFtc1snZGl2aWQnXSk7DQoJLy8gZm9udHNpemUNCgkkZm9udHNpemUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnKTsNCgkvLyB3aWR0aCBvZiB3cmFwcGluZyBlbGVtZW50DQoJJHdpZHRoID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCd3aWR0aCcsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJykpOw0KCS8vIGhlaWdodCBvZiB3cmFwcGluZyBlbGVtZW50DQoJJGhlaWdodCA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywnaGVpZ2h0JywkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfaGVpZ2h0JykpOw0KCS8vIG1vZGUgZm9yIGN1cnJlbnQgYXJlYQ0KCSRtb2RlID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCdtb2RlJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZScpKTsNCgkvLyB0aGVtZSBmb3IgY3VycmVudCBhcmVhDQoJJHRoZW1lID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCd0aGVtZScsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9zeW50YXhhcmVhX3RoZW1lJykpOw0KDQoJJHNtYXJ0eS0+YXNzaWduKCdkaXZpZCcsICRkaXZpZCk7DQoJaWYgKCRtb2RlKQ0KCQkkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCAkbW9kZSk7DQoJaWYgKCR0aGVtZSkNCgkJJHNtYXJ0eS0+YXNzaWduKCd0aGVtZScsICR0aGVtZSk7DQoJaWYgKCRmb250c2l6ZSkNCgkJJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZScsICRmb250c2l6ZSk7DQoJaWYgKCR3aWR0aCkNCgkJJHNtYXJ0eS0+YXNzaWduKCd3aWR0aCcsICR3aWR0aCk7DQoJaWYgKCRoZWlnaHQpDQoJCSRzbWFydHktPmFzc2lnbignaGVpZ2h0JywgJGhlaWdodCk7DQoJDQoJJHNtYXJ0eSAtPiBhc3NpZ24oJ2FjZV91cmwnLCAkdGhpcyAtPiBHZXRNb2R1bGVVUkxQYXRoKCkpOw0KCS8vIG91dHB1dCB0ZW1wbGF0ZQ0KCWVjaG8gJHRoaXMgLT4gUHJvY2Vzc1RlbXBsYXRlKCdvcmlnX2RlZmF1bHQudHBsJyk7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCglpZiAoISgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpfHwkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyl8fCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkpIHsNCgkgICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOw0KCQlyZXR1cm47DQoJfQ0KCQ0KICAgICR1c2VyaWQgPSBnZXRfdXNlcmlkKCk7IC8vIGdldCB1c2VyIGlkDQogICAgDQogCWlmICghZW1wdHkoJHBhcmFtc1snYWN0aXZlX3RhYiddKSkgew0KCSR0YWIgPSAkcGFyYW1zWydhY3RpdmVfdGFiJ107DQoJfSBlbHNlIHsNCgkJJHRhYiA9ICdzZXR0aW5ncyc7DQoJfQkNCgkvKiBUYWJIZWFkZXJzICovDQoJZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7DQoJCS8vIGJhY2tlbmQNCgkJaWYgKCgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyl8fCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkpIHsNCgkJICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignc2V0dGluZ3MnLCAkdGhpcy0+TGFuZygnc2V0dGluZ3NfdGFiJyksICgkdGFiID09ICdzZXR0aW5ncycpKTsNCiAgICAgICAgfQ0KCQkvLyBmcm9udGVuZA0KCQlpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkgew0KCQkgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignZnJvbnRlbmRzZXR0aW5ncycsICR0aGlzLT5MYW5nKCdmcm9udGVuZHNldHRpbmdzX3RhYicpLCAoJHRhYiA9PSAnZnJvbnRlbmRzZXR0aW5ncycpKTsNCiAgICAgICAgfQ0KCWVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsNCgkNCgkvKiBUYWJDb250ZW50ICovDQoJZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7DQoJCS8vIGJhY2tlbmQNCgkJaWYgKCgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpfHwkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJyl8fCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkpIHsNCgkJICBlY2hvICR0aGlzLT5TdGFydFRhYignc2V0dGluZ3MnLCAkcGFyYW1zKTsNCgkgICAJICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX3ByZWZzdGFiLnBocCcpOw0KCQkgIGVjaG8gJHRoaXMtPkVuZFRhYigpOw0KICAgICAgICB9DQoJCS8vIGZyb250ZW5kDQoJCWlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7DQoJCSAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2Zyb250ZW5kc2V0dGluZ3MnLCAkcGFyYW1zKTsNCgkJICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fZnJvbnRlbmRwcmVmc3RhYi5waHAnKTsNCgkJICBlY2hvICR0aGlzLT5FbmRUYWIoKTsNCiAgICAgICAgfQ0KCWVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.head.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCi8vIGluaXRpYWxpemUNCiR0aGlzLT5kaXZpZCA9ICcnOw0KLy8gc2VsZWN0ZWQgdGhlbWVzDQokdGhpcy0+dGhlbWVzID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCAndGhlbWVzJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3RoZW1lJykpOw0KLy8gc2VsZWN0ZWQgbW9kZXMNCiR0aGlzLT5tb2RlcyA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywgJ21vZGVzJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX21vZGUnKSk7DQoNCglpZiAoaXNzZXQoJHBhcmFtc1snZGl2aWQnXSkpDQoJCSR0aGlzLT5kaXZpZCA9IHRyaW0oJHBhcmFtc1snZGl2aWQnXSk7DQoJaWYgKCFpc19hcnJheSgkdGhpcy0+bW9kZSkpIHsNCgkJJHRoaXMtPm1vZGVzID0gZXhwbG9kZSgnLCcsICR0aGlzLT5tb2Rlcyk7DQoJfQ0KCWlmIChpc3NldCgkdGhpcy0+dGhlbWVzKSAmJiAhaXNfYXJyYXkoJHRoaXMtPnRoZW1lcykpIHsNCgkJJHRoaXMtPnRoZW1lcyA9IGV4cGxvZGUoJywnLCAkdGhpcy0+dGhlbWVzKTsNCgl9DQoJaWYgKGlzc2V0KCR0aGlzLT50aGVtZXMpKSB7DQoJCSRzbWFydHktPmFzc2lnbigndGhlbWVzJywgJHRoaXMtPnRoZW1lcyk7DQoJfQ0KDQoJJHNtYXJ0eS0+YXNzaWduKCdtb2RlcycsICR0aGlzLT5tb2Rlcyk7DQoJJHNtYXJ0eS0+YXNzaWduKCdhY2VfdXJsJywgJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKSk7DQoJLy8gb3V0cHV0IHRlbXBsYXRlDQoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdvcmlnX2hlYWQuanMnKTsNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savefrontendsettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCglpZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpIHsNCgkJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOw0KCQlyZXR1cm47DQoJfQ0KDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfd2lkdGgnXSkpIA0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmcm9udGVuZF93aWR0aCcsICRwYXJhbXNbJ2Zyb250ZW5kX3dpZHRoJ10pOwkNCg0KCWlmKGlzc2V0KCRwYXJhbXNbJ2Zyb250ZW5kX2hlaWdodCddKSkgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2hlaWdodCcsICRwYXJhbXNbJ2Zyb250ZW5kX2hlaWdodCddKTsJCQ0KDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfbW9kZSddKSkgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX21vZGUnLCBpbXBsb2RlKCcsJywgJHBhcmFtc1snZnJvbnRlbmRfbW9kZSddKSk7DQoNCglpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZF9zeW50YXhhcmVhX21vZGUnXSkpDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZScsICRwYXJhbXNbJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZSddKTsJDQoNCglpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZF90aGVtZSddKSkgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3RoZW1lJywgaW1wbG9kZSgnLCcsICRwYXJhbXNbJ2Zyb250ZW5kX3RoZW1lJ10pKTsJDQoJDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZSddKSkNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICRwYXJhbXNbJ2Zyb250ZW5kX3N5bnRheGFyZWFfdGhlbWUnXSk7DQoJDQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfZm9udHNpemUnXSkpDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2ZvbnRzaXplJywgJHBhcmFtc1snZnJvbnRlbmRfZm9udHNpemUnXSk7CQkJCQkNCg0KCS8vIHJlZGlyZWN0IHRvIHRhYgkJCQ0KCSRwYXJhbXMgPSBhcnJheSgnbW9kdWxlX21lc3NhZ2UnID0+ICR0aGlzLT5MYW5nKCdzZXR0aW5nc3NhdmVkJyksICdhY3RpdmVfdGFiJyA9PiAnZnJvbnRlbmRzZXR0aW5ncycpOw0KCSR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCmlmICghKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UnKXx8JHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKSkgew0KCWVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsNCglyZXR1cm47DQp9DQoNCiR1c2VyaWQgPSBnZXRfdXNlcmlkKCk7IA0KDQppZighZW1wdHkoJHBhcmFtc1snd2lkdGgnXSkpDQp7DQogICAgY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsICR0aGlzLT5HZXROYW1lKCkuJ193aWR0aCcsICRwYXJhbXNbJ3dpZHRoJ10pOw0KfQ0KDQppZighZW1wdHkoJHBhcmFtc1snaGVpZ2h0J10pKQ0Kew0KICAgIGNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19oZWlnaHQnLCAkcGFyYW1zWydoZWlnaHQnXSk7DQp9DQoNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19lbmFibGVfaWUnLCAoaXNzZXQoJHBhcmFtc1snZW5hYmxlX2llJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ191c2VfdW5jb21wcmVzc2VkJywgKGlzc2V0KCRwYXJhbXNbJ3VzZV91bmNvbXByZXNzZWQnXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX21vZGUnLCAkcGFyYW1zWydtb2RlJ10pOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX3RoZW1lJywgJHBhcmFtc1sndGhlbWUnXSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZm9udHNpemUnLCAkcGFyYW1zWydmb250c2l6ZSddKTsgDQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZnVsbF9saW5lJywgKGlzc2V0KCRwYXJhbXNbJ2Z1bGxfbGluZSddKSA/IDEgOiAwKSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfaGlnaGxpZ2h0X2FjdGl2ZScsIChpc3NldCgkcGFyYW1zWydoaWdobGlnaHRfYWN0aXZlJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19zaG93X2ludmlzaWJsZXMnLCAoaXNzZXQoJHBhcmFtc1snc2hvd19pbnZpc2libGVzJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19wZXJzaXN0ZW50X2hzY3JvbGwnLCAoaXNzZXQoJHBhcmFtc1sncGVyc2lzdGVudF9oc2Nyb2xsJ10pID8gMSA6IDApKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19rZXliaW5kaW5nJywgKGlzc2V0KCRwYXJhbXNbJ2tleWJpbmRpbmcnXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX3NvZnRfd3JhcCcsICRwYXJhbXNbJ3NvZnRfd3JhcCddKTsNCmNtc191c2VycHJlZnM6OnNldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19zaG93X2d1dHRlcicsIChpc3NldCgkcGFyYW1zWydzaG93X2d1dHRlciddKSA/IDEgOiAwKSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfcHJpbnRfbWFyZ2luJywgKGlzc2V0KCRwYXJhbXNbJ3ByaW50X21hcmdpbiddKSA/IDEgOiAwKSk7DQpjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc29mdF90YWInLCAoaXNzZXQoJHBhcmFtc1snc29mdF90YWInXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2hpZ2hsaWdodF9zZWxlY3RlZCcsIChpc3NldCgkcGFyYW1zWydoaWdobGlnaHRfc2VsZWN0ZWQnXSkgPyAxIDogMCkpOw0KY21zX3VzZXJwcmVmczo6c2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2VuYWJsZV9iZWhhdmlvcnMnLCAoaXNzZXQoJHBhcmFtc1snZW5hYmxlX2JlaGF2aW9ycyddKSA/IDEgOiAwKSk7ICAgIAkJCQkNCg0KLy8gcmVkaXJlY3QgdG8gdGFiDQokcGFyYW1zID0gYXJyYXkoJ21vZHVsZV9tZXNzYWdlJyA9PiAkdGhpcy0+TGFuZygnc2V0dGluZ3NzYXZlZCcpLCAnYWN0aXZlX3RhYicgPT4gJ3NldHRpbmdzJyk7DQokdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsICRwYXJhbXMpOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/css/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/css/images/ui-bg_flat_0_aaaaaa_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAe0lEQVRoge3OMQHAIBAAMcC/kjdZJHTI0A4XBdkz86wfO18H3hRUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUF8O8A8WdY6opAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_flat_75_ffffff_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAeUlEQVRoge3OMQHAIBAAsVL/nh8JDDfAkCjImpn5HvbfDpwIVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVhtqiwTEKTLXTgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_55_fbf9ee_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAP0lEQVQ4je3PMQrAMABC0a/3v2zX0mCXNkOgc6C4PARd5DqPGKCU8luS8SbAQhiCQRgJE56kZTfbbP9RSvnkBsWcEAZRWcgqAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAMElEQVQ4je3LIQ4AIBTD0O3f/8wrFgmKhMy8pKJKwkhSKeVbbGuAPU9f4PIopTxgAeS0DRtI4yK0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_75_dadada_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANklEQVQ4jWN48uTJfyYGBgaGUWKUGCWGLfHt2zcoi5GREYNgYmJCZiG42IiB98woMUqMEtgIAMdjCdyg+eEBAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_75_e6e6e6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANUlEQVQ4je3LMQoAIBADwb38/6t5wFXaWAiCtUiaYZvF9hBACOFbuntVVe11B0CSjjeE8BwThQIJ8dhEl0YAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_95_fef1ec_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAPklEQVQ4je3PMQqAMABD0Z/c/7aCIAXjJIhD10LJ8vgZw30eMUApZV/GhZNgSTjoLYElY/hNMJ/S6gullCkPiCIPCr4NiEwAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAALElEQVQYlWN49OjRfyYGBgaGIUT8//8fSqBx0Yh///4RL8vAwAAVQ2MNOwIAl6g6KkOJwk8AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_2e83ff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvzLrJBNAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiTww4gUAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_454545_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEVERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkQfbf86AAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_888888_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEWMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMiozJxoFPAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_cd0a0a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEXMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzrDkZjAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/jquery-ui-1.8.16.custom.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoNCiAqIGpRdWVyeSBVSSBDU1MgRnJhbWV3b3JrIDEuOC4xNg0KICoNCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkNCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLg0KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQ0KICoNCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvVGhlbWluZy9BUEkNCiAqLw0KDQovKiBMYXlvdXQgaGVscGVycw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoudWktaGVscGVyLWhpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH0NCi51aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUgeyBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsgY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpOyBjbGlwOiByZWN0KDFweCwxcHgsMXB4LDFweCk7IH0NCi51aS1oZWxwZXItcmVzZXQgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJvcmRlcjogMDsgb3V0bGluZTogMDsgbGluZS1oZWlnaHQ6IDEuMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDEwMCU7IGxpc3Qtc3R5bGU6IG5vbmU7IH0NCi51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgeyBjb250ZW50OiAiLiI7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDA7IGNsZWFyOiBib3RoOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0NCi51aS1oZWxwZXItY2xlYXJmaXggeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0NCi8qIHJlcXVpcmVkIGNvbW1lbnQgZm9yIGNsZWFyZml4IHRvIHdvcmsgaW4gT3BlcmEgXCovDQoqIGh0bWwgLnVpLWhlbHBlci1jbGVhcmZpeCB7IGhlaWdodDoxJTsgfQ0KLnVpLWhlbHBlci1jbGVhcmZpeCB7IGRpc3BsYXk6YmxvY2s7IH0NCi8qIGVuZCBjbGVhcmZpeCAqLw0KLnVpLWhlbHBlci16Zml4IHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTApOyB9DQoNCg0KLyogSW50ZXJhY3Rpb24gQ3Vlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoudWktc3RhdGUtZGlzYWJsZWQgeyBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDsgfQ0KDQoNCi8qIEljb25zDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogc3RhdGVzIGFuZCBpbWFnZXMgKi8NCi51aS1pY29uIHsgZGlzcGxheTogYmxvY2s7IHRleHQtaW5kZW50OiAtOTk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfQ0KDQoNCi8qIE1pc2MgdmlzdWFscw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIE92ZXJsYXlzICovDQoudWktd2lkZ2V0LW92ZXJsYXkgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfQ0KDQoNCi8qDQogKiBqUXVlcnkgVUkgQ1NTIEZyYW1ld29yayAxLjguMTYNCiAqDQogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpDQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4NCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UNCiAqDQogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1RoZW1pbmcvQVBJDQogKg0KICogVG8gdmlldyBhbmQgbW9kaWZ5IHRoaXMgdGhlbWUsIHZpc2l0IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvP2ZmRGVmYXVsdD1WZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWYmZndEZWZhdWx0PW5vcm1hbCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPWNjY2NjYyZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj03NSZib3JkZXJDb2xvckhlYWRlcj1hYWFhYWEmZmNIZWFkZXI9MjIyMjIyJmljb25Db2xvckhlYWRlcj0yMjIyMjImYmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmJnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD03NSZib3JkZXJDb2xvckNvbnRlbnQ9YWFhYWFhJmZjQ29udGVudD0yMjIyMjImaWNvbkNvbG9yQ29udGVudD0yMjIyMjImYmdDb2xvckRlZmF1bHQ9ZTZlNmU2JmJnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9NzUmYm9yZGVyQ29sb3JEZWZhdWx0PWQzZDNkMyZmY0RlZmF1bHQ9NTU1NTU1Jmljb25Db2xvckRlZmF1bHQ9ODg4ODg4JmJnQ29sb3JIb3Zlcj1kYWRhZGEmYmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTc1JmJvcmRlckNvbG9ySG92ZXI9OTk5OTk5JmZjSG92ZXI9MjEyMTIxJmljb25Db2xvckhvdmVyPTQ1NDU0NSZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT02NSZib3JkZXJDb2xvckFjdGl2ZT1hYWFhYWEmZmNBY3RpdmU9MjEyMTIxJmljb25Db2xvckFjdGl2ZT00NTQ1NDUmYmdDb2xvckhpZ2hsaWdodD1mYmY5ZWUmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmNlZmExJmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MmU4M2ZmJmJnQ29sb3JFcnJvcj1mZWYxZWMmYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTk1JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9Y2QwYTBhJmljb25Db2xvckVycm9yPWNkMGEwYSZiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmb3BhY2l0eU92ZXJsYXk9MzAmYmdDb2xvclNoYWRvdz1hYWFhYWEmYmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PThweCZvZmZzZXRUb3BTaGFkb3c9LThweCZvZmZzZXRMZWZ0U2hhZG93PS04cHgmY29ybmVyUmFkaXVzU2hhZG93PThweA0KICovDQoNCg0KLyogQ29tcG9uZW50IGNvbnRhaW5lcnMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLnVpLXdpZGdldCB7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMS4xZW07IH0NCi51aS13aWRnZXQgLnVpLXdpZGdldCB7IGZvbnQtc2l6ZTogMWVtOyB9DQoudWktd2lkZ2V0IGlucHV0LCAudWktd2lkZ2V0IHNlbGVjdCwgLnVpLXdpZGdldCB0ZXh0YXJlYSwgLnVpLXdpZGdldCBidXR0b24geyBmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDFlbTsgfQ0KLnVpLXdpZGdldC1jb250ZW50IHsgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsgYmFja2dyb3VuZDogI2ZmZmZmZiB1cmwoaW1hZ2VzL3VpLWJnX2ZsYXRfNzVfZmZmZmZmXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGNvbG9yOiAjMjIyMjIyOyB9DQoudWktd2lkZ2V0LWNvbnRlbnQgYSB7IGNvbG9yOiAjMjIyMjIyOyB9DQoudWktd2lkZ2V0LWhlYWRlciB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNjY2NjY2MgdXJsKGltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9jY2NjY2NfMXgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzIyMjIyMjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCi51aS13aWRnZXQtaGVhZGVyIGEgeyBjb2xvcjogIzIyMjIyMjsgfQ0KDQovKiBJbnRlcmFjdGlvbiBzdGF0ZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHQgeyBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzOyBiYWNrZ3JvdW5kOiAjZTZlNmU2IHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZTZlNmU2XzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICM1NTU1NTU7IH0NCi51aS1zdGF0ZS1kZWZhdWx0IGEsIC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywgLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVkIHsgY29sb3I6ICM1NTU1NTU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQ0KLnVpLXN0YXRlLWhvdmVyLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhvdmVyLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaG92ZXIsIC51aS1zdGF0ZS1mb2N1cywgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1mb2N1cywgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWZvY3VzIHsgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsgYmFja2dyb3VuZDogI2RhZGFkYSB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2RhZGFkYV8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjMjEyMTIxOyB9DQoudWktc3RhdGUtaG92ZXIgYSwgLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIgeyBjb2xvcjogIzIxMjEyMTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQoudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZSB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKGltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzIxMjEyMTsgfQ0KLnVpLXN0YXRlLWFjdGl2ZSBhLCAudWktc3RhdGUtYWN0aXZlIGE6bGluaywgLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWQgeyBjb2xvcjogIzIxMjEyMTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQoudWktd2lkZ2V0IDphY3RpdmUgeyBvdXRsaW5lOiBub25lOyB9DQoNCi8qIEludGVyYWN0aW9uIEN1ZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgIHtib3JkZXI6IDFweCBzb2xpZCAjZmNlZmExOyBiYWNrZ3JvdW5kOiAjZmJmOWVlIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNTVfZmJmOWVlXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgY29sb3I6ICMzNjM2MzY7IH0NCi51aS1zdGF0ZS1oaWdobGlnaHQgYSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQgYSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0IGEgeyBjb2xvcjogIzM2MzYzNjsgfQ0KLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNjZDBhMGE7IGJhY2tncm91bmQ6ICNmZWYxZWMgdXJsKGltYWdlcy91aS1iZ19nbGFzc185NV9mZWYxZWNfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogI2NkMGEwYTsgfQ0KLnVpLXN0YXRlLWVycm9yIGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IgYSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIGEgeyBjb2xvcjogI2NkMGEwYTsgfQ0KLnVpLXN0YXRlLWVycm9yLXRleHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3ItdGV4dCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHQgeyBjb2xvcjogI2NkMGEwYTsgfQ0KLnVpLXByaW9yaXR5LXByaW1hcnksIC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnkgeyBmb250LXdlaWdodDogYm9sZDsgfQ0KLnVpLXByaW9yaXR5LXNlY29uZGFyeSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1zZWNvbmRhcnksICAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5IHsgb3BhY2l0eTogLjc7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTcwKTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQ0KLnVpLXN0YXRlLWRpc2FibGVkLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRpc2FibGVkLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGlzYWJsZWQgeyBvcGFjaXR5OiAuMzU7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KTsgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsgfQ0KDQovKiBJY29ucw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovDQoudWktaWNvbiB7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nKTsgfQ0KLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0NCi51aS13aWRnZXQtaGVhZGVyIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0NCi51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29uIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc184ODg4ODhfMjU2eDI0MC5wbmcpOyB9DQoudWktc3RhdGUtaG92ZXIgLnVpLWljb24sIC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOyB9DQoudWktc3RhdGUtYWN0aXZlIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzQ1NDU0NV8yNTZ4MjQwLnBuZyk7IH0NCi51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMmU4M2ZmXzI1NngyNDAucG5nKTsgfQ0KLnVpLXN0YXRlLWVycm9yIC51aS1pY29uLCAudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc19jZDBhMGFfMjU2eDI0MC5wbmcpOyB9DQoNCi8qIHBvc2l0aW9uaW5nICovDQoudWktaWNvbi1jYXJhdC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH0NCi51aS1pY29uLWNhcmF0LTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAwOyB9DQoudWktaWNvbi1jYXJhdC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAwOyB9DQoudWktaWNvbi1jYXJhdC0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IDA7IH0NCi51aS1pY29uLWNhcmF0LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDA7IH0NCi51aS1pY29uLWNhcmF0LTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggMDsgfQ0KLnVpLWljb24tY2FyYXQtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggMDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNnB4OyB9DQoudWktaWNvbi10cmlhbmdsZS0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNnB4OyB9DQoudWktaWNvbi10cmlhbmdsZS0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNnB4OyB9DQoudWktaWNvbi10cmlhbmdsZS0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTZweDsgfQ0KLnVpLWljb24tdHJpYW5nbGUtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2cHg7IH0NCi51aS1pY29uLXRyaWFuZ2xlLTItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4OyB9DQoudWktaWNvbi1hcnJvdy0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMzJweDsgfQ0KLnVpLWljb24tYXJyb3ctMi1uZS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMzJweDsgfQ0KLnVpLWljb24tYXJyb3ctMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTMycHg7IH0NCi51aS1pY29uLWFycm93LTItc2UtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTMycHg7IH0NCi51aS1pY29uLWFycm93c3RvcC0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTMycHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGljay0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGljay0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGljay0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2stMi1zZS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTQ4cHg7IH0NCi51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtNDhweDsgfQ0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OyB9DQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJuLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC02NHB4OyB9DQoudWktaWNvbi1hcnJvd3JldHVybi0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZXR1cm4tMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTY0cHg7IH0NCi51aS1pY29uLWFycm93cmV0dXJuLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNjRweDsgfQ0KLnVpLWljb24tYXJyb3ctNCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTgwcHg7IH0NCi51aS1pY29uLWFycm93LTQtZGlhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC04MHB4OyB9DQoudWktaWNvbi1leHRsaW5rIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHg7IH0NCi51aS1pY29uLW5ld3dpbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC04MHB4OyB9DQoudWktaWNvbi1yZWZyZXNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTgwcHg7IH0NCi51aS1pY29uLXNodWZmbGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtODBweDsgfQ0KLnVpLWljb24tdHJhbnNmZXItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTgwcHg7IH0NCi51aS1pY29uLXRyYW5zZmVydGhpY2stZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC04MHB4OyB9DQoudWktaWNvbi1mb2xkZXItY29sbGFwc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsgfQ0KLnVpLWljb24tZm9sZGVyLW9wZW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtOTZweDsgfQ0KLnVpLWljb24tZG9jdW1lbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtOTZweDsgfQ0KLnVpLWljb24tZG9jdW1lbnQtYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4OyB9DQoudWktaWNvbi1ub3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTk2cHg7IH0NCi51aS1pY29uLW1haWwtY2xvc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTk2cHg7IH0NCi51aS1pY29uLW1haWwtb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4OyB9DQoudWktaWNvbi1zdWl0Y2FzZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtOTZweDsgfQ0KLnVpLWljb24tY29tbWVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtOTZweDsgfQ0KLnVpLWljb24tcGVyc29uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4OyB9DQoudWktaWNvbi1wcmludCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtOTZweDsgfQ0KLnVpLWljb24tdHJhc2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTk2cHg7IH0NCi51aS1pY29uLWxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtOTZweDsgfQ0KLnVpLWljb24tdW5sb2NrZWQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTk2cHg7IH0NCi51aS1pY29uLWJvb2ttYXJrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC05NnB4OyB9DQoudWktaWNvbi10YWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7IH0NCi51aS1pY29uLWhvbWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMTJweDsgfQ0KLnVpLWljb24tZmxhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMTJweDsgfQ0KLnVpLWljb24tY2FsZW5kYXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTEycHg7IH0NCi51aS1pY29uLWNhcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTEycHg7IH0NCi51aS1pY29uLXBlbmNpbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMTJweDsgfQ0KLnVpLWljb24tY2xvY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTEycHg7IH0NCi51aS1pY29uLWRpc2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTEycHg7IH0NCi51aS1pY29uLWNhbGN1bGF0b3IgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTExMnB4OyB9DQoudWktaWNvbi16b29taW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4OyB9DQoudWktaWNvbi16b29tb3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xMTJweDsgfQ0KLnVpLWljb24tc2VhcmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMTJweDsgfQ0KLnVpLWljb24td3JlbmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDsgfQ0KLnVpLWljb24tZ2VhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTEycHg7IH0NCi51aS1pY29uLWhlYXJ0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xMTJweDsgfQ0KLnVpLWljb24tc3RhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7IH0NCi51aS1pY29uLWxpbmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTExMnB4OyB9DQoudWktaWNvbi1jYW5jZWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMjhweDsgfQ0KLnVpLWljb24tcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweDsgfQ0KLnVpLWljb24tcGx1c3RoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyB9DQoudWktaWNvbi1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMjhweDsgfQ0KLnVpLWljb24tbWludXN0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweDsgfQ0KLnVpLWljb24tY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTI4cHg7IH0NCi51aS1pY29uLWNsb3NldGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTI4cHg7IH0NCi51aS1pY29uLWtleSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7IH0NCi51aS1pY29uLWxpZ2h0YnVsYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7IH0NCi51aS1pY29uLXNjaXNzb3JzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xMjhweDsgfQ0KLnVpLWljb24tY2xpcGJvYXJkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMjhweDsgfQ0KLnVpLWljb24tY29weSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTI4cHg7IH0NCi51aS1pY29uLWNvbnRhY3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTEyOHB4OyB9DQoudWktaWNvbi1pbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHg7IH0NCi51aS1pY29uLXZpZGVvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMjhweDsgfQ0KLnVpLWljb24tc2NyaXB0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0xMjhweDsgfQ0KLnVpLWljb24tYWxlcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDsgfQ0KLnVpLWljb24taW5mbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNDRweDsgfQ0KLnVpLWljb24tbm90aWNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE0NHB4OyB9DQoudWktaWNvbi1oZWxwIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE0NHB4OyB9DQoudWktaWNvbi1jaGVjayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNDRweDsgfQ0KLnVpLWljb24tYnVsbGV0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE0NHB4OyB9DQoudWktaWNvbi1yYWRpby1vZmYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTQ0cHg7IH0NCi51aS1pY29uLXJhZGlvLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNDRweDsgfQ0KLnVpLWljb24tcGluLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE0NHB4OyB9DQoudWktaWNvbi1waW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTQ0cHg7IH0NCi51aS1pY29uLXBsYXkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNjBweDsgfQ0KLnVpLWljb24tcGF1c2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTYwcHg7IH0NCi51aS1pY29uLXNlZWstbmV4dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweDsgfQ0KLnVpLWljb24tc2Vlay1wcmV2IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2MHB4OyB9DQoudWktaWNvbi1zZWVrLWVuZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNjBweDsgfQ0KLnVpLWljb24tc2Vlay1zdGFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQ0KLyogdWktaWNvbi1zZWVrLWZpcnN0IGlzIGRlcHJlY2F0ZWQsIHVzZSB1aS1pY29uLXNlZWstc3RhcnQgaW5zdGVhZCAqLw0KLnVpLWljb24tc2Vlay1maXJzdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQ0KLnVpLWljb24tc3RvcCB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNjBweDsgfQ0KLnVpLWljb24tZWplY3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2MHB4OyB9DQoudWktaWNvbi12b2x1bWUtb2ZmIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNjBweDsgfQ0KLnVpLWljb24tdm9sdW1lLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNjBweDsgfQ0KLnVpLWljb24tcG93ZXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNzZweDsgfQ0KLnVpLWljb24tc2lnbmFsLWRpYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTc2cHg7IH0NCi51aS1pY29uLXNpZ25hbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNzZweDsgfQ0KLnVpLWljb24tYmF0dGVyeS0wIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE3NnB4OyB9DQoudWktaWNvbi1iYXR0ZXJ5LTEgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTc2cHg7IH0NCi51aS1pY29uLWJhdHRlcnktMiB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNzZweDsgfQ0KLnVpLWljb24tYmF0dGVyeS0zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE3NnB4OyB9DQoudWktaWNvbi1jaXJjbGUtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE5MnB4OyB9DQoudWktaWNvbi1jaXJjbGUtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE5MnB4OyB9DQoudWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS1hcnJvdy1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLWFycm93LXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE5MnB4OyB9DQoudWktaWNvbi1jaXJjbGUtYXJyb3ctdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS1hcnJvdy1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLXpvb21pbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTkycHg7IH0NCi51aS1pY29uLWNpcmNsZS16b29tb3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xOTJweDsgfQ0KLnVpLWljb24tY2lyY2xlc21hbGwtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIwOHB4OyB9DQoudWktaWNvbi1jaXJjbGVzbWFsbC1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMDhweDsgfQ0KLnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjA4cHg7IH0NCi51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjA4cHg7IH0NCi51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIwOHB4OyB9DQoudWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweDsgfQ0KLnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yMjRweDsgfQ0KLnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMjRweDsgfQ0KLnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMjRweDsgfQ0KLnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIyNHB4OyB9DQoudWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMjI0cHg7IH0NCi51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHg7IH0NCg0KDQovKiBNaXNjIHZpc3VhbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBDb3JuZXIgcmFkaXVzICovDQoudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci10b3AsIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci10bCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyAta2h0bWwtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IH0NCi51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLXRvcCwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci10ciB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyB9DQoudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci1ib3R0b20sIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci1ibCB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyAta2h0bWwtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IH0NCi51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLWJvdHRvbSwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci1iciB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9DQoNCi8qIE92ZXJsYXlzICovDQoudWktd2lkZ2V0LW92ZXJsYXkgeyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyB9DQoudWktd2lkZ2V0LXNoYWRvdyB7IG1hcmdpbjogLThweCAwIDAgLThweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyAtbW96LWJvcmRlci1yYWRpdXM6IDhweDsgLWtodG1sLWJvcmRlci1yYWRpdXM6IDhweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgfS8qDQogKiBqUXVlcnkgVUkgUmVzaXphYmxlIDEuOC4xNg0KICoNCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkNCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLg0KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQ0KICoNCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvUmVzaXphYmxlI3RoZW1pbmcNCiAqLw0KLnVpLXJlc2l6YWJsZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTt9DQoudWktcmVzaXphYmxlLWhhbmRsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTtmb250LXNpemU6IDAuMXB4O3otaW5kZXg6IDk5OTk5OyBkaXNwbGF5OiBibG9jazsgfQ0KLnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSwgLnVpLXJlc2l6YWJsZS1hdXRvaGlkZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0NCi51aS1yZXNpemFibGUtbiB7IGN1cnNvcjogbi1yZXNpemU7IGhlaWdodDogN3B4OyB3aWR0aDogMTAwJTsgdG9wOiAtNXB4OyBsZWZ0OiAwOyB9DQoudWktcmVzaXphYmxlLXMgeyBjdXJzb3I6IHMtcmVzaXplOyBoZWlnaHQ6IDdweDsgd2lkdGg6IDEwMCU7IGJvdHRvbTogLTVweDsgbGVmdDogMDsgfQ0KLnVpLXJlc2l6YWJsZS1lIHsgY3Vyc29yOiBlLXJlc2l6ZTsgd2lkdGg6IDdweDsgcmlnaHQ6IC01cHg7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB9DQoudWktcmVzaXphYmxlLXcgeyBjdXJzb3I6IHctcmVzaXplOyB3aWR0aDogN3B4OyBsZWZ0OiAtNXB4OyB0b3A6IDA7IGhlaWdodDogMTAwJTsgfQ0KLnVpLXJlc2l6YWJsZS1zZSB7IGN1cnNvcjogc2UtcmVzaXplOyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4OyByaWdodDogMXB4OyBib3R0b206IDFweDsgfQ0KLnVpLXJlc2l6YWJsZS1zdyB7IGN1cnNvcjogc3ctcmVzaXplOyB3aWR0aDogOXB4OyBoZWlnaHQ6IDlweDsgbGVmdDogLTVweDsgYm90dG9tOiAtNXB4OyB9DQoudWktcmVzaXphYmxlLW53IHsgY3Vyc29yOiBudy1yZXNpemU7IHdpZHRoOiA5cHg7IGhlaWdodDogOXB4OyBsZWZ0OiAtNXB4OyB0b3A6IC01cHg7IH0NCi51aS1yZXNpemFibGUtbmUgeyBjdXJzb3I6IG5lLXJlc2l6ZTsgd2lkdGg6IDlweDsgaGVpZ2h0OiA5cHg7IHJpZ2h0OiAtNXB4OyB0b3A6IC01cHg7fQ==]]></data>
	</file>
	<file>
	  <filename>/function.admin_frontendprefstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KCWlmIChpc3NldCgkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKSkgDQoJew0KCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZXhhbXBsZV9zeW50YXgnLCAkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKTsNCgl9DQoJCSRzbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlZnJvbnRlbmRzZXR0aW5ncycsICRyZXR1cm5pZCkpOw0KCQkkc21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsNCgkJJHNtYXJ0eS0+YXNzaWduKCdzZXR0aW5nc3RleHQnLCAkdGhpcy0+TGFuZygnZnJvbnRlbmRfaGVhZF9zZXR0aW5ncycpKTsNCgkJJHNtYXJ0eS0+YXNzaWduKCdzeW50YXhfc2V0dGluZ3N0ZXh0JywgJHRoaXMtPkxhbmcoJ2Zyb250ZW5kX3N5bnRheGFyZWFfc2V0dGluZ3MnKSk7DQoJCSRzbWFydHktPmFzc2lnbignaGVhZF9kZXNjcmlwdGlvbicsICR0aGlzLT5MYW5nKCdoZWFkX2Rlc2NyaXB0aW9uJykpOw0KCQkkc21hcnR5LT5hc3NpZ24oJ2NvbnRlbnRfZGVzY3JpcHRpb24nLCAkdGhpcy0+TGFuZygnY29udGVudF9kZXNjcmlwdGlvbicpKTsNCgkJDQoJCSRzbWFydHktPmFzc2lnbignd2lkdGhfdGl0bGUnLCAkdGhpcy0+TGFuZygnZnJvbnRlbmRfd2lkdGhfdGl0bGUnKSk7DQoJCSRzbWFydHktPmFzc2lnbignd2lkdGhfaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2Zyb250ZW5kX3dpZHRoJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJywgJzUwMCcpLCAxMCwgMjU1KSk7CQkNCgkJJHNtYXJ0eS0+YXNzaWduKCdoZWlnaHRfdGl0bGUnLCAkdGhpcy0+TGFuZygnZnJvbnRlbmRfaGVpZ2h0X3RpdGxlJykpOw0KCQkkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnZnJvbnRlbmRfaGVpZ2h0JywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2hlaWdodCcsICc0MDAnKSwgMTAsIDI1NSkpOw0KCQkNCgkJLyogbW9kZXMgKi8NCgkJJHNtYXJ0eS0+YXNzaWduKCdmcm9udGVuZF9zeW50YXhfbW9kZScsICR0aGlzLT5MYW5nKCdzeW50YXhfbW9kZScpKTsNCgkJCSRtb2RlcyA9IGFycmF5KA0KCQkJCSR0aGlzLT5MYW5nKCdqcycpID0+ICdqYXZhc2NyaXB0JywgDQoJCQkJJHRoaXMtPkxhbmcoJ3BsYWluJykgPT4gJ3BsYWluJywgDQoJCQkJJHRoaXMtPkxhbmcoJ3N2ZycpID0+ICdzdmcnLCANCgkJCQkkdGhpcy0+TGFuZygnaHRtbCcpID0+ICdodG1sJywNCgkJCQkkdGhpcy0+TGFuZygnY3NzJykgPT4gJ2NzcycsDQoJCQkJJHRoaXMtPkxhbmcoJ3Njc3MnKSA9PiAnc2NzcycsDQoJCQkJJHRoaXMtPkxhbmcoJ2NvZmZlZScpID0+ICdjb2ZmZWUnLA0KCQkJCSR0aGlzLT5MYW5nKCdqc29uJykgPT4gJ2pzb24nLA0KCQkJCSR0aGlzLT5MYW5nKCdweXRob24nKSA9PiAncHl0aG9uJywNCgkJCQkkdGhpcy0+TGFuZygncnVieScpID0+ICdydWJ5JywNCgkJCQkkdGhpcy0+TGFuZygncGVybCcpID0+ICdwZXJsJywNCgkJCQkkdGhpcy0+TGFuZygncGhwJykgPT4gJ3BocCcsDQoJCQkJJHRoaXMtPkxhbmcoJ2phdmEnKSA9PiAnamF2YScsDQoJCQkJJHRoaXMtPkxhbmcoJ2NzaGFycCcpID0+ICdjc2hhcnAnLA0KCQkJCSR0aGlzLT5MYW5nKCdjX2NwcCcpID0+ICdjX2NwcCcsDQoJCQkJJHRoaXMtPkxhbmcoJ2Nsb2p1cmUnKSA9PiAnY2xvanVyZScsDQoJCQkJJHRoaXMtPkxhbmcoJ2NvbGRmdXNpb24nKSA9PiAnY29sZGZ1c2lvbicsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2hheGUnKSA9PiAnaGF4ZScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2xhdGV4JykgPT4gJ2xhdGV4JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnbHVhJykgPT4gJ2x1YScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ21hcmtkb3duJykgPT4gJ21hcmtkb3duJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygncG93ZXJzaGVsbCcpID0+ICdwb3dlcnNoZWxsJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnc3FsJykgPT4gJ3NxbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3Bnc3FsJykgPT4gJ3Bnc3FsJywNCgkJCQkkdGhpcy0+TGFuZygnb2NhbWwnKSA9PiAnb2NhbWwnLA0KCQkJCSR0aGlzLT5MYW5nKCd0ZXh0aWxlJykgPT4gJ3RleHRpbGUnLA0KCQkJCSR0aGlzLT5MYW5nKCdncm9vdnknKSA9PiAnZ3Jvb3Z5JywNCgkJCQkkdGhpcy0+TGFuZygnc2NhbGEnKSA9PiAnc2NhbGEnDQoJCQkJKTsJDQoJCS8vIGhlYWQgbXVsdGlzZWxlY3QJCQ0KCQkkc21hcnR5LT5hc3NpZ24oJ2Zyb250ZW5kX3N5bnRheF9tb2RlaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCRpZCwgJ2Zyb250ZW5kX21vZGVbXScsICRtb2RlcywgZXhwbG9kZSgnLCcsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9tb2RlJywgJ2h0bWwnKSksIDUpKTsNCgkJLy8gc3ludGF4YXJlYSBwcmVmDQoJCSRzbWFydHktPmFzc2lnbignZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsICdmcm9udGVuZF9zeW50YXhhcmVhX21vZGUnLCAkbW9kZXMsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJywgJ2h0bWwnKSkpOwkJDQoJCQ0KCQkvKiB0aGVtZXMgKi8JCQ0KCQkkc21hcnR5LT5hc3NpZ24oJ3RoZW1ldGV4dCcsICR0aGlzLT5MYW5nKCd0aGVtZXMnKSk7DQoJCQkkdGhlbWVzID0gYXJyYXkoDQoJCQkJJHRoaXMtPkxhbmcoJ2Nocm9tZScpID0+ICdjaHJvbWUnLCANCgkJCQkkdGhpcy0+TGFuZygnY2xvdWRzJykgPT4gJ2Nsb3VkcycsIA0KCQkJCSR0aGlzLT5MYW5nKCdjbG91ZHNfbWlkbmlnaHQnKSA9PiAnY2xvdWRzX21pZG5pZ2h0JywgDQoJCQkJJHRoaXMtPkxhbmcoJ2NvYmFsdCcpID0+ICdjb2JhbHQnLCANCgkJCQkkdGhpcy0+TGFuZygnY3JpbXNvbl9lZGl0b3InKSA9PiAnY3JpbXNvbl9lZGl0b3InLA0KCQkJCSR0aGlzLT5MYW5nKCdkYXduJykgPT4gJ2Rhd24nLA0KCQkJCSR0aGlzLT5MYW5nKCdkcmVhbXdlYXZlcicpID0+ICdkcmVhbXdlYXZlcicsIA0KCQkJCSR0aGlzLT5MYW5nKCdlY2xpcHNlJykgPT4gJ2VjbGlwc2UnLA0KCQkJCSR0aGlzLT5MYW5nKCdpZGxlX2ZpbmdlcnMnKSA9PiAnaWRsZV9maW5nZXJzJywNCgkJCQkkdGhpcy0+TGFuZygna3JfdGhlbWUnKSA9PiAna3JfdGhlbWUnLA0KCQkJCSR0aGlzLT5MYW5nKCdtZXJiaXZvcmUnKSA9PiAnbWVyYml2b3JlJywNCgkJCQkkdGhpcy0+TGFuZygnbWVyYml2b3JlX3NvZnQnKSA9PiAnbWVyYml2b3JlX3NvZnQnLA0KCQkJCSR0aGlzLT5MYW5nKCdtb25vX2luZHVzdHJpYWwnKSA9PiAnbW9ub19pbmR1c3RyaWFsJywNCgkJCQkkdGhpcy0+TGFuZygnbW9ub2thaScpID0+ICdtb25va2FpJywNCgkJCQkkdGhpcy0+TGFuZygncGFzdGVsX29uX2RhcmsnKSA9PiAncGFzdGVsX29uX2RhcmsnLA0KCQkJCSR0aGlzLT5MYW5nKCdzb2xhcml6ZWRfZGFyaycpID0+ICdzb2xhcml6ZWRfZGFyaycsDQoJCQkJJHRoaXMtPkxhbmcoJ3NvbGFyaXplZF9saWdodCcpID0+ICdzb2xhcml6ZWRfbGlnaHQnLA0KCQkJCSR0aGlzLT5MYW5nKCd0ZXh0bWF0ZScpID0+ICd0ZXh0bWF0ZScsDQoJCQkJJHRoaXMtPkxhbmcoJ3R3aWxpZ2h0JykgPT4gJ3R3aWxpZ2h0JywNCgkJCQkkdGhpcy0+TGFuZygndmlicmFudF9pbmsnKSA9PiAndmlicmFudF9pbmsnCQkNCgkJCSk7DQoJCS8vIGhlYWQgdGhlbWVzDQoJCSRzbWFydHktPmFzc2lnbignZnJvbnRlbmRfdGhlbWVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCAnZnJvbnRlbmRfdGhlbWVbXScsICR0aGVtZXMsIGV4cGxvZGUoJywnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfdGhlbWUnLCAndGV4dG1hdGUnKSksIDUpKTsNCgkJLy8gc3ludGF4YXJlYSB0aGVtZQkNCgkJJHNtYXJ0eS0+YXNzaWduKCd0aGVtZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICR0aGVtZXMsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICd0ZXh0bWF0ZScpKSk7DQoJCQ0KCQkvKiBmb250IHNpemUgKi8NCgkJJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZXRleHQnLCAkdGhpcy0+TGFuZygnZm9udF9zaXplJykpOw0KCQkJJGZvbnRzID0gYXJyYXkoDQoJCQkJJzEwcHgnID0+ICcxMHB4JywgDQoJCQkJJzExcHgnID0+ICcxMXB4JywgDQoJCQkJJzEycHgnID0+ICcxMnB4JywgDQoJCQkJJzE0cHgnID0+ICcxNHB4JywNCgkJCQknMTZweCcgPT4gJzE2cHgnLA0KCQkJCScyMHB4JyA9PiAnMjBweCcsDQoJCQkJJzI0cHgnID0+ICcyNHB4Jw0KCQkJKTsNCgkJJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZnJvbnRlbmRfZm9udHNpemUnLCAkZm9udHMsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnLCAnMTJweCcpKSk7CQkNCgkJLy8gc3VibWl0IHNldHRpbmdzDQoJCSRzbWFydHktPmFzc2lnbignZnJvbnRlbmRzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnZnJvbnRlbmRzdWJtaXQnLCAkdGhpcy0+TGFuZygnc2F2ZXNldHRpbmdzJykpKTsNCgkJDQoJLyogUHJvY2Vzc1RlbXBhbHRlICovDQoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdmcm9udGVuZHNldHRpbmdzLnRwbCcpOw0KDQo/Pgk=]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIGlmIChpc3NldCgkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKSkgDQogICAgew0KICAgICAgICBjbXNfdXNlcnByZWZzOjpzZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZXhhbXBsZV9zeW50YXgnLCRwYXJhbXNbJ2V4YW1wbGVfc3ludGF4J10pOw0KICAgIH0NCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnc2F2ZXNldHRpbmdzJywkcmV0dXJuaWQpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignc2V0dGluZ3N0ZXh0JywgJHRoaXMtPkxhbmcoJ3NldHRpbmdzX3RhYicpKTsNCg0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3dpZHRoX3RpdGxlJywgJHRoaXMtPkxhbmcoJ3dpZHRoX3RpdGxlJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3dpZHRoX2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICd3aWR0aCcsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ193aWR0aCcsICc4MCcpLCAxMCwgMjU1KSk7ICAgICAgICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoZWlnaHRfdGl0bGUnLCAkdGhpcy0+TGFuZygnaGVpZ2h0X3RpdGxlJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaGVpZ2h0JywgY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2hlaWdodCcsICc0MCcpLCAxMCwgMjU1KSk7DQogICAgICAgIC8vIGNyZWF0ZSBhIElFIHByZWYsIERPTlQgV0FOVCBUTyBTRUUgQSBCUiBGT1IgVEhJUyBTSElUIQ0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZXRleHQnLCAkdGhpcy0+TGFuZygnZW5hYmxlX2llJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZWRlc2NyJywgJHRoaXMtPkxhbmcoJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2VuYWJsZV9pZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnZW5hYmxlX2llJywgMSwgY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2VuYWJsZV9pZScsIDApKSk7DQoNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd1c2VfdW5jb21wcmVzc2VkX3RpdGxlJywgJHRoaXMtPkxhbmcoJ3VzZV91bmNvbXByZXNzZWQnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndXNlX3VuY29tcHJlc3NlZF90ZXh0JywgJHRoaXMtPkxhbmcoJ3VzZV91bmNvbXByZXNzZWRfdGV4dCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd1c2VfdW5jb21wcmVzc2VkX2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAndXNlX3VuY29tcHJlc3NlZCcsIDEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ191c2VfdW5jb21wcmVzc2VkJywgMCkpKTsNCg0KICAgICAgICAvKiBtb2RlIGRyb3Bkb3duICovDQogICAgICAgICRzbWFydHktPmFzc2lnbignc3ludGF4X21vZGUnLCAkdGhpcy0+TGFuZygnc3ludGF4X21vZGUnKSk7DQogICAgICAgICAgICAkbW9kZXMgPSBhcnJheSgNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnanMnKSA9PiAnamF2YXNjcmlwdCcsIA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdwbGFpbicpID0+ICdwbGFpbicsIA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdzdmcnKSA9PiAnc3ZnJywgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2h0bWwnKSA9PiAnaHRtbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2NzcycpID0+ICdjc3MnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdzY3NzJykgPT4gJ3Njc3MnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjb2ZmZWUnKSA9PiAnY29mZmVlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnanNvbicpID0+ICdqc29uJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygncHl0aG9uJykgPT4gJ3B5dGhvbicsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3J1YnknKSA9PiAncnVieScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3BlcmwnKSA9PiAncGVybCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3BocCcpID0+ICdwaHAnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdqYXZhJykgPT4gJ2phdmEnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjc2hhcnAnKSA9PiAnY3NoYXJwJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnY19jcHAnKSA9PiAnY19jcHAnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjbG9qdXJlJykgPT4gJ2Nsb2p1cmUnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjb2xkZnVzaW9uJykgPT4gJ2NvbGRmdXNpb24nLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdoYXhlJykgPT4gJ2hheGUnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdsYXRleCcpID0+ICdsYXRleCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2x1YScpID0+ICdsdWEnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdtYXJrZG93bicpID0+ICdtYXJrZG93bicsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3Bvd2Vyc2hlbGwnKSA9PiAncG93ZXJzaGVsbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3NxbCcpID0+ICdzcWwnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdwZ3NxbCcpID0+ICdwZ3NxbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ29jYW1sJykgPT4gJ29jYW1sJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndGV4dGlsZScpID0+ICd0ZXh0aWxlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZ3Jvb3Z5JykgPT4gJ2dyb292eScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3NjYWxhJykgPT4gJ3NjYWxhJw0KICAgICAgICAgICAgICAgICk7ICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzeW50YXhfbW9kZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnbW9kZScsICRtb2RlcywgLTEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19tb2RlJywgJ2h0bWwnKSwnb25jaGFuZ2U9InRoaXMuZm9ybS5zdWJtaXQoKSInKSk7ICAgICAgICAgICAgICAgIA0KDQogICAgICAgIC8qIHRoZW1lcyAqLyAgICAgICAgDQogICAgICAgICRzbWFydHktPmFzc2lnbigndGhlbWV0ZXh0JywgJHRoaXMgLT4gTGFuZygndGhlbWVzJykpOw0KICAgICAgICAgICAgJHRoZW1lcyA9IGFycmF5KA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjaHJvbWUnKSA9PiAnY2hyb21lJywgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2Nsb3VkcycpID0+ICdjbG91ZHMnLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnY2xvdWRzX21pZG5pZ2h0JykgPT4gJ2Nsb3Vkc19taWRuaWdodCcsIA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdjb2JhbHQnKSA9PiAnY29iYWx0JywgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2NyaW1zb25fZWRpdG9yJykgPT4gJ2NyaW1zb25fZWRpdG9yJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZGF3bicpID0+ICdkYXduJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZHJlYW13ZWF2ZXInKSA9PiAnZHJlYW13ZWF2ZXInLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnZWNsaXBzZScpID0+ICdlY2xpcHNlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnaWRsZV9maW5nZXJzJykgPT4gJ2lkbGVfZmluZ2VycycsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ2tyX3RoZW1lJykgPT4gJ2tyX3RoZW1lJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnbWVyYml2b3JlJykgPT4gJ21lcmJpdm9yZScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ21lcmJpdm9yZV9zb2Z0JykgPT4gJ21lcmJpdm9yZV9zb2Z0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnbW9ub19pbmR1c3RyaWFsJykgPT4gJ21vbm9faW5kdXN0cmlhbCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ21vbm9rYWknKSA9PiAnbW9ub2thaScsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3Bhc3RlbF9vbl9kYXJrJykgPT4gJ3Bhc3RlbF9vbl9kYXJrJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnc29sYXJpemVkX2RhcmsnKSA9PiAnc29sYXJpemVkX2RhcmsnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCdzb2xhcml6ZWRfbGlnaHQnKSA9PiAnc29sYXJpemVkX2xpZ2h0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndGV4dG1hdGUnKSA9PiAndGV4dG1hdGUnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCd0b21vcnJvdycpID0+ICd0b21vcnJvdycsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3RvbW9ycm93X25pZ2h0JykgPT4gJ3RvbW9ycm93X25pZ2h0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndG9tb3Jyb3dfbmlnaHRfYmx1ZScpID0+ICd0b21vcnJvd19uaWdodF9ibHVlJywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndG9tb3Jyb3dfbmlnaHRfYnJpZ2h0JykgPT4gJ3RvbW9ycm93X25pZ2h0X2JyaWdodCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJykgPT4gJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJywgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ3R3aWxpZ2h0JykgPT4gJ3R3aWxpZ2h0JywNCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygndmlicmFudF9pbmsnKSA9PiAndmlicmFudF9pbmsnICAgICANCiAgICAgICAgICAgICk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigndGhlbWVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ3RoZW1lJywgJHRoZW1lcywgLTEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ190aGVtZScsICd0ZXh0bWF0ZScpLCdvbmNoYW5nZT0idGhpcy5mb3JtLnN1Ym1pdCgpIicpKTsNCg0KICAgICAgICAvKiBmb250IHNpemUgKi8NCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZXRleHQnLCAkdGhpcy0+TGFuZygnZm9udF9zaXplJykpOw0KICAgICAgICAgICAgJGZvbnRzID0gYXJyYXkoDQogICAgICAgICAgICAgICAgJzEwcHgnID0+ICcxMHB4JywgDQogICAgICAgICAgICAgICAgJzExcHgnID0+ICcxMXB4JywgDQogICAgICAgICAgICAgICAgJzEycHgnID0+ICcxMnB4JywgDQogICAgICAgICAgICAgICAgJzE0cHgnID0+ICcxNHB4JywNCiAgICAgICAgICAgICAgICAnMTZweCcgPT4gJzE2cHgnLA0KICAgICAgICAgICAgICAgICcyMHB4JyA9PiAnMjBweCcsDQogICAgICAgICAgICAgICAgJzI0cHgnID0+ICcyNHB4Jw0KICAgICAgICAgICAgKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdmb250c2l6ZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZm9udHNpemUnLCAkZm9udHMsIC0xLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZm9udHNpemUnLCAnMTJweCcpKSk7ICAgICAgIA0KDQogICAgICAgICRzbWFydHktPmFzc2lnbignZnVsbF9saW5ldGV4dCcsICR0aGlzLT5MYW5nKCdmdWxsX2xpbmUnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignZnVsbF9saW5laW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdmdWxsX2xpbmUnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfZnVsbF9saW5lJywgMSkpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdoaWdobGlnaHRfYWN0aXZldGV4dCcsICR0aGlzLT5MYW5nKCdoaWdobGlnaHRfYWN0aXZlJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9hY3RpdmVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ2hpZ2hsaWdodF9hY3RpdmUnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfaGlnaGxpZ2h0X2FjdGl2ZScsIDEpKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignc2hvd19pbnZpc2libGVzdGV4dCcsICR0aGlzLT5MYW5nKCdzaG93X2ludmlzaWJsZXMnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbignc2hvd19pbnZpc2libGVzaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdzaG93X2ludmlzaWJsZXMnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc2hvd19pbnZpc2libGVzJywgMCkpKTsgICAgDQogICAgICAgICRzbWFydHktPmFzc2lnbigncGVyc2lzdGVudF9oc2Nyb2xsdGV4dCcsICR0aGlzLT5MYW5nKCdwZXJzaXN0ZW50X2hzY3JvbGwnKSk7DQogICAgICAgICRzbWFydHktPmFzc2lnbigncGVyc2lzdGVudF9oc2Nyb2xsaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdwZXJzaXN0ZW50X2hzY3JvbGwnLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfcGVyc2lzdGVudF9oc2Nyb2xsJywgMSkpKTsNCg0KICAgICAgICAvKiB0ZXh0IHdyYXBwaW5nICovDQogICAgICAgICRzbWFydHktPmFzc2lnbignc29mdF93cmFwdGV4dCcsICR0aGlzLT5MYW5nKCdzb2Z0X3dyYXAnKSk7DQogICAgICAgICAgICAkc29mdF93cmFwID0gYXJyYXkoDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJ29mZicpID0+ICdvZmYnLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnNDAnKSA9PiAnNDAsNDAnLCANCiAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZygnODAnKSA9PiAnODAsODAnLA0KICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nKCcxMDAnKSA9PiAnMTAwLDEwMCcsDQogICAgICAgICAgICAgICAgJHRoaXMtPkxhbmcoJzE0MCcpID0+ICcxNDAsMTQwJw0KICAgICAgICAgICAgKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzb2Z0X3dyYXBpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ3NvZnRfd3JhcCcsICRzb2Z0X3dyYXAsIC0xLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc29mdF93cmFwJywgJzgwLDgwJykpKTsNCg0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3Nob3dfZ3V0dGVydGV4dCcsICR0aGlzLT5MYW5nKCdzaG93X2d1dHRlcicpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzaG93X2d1dHRlcmlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnc2hvd19ndXR0ZXInLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc2hvd19ndXR0ZXInLCAxKSkpOyAgICANCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwcmludF9tYXJnaW50ZXh0JywgJHRoaXMtPkxhbmcoJ3ByaW50X21hcmdpbicpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdwcmludF9tYXJnaW5pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ3ByaW50X21hcmdpbicsIDEsIGNtc191c2VycHJlZnM6OmdldF9mb3JfdXNlcigkdXNlcmlkLCR0aGlzLT5HZXROYW1lKCkuJ19wcmludF9tYXJnaW4nLCAwKSkpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ3NvZnRfdGFidGV4dCcsICR0aGlzLT5MYW5nKCdzb2Z0X3RhYicpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzb2Z0X3RhYmlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnc29mdF90YWInLCAxLCBjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfc29mdF90YWInLCAxKSkpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9zZWxlY3RlZHRleHQnLCAkdGhpcy0+TGFuZygnaGlnaGxpZ2h0X3NlbGVjdGVkJykpOw0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2hpZ2hsaWdodF9zZWxlY3RlZGlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnaGlnaGxpZ2h0X3NlbGVjdGVkJywgMSwgY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsJHRoaXMtPkdldE5hbWUoKS4nX2hpZ2hsaWdodF9zZWxlY3RlZCcsIDEpKSk7ICAgDQoNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMtPkxhbmcoJ3NhdmVzZXR0aW5ncycpKSk7DQogICAgICAgIA0KICAgICAgICAvKiBzYW1wbGUgY29udGVudCAqLw0KICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAnJzsNCiAgICAgICAgc3dpdGNoIChjbXNfdXNlcnByZWZzOjpnZXRfZm9yX3VzZXIoJHVzZXJpZCwkdGhpcy0+R2V0TmFtZSgpLidfbW9kZScsJ2h0bWwnKSkgew0KICAgICAgICAgICAgY2FzZSAnaHRtbCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KPGh0bWw+DQo8aGVhZD4NCg0KPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPg0KLnRleHQtbGF5ZXIgew0KICAgIGZvbnQtZmFtaWx5OiBNb25hY28sIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlOw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICBjdXJzb3I6IHRleHQ7DQp9DQo8L3N0eWxlPg0KDQo8L2hlYWQ+DQo8Ym9keT4NCiAgICA8aDEgc3R5bGU9XCJjb2xvcjpyZWRcIj5KdWh1IEtpbm5lcnM8L2gxPg0KPC9ib2R5Pg0KPC9odG1sPg0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdjc3MnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi50ZXh0LWxheWVyIHsNCiAgICBmb250LWZhbWlseTogTW9uYWNvLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsNCiAgICBmb250LXNpemU6IDEycHg7DQogICAgY3Vyc29yOiB0ZXh0Ow0KfSAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdqYXZhc2NyaXB0JyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQpmdW5jdGlvbiBmb28oaXRlbXMpIHsNCiAgICBmb3IgKHZhciBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgYWxlcnQoaXRlbXNbaV0gKyBcImp1aHVcIik7DQogICAgfSAgIC8vIFJlYWwgVGFiLg0KfSAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdwbGFpbicgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4NCg0KRHVpcyBhdXRlbSB2ZWwgZXVtIGlyaXVyZSBkb2xvciBpbiBoZW5kcmVyaXQgaW4gdnVscHV0YXRlIHZlbGl0IGVzc2UgbW9sZXN0aWUgY29uc2VxdWF0LCB2ZWwgaWxsdW0gZG9sb3JlIGV1IGZldWdpYXQgbnVsbGEgZmFjaWxpc2lzIGF0IHZlcm8gZXJvcyBldCBhY2N1bXNhbiBldCBpdXN0byBvZGlvIGRpZ25pc3NpbSBxdWkgYmxhbmRpdCBwcmFlc2VudCBsdXB0YXR1bSB6enJpbCBkZWxlbml0IGF1Z3VlIGR1aXMgZG9sb3JlIHRlIGZldWdhaXQgbnVsbGEgZmFjaWxpc2kuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZGlhbSBub251bW15IG5pYmggZXVpc21vZCB0aW5jaWR1bnQgdXQgbGFvcmVldCBkb2xvcmUgbWFnbmEgYWxpcXVhbSBlcmF0IHZvbHV0cGF0Lg0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdzdmcnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCjxzdmcNCiAgd2lkdGg9XCI4MDBcIiBoZWlnaHQ9XCI2MDBcIg0KICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCINCiAgb25sb2FkPVwiU3RhcnRBbmltYXRpb24oZXZ0KVwiPg0KDQogIDx0aXRsZT5UZXN0IFR1YmUgUHJvZ3Jlc3MgQmFyPC90aXRsZT4NCiAgPGRlc2M+Q3JlYXRlZCBmb3IgdGhlIFdlYiBEaXJlY3Rpb25zIFNWRyBjb21wZXRpdGlvbjwvZGVzYz4NCg0KICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2VjbWFzY3JpcHRcIj48IVtDREFUQVsNCiAgICB2YXIgdGltZXZhbHVlID0gMDsNCiAgICB2YXIgdGltZXJfaW5jcmVtZW50ID0gMTsNCiAgICB2YXIgbWF4X3RpbWUgPSAxMDA7DQogICAgdmFyIGhpY2tvcnk7DQogICAgdmFyIGRpY2tvcnk7DQogICAgdmFyIGRvY2s7DQogICAgdmFyIGk7DQoNCiAgICBmdW5jdGlvbiBTdGFydEFuaW1hdGlvbihldnQpIHsNCiAgICAgICAgaGlja29yeSAgPSBldnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaWNrb3J5XCIpOw0KICAgICAgICBkaWNrb3J5ID0gZXZ0LnRhcmdldC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGlja29yeVwiKTsNCiAgICAgICAgZG9jayA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvY2tcIik7DQoNCiAgICAgICAgU2hvd0FuZEdyb3dFbGVtZW50KCk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIFNob3dBbmRHcm93RWxlbWVudCgpIHsNCiAgICAgICAgdGltZXZhbHVlID0gdGltZXZhbHVlICsgdGltZXJfaW5jcmVtZW50Ow0KICAgICAgICBpZiAodGltZXZhbHVlID4gbWF4X3RpbWUpDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIC8vIFNjYWxlIHRoZSB0ZXh0IHN0cmluZyBncmFkdWFsbHkgdW50aWwgaXQgaXMgMjAgdGltZXMgbGFyZ2VyDQogICAgICAgIHNjYWxlZmFjdG9yID0gKHRpbWV2YWx1ZSAqIDY1MCkgLyBtYXhfdGltZTsNCg0KICAgICAgICBpZiAodGltZXZhbHVlIDwgMzApIHsNCiAgICAgICAgICAgIGhpY2tvcnkuc2V0QXR0cmlidXRlKFwiZGlzcGxheVwiLCBcIlwiKTsNCiAgICAgICAgICAgIGhpY2tvcnkuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgKDYwMCtzY2FsZWZhY3RvciozKi0xICkgKyBcIiwgLTE0NCApXCIpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRpbWV2YWx1ZSA+IDMwICYmIHRpbWV2YWx1ZSA8IDY2KSB7DQogICAgICAgICAgICBkaWNrb3J5LnNldEF0dHJpYnV0ZShcImRpc3BsYXlcIiwgXCJcIik7DQogICAgICAgICAgICBkaWNrb3J5LnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArICgtNzk1K3NjYWxlZmFjdG9yKjIpICsgXCIsIDAgKVwiKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGltZXZhbHVlID4gNjYpIHsNCiAgICAgICAgICAgIGRvY2suc2V0QXR0cmlidXRlKFwiZGlzcGxheVwiLCBcIlwiKTsNCiAgICAgICAgICAgIGRvY2suc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgKDE0NTArc2NhbGVmYWN0b3IqMiotMSkgKyBcIiwgMTQ0IClcIik7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDYWxsIFNob3dBbmRHcm93RWxlbWVudCBhZ2FpbiA8dGltZXJfaW5jcmVtZW50PiBtaWxsaXNlY29uZHMgbGF0ZXIuDQogICAgICAgIHNldFRpbWVvdXQoXCJTaG93QW5kR3Jvd0VsZW1lbnQoKVwiLCB0aW1lcl9pbmNyZW1lbnQpDQogICAgfQ0KICAgIHdpbmRvdy5TaG93QW5kR3Jvd0VsZW1lbnQgPSBTaG93QW5kR3Jvd0VsZW1lbnQNCiAgXV0+PC9zY3JpcHQ+DQoNCiAgPHJlY3QNCiAgICBmaWxsPVwiIzJlMzQzNlwiDQogICAgZmlsbC1ydWxlPVwibm9uemVyb1wiDQogICAgc3Ryb2tlLXdpZHRoPVwiM1wiDQogICAgeT1cIjBcIg0KICAgIHg9XCIwXCINCiAgICBoZWlnaHQ9XCI2MDBcIg0KICAgIHdpZHRoPVwiODAwXCINCiAgICBpZD1cInJlY3QzNTkwXCIvPg0KDQogICAgPHRleHQNCiAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxNDRweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMgQm9sZFwiDQogICAgICAgeD1cIjUwXCINCiAgICAgICB5PVwiMzUwXCINCiAgICAgICBpZD1cImhpY2tvcnlcIg0KICAgICAgIGRpc3BsYXk9XCJub25lXCI+DQogICAgICAgIEhpY2tvcnksPC90ZXh0Pg0KICAgIDx0ZXh0DQogICAgICAgc3R5bGU9XCJmb250LXNpemU6MTQ0cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIEJvbGRcIg0KICAgICAgIHg9XCI1MFwiDQogICAgICAgeT1cIjM1MFwiDQogICAgICAgaWQ9XCJkaWNrb3J5XCINCiAgICAgICBkaXNwbGF5PVwibm9uZVwiPg0KICAgICAgICBkaWNrb3J5LDwvdGV4dD4NCiAgICA8dGV4dA0KICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjE0NHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246Qml0c3RyZWFtIFZlcmEgU2FucyBCb2xkXCINCiAgICAgICB4PVwiNTBcIg0KICAgICAgIHk9XCIzNTBcIg0KICAgICAgIGlkPVwiZG9ja1wiDQogICAgICAgZGlzcGxheT1cIm5vbmVcIj4NCiAgICAgICAgZG9jayE8L3RleHQ+DQo8L3N2Zz4gICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ3Njc3MnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi8qIHN0eWxlLnNjc3MgKi8NCg0KI25hdmJhciB7DQogICAgXCRuYXZiYXItd2lkdGg6IDgwMHB4Ow0KICAgIFwkaXRlbXM6IDU7DQogICAgXCRuYXZiYXItY29sb3I6ICNjZTRkZDY7DQoNCiAgICB3aWR0aDogXCRuYXZiYXItd2lkdGg7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIFwkbmF2YmFyLWNvbG9yOw0KDQogICAgbGkgew0KICAgICAgICBmbG9hdDogbGVmdDsNCiAgICAgICAgd2lkdGg6IFwkbmF2YmFyLXdpZHRoL1wkaXRlbXMgLSAxMHB4Ow0KDQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0ZW4oXCRuYXZiYXItY29sb3IsIDIwJSk7DQogICAgICAgICY6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbihcJG5hdmJhci1jb2xvciwgMTAlKTsNCiAgICAgICAgfQ0KICAgIH0NCn0gICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnY29mZmVlJyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQojIS91c3IvYmluL2VudiBjb2ZmZWUNCg0KdHJ5DQogICAgdGhyb3cgVVJJRXJyb3IgZGVjb2RlVVJJKDB4QzBmZmVlICogMTIzNDU2LjdlLTggLyAuOSkNCmNhdGNoIGUNCiAgICBjb25zb2xlLmxvZyAncXN0cmluZycgKyBcInFxc3RyaW5nXCIgKyAnJycNCiAgICAgICAgcWRvYw0KICAgICcnJyArIFwiXCJcIg0KICAgICAgICBxcWRvYw0KICAgIFwiXCJcIg0KDQpkbyAtPg0KICAgICMjIw0KICAgIGhlcmVjb21tZW50DQogICAgIyMjDQogICAgcmUgPSAvcmVnZXgvaW1neS50ZXN0IC8vLw0KICAgICAgICBoZXJlZ2V4ICAjIGNvbW1lbnQNCiAgICAvLy9pbWd5DQogICAgdGhpcyBpc250OiBganVzdCBKYXZhU2NyaXB0YA0KICAgIHVuZGVmaW5lZCAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdqc29uJyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQp7DQogXCJxdWVyeVwiOiB7DQogIFwiY291bnRcIjogMTAsDQogIFwiY3JlYXRlZFwiOiBcIjIwMTEtMDYtMjFUMDg6MTA6NDZaXCIsDQogIFwibGFuZ1wiOiBcImVuLVVTXCIsDQogIFwicmVzdWx0c1wiOiB7DQogICBcInBob3RvXCI6IFsNCiAgICB7DQogICAgIFwiZmFybVwiOiBcIjZcIiwNCiAgICAgXCJpZFwiOiBcIjU4NTU2MjA5NzVcIiwNCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwNCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwNCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwNCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLA0KICAgICBcInNlY3JldFwiOiBcImYxZjVlODUxNWRcIiwNCiAgICAgXCJzZXJ2ZXJcIjogXCI1MTEwXCIsDQogICAgIFwidGl0bGVcIjogXCI3MDg3IGJhbmRpdCBjYXRcIg0KICAgIH0sDQogICAgew0KICAgICBcImZhcm1cIjogXCI0XCIsDQogICAgIFwiaWRcIjogXCI1ODU2MTcwNTM0XCIsDQogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsDQogICAgIFwiaXNmcmllbmRcIjogXCIwXCIsDQogICAgIFwiaXNwdWJsaWNcIjogXCIxXCIsDQogICAgIFwib3duZXJcIjogXCIzMjAyMTU1NEBOMDRcIiwNCiAgICAgXCJzZWNyZXRcIjogXCJmZjFlZmIyYTZmXCIsDQogICAgIFwic2VydmVyXCI6IFwiMzIxN1wiLA0KICAgICBcInRpdGxlXCI6IFwiNjk3NSBydXN0eSBjYXRcIg0KICAgIH0sDQogICAgew0KICAgICBcImZhcm1cIjogXCI2XCIsDQogICAgIFwiaWRcIjogXCI1ODU2MTcyOTcyXCIsDQogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsDQogICAgIFwiaXNmcmllbmRcIjogXCIwXCIsDQogICAgIFwiaXNwdWJsaWNcIjogXCIxXCIsDQogICAgIFwib3duZXJcIjogXCI1MTI0OTg3NUBOMDNcIiwNCiAgICAgXCJzZWNyZXRcIjogXCI2YzY4ODczNDdjXCIsDQogICAgIFwic2VydmVyXCI6IFwiNTE5MlwiLA0KICAgICBcInRpdGxlXCI6IFwid2F0ZXJtYXJrZWQtY2F0c1wiDQogICAgfSwNCiAgICB7DQogICAgIFwiZmFybVwiOiBcIjZcIiwNCiAgICAgXCJpZFwiOiBcIjU4NTYxNjgzMjhcIiwNCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwNCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwNCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwNCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLA0KICAgICBcInNlY3JldFwiOiBcIjBjMWNmZGY2NGNcIiwNCiAgICAgXCJzZXJ2ZXJcIjogXCI1MDc4XCIsDQogICAgIFwidGl0bGVcIjogXCI3MDIwIG1hbmR5IGNhdFwiDQogICAgfSwNCiAgICB7DQogICAgIFwiZmFybVwiOiBcIjNcIiwNCiAgICAgXCJpZFwiOiBcIjU4NTYxNzE3NzRcIiwNCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwNCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwNCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwNCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLA0KICAgICBcInNlY3JldFwiOiBcIjdmNWEzMTgwYWJcIiwNCiAgICAgXCJzZXJ2ZXJcIjogXCIyNjk2XCIsDQogICAgIFwidGl0bGVcIjogXCI3NDQ4IGJvYmJ5IGNhdFwiDQogICAgfQ0KICAgXQ0KICB9DQogfQ0KfSAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdweXRob24nIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCiMhL3Vzci9sb2NhbC9iaW4vcHl0aG9uDQoNCmltcG9ydCBzdHJpbmcsIHN5cw0KDQojIElmIG5vIGFyZ3VtZW50cyB3ZXJlIGdpdmVuLCBwcmludCBhIGhlbHBmdWwgbWVzc2FnZQ0KaWYgbGVuKHN5cy5hcmd2KT09MToNCiAgICBwcmludCAnVXNhZ2U6IGNlbHNpdXMgdGVtcDEgdGVtcDIgLi4uJw0KICAgIHN5cy5leGl0KDApDQoNCiMgTG9vcCBvdmVyIHRoZSBhcmd1bWVudHMNCmZvciBpIGluIHN5cy5hcmd2WzE6XToNCiAgICB0cnk6DQogICAgICAgIGZhaHJlbmhlaXQ9ZmxvYXQoc3RyaW5nLmF0b2koaSkpDQogICAgZXhjZXB0IHN0cmluZy5hdG9pX2Vycm9yOg0KICAgICAgICBwcmludCByZXByKGkpLCBcIm5vdCBhIG51bWVyaWMgdmFsdWVcIiAgDQogICAgZWxzZToNCiAgICAgICAgY2Vsc2l1cz0oZmFocmVuaGVpdC0zMikqNS4wLzkuMA0KICAgICAgICBwcmludCAnJWlcXDI2MEYgPSAlaVxcMjYwQycgJSAoaW50KGZhaHJlbmhlaXQpLCBpbnQoY2Vsc2l1cysuNSkpDQogICAgICAgICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ3BocCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KPD9waHANCg0KZnVuY3Rpb24gbmZhY3QoXCRuKSB7DQogIGlmIChcJG4gPT0gMCkgew0KICAgIHJldHVybiAxOw0KICB9DQogIGVsc2Ugew0KICAgIHJldHVybiBcJG4gKiBuZmFjdChcJG4gLSAxKTsNCiAgfQ0KfQ0KDQplY2hvIFwiXFxuXFxuUGxlYXNlIGVudGVyIGEgd2hvbGUgbnVtYmVyIC4uLiBcIjsNClwkbnVtID0gdHJpbShmZ2V0cyhTVERJTikpOw0KDQovLyA9PT09PSBQUk9DRVNTIC0gRGV0ZXJtaW5nIHRoZSBmYWN0b3JpYWwgb2YgdGhlIGlucHV0IG51bWJlciA9PT09PQ0KXCRvdXRwdXQgPSBcIlxcblxcbkZhY3RvcmlhbCBcIiAuIFwkbnVtIC4gXCIgPSBcIiAuIG5mYWN0KFwkbnVtKSAuIFwiXFxuXFxuXCI7DQplY2hvIFwkb3V0cHV0Ow0KDQo/Pg0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdydWJ5JyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQojIS91c3IvYmluL3J1YnkNCg0KIyBQcm9ncmFtIHRvIGZpbmQgdGhlIGZhY3RvcmlhbCBvZiBhIG51bWJlcg0KZGVmIGZhY3QobikNCiAgICBpZiBuID09IDANCiAgICAgICAgMQ0KICAgIGVsc2UNCiAgICAgICAgbiAqIGZhY3Qobi0xKQ0KICAgIGVuZA0KZW5kDQoNCnB1dHMgZmFjdChBUkdWWzBdLnRvX2kpDQogICAgICAgICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ3BlcmwnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCiMhL3Vzci9iaW4vcGVybA0KdXNlIHN0cmljdDsNCnVzZSB3YXJuaW5nczsNCm15IFwkbnVtX3ByaW1lcyA9IDA7DQpteSBAcHJpbWVzOw0KDQojIFB1dCAyIGFzIHRoZSBmaXJzdCBwcmltZSBzbyB3ZSB3b24ndCBoYXZlIGFuIGVtcHR5IGFycmF5DQpcJHByaW1lc1tcJG51bV9wcmltZXNdID0gMjsNClwkbnVtX3ByaW1lcysrOw0KDQpNQUlOX0xPT1A6DQpmb3IgbXkgXCRudW1iZXJfdG9fY2hlY2sgKDMgLi4gMjAwKQ0Kew0KICAgIGZvciBteSBcJHAgKDAgLi4gKFwkbnVtX3ByaW1lcy0xKSkNCiAgICB7DQogICAgICAgIGlmIChcJG51bWJlcl90b19jaGVjayAlIFwkcHJpbWVzW1wkcF0gPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgbmV4dCBNQUlOX0xPT1A7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIElmIHdlIHJlYWNoZWQgdGhpcyBwb2ludCBpdCBtZWFucyBcJG51bWJlcl90b19jaGVjayBpcyBub3QNCiAgICAjIGRpdmlzYWJsZSBieSBhbnkgcHJpbWUgbnVtYmVyIHRoYXQgY2FtZSBiZWZvcmUgaXQuDQogICAgXCRwcmltZXNbXCRudW1fcHJpbWVzXSA9IFwkbnVtYmVyX3RvX2NoZWNrOw0KICAgIFwkbnVtX3ByaW1lcysrOw0KfQ0KDQpmb3IgbXkgXCRwICgwIC4uIChcJG51bV9wcmltZXMtMSkpDQp7DQogICAgcHJpbnQgXCRwcmltZXNbXCRwXSwgXCIsIFwiOw0KfQ0KcHJpbnQgXCJcXG5cIjsNCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnamF2YScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KcHVibGljIGNsYXNzIEluZmluaXRlTG9vcCB7DQoNCiAgICAvKg0KICAgICAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgcHJvZ3JhbSB0byBoYW5nLi4uDQogICAgICoNCiAgICAgKiBUYWtlbiBmcm9tOg0KICAgICAqIGh0dHA6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS9qYXZhLWhhbmdzLXdoZW4tY29udmVydGluZy0yLTIyNTA3Mzg1ODUwNzIwMTJlLTMwOC8NCiAgICAgKi8NCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQogICAgICAgIGRvdWJsZSBkID0gRG91YmxlLnBhcnNlRG91YmxlKFwiMi4yMjUwNzM4NTg1MDcyMDEyZS0zMDhcIik7DQoNCiAgICAgICAgLy8gdW5yZWFjaGFibGUgY29kZQ0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJWYWx1ZTogXCIgKyBkKTsNCiAgICB9DQp9DQogICAgICAgICAgICAgICAgIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ2NzaGFycCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KcHVibGljIHZvaWQgSGVsbG9Xb3JsZCgpIHsNCiAgIC8vU2F5IEhlbGxvIQ0KICAgQ29uc29sZS5Xcml0ZUxpbmUoXCJIZWxsbyBXb3JsZFwiKTsNCn0gICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnY19jcHAnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi8vIGNvbXBvdW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzDQoNCiNpbmNsdWRlIDxpb3N0cmVhbT4NCnVzaW5nIG5hbWVzcGFjZSBzdGQ7DQoNCmludCBtYWluICgpDQp7DQogICAgaW50IGEsIGI9MzsgLyogZm9vYmFyICovDQogICAgYSA9IGI7DQogICAgYSs9MjsgLy8gZXF1aXZhbGVudCB0byBhPWErMg0KICAgIGNvdXQgPDwgYTsNCiAgICByZXR1cm4gMDsNCn0gICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnY2xvanVyZScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KKGRlZm4gcGFydGluZw0KICBcInJldHVybnMgYSBTdHJpbmcgcGFydGluZyBpbiBhIGdpdmVuIGxhbmd1YWdlXCINCiAgKFtdIChwYXJ0aW5nIFwiV29ybGRcIikpDQogIChbbmFtZV0gKHBhcnRpbmcgbmFtZSBcImVuXCIpKQ0KICAoW25hbWUgbGFuZ3VhZ2VdDQogICAgOyBjb25kcCBpcyBzaW1pbGFyIHRvIGEgY2FzZSBzdGF0ZW1lbnQgaW4gb3RoZXIgbGFuZ3VhZ2VzLg0KICAgIDsgSXQgaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGxhdGVyLg0KICAgIDsgSXQgaXMgdXNlZCBoZXJlIHRvIHRha2UgZGlmZmVyZW50IGFjdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGUNCiAgICA7IHBhcmFtZXRlciBcImxhbmd1YWdlXCIgaXMgc2V0IHRvIFwiZW5cIiwgXCJlc1wiIG9yIHNvbWV0aGluZyBlbHNlLg0KICAgIChjb25kcCA9IGxhbmd1YWdlDQogICAgICBcImVuXCIgKHN0ciBcIkdvb2RieWUsIFwiIG5hbWUpDQogICAgICBcImVzXCIgKHN0ciBcIkFkaW9zLCBcIiBuYW1lKQ0KICAgICAgKHRocm93IChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uDQogICAgICAgIChzdHIgXCJ1bnN1cHBvcnRlZCBsYW5ndWFnZSBcIiBsYW5ndWFnZSkpKSkpKQ0KDQoocHJpbnRsbiAocGFydGluZykpIDsgLT4gR29vZGJ5ZSwgV29ybGQNCihwcmludGxuIChwYXJ0aW5nIFwiTWFya1wiKSkgOyAtPiBHb29kYnllLCBNYXJrDQoocHJpbnRsbiAocGFydGluZyBcIk1hcmtcIiBcImVzXCIpKSA7IC0+IEFkaW9zLCBNYXJrDQoocHJpbnRsbiAocGFydGluZyBcIk1hcmtcIiwgXCJ4eVwiKSkgOyAtPiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOiB1bnN1cHBvcnRlZCBsYW5ndWFnZSB4eSAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdvY2FtbCcgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KKCoNCiAqIEV4YW1wbGUgb2YgZWFybHkgcmV0dXJuIGltcGxlbWVudGF0aW9uIHRha2VuIGZyb20NCiAqIGh0dHA6Ly9vY2FtbC5qYW5lc3RyZWV0LmNvbS8/cT1ub2RlLzkxDQogKikNCg0KbGV0IHdpdGhfcmV0dXJuICh0eXBlIHQpIChmIDogXyAtPiB0KSA9DQogIGxldCBtb2R1bGUgTSA9DQogICAgIHN0cnVjdCBleGNlcHRpb24gUmV0dXJuIG9mIHQgZW5kDQogIGluDQogIGxldCByZXR1cm4gPSB7IHJldHVybiA9IChmdW4geCAtPiByYWlzZSAoTS5SZXR1cm4geCkpOyB9IGluDQogIHRyeSBmIHJldHVybiB3aXRoIE0uUmV0dXJuIHggLT4geA0KDQoNCigqIEZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUgJ2Vhcmx5IHJldHVybicgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBgd2l0aF9yZXR1cm5gICopDQpsZXQgc3VtX3VudGlsX2ZpcnN0X25lZ2F0aXZlIGxpc3QgPQ0KICB3aXRoX3JldHVybiAoZnVuIHIgLT4NCiAgICBMaXN0LmZvbGQgbGlzdCB+aW5pdDowIH5mOihmdW4gYWNjIHggLT4NCiAgICAgIGlmIHggPj0gMCB0aGVuIGFjYyArIHggZWxzZSByLnJldHVybiBhY2MpKSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAndGV4dGlsZScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KaDEuIFRleHRpbGUgZG9jdW1lbnQNCg0KaDIuIEhlYWRpbmcgVHdvDQoNCmgzLiBBIHR3by1saW5lDQogICAgaGVhZGVyDQoNCmgyLiBBbm90aGVyIHR3by1saW5lDQpoZWFkZXINCg0KUGFyYWdyYXBoOg0Kb25lLCB0d28sDQp0aGVlIGxpbmVzIQ0KDQpwKGNsYXNzb25lIHR3byB0aHJlZSkuIFRoaXMgaXMgYSBwYXJhZ3JhcGggd2l0aCBjbGFzc2VzDQoNCnAoI2lkKS4gKG9uZSB3aXRoIGFuIGlkKQ0KDQpwKG9uZSB0d28gdGhyZWUjbXlfaWQpLiAuLmNsYXNzZXMgKyBpZA0KDQoqIFVub3JkZXJlZCBsaXN0DQoqKiBzdWJsaXN0DQoqIGJhY2sgYWdhaW4hDQoqKiBzdWJsaXN0IGFnYWluLi4NCg0KIyBvcmRlcmVkDQoNCmJnLiBCbG9ja3F1b3RlIQ0KICAgIFRoaXMgaXMgYSB0d28tbGlzdCBibG9ja3F1b3RlLi4hICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdncm9vdnknIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCg0KLy9odHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy9Db25jdXJyZW5jeSt3aXRoK0dyb292eQ0KaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyDQoNCmRlZiBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKQ0KDQpzeW5jaHJvbml6ZWQgb3V0KG1lc3NhZ2UpIHsNCiAgICBwcmludGxuKG1lc3NhZ2UpDQp9DQoNCmRlZiB0aCA9IFRocmVhZC5zdGFydCB7DQogICAgZm9yKCBpIGluIDEuLjggKSB7DQogICAgICAgIHNsZWVwIDMwDQogICAgICAgIG91dCBcInRocmVhZCBsb29wIFwkaVwiDQogICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkNCiAgICB9DQp9DQoNCmZvciggaiBpbiAxLi40ICkgew0KICAgIHNsZWVwIDUwDQogICAgb3V0IFwibWFpbiBsb29wIFwkalwiDQogICAgY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKQ0KfQ0KDQp0aC5qb2luKCkNCg0KYXNzZXJ0IGNvdW50ZXIuZ2V0KCkgPT0gMTINCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnc2NhbGEnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi8vaHR0cDovL3d3dy5zY2FsYS1sYW5nLm9yZy9ub2RlLzIyNw0KLyogRGVmaW5lcyBhIG5ldyBtZXRob2QgJ3NvcnQnIGZvciBhcnJheSBvYmplY3RzICovDQpvYmplY3QgaW1wbGljaXRzIGV4dGVuZHMgQXBwbGljYXRpb24gew0KICBpbXBsaWNpdCBkZWYgYXJyYXlXcmFwcGVyW0EgOiBDbGFzc01hbmlmZXN0XSh4OiBBcnJheVtBXSkgPQ0KICAgIG5ldyB7DQogICAgICBkZWYgc29ydChwOiAoQSwgQSkgPT4gQm9vbGVhbikgPSB7DQogICAgICAgIHV0aWwuU29ydGluZy5zdGFibGVTb3J0KHgsIHApOyB4DQogICAgICB9DQogICAgfQ0KICB2YWwgeCA9IEFycmF5KDIsIDMsIDEsIDQpDQogIHByaW50bG4oXCJ4ID0gXCIrIHguc29ydCgoeDogSW50LCB5OiBJbnQpID0+IHggPCB5KSkNCn0gICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGNhc2UgJ2NvbGRmdXNpb24nIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCjwhLS0tIGhlbGxvIHdvcmxkIC0tLT4NCg0KPGNmc2V0IHdlbGNvbWU9XCJIZWxsbyBXb3JsZCFcIj4NCg0KPGNmb3V0cHV0PiN3ZWxjb21lIzwvY2ZvdXRwdXQ+ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdsdWEnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCi0tW1stLQ0KbnVtX2FyZ3MgdGFrZXMgaW4gNS4xIGJ5dGUgY29kZSBhbmQgZXh0cmFjdHMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMNCmZyb20gaXRzIGZ1bmN0aW9uIGhlYWRlci4NCi0tXV0tLQ0KDQpmdW5jdGlvbiBpbnQodCkNCiAgICByZXR1cm4gdDpieXRlKDEpK3Q6Ynl0ZSgyKSoweDEwMCt0OmJ5dGUoMykqMHgxMDAwMCt0OmJ5dGUoNCkqMHgxMDAwMDAwDQplbmQNCg0KZnVuY3Rpb24gbnVtX2FyZ3MoZnVuYykNCiAgICBsb2NhbCBkdW1wID0gc3RyaW5nLmR1bXAoZnVuYykNCiAgICBsb2NhbCBvZmZzZXQsIGN1cnNvciA9IGludChkdW1wOnN1YigxMykpLCBvZmZzZXQgKyAyNg0KICAgIC0tR2V0IHRoZSBwYXJhbXMgYW5kIHZhciBmbGFnICh3aGV0aGVyIHRoZXJlJ3MgYSAuLi4gaW4gdGhlIHBhcmFtKQ0KICAgIHJldHVybiBkdW1wOnN1YihjdXJzb3IpOmJ5dGUoKSwgZHVtcDpzdWIoY3Vyc29yKzEpOmJ5dGUoKQ0KZW5kDQoNCi0tIFVzYWdlOg0KbnVtX2FyZ3MoZnVuY3Rpb24oYSxiLGMsZCwgLi4uKSBlbmQpIC0tIHJldHVybiA0LCA3DQoNCi0tIFB5dGhvbiBzdHlsZWQgc3RyaW5nIGZvcm1hdCBvcGVyYXRvcg0KbG9jYWwgZ20gPSBkZWJ1Zy5nZXRtZXRhdGFibGUoXCJcIikNCg0KZ20uX19tb2Q9ZnVuY3Rpb24oc2VsZiwgb3RoZXIpDQogICAgaWYgdHlwZShvdGhlcikgfj0gXCJ0YWJsZVwiIHRoZW4gb3RoZXIgPSB7b3RoZXJ9IGVuZA0KICAgIGZvciBpLHYgaW4gaXBhaXJzKG90aGVyKSBkbyBvdGhlcltpXSA9IHRvc3RyaW5nKHYpIGVuZA0KICAgIHJldHVybiBzZWxmOmZvcm1hdCh1bnBhY2sob3RoZXIpKQ0KZW5kDQoNCnByaW50KFs9PT1bDQogICAgYmxhaCBibGFoICVzLCAoJWQgJWQpDQpdPT09XSV7XCJibGFoXCIsIG51bV9hcmdzKGludCl9KQ0KDQotLVs9Wy0tDQp0YWJsZS5tYXhuIGlzIGRlcHJlY2F0ZWQsIHVzZSAjIGluc3RlYWQuDQotLV09XS0tDQpwcmludCh0YWJsZS5tYXhuezEsMixbNF09NCxbOF09OCkgLS0gb3V0cHV0cyA4IGluc3RlYWQgb2YgMiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAnaGF4ZScgOiB7DQogICAgICAgICAgICAgICAgJHN5bnRheF9jb250ZW50ID0gIg0KY2xhc3MgSGF4ZSANCnsNCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1haW4oKSANCiAgICB7DQogICAgICAgIC8vIFNheSBIZWxsbyENCiAgICAgICAgdmFyIGdyZWV0aW5nOlN0cmluZyA9IFwiSGVsbG8gV29ybGRcIjsNCiAgICAgICAgdHJhY2UoZ3JlZXRpbmcpOw0KICAgICAgICANCiAgICAgICAgdmFyIHRhcmdldHM6QXJyYXk8U3RyaW5nPiA9IFtcIkZsYXNoXCIsXCJKYXZhc2NyaXB0XCIsXCJQSFBcIixcIk5la29cIixcIkMrK1wiLFwiaU9TXCIsXCJBbmRyb2lkXCIsXCJ3ZWJPU1wiXTsNCiAgICAgICAgdHJhY2UoXCJIYXhlIGlzIGEgZ3JlYXQgbGFuZ3VhZ2UgdGhhdCBjYW4gdGFyZ2V0OlwiKTsNCiAgICAgICAgZm9yICh0YXJnZXQgaW4gdGFyZ2V0cykNCiAgICAgICAgew0KICAgICAgICAgICAgdHJhY2UgKFwiIC0gXCIgKyB0YXJnZXQpOw0KICAgICAgICB9DQogICAgICAgIHRyYWNlKFwiQW5kIG1hbnkgbW9yZSFcIik7DQogICAgfQ0KfSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOyAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhc2UgJ21hcmtkb3duJyA6IHsNCiAgICAgICAgICAgICAgICAkc3ludGF4X2NvbnRlbnQgPSAiDQpBY2UgKEFqYXgub3JnIENsb3VkOSBFZGl0b3IpDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCkFjZSBpcyBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LiBPdXIgZ29hbCBpcyB0byBjcmVhdGUgYSBicm93c2VyIGJhc2VkIGVkaXRvciB0aGF0IG1hdGNoZXMgYW5kIGV4dGVuZHMgdGhlIGZlYXR1cmVzLCB1c2FiaWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIGV4aXN0aW5nIG5hdGl2ZSBlZGl0b3JzIHN1Y2ggYXMgVGV4dE1hdGUsIFZpbSBvciBFY2xpcHNlLiBJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBvciBKYXZhU2NyaXB0IGFwcGxpY2F0aW9uLiBBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgW0Nsb3VkOSBJREVdKGh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbS8pIGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0Lg0KDQpGZWF0dXJlcw0KLS0tLS0tLS0NCg0KKiBTeW50YXggaGlnaGxpZ2h0aW5nDQoqIEF1dG9tYXRpYyBpbmRlbnQgYW5kIG91dGRlbnQNCiogQW4gb3B0aW9uYWwgY29tbWFuZCBsaW5lDQoqIEhhbmRsZXMgaHVnZSBkb2N1bWVudHMgKDEwMCwwMDAgbGluZXMgYW5kIG1vcmUgYXJlIG5vIHByb2JsZW0pDQoqIEZ1bGx5IGN1c3RvbWl6YWJsZSBrZXkgYmluZGluZ3MgaW5jbHVkaW5nIFZJIGFuZCBFbWFjcyBtb2Rlcw0KKiBUaGVtZXMgKFRleHRNYXRlIHRoZW1lcyBjYW4gYmUgaW1wb3J0ZWQpDQoqIFNlYXJjaCBhbmQgcmVwbGFjZSB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMNCiogSGlnaGxpZ2h0IG1hdGNoaW5nIHBhcmVudGhlc2VzDQoqIFRvZ2dsZSBiZXR3ZWVuIHNvZnQgdGFicyBhbmQgcmVhbCB0YWJzDQoqIERpc3BsYXlzIGhpZGRlbiBjaGFyYWN0ZXJzDQoqIERyYWcgYW5kIGRyb3AgdGV4dCB1c2luZyB0aGUgbW91c2UNCiogTGluZSB3cmFwcGluZw0KKiBVbnN0cnVjdHVyZWQgLyB1c2VyIGNvZGUgZm9sZGluZw0KKiBMaXZlIHN5bnRheCBjaGVja2VyIChjdXJyZW50bHkgSmF2YVNjcmlwdC9Db2ZmZWVTY3JpcHQpICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICdzcWwnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINClNFTEVDVCBjaXR5LCBDT1VOVChpZCkgQVMgdXNlcnNfY291bnQNCkZST00gdXNlcnMNCldIRVJFIGdyb3VwX25hbWUgPSBcJ3NhbGVzbWFuXCcNCkFORCBjcmVhdGVkID4gXCcyMDExLTA1LTIxXCcNCkdST1VQIEJZIDENCk9SREVSIEJZIDIgREVTQyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAncGdzcWwnIDogew0KICAgICAgICAgICAgICAgICRzeW50YXhfY29udGVudCA9ICINCkJFR0lOOw0KDQovKioNCiogU2FtcGxlcyBmcm9tIFBvc3RncmVTUUwgc3JjL3R1dG9yaWFsL2Jhc2ljcy5zb3VyY2UNCiovDQpDUkVBVEUgVEFCTEUgd2VhdGhlciAoDQogICAgY2l0eSAgICAgICAgdmFyY2hhcig4MCksDQogICAgdGVtcF9sbyAgICAgaW50LCAgICAgICAgLS0gbG93IHRlbXBlcmF0dXJlDQogICAgdGVtcF9oaSAgICAgaW50LCAgICAgICAgLS0gaGlnaCB0ZW1wZXJhdHVyZQ0KICAgIHByY3AgICAgICAgIHJlYWwsICAgICAgIC0tIHByZWNpcGl0YXRpb24NCiAgICBcImRhdGVcIiAgICAgIGRhdGUNCik7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0gICANCiAgICAgICAgDQogICAgICAgIC8qIGNyZWF0ZSB0ZXN0IHRleHRhcmVhICovDQogICAgICAgICRzbWFydHktPmFzc2lnbigndGVzdGFyZWF0ZXh0JywgJHRoaXMtPkxhbmcoJ3Rlc3RhcmVhdGV4dCcpKTsNCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd0ZXN0YXJlYScsICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJHN5bnRheF9jb250ZW50LCd0ZXN0YXJlYScsJycsJycsJycsJycsJycsJycsJ0FjZUVkaXRvcicsY21zX3VzZXJwcmVmczo6Z2V0X2Zvcl91c2VyKCR1c2VyaWQsDQogICAgICAgICdtb2RlJywNCiAgICAgICAgJ3RoZW1lJywNCiAgICAgICAgJ2ZvbnRzaXplJywNCiAgICAgICAgJ2Z1bGxfbGluZScsDQogICAgICAgICdoaWdobGlnaHRfYWN0aXZlJywNCiAgICAgICAgJ3Nob3dfaW52aXNpYmxlcycsDQogICAgICAgICdwZXJzaXN0ZW5faHNjcm9sbCcsDQogICAgICAgICdrZXliaW5kaW5nJywNCiAgICAgICAgJ3NvZnRfd3JhcCcsDQogICAgICAgICdzaG93X2d1dHRlcicsDQogICAgICAgICdwcmludF9tYXJnaW4nLA0KICAgICAgICAnc29mdF90YWInLA0KICAgICAgICAnaGlnaGxpZ2h0X3NlbGVjdGVkJywNCiAgICAgICAgJ2VuYWJsZV9iZWhhdmlvcnMnDQogICAgICAgICkpKTsNCiAgICAgICAgDQogICAgLyogUHJvY2Vzc1RlbXBhbHRlICovDQogICAgZWNobyAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGUoJ3NldHRpbmdzLnRwbCcpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/editor.jpg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAQEAYABgAAD/4RDgRXhpZgAATU0AKgAAAAgABAE7AAIAAAAHAAAISodpAAQAAAABAAAIUpydAAEAAAAOAAAQyuocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVuaXF1MwAAAAWQAwACAAAAFAAAEKCQBAACAAAAFAAAELSSkQACAAAAAzIzAACSkgACAAAAAzIzAADqHAAHAAAIDAAACJQAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDExOjEyOjAzIDE1OjM4OjUzADIwMTE6MTI6MDMgMTU6Mzg6NTMAAAB1AG4AaQBxAHUAMwAAAP/hCxlodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDExLTEyLTAzVDE1OjM4OjUzLjIyNTwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT51bmlxdTM8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAHBQUGBQQHBgUGCAcHCAoRCwoJCQoVDxAMERgVGhkYFRgXGx4nIRsdJR0XGCIuIiUoKSssKxogLzMvKjInKisq/9sAQwEHCAgKCQoUCwsUKhwYHCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq/8AAEQgBAwE8AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9v1C9+yXdnH5e/7VP5Oc42/u2fPv9zH41YqvqH2v7XZ/ZP8AV+f/AKR0/wBX5bev+1s6c/hmrFMOoUUUUgCiiigDxH9oz/mXP+3r/wBpV5QfC2rDRX1XyIfsscSzPi6i8xEZgqsYt28AkjBK85Fer/tGf8y5/wBvX/tKvO7nxlE/hX+x7S21GMGKFNk+pma3iZCrNJHCU+RmZT/EQAzDHNSw6lC48Ha1aWqXFzBBFGZI4n3XkOYXflVlG/MRPP3wuMHPQ1Jd+BvENleQ2tzYKs0zlFVbiJtuBuy5DEIu0FgzYBUFgcDNLqWtaHqM8ly+h3KXV1OJrqT+0MjkkuIl8v5NxP8AH5mB+dTXnibTZ/EsuqW2lXcUV3HLHdwSXyuXDqVOxhENhGcjIbkenFT/AF/X9fIP6/r+vmV7Pwwy+JLLStcnezW+KCC4tFju0cs21SGWQKVzkEhjggjGaq6PpVpqV1dW1xeTW80cEssHl24kWQxozkMS6lQQvUBuvStK28SaTbavpcy6Temx0v57e3/tBPMaXzN+55PJwR22hRwBz1zFputaDp+s3N5/ZGoyRSRPHFF/aUYZN8bI5ZvI+bhsjAGMc5pajVvy/wCCc7WoumWknhiXUoruY3MFxHDLbtbgIA4cqyybySf3fIKjr1NULloGuZGs45IoCx8tJZA7KOwLBVBPvgfStiy1bRoPDNxptzpd9LcXDpK1xHfoiB0DhMIYScYk5G7nHBFN7C6kFz4a1S00v7fPDCIQiSOq3MTSxq+NrPEG3qDlcFlA+YeorW1DwTHp+m6eX1WB9Rv9myBZ7UwpvzgtIJywGB94oFzxml1XxzPq+g/YrmfWxKYY4mRdXP2RtgAz9nMfcLnG/G7n2qhretaVqCWTabpl5aT2kaRBri+WZWRAcfKIkIOcc5/Cq0v8/wABa2+X46FTXdAu/D181rfS2cjq7pm1vI5xlTg5CMSv0YA+3WjQ9Bu/EF1NBYy2kbwwvMxurlIQVUZOC5AJ4/DqcDJqfxDq+m6vcPcWGlPZ3E88lxcSy3RmLM5ztUBVCoDnAILc8saraJqUWlaiZri3a5gkhlgljSTy2KyIUO1sEAjOQSD9KmO2o35E9t4X1O8u7mC3Fo32UqJZjfwLCC33QJS+wk84AYng+hqxB4G8Q3Fv5yWUar57W22W6hjczKcGLYzht/omNx7A05dc0Roriyl0S5TTXeOSKK31ALKropUs0jRsG3biSAqjIGMDIO3J4i0G60GO81WMXV6upy3cdhBdSQvChEaqrMYWR1xGM4YNgDnJID/r8v8Agi/r+v6+85OPQdSl0S61dLU/YbOVYZ5S6go7dBtJ3fkKzq17zUdPu9HkMlmz6zc3rzz3bMVVIyBhEUHByxYkkcYAHesikr9SnboFFFFMQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2Xql5f22u6dHCLb7FcSmKUuGMhby3YbeQFA2dTnOegxk1NV1TUrDW7KJBb/Y7iVIgphkZnycMTLwkeMjCncX6DBq3rOiyane28yate2X2Zt6JbrCRu2ldx3xsc4Yjrj2zTLrQhd6gtxJqN95IkSVrMOpid0IKnlSw5CnCsFJHI5OdF0B9fQ1aKKKQBRRRQB4j+0Z/wAy5/29f+0q8iurK2Tw5p9/CJVmmnnhmDuGUlBGwKjAI4kwQSemc84Hrv7Rn/Muf9vX/tKvJLjUIT4YstNtnm3rcS3FyGUKhYhVQDBO7AVjkgY3kD1MsRl0UUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2Tq73sOvaW0N55drLOYZbcRKfMzE7ZLHJ42jAGO+Segy9S8TRw+M9P0mPUbe3AmCXEDum+YvGxUAH5gAQvI6l1GeorZ1bQbLVruKa8N2Hh5j8i9mhCnBGcI4GcEjPXBxTdStbCa5s574zh7RzLD5c0qhSBgswQ4IAOMtkYJ9TVOUYpOWyHZydl2NGiiimIKKKKAPEf2jP8AmXP+3r/2lXjAjRLEySLmSRsR+wHU/wBPzr2f9oz/AJlz/t6/9pV4pNM0xTcAAihFA6AD/JP41DAtX1vZxW0D2sxkdh86nHy9+cE9iBx6evFN02KCa5ZLkfuzG3zZPycdfwqnUsFxJbMzRbcspU7kDcH6ikBovpkJ8mJW2lUYzSqQRkEcZLBcAnHWoY9NjN9Lby3SoI8YbK/Nn6sB+p/GoU1C4SNI1MexAVCmFCCOvORz07046pdGR3Zo2aTBbdChBI6HBHXmlqBOmnRtFcqThbabDz4OQuD/AAkgdQOOvNZrbQ52Elc8EjBI+lWY9RuYixR1+dizbo1bcSCDnI56nj3qsTkknHPoMUK4zQuLOB1DW77ZPKjdotp2jdgfeJ9SD+PWkvNPjsk3rcRzMr7Wj3Lz9NrE4474NQNf3DBwTH86CNsRIPlHQdOP/rD0pJL6abaZPKYhg27yUyT7nGT+PWjURYNrBPfiPItUaASfKCwB2bj1OcdfWlh0yOf95Hc4g2k7nVUbOQMYLAd/X/Ckh1V1ukmuEVyilV8pEjIyMdQvOB2NQnUJ/O3qUA27QnlJt25zgrjB59qNRkq2EH2ieOS7AWJA4dFDhhxno3Xn35796pyqiysIn3oDw2MZH0qZL+eN5HQQgyABh5CYx9MYFV2O5iTjJOeBinqAlaBS0TTItqGS4mzgshGDkDgh8fmDWfVh72aS2WBvL2KMDESAj8cZ/WgRLLZwxh9twz+U4Wb93jHbK88/jim3trBauY4rkyupwwMe3H6/n/WmyX88uN5jOGDH90g3Ed24+bqeuaZc3Ut0++bYW9VjVc/XAGaWoyWxhhmjufPOwJGHEgBJX5gOBnBznv8ApUiWEBd990yxiISo/lZyucHIzwfzHv3qvb3c1rv8gqN42tuRWyPTkdKeuo3CyO4MZLgKd0KEYHQAEYA9hT1ESJZW7YLXRCyOUiIiznpy3PHUdM9/xkTSCxjYyOItmZX2D5DznjdyPl61Vivp4ARGY/vbhmJTtPqMjjt09KRb24WAQrKRGAw24HRuv8qWoyyumxvYeelyGkwD5YCnqcYPzZHXuAKLzTYrRQTdK+H2OFKEj3ADknp3x2qCS/uJIPKdk27QpIjUMQOgLAZPQd+1El9NKVMgiYht24wpkn3OMn8aeoE01jbR3a263mTv2uWj2hfxJx+eOe+Oaiv7RLOWNY5vNDpuzgcckdiQenY0NqNw1yJyY/MAIyIUGcjByMYPHrUU9xJcOGlK5A2gKoUAewAxS1An08Ql3+0QJIijczOzAIo69CMk8AVJELVVjZ7XzBcSMMbz+7XOMDHfnqc9uKrQXctsrrFsKvgsHjVwcdPvA+tPTUrpHdlkGXYuSUU4Y9xx8p9ximItfZreKZLNoRI8ik+fuIKnJxgdMcc5z36VLNZWapNKqrzD8kQY/I+Mk9c46dfX2rOS+uI4PJWQbMEcqCQD1AOMgH0FObULhpHcmPdImxj5KdPy4pWY9CrVvTI45r5Y5Y0kVlbh2KjIUkcgj0pl3dNdPGSu1Yo1jVc9AB/jk/jTLe4ktZfMhKhsEfMgbg9eCKYjQbTY5bnBMdsFhV5AjgqCTgbSzAHjB+96/SqF1ALe5aNZVlUYIdSCDx7EjP405L64jChWTCggBo1IwTkjBHIzzjtUUsjTSF3CgnsiBR+Q4pajPsPWopF8QaPcrdXKg3BhMCyFY2BikYllH3jlV65AxxjnPFeIDqM3i2LUYJ5JLJdSgsnit72QmIbirJJCBs2udpJY9CvBzXf6noWkarciXVNKsr2RF2q9xbpIVHXALA8U240HSLu9F5daVZT3QAAnkt0ZwBwPmIzUV6TqxUU7GlOag72DSJXa2kglbe1tIYt5OSwwCM++GAPuDV+mQwxW8Qit40ijXoiKFA/AU+tKUHCmoyd2iZyUpNpBRRRWhB4j+0Z/zLn/AG9f+0q8oNnbp4eEzMpkJzkbM/TO7Pb0/DrXq/7Rn/Muf9vX/tKvFftMpgWHf+7U7gMdDz3/ABNSzqw1WnT5ueN7ppepensrUzCK2MqESpGWkYMPmBOeAMYx+PtUEvkRqJbWGdWSTafOCuv8uvsc1E95dSqyyXMzq+CwaQkNjpmhr67eRHe6mZ4/uMZCSv09KRrOtRd3FW+S7+ull9/XuXPssE2pXXnMIo4huwvyjqB2U46+lENlZSXMp84tbjaFYMQdx7fcJPQ9h0qmb67aZZWupjIowrmQ5H0NAvrsStILqYSMMM/mHJHuaasX9Yoc1+Xq3t6+f4eW6LkdjaqWjn85pBc+QGRgBj1wQfyzSrbQTQWYkRxJMhVXQBVGGPJ4+b36YA71T+33gORdT53bv9Yevr9aGvrtkZWupirDDAyHBHvS6DWIw605dPRd0+/ZW+dx7MH0yMuifLKVyqhSRgdSBz+NWDp0LTGNfMQfaViEjHIwwJ9OvH69Kpm9ujB5JuZjFjGzzDtx6YpGu7l4hE9xK0YAAQuSMDoMU+pmq1H7Sb0X4J+e22vkTX0NpGENpNubJDoSxx6HJRferXhW0S+8XaVbypHJG93H5iSYwyhgWGD1yARtGSTwASQKz5ru4uQBcTyyhem9y2Pzp1heSadqVtfQBTLbTJMgcZBZSCM+3FI5cRKNSTcFZelv1Y28mNxezzMqKZJGYrHGI1GT2VQAo9gABUNS3My3F1LMkMcCyOWEUZYqmT0G4k4HuSfeoqS2Ik7tsKKKKZIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9b+KbvRLDxNot1qd7aW13HOdpuLgKUjMUgJAY4ALYBIHOAM8CszW5gfHCHUF0yWOM24sba9XfJNvfDvBlgFZTyTtYnAHyjBPa3N5awXsNtNcwxz3GfJieQBpNoydo6nA64qpJrukRakNOl1WyS+JCi1a4QSknkDZnPOfStE9gf6F+iiikAUUUUAeI/tGf8y5/29f+0q8afNvYLH0e4w7f7o6D8Tk/lXsv7Rn/ADLn/b1/7SrxJmZzl2LHAGSc9OBUMC5fXdtcW0CQW4jeMYZgDz345OOSf88CGwhE97HGYmlHJKJ1IAz6jP0zVeikBumytPtm37JIGEAcQCNizNuwcpvz07bvf2qJIYxc3kUOnNKwRWSKZHDjkZwA2cc565xWPUsFtPdSFLaGSZ1RnKxqWIVRljx2ABJPYClYYk6NHO6OqoysQVU5A9s5NX44jNpKGGxidlLh5ssCmACCTuwO/WqVpZ3N/dR2tjby3NxIcJFChd2PsByaiIIOCMEU+gjTltEWzZvsjLGsSut183zsccencjAGRj2NUrIRm+hWdA8bMFYEkDnjtzRd2d1YXBt762mtpgATHNGUYAjIODzyCD+NQUB0NaayW1WKOKBbud5G4UNkbR8y4DevfrxSy2TrqV3vs5JnBLRROH+cbsZ9T+dZFFKwzfuIma9uFaw86U28TJHJvZh90EDBBOOffj60yC2d7eC3uLMyB7p0G1mIjBAztwfr1z0NYdFFguKysjFXBVgcEEYINactoi2bH7IyxrErrdfN87HHHp3IwBkY9jWXRTEa+qPdR2NvC9q9vBtXj94F3c8YJx79M1QsmhF0ouY0eNvlO8kBc9+COlV6KLAa9vCF1O2torMSSxYEzRl8g5GTw3GP55osbFB54urSeSZGX90ImZgpzzgMp9Of8ayKKVhm1Dp9tcY2p5IjnZCJQdz9wrDdxxu6elBtYJoIpYtO2wyI5eZWciLBIHfA4A69e2KxamluZJoo432bYxhcIoIH1AyfxoswL0logtGItGWNYlZLr5vnY449O5GAMjHsadewpa+SX0sxbgrFnLhSccryen459+1ZNFMRoatA0VwzfY0tozIwTbkbxnrgk8e44qDT7iO1vEmmiEqrzt9xyO4xyOv6Gq1FCVkDL0Zia8luo4gsEPzKhHHoo6nv159apu7O7O5JZjkk9zRubYU3HaTkrnjP+TTaACiiimAUUUUAFFFFAH194kubW01zTJms7qSZJ98k1tp8sxEflyKAWRD/ABMPlz3zird9befqdjFFBiJpjdXDhMBiigLuP97cUIzzhParV5q1lbavb6dNNi6ucmKMIzdATyQML904zjODjOKil1qwh1VNOklYXDYHETlASCQpcDarHHCkgnjjkVp2B7/Iv0UUUgCiiigDxH9oz/mXP+3r/wBpV4hXt/7Rn/Muf9vX/tKvE1id43kUfKmNxz0z0qHuAyinvDJGqs6kBhkfmR/MH8qZQB03g5tKlGqWWuvBDbS2wl85kj80GNgxSJ3UlWZdwGOpx1rfVLO58S3NjpsmgyaZb6abY3FyLKEzOYXKOC+Dv8xgCy88Dca86opPUFoejeC44dOvNLXd4eAg1A/2rLfXNszqqldpidmzgDJBiPLZySMVU+0XF14NXTo73w/CtnPdrctcJamQLhCpjbaZHLEMA0eT0yQACOEooeoLT+vX/M9B1kpd6LdWch0IrZaPZvDNFcWxneZfLVx5gbe5CiQFASBtXjJBPN69/wAgnQ/+QN/x6H/kHf637x/4+P8App/TFYVFAL/gfkbXhFLRvE1sb9ohEiu4WYxBJHCEqhMoMa5OBlgQM8g9K63WLXTpdWuobAaHDJf6VG6KbuzdI7lJVLDzFCxxtsDZwEVvfOT5xRTetv6/r/gAtHf+v6/zPSjdNZ6xrdnptz4beW80+1eJ9ll9mklXyvMAMihE5Eh2HbyM4ziqmkRQQ4jhk8NXf/EwkGqTXRt0V4flx5Ik2sEwZMGIBsj/AHa4EKzAkKSFGSQOlJQKx0rx/ZvA93NFb6Z9jvNQ8u2luIyb3CAE7GHATDKG9zXNUUUrFN3CiiimIKKKKACiiigAopxQhA+RgkjqM/l1ptABRRRQAUUUUAFFFSJC8kcjoARGMt8wBAzjp360gI6KfDC88yxRAF2OACQMn6mmUAFFFLTA+w/EUt6up6cbPSLu+S3n86R4HhUAeW6Y+eRTnLA9MY79qo3mm3Enijz/AOzbqXdNC6XCXIW3RV27vMj8wbnGGwdjY+TnjjavtWjtNZtLFra5c3ZKiZUHloQpYBmJHJCtwMnjnGRUFzr0Ntqgs2tbl0DJHLdIF8qF34RWy27JyOikDcMkVougP9DUooopAFFFFAHiP7Rn/Muf9vX/ALSrxmdljtoreNg3HmSEHI3HoPwH6k17N+0Z/wAy5/29f+0q8QqGBbutSuLyCKGdsrF93knt7nn/AOv6cU3T5Jor6NrZZHfP3Y87mHcDHtmq1FIDZlmNpdPZ/aGgMEflxSvu+Ukgt0BIz0yP60w3ccjOhvvLYNG/nAN8zKCGIwM556nGcc1HpWh3etQ3Z04Cae2RHFqiO0swZ1T5AqkEgsuQSOvGaIPDut3V7cWdro9/NdW3+vgjtXZ4v95QMr+NKwXKt86SahO8TiRHkZlYAjIJz3q3BdbLJEjvvsyqjCSHYSZCc84xg8YHJGMVFp+i6rq6zNpWmXl8sABlNtA0gjBzjdtBx0PX0qzH4Y1O5s7SbT4Hv5Lkyj7NawyPLEYyu7eu3/aU5GRzzg8U7aWAdJdW76V5C3KAqqGNW8wsrDr/ALI79PzpmpXa3UU+69WfEqmJSG+7g5xkcdR+VRr4e1p9OF+mj37WbI0guRbOYyi9W3YxgdzSXvh7WtNhMuo6Rf2kYkEW+e2dBvIyFyR1I5x6UW1C5WsHWO9jdpFiC5IZ1JAOOOnPXuOlap1SM3m8zRl/ICCUmXap3Z4P3+nf8OlVbjw3rlpcGC70bUIJhC05jltXVhGvV8EZ2juelOi8L6/cTiCDQ9SllMSzCNLSQsY2OFfAH3T2PQ0WuGw5dQb7Vdbb1LczIuJITIELAjn+9nGecVmT7TO5SRpRuPzsMFver9n4d1e+1OWwg028a4tz/pEYtpGa3GcEuqqWAHfikvNCv7TUNRtUge6/s12W5mt0Zo0AbbuJxwpPcgUtBktvJcR6SLo+ev2fckL87SH44Ptz+gpr3i/ZWC3YMflqI7YBgUcY56YBzk5ByfxrKq2dOmXSxflk8ouEC5O7vz0x/CapRbvYEXLm4ikjlMWoANJcrMikOPL65OcdeRnHp3qDVrtrifi7W4iyWUKpGz8wOv696luvDt9ZWMNxcKUecgRwGGXeSegzs259s5p134av7Oe2t2Uvc3JwkCxSBumTyUAOO+Ca0+r1E7W2DXcp2EwieXEwt5GTCTHPynIz0BIyM8irwvrVxLFdytKmUbK7gJHxhm7c85yeuPequq6VLpFysFxIrSEZIEciYGcfxqufqMioINPvLpFe2tJ5leQRK0cZYFyMhRgdcdutQ4O9hN8u5rLqm+QbtQKxm5JdW3nMeMc8c5A6e9YTAKxAYMAeo6GrsOi6rcbvs+mXku2QxNsgZsOBkrwOoHbrTf7PzpBv1uYWCSrE8AD70LBiCcrtwdh6E0uVonnj3JvMVrK2DainmQyblB8zKA7eB8vGMHpV641GC4cie98yPfuwA2f9Zn0/unA+hrLi02aXSLnUtyJBbypEdxOXd9xAXj0Vic46e4p91pbWmk2N9JdQMb1WdLdd/mKquybmyu3BKnGGJ9hUtaldC9LdR3FzbtHOj3O10DRrKxUn7pywLH8OmeBUkt41rdRx3M+ZhbBRJKJF2tvJPTDDIxz1PGetVJ/Dt6t3ZWdljUby8t0uFtbOOR5EDIHAI2jJ2nPy5A9aiHh7WjfQWQ0e/N1cR+bDB9mfzJU5+ZVxkjg8j0NFh36le/m8+9eTMTZxlot208dfm5z9avaVd28FsY5ZkjDsfMV/MORjAwF4PfO6obbw/rN5qE1haaTfT3lvnzraK2dpI8HB3KBkc+tTWXhPxBqWnSX2naLfXVtFJ5TyQ27PtbBJGAM8Y59OM9RRbQOoR3a/Y4rZ9QXyhDIrIQ5GTnb/AA/Q+2KVruN7G4j+2r5bwqIrfa3yMCCe2B0PIPOeax6vzaHq1vFcS3Gl3sUdts893t3URb8bNxI+XdkYz1zxTtcVyCwdI9Rt5JnCIkgZiQTwDntWiLyITxGe8E7K7MkgDqIxjgHgEDOOF6Y4qG58O6vp6rJqum3mnweasTT3VtIiIxGQCdvXHOBzjtRf6MNP1qOwn1G0MciRyC8QSmLZIgcNjZvxhhkbc+1G4E013C175sV3GkrwBfPUSfI+eeSC3I4zyaz72QzXO5rj7Q20AybSM8fmfqea0IvDksni1vD8t9aQXAuDbCeTzDEzhtoA2oW5PQlR15xWQylHKnqDikrDPsTX4NXm1GxfS7WymjtpfOY3F28RJ2Om0BY24+fOc9sY71R1jw2+r67BO9rCkCvFJJOt9MGYxtuAMAAjY543MSQD04FbuoXv2S7s4/L3/ap/JznG392z59/uY/GrFbdhP9AooopAFFFFAHiP7Rn/ADLn/b1/7SrxCvb/ANoz/mXP+3r/ANpV5QfC2rDRX1XyIfsscSzPi6i8xEZgqsYt28AkjBK85FQw62Meity48Ha1aWqXFzBBFGZI4n3XkOYXflVlG/MRPP3wuMHPQ1Jd+BvENleQ2tzYKs0zlFVbiJtuBuy5DEIu0FgzYBUFgcDNAC+FdV03TYNYi1S4v7cahZfZEexiVyoLqzE7nXjCY29wx5Hfd03xhodpeDzRdFLdLWOG7l06C5lljiDblKSOVjJJGGG4qFA574Fn4YZfEllpWuTvZrfFBBcWix3aOWbapDLIFK5yCQxwQRjNVdH0q01K6ura4vJreaOCWWDy7cSLIY0ZyGJdSoIXqA3XpRzW+X6f0w5b3/rf/hjdbxBot1cyeZf6zYxw6pLf20tnbp5knmbfvfvR5brt4YFuvTjlbbxJoX/CEz6LOL6G4meWYXS20czoS6ERby6kowTLMApzjggEHjK1F0y0k8MS6lFdzG5guI4ZbdrcBAHDlWWTeST+75BUdepqUklYe7uddfXmny+DtW1FtQkW41a2tYRYmeBhGYnToiymTACNt3IgUHGTkZo3XijTrfVdFu9M1HVrmKwSCGS2uLdYV2R4OVxK/O4bgMAA85rBufDWqWml/b54YRCESR1W5iaWNXxtZ4g29QcrgsoHzD1Fa2oeCY9P03Ty+qwPqN/s2QLPamFN+cFpBOWAwPvFAueM1XX5kK34f1+g+317RtPFpaQ3WpXtoJLl5557ZI5I/Oh8o7E81gTzuOWGcAcYzUr674cgsjBp91q6ldHk09We0jBd2mMm44l+VW3EEc4H96ue13QLvw9fNa30tnI6u6ZtbyOcZU4OQjEr9GAPt1o0PQbvxBdTQWMtpG8MLzMbq5SEFVGTguQCePw6nAyaSs1/Xa35FPRq/T/O/wCZ0l14h0G8YwHUdZt4Va0mW4is4/NeSGHyjlfOAHQMrbiQWYY71T1PX9KvdZ8T3kV1rMKaoWkto4isauzPuKTruO5Rk4weSAcDpWZbeF9TvLu5gtxaN9lKiWY38Cwgt90CUvsJPOAGJ4PoasQeBvENxb+cllGq+e1ttluoY3MynBi2M4bf6JjcewND11f9bL/IFpp/Xf8AzOfrpLnxGJPCEGmo+JMKjqJJeFBb1baeNvHTnpwMZkeg6lLol1q6Wp+w2cqwzyl1BR26DaTu/IVnVrCrKClFddH+Y02tTU1CXTbg2vkXF2fLRIn32yjCjqwxIcn24+tSXN1pkmuxXkc92Yt4eQNbqGXGMADfznHqMe9Y9FUqzUuZJXvfruJ6qxa1BrZ715LOSWSNyWJljCEEk8YDN+eataXdaellcWupm5WOSWKYNborElA428kYyH684x0NZdFZRfK7oU1zrU6aXV9Lf+2DFfalbtqFyJl2Wy/dBZgrHzR3b3+6D7CjDcaY2hXMN1d3v2y4lWY4tlZdyhwAWMgJzvyTjj0NY9FPm8jJUUlZPt26fI3o7uGb4fT2PmIk9tqK3IRnAMqPGUOB32lV6f38+tM1dVfw3oM0c0DhLeSF0WdDIjefI3zIDuAwwIJGDmsSioau7/1tY2W1jrbiextPFOhalfXWbOO0s5CbIxzyBo4kBUpvG07lIwxB74NI+v6fLqGqw3GravPY6jGc3MlspmjcyK7DyzNgg7ACd4zwccYPJ0Uf194f8D8DsLnxBpGo28+n3N5qdvaqLXyruO1SSabyY2T94hlUD72Vwx2gY560yTX9E1a41VdZ/tCG3ur+O8Q20aPJIFV1KsWYBWYOCX+bnPymuSoo/r+vuQG4ngzxNcxrPZ+GdZe3lG+JlspHDKeQdwXB47jrWpNq+gvpN7HcnVIdTn06CxaP7NGYomhMfUlwx3eUOw25PDVx9FAHU6/q+l6gunw2Or6w1tDbw2k0U1oqKsaYyyqJyGO75tpwM96g11tK1jULJdCu7qSUww2zC/hitUHlxqgbf5rAZ255wB6mudoosG33WOwQxXXxhaeK6tBbpq/nm4kuo0i2LLuLB2YKeBxg89s1yrokksjGZF+Y4znn8hUNFEdAfXzPtXUPtf2uz+yf6vz/APSOn+r8tvX/AGtnTn8M1YrH8SXuqafi4sJLFYlAHlXCs0lzISAsSYICE9Afm5PTjmG61a/j1WUxC3Fha3ENtMjIxlkaTb8ytuAUL5i8ENnB6cVqtQZvUUUUgCiiigDxH9oz/mXP+3r/ANpV53c+Mon8K/2PaW2oxgxQpsn1MzW8TIVZpI4SnyMzKf4iAGYY5r0T9oz/AJlz/t6/9pV5FdWVsnhzT7+ESrNNPPDMHcMpKCNgVGARxJggk9M55wJdxaF/Uta0PUZ5Ll9DuUurqcTXUn9oZHJJcRL5fybif4/MwPzqa88TabP4ll1S20q7iiu45Y7uCS+Vy4dSp2MIhsIzkZDcj04rmKKnYZ09t4k0m21fS5l0m9Njpfz29v8A2gnmNL5m/c8nk4I7bQo4A565i03WtB0/Wbm8/sjUZIpInjii/tKMMm+Nkcs3kfNw2RgDGOc1ztFFgJbloGuZGs45IoCx8tJZA7KOwLBVBPvgfStiy1bRoPDNxptzpd9LcXDpK1xHfoiB0DhMIYScYk5G7nHBFYVFHSweZ1uq+OZ9X0H7Fcz62JTDHEyLq5+yNsAGfs5j7hc4343c+1UNb1rStQSybTdMvLSe0jSINcXyzKyIDj5REhBzjnP4Vg0U763+YW0sbXiHV9N1e4e4sNKezuJ55Li4llujMWZznaoCqFQHOAQW55Y1W0TUotK1EzXFu1zBJDLBLGknlsVkQodrYIBGcgkH6VnUUlpsD1OiXXNEaK4spdEuU013jkiit9QCyq6KVLNI0bBt24kgKoyBjAyDtyeItButBjvNVjF1erqct3HYQXUkLwoRGqqzGFkdcRjOGDYA5ySBwVFPrcVjXvNR0+70eQyWbPrNzevPPdsxVUjIGERQcHLFiSRxgAd6yKKKSVth3uFFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPsbVvDv9oa7FqaatfWk0EflxpCIWRM9WAkjbDEHBIwccU+bQ0m1MXZvLlIy6SyWqiPy5XTG12ym7I2r0YD5RxVfxRLewzQmw1VraeT5LazjgRzcy9fnLAnYB127cDJLdMSu97F4ugja83Wc9rKy2wiUBWQx/MW+8T857gYxxnk2gZr0UUUAFFFFAHiP7Rn/Muf9vX/ALSryS41CE+GLLTbZ5t63EtxchlCoWIVUAwTuwFY5IGN5A9T63+0Z/zLn/b1/wC0q8YEaJYmSRcySNiP2A6n+n51DAr0VevrezitoHtZjI7D51OPl784J7EDj09eKgtLdbmVoy7KQjMu1c7iBnHUUgIKK0l05Ibq2iu3ZZJWwybAwHOByGGQfUYqOwtBdi4iCAsqhg+cbAGGT1xjBPX0ougKNFW1htmiujFI7mNQULx4yMgZ4bg8+9VKACir/wDZ8X9nG5+1AsqhiihTjJxj72R+IA96S5trOK5jjS4mw20sXiHyggHPDc9en60XAo0VcltkswHkzIwlZPKkXAYDvkNn/PWpRp8c2o3aB1ghhY9x0zgAbmA/M0XAzqKmuoBb3LRrKsqjBDqQQePYkZ/GrVppiXFsJZblId7FVDMgHHc5YHHPYGi/UDPorQi06KTT2uzcMFjBEgEYO1sjaB83Oc9e1RzW1ssMHkzStLKgO1owFzuI67uOnpRcCnRWheabFaKCbpXw+xwpQke4Ack9O+O1OOnWovRbi9YkZ3HyemBn159/0zRdDsZtFX49PjlnUJMxhaLzPMKKpAzjkFgByPWhLZIL+a1lRJgEYq+TxhSwIwcenqKLiKFFFWVEbaZI3lKJEkUCQE5IIbg847DtQBWoqzJFCLKCRGJLOyuSmCMAdPmwRz6CpriygtnzFMZxHKqSK8ewHIJ7H2PpQBQorSu9OigvxA8vks8h+UgYRMnHJbrjHBx15NV7+0SzljWObzQ6bs4HHJHYkHp2NCaYFWirumwWs8rreTeSoU7WOMZPA7juQf58c1HBFF5sskgLQxAnBP3j0Ucf07A0XArUUUUwCiiigAooooA+ytT8N6dqOrf2hcC6S6EQh823vZoDsznb+7cDGTmln0CxudVj1GVrz7TFjYUvpkQDjjYHC4O0ZGMHHOaoeKI1udRhtbW9vl1N0/0eG1nZEh55nkC4BUej5BxgDJOW38a3PimGOxvb572J43mWOdhBbRDkq6DCkuMgBgW5yMBeLXQGdHRRRQAUUUUAeI/tGf8AMuf9vX/tKvFJpmmKbgAEUIoHQAf5J/Gva/2jP+Zc/wC3r/2lXjJVYbAblBknOVJH3UHcfU/y96hgVqkgmkt5llhba6HIOM4q1fNYNbQfY1YSgYkycj19BnrjPt+JisLeO5utkz7ECsxPPOBnsD/I0gBL+4SZJQ6s6KFUuitgA5HUfrSpqNzFK0kTRo7EElYlHQ5HGP8A9dWUs7Ga8MUErOjRFg4Y4jYf3iVGV98DrStb2UM16j29wwhA25lAP3gM/d7549qWgyrHqE8W/YIR5h+YGBDn25HTgcVWJyc1pxWNmsG++le3ZpGUKxbKYx1AQ5PPT5agjishYCWYT+YXKZRht6Zzgj36d/UUaARyX1xLB5Tsm3aFJEahiB0BYDJ6Dv2oa9lkjWKZt0QK7goCswHAy2MnjpnNTzWtr9nPkLMJVhSUl3BU5IGMYHr1p19ZQ2sCywPudJPLkUneNwGe6gfhz9aegiC5vvNuY5Yk2iOMIqy7ZOn1XB/KkbUbhpzMTHvYYb9ymGGc8jGDz60X5BuVYKq7okYhFCjJUE8Dik05tuowAqjB3VSHQMCCRngil0BkMsjTSF3CgnsiBR+Q4qSG8mgjMaeWyZziSJXAPtuBxUlmsTTypIrEmNypBGAQpPIIOentUtnbWs1vF5wm82WbygVcBRwOcY9+maB9SJNSuo4ljR0CKjIB5Snhuvb2pgvZxbeQHATG3hRuxnON2M4z2zVuK3ifSFuJ1ysTMpEZCu2duMnB4GTyfUCmmztBpjyB5PtCIrlSSMZIHIK9ORyGP0o0AryX00pUyCJiG3bjCmSfc4yfxpTqNw1yJyYvMAIyIUGc9cjGDTLOOOW8ijn3bHYKdrYPPvg1auLGKxhja5Vnd3PCSADaByOV4IPFPQRANQuFCAGPCJsAMKEYznBGOeeeaX+07r7Q85MRkcYZmhQ8Yx3HpUyAQ+IPLVUZDPsIeNSCN2OmMfkKhsm/0iSMojK0cmdyA4wpIxkcfhSGVncyOXYAEnJ2qAPyHAqZL2aO2MCiLyz1zChJ69yM9zVetIxW81lAGRlnMDsGTaF+UseRjJPGM59OtNiKxvpjbrARF5a9B5CZ7c5xnsKV9RuH3bzGd7h2/cpyR07f5yfWrD2NvHYeaWYyxhGkQPnhu33cA49z9KeNPtWmVP3qLPIogYuD8pAJJAXk8gfU+1K6AqnU7ppEdnQsm4AmJTw2cg8cjk8H1qGe4kuHDSlcgbQFUKAPYAYqa+is4whs5t5OQ65LY9Dkov8ALtUVtOtvIztEkuUZQHAIBIwD+HWmhkNSec32YQAALu3kjqTjAz9OfzNW4DFfa0reSkcbNu8pRxgDOPxx+tPtrWyktRPez+UZHYDbkBcY7BDnr0yKLiM2itOGxtn0xrllmLIrZUOBvIIwyjb90Z5pk0Fu1vAILeZZGiDvIZNyqNxBJG3+tFwM+itK+tbC2O2KZnkjk2vHuOWHc8oAp/Pr7U42unjUfs4Fzhd247l5wM8ce34+1K47GXRWjHaWryrIS6W5h8xt8nK/MV6hTnkf3e9Vr63W1vZIUYsqngnrgjNO4j7H1Pw/o2qXfn6npNjeTKoUSXFskjAemSCccmmS+HtFm1AX82kWEl4GDC4e2QyBhjB3YzkYGPpXP+Nrvw8+swadqcllHqMkQZLi8nWMWce7mRCx4kyONvJIGSAM0mvtpTeLLB457Y6pHcwgwOrG5ZCRgwknCpgsX2qQwDAkEGtF09QfX0OyooooAKKKKAPEf2jP+Zc/7ev/AGlXickrysDIckKFHsAMCvbP2jP+Zc/7ev8A2lXKan4PtI/h29/b6Vc/arW3t7hr+K2lEMwkxuAkaVlcDdztjQKR1PeJaagt7HndOR3jcPGxRlOQynBBrf0vw20Ot6APEcbW2m6q6ukiyITJFu2k/e+XnjnGOtdc3hexl8WaJa23grU8zvItzaXlnPZRSxgD51YzyNlckn5sH5Rj1LCuecNfXbszPdTMWXYxMhOV9PpSfbbrz/O+0zebjbv8w7sema9FfQ7LTPFMFnaeGbbULW60Z5LGWdLgHUX8ksJFTzMqxYY2DkdRyQai0Pw1ZPPqZ1jw1PJqEckJGkWFvLdG3idCSxRblJFOQAdzHaTggZGC39fO39fiN6Hn8V5dQFjDczRlzltjkbj70C8uhB5AuZRERjy952/lXdaZoEH2DXrmHwTf6rFZXoS2+0JcRyIvzbklEbY+QAEgYIJBJx8tPtvDtvqHh+wS08ITebe6feXK3qNcPIDFuMeBnYc4RSduDvGApxmelx9Tgje3TKVa5mKsuwgyHBX0+nNK1/eOFD3U7BSCoMhOCOld5qXg+0T4dvf2+lXP2q2gt5zfxW0ohmEmNwEjSsrgbudsaBSMZPfM8Zab4jGiaFfa/ZaoClo0MlxexSfKfPlKoWYcHbjA9Mdqb0dhLVXOUmu7i5AFxcSyhenmOWx+dNhnmt3L28rxMRjcjFTj8K1PCunrqnia0tXsZtQQlne2gGXkVVLEAblLcDO0MCegIJFd1P4d0r+1rq2sfB7z3KaMt3HYSm4gl87z9nMXmsy5U52b2JAUqV3U7WsFzzVdQvFkaRbucO+NzCQ5bHTJzQL+7ByLqcHcX4kP3j3+tekaN4Q0241qcXWgzO+y1WbS4oJ55LKSTcWJAmjKIAoO6Rm27wCDyaj03whBGY9PufCc9282uS6d9sk+0LIkQGdwCsE3AZbJXGFOQey2/rzS/UL3/ryv+h50L26UELczDII4kPQnJ/Oke7uZIBDJcStEuMIzkqMdOKZLFJbzPDPG0UsbFXR1IZWBwQQehrcuXeL4e6fFHOzRT6jcSSxoxChlSIKGHdgCSDggB+udwAPrYwQSpBBII5BFSC6uFkEizyBwSQwc5BPU596iopiLH9oXnm+b9rn8zG3f5hzj0zmhdQvFkaRbucO+NzCQ5bHTJzVeikA53eRy8jF2Y5LMckmpVvbpAoS5mUKpVcSEYHoPbioKKAJ/tl0YPJNzN5WMbPMO3Hpioi7kLlmOzheenOeKbRQBNPdXFzt+0zyzbenmOWx+dQ0UUAPhlaCdJYzhkYMM1JFeXEBb7NNJAHOSsTlR/OoKKAJ1vbpFVVuZlCgqAJDwD1FM+0TeR5HnSeTnPl7jtz9KjooAnN9dsqK11MVjIKAyHCkdMelKb+8aVZGu5zIowHMhyB9c1XooAnF9dqyFbqYFBtQiQ/KPQegpks0sz75pHkbGNzsSajopgfat/qlhp9zDFf31tbSXDbYUmmVDKeOFBPJ5HT1FPkuYIZooppo45JyViRnAMhAyQo78Anj0rnfFd5EdT/s19NuTFdQBbu+j0+WceTk/ulMaH5jz1wFznk8VX1ldTj8baVcGzW4tTcKkUiGVmgQxsHLBYiq5Zl5LjO1emGIta2B9Tr6KKKACiiigDxH9oz/mXP8At6/9pV4hXt/7Rn/Muf8Ab1/7SrxCoe4BRRRQAUV1ngYb11tUg0qSZbASQNqiRGOOQSxqDukG1ThmABIUkjdkVrEQLLctpUXh061tt/tIuHtDaj5WMnk+YfJyT5e7b0JO3AzRb+v6/EV/6/r8Dz2pVtp2tXuVhkMCOEeUKdqsQSAT0BIBwPY16Z4dOg2up38otdDn099QZS1zd22YY1UZIinVneLLHb5TK52kE5xXM2tjLfeAbnc2io63KTW4a5tIrnYBL5g5YSkZ2YU9eNopX/QpHKVLLbTwRxPPDJGkyb4mdSBIuSMrnqMgjI7g12Gr3c+q+DdPcXehR29vYrHInk2yXRlWZ8IoVPNHylWzwh5JOScy32n25vPDd1rL6GYVCw362N1aAE+c+C6QNnGzZlgOnfNPrbzJ6XOFq/pus3mlQ3cVn9n2XkYimE1rFNuUHOBvU7eQDxjkA9hXd2DR/wBq6e+sQ+FjfbrnKRvY/Z2h8rKCTYfLB8zhTw/XJxissqsniXw1ekeG1nuoA1wk7QizEgdwPOjiOEGzy8jA5980LXQb0VziaKnvP+P+f/U/6xv9R/q+v8P+z6e1d34Ct9Gl0ZotT/s6U3M0kc5vLq0gMCeWNpBlUyNkk/6spgjk9wk7xuD0djg7izubTyvtdvLB50Yli81CvmIejLnqDg8jipP7Ruf7K/s0shtRN54UxqWVyApIbG4AgDIBwcDjgV30KW0fhvRYbyTw9LZxWMy6juuLeS6XMkrIEO4uDhlKiPuTv4qOd9Kt/h6YLm10fzDbW5S4t7q1mmdmdGcBAgnRwpbcXZlG0gDlcPd2Xf8AUSPPoopJpUihRpJHYKiIMliegA7mpb6wvNMvHtNStJ7S5TG+G4jMbrkZGVPI4INdl4igguLK4g2aBGrXkcektYTWyuIjuB81kbcF27CWm+YHHI+anT2Udv4msxd3OjzQXWlLZ7jeW1wiSi0CDJDN5eJAuHOOmQcZqb+RS/r7zg6K9Htpv7I1fTlS58OtcXGiT20rxi0eITjzdqucbFbBjUueG5+Zhk0aG1haz6mL+LRNS1dpIXIiubG3t1jKHcqGaFoSQ20NsGT2JG6qtr/Xe3/B9CbnnFFddHH5Vn4qv7bT9Hhsd4t1ju3+0vCzsxVbaRBtZgFPzdNozXI0rlBRRRTEFFFFABRRRQAUUUUAFFFFABRRRQB9narr2naTdLFfTOjsu87IXkEa5xucqCEXP8TYHB54NI+t2Sav/Zv+kPcjbuEdpK6Ju6bpApVencis/wASy6rNqUdlBpF1daWyBrmW2kg3SnP+qxJIu1SOp5yDgY61DqGn3UniRbiz068hmeSEm+iv8QGNSNwkh3jLY3KPkbqDuHa10BnTUUUUAFFFFAHiP7Rn/Muf9vX/ALSrxCvb/wBoz/mXP+3r/wBpV4hUPcAooooA2fDja5Nevp/h3UJLSW8XY8a3y2qzjoFJZlDH5sBepzwKx2BVip4IODWx4TNpH4osLrUNQgsILWeOdpJ0kYMFdSVAjRjnGeoA4610/hfXbLw2NTtbTV9MFxLNHLHqDtfxRyIA2Y8whJAQSDhl2nn0FHUO/wDX9dDjtL0W81hpvsQgCwKGkkuLmOBFBOB80jKMk9s5qtNazQLuljIQuyLIPmRmXG4Kw4bGR0PcetdxpuvvHZ+IVtfFtrocl7diSKGzN5HEcNlmQLGSqsCAAcHjBAGKp2WvPceB4dLuPFl3p0Vs1wJLJTM/2hGVNiKq/IRuDAhmUDcSM9KXS4dbHG0Vu3d/5ngjT7H+2fO8q6lf+zPsu3yMgfvPN/i3enbFYsTrHKrtGsqqclHzhvY4IP5Gn1sHQfa20t5dJb26hpZDhQWCj8zwKmGl3TXn2VBDJJt3kpOjIoHUlwdoH1NWLfUITqFvJDDbaWYyT50SSSjOONyuzZH0HfoelWZbmzkuHh+02qGa08qS5igaOIvvDA7VQHoAOFHP51vGnDlvfW/ddvv+/QpJGfFpN7LdS26RqHh++WlVVGenzE7ecjHPPakg0q8uVlMUP+qba291U7uflAJG5uDwMmr7z2l0bm1a9ihTEAWd1cq/loVPAUnnORkDpUsV/aT3ZuZLlLfyb97pUZXJlU7TgYUjPy98dar2dPTXv1Xf+vXoFkc/RXXtcXNvoemS3t48Vo1u4a1kikxcDc20A4KnjGMkbRgiobzVIJfDf2NdX33Kwxh3xJ++UFv3ONuBtzncevT6OWHjFO8tV6f5/wBetkzlOWorofFF3K9ro2nvrKamllZJtWOFFS1L/MYg6n94RkZJ6HI7Vz1cpIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2ZrWtrpMpL2F7cRInmzTQRqUgQdWYswz3OF3NgdOmVudW8nUksbeyuryUgNKYAgWBScBmLso7HgZOAeKo+ILPXLzWIBZw2U+mRKHeCW7eBpZQcjcVjfKDg7eMnrkcVU1LwvLc+Jv7Tht7WVpWgP2iaVlltPLbLeUAhB3Dg8rnvkcC10BnU0UUUAFFFFAHiP7Rn/ADLn/b1/7SrxCvb/ANoz/mXP+3r/ANpV4hUPcAooooAswafe3VpcXVtaTzW9qAZ5o4iyRAnA3EDC57Zq9b+F9Zm3s+m3kEaWpuzJJaSlfKwSG+VThW2kBj8vqQMmp/CuuWeiXN42o2n2yGa3KpCyK6mVWV49wbgruXB68E8VqjxB4fuvFM+oXBvrCyS0a1tLa2tEl2q8LRtnMq7cM5YYznPak/IF5mHoHhnU/El2sWnW0pi8xY5LowyNDAW6b2RW2g+uKU+E9fGjjVl0e9fTiHP2pIGaMBfvMSBwvueOD6Gt7w/4i0LS7vSpLi91dE0a+e4gFtap/pKMVPz5mHlsdu0435GB2rNF/wCH59G+yXz6kWtLi5ltlhhjUTiRUCb2Lny8FASAHyDgEdaGC8/63KereGNT0iBLqW3kmsJEjaO/ihk8h96BwA7KOcHkeoNZ1xY3dpFBLdWs0Mdwm+F5IyolXONyk9RnuK6m+1/R7m0volvdUcSaRbWNuklqgUPEyMc/vTtXMfBGT+8bjj5sTV760u9P0qK1utTmkt7cpMl7IGjibcTthA6Jjse+aAX6f5GWqs7hUBZmOAB3NaEmizRai9pLPAvlRiWSYsdiKQDnOMnqBwDz0zVaxu2sL2O5SNJGjOQr5x0x2IP5GtW71PTZ9QfyllgtZbRLdykPzKVxyFaQ5Hygfe6e/J3hGDjd73/T/Mat1KaaPIbmaOW5t4Y4duZ3LbG3crjAJORz06dcUQaLPMZFeWGF0lMKpIxzJIOqrgHnpycDkc1Ob6xuHnguHuI7ZhCI3SJWc+Wu0ZUsAMgk9TinxatayXDXF35yPHdtdRLHGGDE4+ViWGPujkZ71fLT0+fXz/y27j0M46Zfi2NybK5EAUOZfKbaFPQ5xjFD6ZfxxNK9jcrGqCRnMTABT0YnHQ+tbZube103TLma6kaaGGQLBE8bqSzMcMA+5MgjPynI4qG61XTZtAGno12XjRCkrRLlnBbKsd33Bn5R2OacqVOKeuq/r+v+CgsjIuLC8tIIJrq0ngiuV3wSSRlVlXplSfvD3FV62fEF3aSpp1rYahfX0VraIrtcyExpIw3OsSkAqgJx7kE9MVjVykhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfZOv6pfaWWmtdNS5tok8yeR7kRnGfuxrtO9/Y7R0GeeIrvVNVtdVji/sy2azluEgSY3hEr5UFmEYjIwPm6sD8pPpTdc0TU9Q1u3u7bUrWO3tlBS0ubNpk83OfM+WVMkcYzkDGRzzWjNZefqFpcvJ8tsHIjC9XYABs+w3DH+17VaBlqiiigAooooA8R/aM/5lz/t6/8AaVeP3Onxw6HY6hFOzm5lmhkjaPb5bR7DwcncCJF5wOcjHc+wftGf8y5/29f+0q8nurqAeEtPsYp45ZjdTXEyBDmIFUVBuI4J2sSFJBG3PIAEsRkUUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2/J/rDTaKKsAooooAKKKKAPEf2jP+Zc/wC3r/2lXiFFFQ9wCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//2Q==]]></data>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAOZ/AKyqqZiXlkh1j/Hx8RuL0CV6q4e83D3a/zNVasLi9S22/DaLuy2MwklRVpLG5dXV1Dp2jja2+oWHib7d8Onz+sbFxGqt1DTD/v3+/juRwkiBopXC3MvKykKay2JxeTWUyd/f31Om1ySU2WKNpnm111yEm+Pv9Sus/MTc6neCiPr6+ht5rySKxSSc57za7EOWxSSEvHG656vQ5lyy5BiS3TSb2fX297LT5qDK4jqWysri7yug6VSIprri+k6j1D6azd3s9r27upDN9CuRzfb6/CGh8EiLsS6FtiN/s9bp9FhgZNzu+imEuDlGTiau+mSo0SyJvk6q37azsnSHka+urVGdyO7u7kOczrDW7Cmk8z6AjPn7/CSHwEOk2jBge0ag0s/p+06ezf/79I+QkKvY9FOOsTKSx////ByDwCRqkyV0ojpngPjy7yiJwebm5sG/vkii2T6k4nx9flqw4nfE9rvY6T6Gr87l9KGfnyyOx2+Ej196iaWko0e29////////yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkRCMzA3NzIxOUE3MTFFMTgyMjFDMzU0MzJGQzVDRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkRCMzA3NzMxOUE3MTFFMTgyMjFDMzU0MzJGQzVDRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyREIzMDc3MDE5QTcxMUUxODIyMUMzNTQzMkZDNUNFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyREIzMDc3MTE5QTcxMUUxODIyMUMzNTQzMkZDNUNFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAH8ALAAAAAAgACAAAAf/gH+Cg4SFhoeIiYqLjI2Oj5CRkpOOVhVUfHxUb26UghgcAVMjpCNTAW82lBUSPCFzMzNzIWUpUiqSDxJGUSE+vz4hUS8pFZE2eBpdVz8fOT9X0V1GY1aLGG4cUtspZjnOBgYdH+TkexwquIcDQWN6JTwlGkMMXBtibFVcDPxDAgFUALwBUcgKgBRGrnxZeOVFmxcDBjxpww8KFAYLNGiINybIAEEqpKTIcKXDi5MdxtU5g2JfPS5tcsh89sNOCgCqQEjQkCODzwwy82ywcaZOHhZmcKAgkecJChkvFuSw+UZFkD0Lsmb1mSeEiRtnsBAY4mKLHx0+KJjwY4HJAjP//9zgEQDlyBEmTLigyXPHAQk/JmrEwOAgiQEsFAxgqILEbgE5HMasYYJkwY0bJCxg8TMhiZ8lNRL4iVIDDhEbOp68wHEESQEPQQJ4YbJigx8gLohwRuyHjBA/GGbEueMnSY4wJjascK0kCBUESFag8CPDwBYHNGiI/gzGDwUiEyhgALJlAxIkTNQo4fBASZoVJDAAlyGiRREhFHpE6NMDDJ0WMdwxwRNowIAEF17I4YYKeDRRAAwW4GBBfVmccEIETiiggBMcnlBECyIQwAIMXKjRwBuCDCCBgwQQQEMLFWqowAU0XiDjCVmAKMIQajQRgDp/2BBAE17AsMMJM15wwDGSTC5JowIn7NCGF03wAeQgHMjRAAJeQOClFmCGCaaXEHiBQAOQeaLmmmy26eabcAYCADs=]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/functions.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[alF1ZXJ5KGZ1bmN0aW9uKCkgew0KCWpRdWVyeSgiLnBhZ2VtY29udGFpbmVyLC5wYWdlZXJyb3Jjb250YWluZXIiKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQl2YXIgYyA9IGpRdWVyeSh0aGlzKTsNCgkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQljLmhpZGUoKTsNCgkJfSwgOTAwMCk7DQoJfSk7DQp9KTsNCg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXT0iQWNlRWRpdG9yIjsNCiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAiQWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuIjsNCg0KDQovKiAtLS0gVGFicyAtLS0gKi8NCiRsYW5nWydzZXR0aW5nc190YWInXSA9ICJQcmVmZXJlbmNlcyI7DQokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc190YWInXSA9ICJGcm9udGVuZCBQcmVmZXJlbmNlcyI7DQokbGFuZ1snZnJvbnRlbmRfaGVhZF9zZXR0aW5ncyddID0gIkZyb250ZW5kIEhlYWQgUHJlZmVyZW5jZXMiOw0KJGxhbmdbJ2Zyb250ZW5kX3N5bnRheGFyZWFfc2V0dGluZ3MnXSA9ICJGcm9udGVuZCBTeW50YXhhcmVhIFByZWZlcmVuY2VzIjsNCiRsYW5nWydoZWFkX2Rlc2NyaXB0aW9uJ10gPSAiVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIHNjcmlwdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gcGFnZSA8Y29kZT4mbHQ7aGVhZCZndDs8L2NvZGU+IHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9PC9jb2RlPiBmcm9tIFBhZ2UgU3BlY2lmaWMgTWV0YWRhdGEgb3IgVGVtcGxhdGUuIjsNCiRsYW5nWydjb250ZW50X2Rlc2NyaXB0aW9uJ10gPSAiVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgU3ludGF4aGlnaGxpZ2h0aW5nIGFyZWEgd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9J2VkaXRvcid9PC9jb2RlPiB0YWcgd2l0aGluIGEgUGFnZS4iOw0KJGxhbmdbJ3N5bnRheGFyZWFkZXNjcmlwdGlvbiddID0gIlRoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0nZm9vJ308L2NvZGU+IGZyb20gYSBQYWdlIG9yIFRlbXBsYXRlIjsNCg0KLyogLS0tIFNldHRpbmdzIGxhYmVscyAtLS0gKi8NCiRsYW5nWydleGFtcGxlX2RvY3VtZW50J10gPSAiRG9jdW1lbnQiOw0KJGxhbmdbJ3dpZHRoX3RpdGxlJ10gPSAiRWRpdG9yIHdpZHRoIChpbiBlbSkiOw0KJGxhbmdbJ2hlaWdodF90aXRsZSddID0gIkVkaXRvciBoZWlnaHQgKGluIGVtKSI7DQokbGFuZ1snZW5hYmxlX2llJ10gPSAiRW5hYmxlIEludGVybmV0IEV4cGxvcmVyIjsNCiRsYW5nWyd1c2VfdW5jb21wcmVzc2VkJ10gPSAiVXNlIHVuY29tcHJlc3NlZCI7DQokbGFuZ1sndXNlX3VuY29tcHJlc3NlZF90ZXh0J10gPSAnTWlnaHQgaGVscCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB1c2luZyBpbiBTYWZhcmkuJzsNCiRsYW5nWydlbmFibGVfaWVkZXNjcmlwdGlvbiddID0gIkFjZSBTeW50YXhoaWdobGlnaHRlciBkb2VzIG5vdCBiZWhhdmUgcHJvcGVybHkgd2hlbiB1c2luZyBJbnRlcm5ldCBFeHBsb3Jlci4gRW5hYmxlIHRoaXMgYXQgeW91ciBvd24gcmlzayEiOw0KJGxhbmdbJ2Zyb250ZW5kX3dpZHRoX3RpdGxlJ10gPSAiRnJvbnRlbmQgU3ludGF4YXJlYSB3aWR0aCAoaW4gcHgpIjsNCiRsYW5nWydmcm9udGVuZF9oZWlnaHRfdGl0bGUnXSA9ICJGcm9udGVuZCBTeW50YXhhcmVhIGhlaWdodCAoaW4gcHgpIjsNCiRsYW5nWydzeW50YXhfbW9kZSddID0gIk1vZGUiOw0KJGxhbmdbJ3RoZW1lcyddID0gIlRoZW1lIjsNCiRsYW5nWydmb250X3NpemUnXSA9ICJGb250IFNpemUiOw0KJGxhbmdbJ2Z1bGxfbGluZSddID0gIkZ1bGwgTGluZSBTZWxlY3Rpb24iOw0KJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICJIaWdobGlnaHQgQWN0aXZlIExpbmUiOw0KJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gIlNob3cgSW52aXNpYmxlcyI7DQokbGFuZ1sncGVyc2lzdGVudF9oc2Nyb2xsJ10gPSAiUGVyc2l0ZW50IEhTY3JvbGwiOw0KJGxhbmdbJ2tleV9iaW5kaW5nJ10gPSAiS2V5IEJpbmRpbmciOw0KJGxhbmdbJ3NvZnRfd3JhcCddID0gIlNvZnQgV3JhcCI7DQokbGFuZ1snc2hvd19ndXR0ZXInXSA9ICJTaG93IEd1dHRlciI7DQokbGFuZ1sncHJpbnRfbWFyZ2luJ10gPSAiU2hvdyBQcmludCBNYXJnaW4iOw0KJGxhbmdbJ3NvZnRfdGFiJ10gPSAiVXNlIFNvZnQgVGFiIjsNCiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICJIaWdobGlnaHQgc2VsZWN0ZWQgd29yZCI7DQokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gIkVuYWJsZSBCZWhhdmlvcnMiOw0KJGxhbmdbJ3Rlc3RhcmVhdGV4dCddID0gIlByZXZpZXciOw0KDQovKiAtLS0gU2VsZWN0IG9wdGlvbnMgLS0tICovDQoNCi8qIGxhbmd1YWdlcyAqLw0KJGxhbmdbJ2pzJ10gPSAiSmF2YVNjcmlwdCI7DQokbGFuZ1sncGxhaW4nXSA9ICJQbGFpbiBUZXh0IjsNCiRsYW5nWydzdmcnXSA9ICJTVkciOw0KJGxhbmdbJ2h0bWwnXSA9ICJIVE1MIjsNCiRsYW5nWydjc3MnXSA9ICJDU1MiOw0KJGxhbmdbJ3Njc3MnXSA9ICJTQ1NTIjsNCiRsYW5nWydjb2ZmZWUnXSA9ICJDb2ZmZWVTY3JpcHQiOw0KJGxhbmdbJ2pzb24nXSA9ICJKU09OIjsNCiRsYW5nWydweXRob24nXSA9ICJQeXRob24iOw0KJGxhbmdbJ3J1YnknXSA9ICJSdWJ5IjsNCiRsYW5nWydwZXJsJ10gPSAiUGVybCI7DQokbGFuZ1sncGhwJ10gPSAiUEhQIjsNCiRsYW5nWydqYXZhJ10gPSAiSmF2YSI7DQokbGFuZ1snY3NoYXJwJ10gPSAiQyMiOw0KJGxhbmdbJ2NfY3BwJ10gPSAiQysrIjsNCiRsYW5nWydjbG9qdXJlJ10gPSAiQ2xvanVyZSI7DQokbGFuZ1snY29sZGZ1c2lvbiddID0gIkNvbGRmdXNpb24iOw0KJGxhbmdbJ2hheGUnXSA9ICJIYXhlIjsNCiRsYW5nWydsYXRleCddID0gIkxhdGV4IjsNCiRsYW5nWydsdWEnXSA9ICJMdWEiOw0KJGxhbmdbJ21hcmtkb3duJ10gPSAiTWFya2Rvd24iOw0KJGxhbmdbJ3Bvd2Vyc2hlbGwnXSA9ICJQb3dlclNoZWxsIjsNCiRsYW5nWydzcWwnXSA9ICJTUUwiOw0KJGxhbmdbJ3Bnc3FsJ10gPSAicGdTUUwiOw0KJGxhbmdbJ29jYW1sJ10gPSAiT0NhbWwiOw0KJGxhbmdbJ3RleHRpbGUnXSA9ICJUZXh0aWxlIjsNCiRsYW5nWydncm9vdnknXSA9ICJHcm9vdnkiOw0KJGxhbmdbJ3NjYWxhJ10gPSAiU2NhbGEiOw0KDQovKiB0aGVtZXMgKi8NCiRsYW5nWydjbG91ZHMnXSA9ICJDbG91ZHMiOyANCiRsYW5nWydjaHJvbWUnXSA9ICJDaHJvbWUiOyANCiRsYW5nWydjbG91ZHNfbWlkbmlnaHQnXSA9ICJDbG91ZHMgTWlkbmlnaHQiOyANCiRsYW5nWydjb2JhbHQnXSA9ICJDb2JhbHQiOyANCiRsYW5nWydjcmltc29uX2VkaXRvciddID0gIkNyaW1zb24gRWRpdG9yIjsNCiRsYW5nWydkYXduJ10gPSAiRGF3biI7DQokbGFuZ1snZHJlYW13ZWF2ZXInXSA9ICJEcmVhbXdlYXZlciI7IA0KJGxhbmdbJ2VjbGlwc2UnXSA9ICJFY2xpcHNlIjsNCiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICJpZGxlRmluZ2VycyI7DQokbGFuZ1sna3JfdGhlbWUnXSA9ICJrclRoZW1lIjsNCiRsYW5nWydtZXJiaXZvcmUnXSA9ICJNZXJiaXZvcmUiOw0KJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAiTWVyYml2b3JlIFNvZnQiOw0KJGxhbmdbJ21vbm9faW5kdXN0cmlhbCddID0gIk1vbm8gSW5kdXN0cmlhbCI7DQokbGFuZ1snbW9ub2thaSddID0gIk1vbm9rYWkiOw0KJGxhbmdbJ3Bhc3RlbF9vbl9kYXJrJ10gPSAiUGFzdGVsIG9uIGRhcmsiOw0KJGxhbmdbJ3NvbGFyaXplZF9kYXJrJ10gPSAiU29sYXJpemVkIERhcmsiOw0KJGxhbmdbJ3NvbGFyaXplZF9saWdodCddID0gIlNvbGFyaXplZCBMaWdodCI7DQokbGFuZ1sndGV4dG1hdGUnXSA9ICJUZXh0TWF0ZSI7DQokbGFuZ1sndG9tb3Jyb3cnXSA9ICJUb21vcnJvdyI7DQokbGFuZ1sndG9tb3Jyb3dfbmlnaHQnXSA9ICJUb21vcnJvdyBOaWdodCI7DQokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYnJpZ2h0J10gPSAiVG9tb3Jyb3cgTmlnaHQgQnJpZ2h0IjsNCiRsYW5nWyd0b21vcnJvd19uaWdodF9ibHVlJ10gPSAiVG9tb3Jyb3cgTmlnaHQgQmx1ZSI7DQokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnXSA9ICJUb21vcnJvdyBOaWdodCBFaWdodGllcyI7DQokbGFuZ1sndHdpbGlnaHQnXSA9ICJUd2lsaWdodCI7DQokbGFuZ1sndmlicmFudF9pbmsnXSA9ICJWaWJyYW50IEluayI7DQoNCi8qIGtleSBiaW5kaW5nICovDQokbGFuZ1snYWNlJ10gPSAiQWNlIjsgDQokbGFuZ1sndmltJ10gPSAiVmltIjsgDQokbGFuZ1snY29iYWx0J10gPSAiQ29iYWx0IjsgDQokbGFuZ1snZW1hY3MnXSA9ICJFTWFjcyI7DQokbGFuZ1snY3VzdG9tJ10gPSAiQ3VzdG9tIjsNCg0KLyogU29mdCB3cmFwICovDQokbGFuZ1snb2ZmJ10gPSAiT2ZmIjsgDQokbGFuZ1snNDAnXSA9ICI0MCBDaGFycyI7IA0KJGxhbmdbJzgwJ10gPSAiODAgQ2hhcnMiOyANCiRsYW5nWycxMDAnXSA9ICIxMDAgQ2hhcnMiOyANCiRsYW5nWycxNDAnXSA9ICIxNDAgQ2hhcnMiOyANCg0KLyogLS0tIENvbW1vbiAtLS0gKi8NCiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICJTYXZlIFByZWZlcmVuY2VzIjsNCiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAiWW91ciBBY2VFZGl0b3Igc2V0dGluZ3MgaGF2ZSBiZWVuIHNhdmVkIjsNCiRsYW5nWydmcm9udGVuZHNldHRpbmdzc2F2ZWQnXSA9ICJZb3VyIEFjZUVkaXRvciBGcm9udGVuZCBzZXR0aW5ncyBoYXZlIGJlZW4gc2F2ZWQiOw0KJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAiQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQhIFNldCBcIk1vZGlmeSBTaXRlIFByZWZlcmVuY2VzXCIsIFwiTW9kaWZ5IFRlbXBsYXRlc1wiIG9yIFwiQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZVwiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZSEgSWYgeW91J3JlIHN1cmZpbmcgd2l0aCBTYWZhcmksIHNldCB0aGUgb3B0aW9uIFwiVXNlIHVuY29tcHJlc3NlZFwiLiI7DQokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gIkFjZUVkaXRvciBTdWNjZXNzZnVsbHkgVW5pbnN0YWxsZWQiOw0KJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICJSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgQWNlRWRpdG9yPyBUaGluayBhZ2FpbiEiOw0KJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAiTWlzc2luZyBQZXJtaXNzaW9uIS4gU2V0IFwiTW9kaWZ5IFRlbXBsYXRlc1wiIG9yIFwiQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZVwiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZS4iOw0KDQovKiAtLS0gSGVscCAtLS0gKi8NCiRsYW5nWydoZWxwX3BhcmFtX2FjdGlvbiddID0gImlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb2YgTW9kdWxlIHRhZy4gUG9zc2libGUgdmFsdWVzIGFyZSAnZGVmYXVsdCcgYW5kICdoZWFkJy4gQm90aCBhcmUgbmVlZGVkIGZvciBjb3JyZWN0IEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD4iOw0KJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZXMnXSA9ICJpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJ21vZGVzJyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciAmbHQ7aGVhZCZndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4iOw0KJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAiaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICd0aGVtZXMnIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyICZsdDtoZWFkJmd0OyBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+IjsNCiRsYW5nWydoZWxwX3BhcmFtX21vZGUnXSA9ICJpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0nZGVmYXVsdCd9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciBtb2RlIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+IjsNCiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lJ10gPSAiaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2RlZmF1bHQnfTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgdGhlbWUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPiI7DQokbGFuZ1snaGVscF9wYXJhbV93aWR0aCddID0gInNwZWNpZmllcyB3aWR0aCBvZiBTeW50YXhoaWdobGlnaHRlciBhcmVhIGluIHBpeGVsLiI7DQokbGFuZ1snaGVscF9wYXJhbV9oZWlnaHQnXSA9ICJzcGVjaWZpZXMgaGVpZ2h0IG9mIFN5bnRheGhpZ2hsaWdodGVyIGFyZWEgaW4gcGl4ZWwuIjsNCiRsYW5nWydoZWxwX3BhcmFtX2RpdmlkJ10gPSAiaWQgb2YgdGhlIGVsZW1lbnQgY29udGFpbmluZyB5b3VyIGNvZGUuIFVzZSB1bmlxdWUgaWQgZm9yIGVhY2ggY29kZSBjaHVuY2suIjsNCiRsYW5nWydoZWxwX2dlbmVyYWxfdGl0bGUnXSA9ICJHZW5lcmFsIjsNCiRsYW5nWydoZWxwX2dlbmVyYWxfdGV4dCddID0gIg0KPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj1cImh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbVwiPkNsb3VkOSBJREU8L2E+IGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0LjwvcD4NCjxoMz5BY2UgaXMgaG9zdGVkIG9uIEdpdEh1YjwvaDM+DQo8cD5UaGUgQWNlIHNvdXJjZSBjb2RlIGlzIGhvc3RlZCBvbiBHaXRIdWIuIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNb3ppbGxhIHRyaS1saWNlbnNlIChNUEwvR1BML0xHUEwpLjxiciAvPg0KVGhpcyBpcyB0aGUgc2FtZSBsaWNlbnNlIHVzZWQgYnkgRmlyZWZveC4gVGhpcyBsaWNlbnNlIGlzIGZyaWVuZGx5IHRvIGFsbCBraW5kcyBvZiBwcm9qZWN0cywgd2hldGhlciBvcGVuIHNvdXJjZSBvciBub3QuPGJyIC8+DQogVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhPC9wPg0KPGgzPlVzaW5nIEFjZUVkaXRvciBNb2R1bGU8L2gzPg0KPHA+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZSBpcyBzaW1wbGUuPGJyIC8+DQpBZnRlciBBY2VFZGl0b3Igd2FzIGluc3RhbGxlZCBnbyB0byBcIk15IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlc1wiIGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gXCJTZWxlY3Qgc3ludGF4IGhpZ2hsaWdodGVyIHRvIHVzZTpcIiBEcm9wZG93bi48YnIgLz4NCk1ha2Ugc3VyZSB5b3UgaGF2ZSAnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnIFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gXCJFeHRlbnNpb25zICZyYXF1bzsgQWNlRWRpdG9yXCI8L3A+IjsNCg0KJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnXSA9ICJLZXlib2FyZCBTaG9ydGN1dHMiOw0KJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCddID0gJw0KICAgICAgPGgzPkRlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSJwYWdldGFibGUiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSJEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyI+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SZXR1cm48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZ1bGxzY3JlZW48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtUzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnBlcmZvcm0gc2F2ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBsY2Fzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5maW5kIG5leHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtRzwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmZpbmQgcHJldmlvdXM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkRvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Eb3duLEN0cmwtTjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+VXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5MZWZ0LEN0cmwtQjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUxlZnQsSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTGVmdCxIb21lLEN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UmlnaHQsQ3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSG9tZSxDdHJsLVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5pbmRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm91dGRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPm92ZXJ3cml0ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+cGFnZXVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlZG88L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtQmFja3NwYWNlLEN0cmwtQWx0LUJhY2tzcGFjZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2U8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MiI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cxIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzIiPg0KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5zcGxpdCBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9InJvdzEiPg0KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLTc8L3RkPg0KPHRkIGFsaWduPSJsZWZ0Ij50b2dnbGUgY29tbWVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSJyb3cyIj4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0ibGVmdCI+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0icm93MSI+DQo8dGQgYWxpZ249ImxlZnQiPkN0cmwtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249ImxlZnQiPnVuZG88L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPic7DQoNCiRsYW5nWydoZWxwX2Zyb250ZW5kX3RpdGxlJ10gPSAiRnJvbnRlbmQiOw0KJGxhbmdbJ2hlbHBfZnJvbnRlbmRfY29udGVudCddID0gIjxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyICZsdDtoZWFkJmd0OyBzZWN0aW9uIG9mIFRlbXBsYXRlIG9yIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9IGFuZCBhbm90aGVyIGNhbGwgdG8gc3BlY2lmeSB3aGljaCBhcmVhIHNob3VsZCBiZSBoaWdobGlnaHRlZCwgZm9yIGV4YW1wbGUge0FjZUVkaXRvciBkaXZpZD0nZm9vJ30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSAmbHQ7aGVhZCZndDsgYXJlYSwgZm9yIGV4YW1wbGUgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ30NCgk8L3ByZT4NCjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPg0KSW4gTW9kdWxlcyBBZG1pbiBpbnRlcmZhY2UgeW91IGNhbiBzZWxlY3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgeW91ciAnaGVhZCcgYWN0aW9uIG9yIHVzZSBwYXJhbWV0ZXIgbW9kZXM9J2h0bWwsamF2YXNjcmlwdCcgYW5kIHRoZW1lcz0ndGV4dG1hdGUnIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHNlbGVjdGVkIFByZWZlcmVuY2VzLjwvcD4NCjxwPk5vdyB3aGVuIHlvdSBoYXZlIG5lZWRlZCBzY3JpcHRzIGluY2x1ZGVkLCBvbmUgbW9yZSBNb2R1bGUgdGFnIGNhbGwgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSBpbiB5b3VyIENvbnRlbnQgRWRpdG9yIGFyZWEpIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBvZiB5b3VyIFBhZ2Ugc2hvdWxkIGJlIGhpZ2hsaWdodGVkLjwvcD4NCgk8cHJlPg0KCXtBY2VFZGl0b3IgZGl2aWQ9J3NvbWUtaWQnfQ0KCTwvcHJlPg0KPHA+VGhpcyB0YWcgaW5jbHVkZXMgbmVlZGVkIFNjcmlwdCBhbmQgU3R5bGUgdGhhdCBpcyB1c2VkIHRvIEhpZ2hsaWdodCBzZWxlY3RlZCBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGlkLjxiciAvPg0KQWxsIHlvdSBuZWVkIHRoZW4gaXMgd3JpdGUgeW91ciBDb2RlIHRoYXQgeW91IHdhbnQgdG8gSGlnaGxpZ2h0IGFuZCB3cmFwIGl0IGluc2lkZSBhbiBlbGVtZW4gbGlrZSAmbHQ7ZGl2Jmd0OyB3aXRoIHNwZWNpZmllZCBpZC48L3A+IjsNCiRsYW5nWydoZWxwX2Zyb250ZW5kX3NhbXBsZSddID0gJw0KPHByZSBpZD0ic29tZS1pZCI+DQombHQ7aHRtbCZndDsNCiDCoCDCoCAmbHQ7aGVhZCZndDsNCiDCoCDCoCAmbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0Ow0KIMKgIMKgIMKgIMKgIC50ZXh0LWxheWVyIHsNCiDCoCDCoCDCoCDCoCDCoCDCoCBmb250LWZhbWlseTogTW9uYWNvLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7DQogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1zaXplOiAxMnB4Ow0KIMKgIMKgIMKgIMKgIMKgIMKgIGN1cnNvcjogdGV4dDsNCiDCoCDCoCDCoCDCoCB9DQogwqAgwqAgJmx0Oy9zdHlsZSZndDsNCiDCoCDCoCAmbHQ7L2hlYWQmZ3Q7DQogwqAgwqAgJmx0O2JvZHkmZ3Q7DQogwqAgwqAgwqAgwqAgJmx0O2gxIHN0eWxlPSJjb2xvcjpyZWQiJmd0O0p1aHUgS2lubmVycyZsdDsvaDEmZ3Q7DQogwqAgwqAgJmx0Oy9ib2R5Jmd0OyAmbHQ7L2h0bWwmZ3Q7DQo8L3ByZT4nOw0KDQokbGFuZ1snaGVscF9hYm91dF90aXRsZSddID0gIkFib3V0IjsNCiRsYW5nWydoZWxwX2Fib3V0X3RleHQnXSA9ICc8aDM+U3VwcG9ydDwvaDM+DQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIEdvcmFuIElsaWMgPGEgaHJlZj0ibWFpbHRvOnVuaXF1M2VAZ21haWwuY29tIj4mbHQ7dW5pcXUzZUBnbWFpbC5jb20mZ3Q7PC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LmljaC1tYWNoLWRhcy5hdCIgcmVsPSJleHRlcm5hbCI+d3d3LmljaC1tYWNoLWRhcy5hdDwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+DQoJPGgzPlRlYW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+DQonOw0KDQovKiAtLS0gQ2hhbmdlbG9nIC0tLSAqLw0KJGxhbmdbJ2NoYW5nZWxvZyddID0gIg0KPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQncyBmcmVzaCEgTm90aGluZyBjaGFuZ2VkIHlldCE8L2xpPg0KCTxsaT5Vc2luZyBBY2UgVmVyc2lvbiAwLjIuMDwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgQ1RSTC1TIEtleWJpbmRpbmc8L2xpPg0KCTxsaT5BZGRlZCBGdWxsc2NyZWVubW9kZTwvbGk+DQoJPGxpPkFkZGVkIEZyb250ZW5kIEhpZ2hsaWdodGluZzwvbGk+DQoJPGxpPlVwZGF0ZWQgQWNlPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMTwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIEludGVybmV0IEV4cGxvcmVyIHByZWZlcmVuY2U8L2xpPg0KCTxsaT5VcGRhdGVkIEFDRSB3aXRoIHRoZW1lczwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjI8L2gzPg0KPHVsPg0KCTxsaT5GaXggZm9yIFNhZmFyaS9NYWM8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4zPC9oMz4NCjx1bD4NCiAgICA8bGk+VXBkYXRlZCB0byBsYXRlc3QgYWNlIGZyb20gZ2l0aHViPC9saT4NCiAgICA8bGk+QWRkZWQgYWRkaXRpb25hbCBwcmVmZXJlbmNlcyAoTW9kaWZ5IFRlbXBsYXRlcywgQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZSk8L2xpPg0KICAgIDxsaT5BZGRlZCBhYmlsaXR5IHRvIGNoYW5nZSBBY2VFZGl0b3IgcHJlZmVyZW5jZXMgcGVyIHVzZXI8L2xpPg0KICAgIDxsaT5Nb3ZlZCBtb2R1bGUgZnJvbSBleHRlbmlvbnMgdG8gbXlwcmVmczwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjMuMTwvaDM+DQo8dWw+DQogICAgPGxpPk1vZGUgcHJlZmVyZW5jZSBidWdmaXg8L2xpPg0KPC91bD4NCjxoMz5Sb2FkbWFwPC9oMz4NCjx1bD4NCgk8bGk+PGRlbD5BZGQgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgRnVsbHNjcmVlbm1vZGU8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4NCgk8bGk+QWRkIEVkaXRvciBiZWhhdmlvciAoVmltLCBFTWFjcyk8L2xpPg0KCTxsaT5NYXliZSBhZGQgVG9vbGJhcjwvbGk+DQo8L3VsPiI7DQoNCj8+DQo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvciAnOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0FjZUVkaXRvciBpc3QgZWluIFN5bnRheGhpZ2hsaWdodGVyIE1vZHVsIGRhcyA8c3Ryb25nPkFjZTwvc3Ryb25nPiwgIGVpbmVuIGVpZ2Vuc3QmYXVtbDtuZGlnZW4gQ29kZS1FZGl0b3IgZ2VzY2hyaWViZW4gbWl0IEphdmFTY3JpcHQgIHZlcndlbmRldC48YnIgLz48c3Ryb25nPkhpbndlaXM6PC9zdHJvbmc+IEludGVybmV0IEV4cGxvcmVyIHdpcmQgenVyemVpdCBuaWNodCB1bnRlcnN0JnV1bWw7enQhJzsKJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc190YWInXSA9ICdGcm9udGVuZCBFaW5zdGVsbHVuZ2VuJzsKJGxhbmdbJ2Zyb250ZW5kX2hlYWRfc2V0dGluZ3MnXSA9ICdGcm9udGVuZCBIZWFkIEVpbnN0ZWxsdW5nZW4nOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIFN5bnRheGJlcmVpY2ggRWluc3RlbGx1bmdlbic7CiRsYW5nWydoZWFkX2Rlc2NyaXB0aW9uJ10gPSAnRGllc2UgRWluc3RlbGx1bmdlbiB3ZXJkZW4gYWxzIFN0YW5kYXJkZWluc3RlbGx1bmdlbiBmJnV1bWw7ciBBY2UgU2tyaXB0ZSB2ZXJ3ZW5kZXQsIGRpZSBpbSA8Y29kZT48aGVhZD48L2NvZGU+IGRlciBTZWl0ZSBlaW5nZWJ1bmRlbiB3ZXJkZW4gd2VubiA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gaW4gU2VpdGVuc3BlemlmaXNjaGVuIE1ldGEtRGF0ZW4gb2RlciBUZW1wbGF0ZSBhdWZnZXJ1ZmVuIHdpcmQuJzsKJGxhbmdbJ2NvbnRlbnRfZGVzY3JpcHRpb24nXSA9ICdEaWVzZSBFaW5zdGVsbHVuZ2VuIHdlcmRlbiBhbHMgU3RhbmRhcmRlaW5zdGVsbHVuZ2VuIGYmdXVtbDtyIFN5bnRheGhpZ2hsaWdodGVyIEJlcmVpY2ggdmVyd2VuZGV0IHdlbm4gPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0mIzAzOTtlZGl0b3ImIzAzOTt9PC9jb2RlPiB0YWcgaW4gZWluZXIgU2VpdGUgYXVmZ2VydWZlbiB3aXJkLic7CiRsYW5nWydzeW50YXhhcmVhZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBBY2UgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fTwvY29kZT4gZnJvbSBhIFBhZ2Ugb3IgVGVtcGxhdGUnOwokbGFuZ1snZXhhbXBsZV9kb2N1bWVudCddID0gJ0Rva3VtZW50JzsKJGxhbmdbJ3dpZHRoX3RpdGxlJ10gPSAnRWRpdG9yIGJyZWl0ZSAoaW4gZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ0VkaXRvciBoJm91bWw7aGUgKGluIGVtKSc7CiRsYW5nWydlbmFibGVfaWUnXSA9ICdGJnV1bWw7ciBJbnRlcm5ldCBFeHBsb3JlciBha3RpdmllcmVuJzsKJGxhbmdbJ3VzZV91bmNvbXByZXNzZWQnXSA9ICdVbmtvbXByaW1pZXJ0IHZlcndlbmRlbic7CiRsYW5nWyd1c2VfdW5jb21wcmVzc2VkX3RleHQnXSA9ICdLJm91bWw7bm50ZSBiZWkgUHJvYmxlbWVuIGltIFNhZmFyaSBoZWxmZW4uJzsKJGxhbmdbJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJ10gPSAnQWNlIFN5bnRheGhpZ2hsaWdodGVyIGZ1bmt0aW9uaWVydCBpbiBJbnRlcm5ldCBFeHBsb3JlciBuaWNodCByaWNodGlnLkFrdGl2aWVyZW4gU2llIGRpZXNlIE9wdGlvbiBhdWYgZWlnZW5lIHZlcmFudHdvcnR1bmchJzsKJGxhbmdbJ2Zyb250ZW5kX3dpZHRoX3RpdGxlJ10gPSAnRnJvbnRlbmQgU3ludGF4YmVyZWljaCBicmVpdGUgKGluIHB4KSc7CiRsYW5nWydmcm9udGVuZF9oZWlnaHRfdGl0bGUnXSA9ICdGcm9udGVuZCBTeW50YXhiZXJlaWNoIGgmb3VtbDtoZSAoaW4gcHgpJzsKJGxhbmdbJ3N5bnRheF9tb2RlJ10gPSAnTW9kdXMnOwokbGFuZ1sndGhlbWVzJ10gPSAnQXVzc2VoZW4nOwokbGFuZ1snZm9udF9zaXplJ10gPSAnU2NocmlmdGdyJm91bWw7JnN6bGlnO2UnOwokbGFuZ1snZnVsbF9saW5lJ10gPSAnR2FuemUgWmVpbGUnOwokbGFuZ1snaGlnaGxpZ2h0X2FjdGl2ZSddID0gJ0FrdGl2ZSBaZWlsZSBtYXJraWVyZW4nOwokbGFuZ1snc2hvd19pbnZpc2libGVzJ10gPSAnWmVpZ2UgdW5zaWNodGJhcmUnOwokbGFuZ1sncGVyc2lzdGVudF9oc2Nyb2xsJ10gPSAnUGVyc2lzdGVudGVzIEhTY3JvbGwnOwokbGFuZ1sna2V5X2JpbmRpbmcnXSA9ICdTY2hsJnV1bWw7c3NlbGJpbmR1bmcnOwokbGFuZ1snc29mdF93cmFwJ10gPSAnU29mdCBXcmFwJzsKJGxhbmdbJ3Nob3dfZ3V0dGVyJ10gPSAnR3V0dGVyIGFuemVpZ2VuJzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ1ByaW50IE1hcmdpbiBhbnplaWdlbic7CiRsYW5nWydzb2Z0X3RhYiddID0gJ1NvZnQgVGFiIHZlcndlbmRlbic7CiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICdBdXNnZXcmYXVtbDtobHRlcyBXb3J0IG1hcmtpZXJlbic7CiRsYW5nWydlbmFibGVfYmVoYXZpb3JzJ10gPSAnVmVyaGFsdGVuIGFrdGl2aWVyZW4nOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnVm9yc2NoYXUnOwokbGFuZ1snanMnXSA9ICdKYXZhU2NyaXB0ICc7CiRsYW5nWydwbGFpbiddID0gJ1RleHQnOwokbGFuZ1snc3ZnJ10gPSAnU1ZHICc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCAnOwokbGFuZ1snY3NzJ10gPSAnQ1NTICc7CiRsYW5nWydzY3NzJ10gPSAnU0NTUyAnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0ICc7CiRsYW5nWydqc29uJ10gPSAnSlNPTiAnOwokbGFuZ1sncHl0aG9uJ10gPSAnUHl0aG9uICc7CiRsYW5nWydydWJ5J10gPSAnUnVieSAnOwokbGFuZ1sncGVybCddID0gJ1BlcmwgJzsKJGxhbmdbJ3BocCddID0gJ1BIUCAnOwokbGFuZ1snamF2YSddID0gJ0phdmEgJzsKJGxhbmdbJ2NzaGFycCddID0gJ0MjICc7CiRsYW5nWydjX2NwcCddID0gJ0MrKyAnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUgJzsKJGxhbmdbJ2NvbGRmdXNpb24nXSA9ICdDb2xkZnVzaW9uJzsKJGxhbmdbJ2hheGUnXSA9ICdIYXhlJzsKJGxhbmdbJ2xhdGV4J10gPSAnTGF0ZXgnOwokbGFuZ1snbHVhJ10gPSAnTHVhJzsKJGxhbmdbJ21hcmtkb3duJ10gPSAnTWFya2Rvd24nOwokbGFuZ1sncG93ZXJzaGVsbCddID0gJ1Bvd2VyU2hlbGwnOwokbGFuZ1snc3FsJ10gPSAnU1FMJzsKJGxhbmdbJ3Bnc3FsJ10gPSAncGdTUUwnOwokbGFuZ1snb2NhbWwnXSA9ICdPQ2FtbCAnOwokbGFuZ1sndGV4dGlsZSddID0gJ1RleHRpbGUgJzsKJGxhbmdbJ2dyb292eSddID0gJ0dyb292eSAnOwokbGFuZ1snc2NhbGEnXSA9ICdTY2FsYSAnOwokbGFuZ1snY2xvdWRzJ10gPSAnQ2xvdWRzICc7CiRsYW5nWydjaHJvbWUnXSA9ICdDaHJvbWUnOwokbGFuZ1snY2xvdWRzX21pZG5pZ2h0J10gPSAnQ2xvdWRzIE1pZG5pZ2h0ICc7CiRsYW5nWydjb2JhbHQnXSA9ICdDb2JhbHQgJzsKJGxhbmdbJ2NyaW1zb25fZWRpdG9yJ10gPSAnQ3JpbXNvbiBFZGl0b3IgJzsKJGxhbmdbJ2Rhd24nXSA9ICdEYXduICc7CiRsYW5nWydkcmVhbXdlYXZlciddID0gJ0RyZWFtd2VhdmVyJzsKJGxhbmdbJ2VjbGlwc2UnXSA9ICdFY2xpcHNlICc7CiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICdpZGxlRmluZ2VycyAnOwokbGFuZ1sna3JfdGhlbWUnXSA9ICdrclRoZW1lICc7CiRsYW5nWydtZXJiaXZvcmUnXSA9ICdNZXJiaXZvcmUgJzsKJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAnTWVyYml2b3JlIFNvZnQnOwokbGFuZ1snbW9ub19pbmR1c3RyaWFsJ10gPSAnTW9ubyBJbmR1c3RyaWFsJzsKJGxhbmdbJ21vbm9rYWknXSA9ICdNb25va2FpJzsKJGxhbmdbJ3Bhc3RlbF9vbl9kYXJrJ10gPSAnUGFzdGVsIG9uIGRhcmsnOwokbGFuZ1snc29sYXJpemVkX2RhcmsnXSA9ICdTb2xhcml6ZWQgRGFyayc7CiRsYW5nWydzb2xhcml6ZWRfbGlnaHQnXSA9ICdTb2xhcml6ZWQgTGlnaHQnOwokbGFuZ1sndGV4dG1hdGUnXSA9ICdUZXh0TWF0ZSAnOwokbGFuZ1sndG9tb3Jyb3cnXSA9ICdUb21vcnJvdyc7CiRsYW5nWyd0b21vcnJvd19uaWdodCddID0gJ1RvbW9ycm93IE5pZ2h0JzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2JyaWdodCddID0gJ1RvbW9ycm93IE5pZ2h0IEJyaWdodCc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9ibHVlJ10gPSAnVG9tb3Jyb3cgTmlnaHQgQmx1ZSc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9laWdodGllcyddID0gJ1RvbW9ycm93IE5pZ2h0IEVpZ2h0aWVzJzsKJGxhbmdbJ3R3aWxpZ2h0J10gPSAnVHdpbGlnaHQgJzsKJGxhbmdbJ3ZpYnJhbnRfaW5rJ10gPSAnVmlicmFudCBJbmsgJzsKJGxhbmdbJ2FjZSddID0gJ0FjZSAnOwokbGFuZ1sndmltJ10gPSAnVmltICc7CiRsYW5nWydlbWFjcyddID0gJ0VNYWNzICc7CiRsYW5nWydjdXN0b20nXSA9ICdCZW51dHplcmRlZmluaWVydCc7CiRsYW5nWydvZmYnXSA9ICdBdXMnOwokbGFuZ1snNDAnXSA9ICc0MCBaZWljaGVuJzsKJGxhbmdbJzgwJ10gPSAnODAgWmVpY2hlbic7CiRsYW5nWycxMDAnXSA9ICcxMDAgWmVpY2hlbic7CiRsYW5nWycxNDAnXSA9ICcxNDAgWmVpY2hlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdFaW5zdGVsbHVuZ2VuIHNwZWljaGVybic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSWhyZSBBY2VFZGl0b3ItRWluc3RlbGx1bmdlbiB3dXJkZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc3NhdmVkJ10gPSAnSWhyZSBBY2VFZGl0b3IgRnJvbnRlbmQgZWluc3RlbGx1bmdlbiB3dXJkZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdBY2VFZGl0b3Igd3VyZGVpbnN0YWxsaWVydCEgU2V0emVuIFNpZSBkaWUgQmVyZWNodGlndW5nICZxdW90O01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJnF1b3Q7LCB1bSBkaWVzZXMgTW9kdWwgdmVyd2VuZGVuIHp1IGsmb3VtbDtubmVuISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnQWNlRWRpdG9yIHd1cmRlIGRlaW5zdGFsbGllcnQnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1dvbGxlbiBTaWUgd2lya2xpY2ggQWNlRWRpdG9yIGRlaW5zdGFsbGllcmVuPyBEZW5rZW4gU2llIG5vY2htYWwgbmFjaCEnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICdGZWhsZW5kZSBCZXJlY2h0aWd1bmdlbiEgU3RlbGxlbiBTaWUgJnF1b3Q7TW9kaWZ5IFRlbXBsYXRlcyZxdW90OyBvZGVyICZxdW90O0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UmcXVvdDstQmVyZWNodGlndW5nZW4gZWluLCB1bSBkaWVzZXMgTW9kdWwgdmVyd2VuZGVuIHp1IGQmdXVtbDtyZmVuLic7CiRsYW5nWydoZWxwX3BhcmFtX2FjdGlvbiddID0gJ3dpcmQgdmVyd2VuZGV0LCB1bSBkaWUgQWt0aW9uIGRlcyBNb2R1bCB0YWdzIHp1IGJlc3RpbW1lbi4gTSZvdW1sO2dsaWNoZSB3ZXJ0ZSBzaW5kICYjMDM5O2RlZmF1bHQmIzAzOTsgdW5kICYjMDM5O2hlYWQmIzAzOTsuIEYmdXVtbDtyIGRpZSBrb3JyZWt0ZSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmcgRnVua3Rpb24gc2luZCBiZWlkZSBha3Rpb25lbiBub3R3ZW5kaWdiZW4mb3VtbDt0aWd0LiA8YnIgLz5NJm91bWw7Z2xpY2hlIHdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmhlYWQ8L2xpPg0KCTxsaT5kZWZhdWx0PC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZXMnXSA9ICd3aXJkIG1pdCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gdmVyd2VuZGV0LiBTaWUgayZvdW1sO25uZW4gbWVocmVyZSBkdXJjaCBLb21tYSBnZXRyZW5udGUgJiMwMzk7bW9kZXMmIzAzOTssIGRpZSBTaWUgYXVmIElocmVyIFdlYnNpdGUgdmVyd2VuZGVuIHdlcmRlbiwgYW5nZWJlbi4gRGllcyBzb2xsdGUgaW0gJmFtcDtndDtoZWFkJmFtcDtsdDsgYmVyZWljaCBkZXMgVGVtcGxhdGVzIG9kZXIgdW50ZXIgU2VpdGVuc3BlemlmaXNjaGUtTWV0YWRhdGVuIGVpbmdlZ2ViZW4gd2VyZGVuLiBEaWVzICZ1dW1sO2JlcnNjaHJlaWJ0IElocmUgRWluc3RlbGx1bmdlbiBkaWUgaW0gTW9kdWwgQWRtaW4tQmVyZWljaCBhdXNnZXcmYXVtbDtobHQgd3VyZGVuLiA8YnIgLz5NJm91bWw7Z2xpY2hlIHdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAnd2lyZCBtaXQgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+IHZlcndlbmRldC4gU2llIGsmb3VtbDtubmVuIG1laHJlcmUgZHVyY2ggS29tbWEgZ2V0cmVubnRlICYjMDM5O3RoZW1lcyYjMDM5OyAoVGVtcGxhdGVzKSwgZGllIFNpZSBhdWYgSWhyZXIgV2Vic2l0ZSB2ZXJ3ZW5kZW4gd2VyZGVuLCBhbmdlYmVuLiBEaWVzIHNvbGx0ZSBpbSAmYW1wO2d0O2hlYWQmYW1wO2x0OyBiZXJlaWNoIGRlcyBUZW1wbGF0ZXMgb2RlciB1bnRlciBTZWl0ZW5zcGV6aWZpc2NoZS1NZXRhZGF0ZW4gZWluZ2VnZWJlbiB3ZXJkZW4uIERpZXMgJnV1bWw7YmVyc2NocmVpYnQgSWhyZSBFaW5zdGVsbHVuZ2VuIGRpZSBpbSBNb2R1bCBBZG1pbi1CZXJlaWNoIGF1c2dldyZhdW1sO2hsdCB3dXJkZW4uIDxiciAvPk0mb3VtbDtnbGljaGUgd2VydGUgc2luZDoNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX21vZGUnXSA9ICd3aXJkIGlubmVyaGFsYiBlaW5lciBTZWl0ZSBtaXQgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb24gPSAmIzAzOTtkZWZhdWx0JiMwMzk7fTwvY29kZT4gTW9kdWwtVGFnIHZlcndlbmRldC4gRGFtaXQgd2lyZCBTeW50YXhIaWdobGlnaHRlciBNb2R1cyBmJnV1bWw7ciBha3R1ZWxsZW4gQ29kZS1CZXJlaWNoIGZlc3RnZWxlZ3QuIDxiciAvPiBNJm91bWw7Z2xpY2hlIFdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWUnXSA9ICd3aXJkIGlubmVyaGFsYiBlaW5lciBTZWl0ZSBtaXQgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb24gPSAmIzAzOTtkZWZhdWx0JiMwMzk7fTwvY29kZT4gTW9kdWwtVGFnIHZlcndlbmRldC4gRGFtaXQgd2lyZCBTeW50YXhIaWdobGlnaHRlciBUZW1wbGF0ZSBmJnV1bWw7ciBha3R1ZWxsZW4gQ29kZS1CZXJlaWNoIGZlc3RnZWxlZ3QuIDxiciAvPiBNJm91bWw7Z2xpY2hlIFdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV93aWR0aCddID0gJ2Jlc3RpbW10IGRpZSBCcmVpdGUgZGVzIFN5bnRheGhpZ2hsaWdodGVyIEJlcmVpY2hzIGluIFBpeGVsLic7CiRsYW5nWydoZWxwX3BhcmFtX2hlaWdodCddID0gJ2Jlc3RpbW10IGRpZSBIJm91bWw7aGUgZGVzIFN5bnRheGhpZ2hsaWdodGVyIEJlcmVpY2hzIGluIFBpeGVsLic7CiRsYW5nWydoZWxwX3BhcmFtX2RpdmlkJ10gPSAnaWQgZGVzIEVsZW1lbnRzIG1pdCBJaHJlbSBDb2RlLiBWZXJ3ZW5kZW4gU2llIGVpbmRldXRpZ2UgSUQgZiZ1dW1sO3IgamVkZW4gQ29kZSBzbmlwcGV0Lic7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGl0bGUnXSA9ICdBbGxnZW1laW4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RleHQnXSA9ICc8aDM+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvaDM+DQo8cD5BY2VFZGl0b3IgaXMgYSBTeW50YXhoaWdobGlnaHRlciBtb2R1bGUgdXNpbmcgPHN0cm9uZz5BY2U8L3N0cm9uZz4gYSBzdGFuZGFsb25lIGNvZGUgZWRpdG9yIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC48YnIgLz4gDQpHb2FsIG9mIEFjZSBjb2RlIGVkaXRvciBncm91cCBpcyB0byBjcmVhdGUgYSB3ZWIgYmFzZWQgY29kZSBlZGl0b3IgdGhhdCBtYXRjaGVzIGFuZCBleHRlbmRzIHRoZSBmZWF0dXJlcywgdXNhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiBleGlzdGluZyBuYXRpdmUgZWRpdG9ycyBzdWNoIGFzIFRleHRNYXRlLCBWaW0gb3IgRWNsaXBzZS48YnIgLz4NCkl0IGNhbiBiZSBlYXNpbHkgZW1iZWRkZWQgaW4gYW55IHdlYiBwYWdlIGFuZCBKYXZhU2NyaXB0IGFwcGxpY2F0aW9uLjxiciAvPiANCkFjZSBpcyBkZXZlbG9wZWQgYXMgdGhlIHByaW1hcnkgZWRpdG9yIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmNsb3VkOWlkZS5jb20iPkNsb3VkOSBJREU8L2E+IGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0LjwvcD4NCjxoMz5BY2UgaXMgaG9zdGVkIG9uIEdpdEh1YjwvaDM+DQo8cD5UaGUgQWNlIHNvdXJjZSBjb2RlIGlzIGhvc3RlZCBvbiBHaXRIdWIuIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNb3ppbGxhIHRyaS1saWNlbnNlIChNUEwvR1BML0xHUEwpLjxiciAvPg0KVGhpcyBpcyB0aGUgc2FtZSBsaWNlbnNlIHVzZWQgYnkgRmlyZWZveC4gVGhpcyBsaWNlbnNlIGlzIGZyaWVuZGx5IHRvIGFsbCBraW5kcyBvZiBwcm9qZWN0cywgd2hldGhlciBvcGVuIHNvdXJjZSBvciBub3QuPGJyIC8+DQogVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhPC9wPg0KPGgzPlVzaW5nIEFjZUVkaXRvciBNb2R1bGU8L2gzPg0KPHA+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZSBpcyBzaW1wbGUuPGJyIC8+DQpBZnRlciBBY2VFZGl0b3Igd2FzIGluc3RhbGxlZCBnbyB0byAmcXVvdDtNeSBQcmVmZXJlbmNlcyAmcmFxdW87IFVzZXIgUHJlZmVyZW5jZXMmcXVvdDsgYW5kIGNob29zZSBBY2VFZGl0b3IgYXMgeW91ciBTeW50YXhoaWdobGlnaHRlciBvZiBjaG9pY2UgZnJvbSAmcXVvdDtTZWxlY3Qgc3ludGF4IGhpZ2hsaWdodGVyIHRvIHVzZTomcXVvdDsgRHJvcGRvd24uPGJyIC8+DQpNYWtlIHN1cmUgeW91IGhhdmUgJiMwMzk7TW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMmIzAzOTsgUGVybXNpc3Npb24uPC9wPg0KPGgzPlNldHRpbmdzPC9oMz4NCjxwPllvdSBjYW4gY2hhbmdlIGRlZmF1bHQgU2V0dGluZ3MgYW5kIFRoZW1lcyBpbiAmcXVvdDtFeHRlbnNpb25zICZyYXF1bzsgQWNlRWRpdG9yJnF1b3Q7PC9wPic7CiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJ10gPSAnVGFzdGF0dXJrJnV1bWw7cnplbCc7CiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX2NvbnRlbnQnXSA9ICcgICAgICA8aDM+RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHM8L2gzPg0KDQo8dGFibGUgY2xhc3M9JnF1b3Q7cGFnZXRhYmxlJnF1b3Q7IGNlbGxzcGFjaW5nPSZxdW90OzAmcXVvdDsgc3VtbWFyeT0mcXVvdDtEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyZxdW90Oz4NCjx0aGVhZD48dHI+DQo8dGg+UEMgKFdpbmRvd3MvTGludXgpPC90ZD4NCjx0aD5NYWM8L3RkPg0KPHRoPmFjdGlvbjwvdGQ+DQo8L3RyPjwvdGhlYWQ+DQo8dGJvZHk+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y29weSBsaW5lcyBkb3duPC90ZD4NCjwvdHI+DQo8dHIgbGNhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmNvcHkgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBuZXh0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBwcmV2aW91czwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkRvd24sQ3RybC1OPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gbGluZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1FbmQsQ29tbWFuZC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkxlZnQsQ3RybC1CPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1SaWdodCxFbmQsQ3RybC1FPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1MZWZ0LEhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1MZWZ0LEhvbWUsQ3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBwYWdlIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcGFnZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodCxDdHJsLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1Ib21lLEN0cmwtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+aW5kZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5vdXRkZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pkluc2VydDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5JbnNlcnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+b3ZlcndyaXRlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBhZ2V1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtWixDb21tYW5kLVk8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVkbzwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1EPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB0byBsaW5lc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1CYWNrc3BhY2UsQ3RybC1BbHQtQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVwbGFjZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBhbGw8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1FbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBwYWdlIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUVuZCxBbHQtU2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSG9tZSxBbHQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3Qgd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c3BsaXQgbGluZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC03PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnRvZ2dsZSBjb21tZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtVDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1aPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz51bmRvPC90ZD4NCjwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT4nOwokbGFuZ1snaGVscF9mcm9udGVuZF90aXRsZSddID0gJ0Zyb250ZW5kJzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfY29udGVudCddID0gJzxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyIDxoZWFkPiBzZWN0aW9uIG9mIFRlbXBsYXRlIG9yIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fSBhbmQgYW5vdGhlciBjYWxsIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQsIGZvciBleGFtcGxlIHtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlIDxoZWFkPiBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPg0KCTxwcmU+DQoJe2Ntc19qcXVlcnl9DQoJe0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPg0KSW4gTW9kdWxlcyBBZG1pbiBpbnRlcmZhY2UgeW91IGNhbiBzZWxlY3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgeW91ciAmIzAzOTtoZWFkJiMwMzk7IGFjdGlvbiBvciB1c2UgcGFyYW1ldGVyIG1vZGVzPSYjMDM5O2h0bWwsamF2YXNjcmlwdCYjMDM5OyBhbmQgdGhlbWVzPSYjMDM5O3RleHRtYXRlJiMwMzk7IHdoaWNoIHdvdWxkIG92ZXJyaWRlIHNlbGVjdGVkIFByZWZlcmVuY2VzLjwvcD4NCjxwPk5vdyB3aGVuIHlvdSBoYXZlIG5lZWRlZCBzY3JpcHRzIGluY2x1ZGVkLCBvbmUgbW9yZSBNb2R1bGUgdGFnIGNhbGwgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSBpbiB5b3VyIENvbnRlbnQgRWRpdG9yIGFyZWEpIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBvZiB5b3VyIFBhZ2Ugc2hvdWxkIGJlIGhpZ2hsaWdodGVkLjwvcD4NCgk8cHJlPg0KCXtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7c29tZS1pZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgdGFnIGluY2x1ZGVzIG5lZWRlZCBTY3JpcHQgYW5kIFN0eWxlIHRoYXQgaXMgdXNlZCB0byBIaWdobGlnaHQgc2VsZWN0ZWQgZWxlbWVudCB3aXRoIHNwZWNpZmllZCBpZC48YnIgLz4NCkFsbCB5b3UgbmVlZCB0aGVuIGlzIHdyaXRlIHlvdXIgQ29kZSB0aGF0IHlvdSB3YW50IHRvIEhpZ2hsaWdodCBhbmQgd3JhcCBpdCBpbnNpZGUgYW4gZWxlbWVuIGxpa2UgPGRpdj4gd2l0aCBzcGVjaWZpZWQgaWQuPC9wPic7CiRsYW5nWydoZWxwX2Zyb250ZW5kX3NhbXBsZSddID0gJzxwcmUgaWQ9JnF1b3Q7c29tZS1pZCZxdW90Oz4NCiZhbXA7bHQ7aHRtbCZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7aGVhZCZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7c3R5bGUgdHlwZT0mcXVvdDt0ZXh0L2NzcyZxdW90OyZhbXA7Z3Q7DQogICAgICAgICAudGV4dC1sYXllciB7DQogICAgICAgICAgICAgZm9udC1mYW1pbHk6IE1vbmFjbywgJnF1b3Q7Q291cmllciBOZXcmcXVvdDssIG1vbm9zcGFjZTsNCiAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgY3Vyc29yOiB0ZXh0Ow0KICAgICAgICAgfQ0KICAgICAmYW1wO2x0Oy9zdHlsZSZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7L2hlYWQmYW1wO2d0Ow0KICAgICAmYW1wO2x0O2JvZHkmYW1wO2d0Ow0KICAgICAgICAgJmFtcDtsdDtoMSBzdHlsZT0mcXVvdDtjb2xvcjpyZWQmcXVvdDsmYW1wO2d0O0p1aHUgS2lubmVycyZhbXA7bHQ7L2gxJmFtcDtndDsNCiAgICAgJmFtcDtsdDsvYm9keSZhbXA7Z3Q7ICZhbXA7bHQ7L2h0bWwmYW1wO2d0Ow0KPC9wcmU+JzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGl0bGUnXSA9ICcmVXVtbDtiZXInOwokbGFuZ1snaGVscF9hYm91dF90ZXh0J10gPSAnPGgzPlN1cHBvcnQ8L2gzPg0KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4NCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEyLCBHb3JhbiBJbGljIDxhIGhyZWY9Im1haWx0bzp1bmlxdTNlQGdtYWlsLmNvbSI+PHVuaXF1M2VAZ21haWwuY29tPjwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy5pY2gtbWFjaC1kYXMuYXQiIHJlbD0iZXh0ZXJuYWwiPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+DQo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPg0KCTxoMz5UZWFtPC9oMz4NCgk8dWw+DQoJCTxsaT5Hb3JhbiBJbGljICh1bmlxdTMpIGcuaWxpY0BpLWFydHMuZXUgPGJyIC8+d3d3LmljaC1tYWNoLWRhcy5hdDwvbGk+CQ0KCQk8bGk+Um9iZXJ0IENhbXBiZWxsIChjYWxndXkxMDAwKSBjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnICA8YnIgLz53d3cuY2FsZ3V5MTAwMC5jb208L2xpPgkJDQoJCTxsaT5Kb25hdGhhbiBTY2htaWQgKEZvYWx5KikgaGlAam9uYXRoYW5zY2htaWQuZGUgPGJyIC8+d3d3LmpvbmF0aGFuc2NobWlkLmRlPC9saT4NCgk8L3VsPg0KJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzxoMz5WZXJzaW9uIDAuMTwvaDM+DQo8dWw+DQoJPGxpPkl0JiMwMzk7cyBmcmVzaCEgTm90aGluZyBjaGFuZ2VkIHlldCE8L2xpPg0KCTxsaT5Vc2luZyBBY2UgVmVyc2lvbiAwLjIuMDwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgQ1RSTC1TIEtleWJpbmRpbmc8L2xpPg0KCTxsaT5BZGRlZCBGdWxsc2NyZWVubW9kZTwvbGk+DQoJPGxpPkFkZGVkIEZyb250ZW5kIEhpZ2hsaWdodGluZzwvbGk+DQoJPGxpPlVwZGF0ZWQgQWNlPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMTwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIEludGVybmV0IEV4cGxvcmVyIHByZWZlcmVuY2U8L2xpPg0KCTxsaT5VcGRhdGVkIEFDRSB3aXRoIHRoZW1lczwvbGk+DQo8L3VsPg0KPGgzPlJvYWRtYXA8L2gzPg0KPHVsPg0KCTxsaT48ZGVsPkFkZCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmc8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBGdWxsc2NyZWVubW9kZTwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEtleWJpbmRpbmcgKENUUkwrUyk8L2RlbD48L2xpPg0KCTxsaT5BZGQgRWRpdG9yIGJlaGF2aW9yIChWaW0sIEVNYWNzKTwvbGk+DQoJPGxpPk1heWJlIGFkZCBUb29sYmFyPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3FjYSddID0gJ1AwLTE0NTg0NTA2NjQtMTI4NDU3MzA4NDkxOCc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEzNzUwNDcxNC4xMzMwNzYyNzY5LjEzMzA3NjI3NjkuMTMzMDc2Mjc2OS4xJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzMwNzYyNzY5LjEuMS51dG1jY249KGRpcmVjdCl8dXRtY3NyPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvcic7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnQWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJbnRlcm5ldCBFeHBsb3JlciBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCEnOwokbGFuZ1snc2V0dGluZ3NfdGFiJ10gPSAnUHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlcyc7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzX3RhYiddID0gJ1ByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZXMgZHUgRnJvbnRlbmQnOwokbGFuZ1snZnJvbnRlbmRfaGVhZF9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIEhlYWQgUHJlZmVyZW5jZXMnOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIFN5bnRheGFyZWEgUHJlZmVyZW5jZXMnOwokbGFuZ1snaGVhZF9kZXNjcmlwdGlvbiddID0gJ1RoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBzY3JpcHRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHBhZ2UgPGNvZGU+PGhlYWQ+PC9jb2RlPiB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+IGZyb20gUGFnZSBTcGVjaWZpYyBNZXRhZGF0YSBvciBUZW1wbGF0ZS4nOwokbGFuZ1snY29udGVudF9kZXNjcmlwdGlvbiddID0gJ1RoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIFN5bnRheGhpZ2hsaWdodGluZyBhcmVhIHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2VkaXRvciYjMDM5O308L2NvZGU+IHRhZyB3aXRoaW4gYSBQYWdlLic7CiRsYW5nWydzeW50YXhhcmVhZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBBY2UgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fTwvY29kZT4gZnJvbSBhIFBhZ2Ugb3IgVGVtcGxhdGUnOwokbGFuZ1snZXhhbXBsZV9kb2N1bWVudCddID0gJ0RvY3VtZW50JzsKJGxhbmdbJ3dpZHRoX3RpdGxlJ10gPSAnRWRpdG9yIHdpZHRoIChpbiBlbSknOwokbGFuZ1snaGVpZ2h0X3RpdGxlJ10gPSAnRWRpdG9yIGhlaWdodCAoaW4gZW0pJzsKJGxhbmdbJ2VuYWJsZV9pZSddID0gJ0VuYWJsZSBJbnRlcm5ldCBFeHBsb3Jlcic7CiRsYW5nWyd1c2VfdW5jb21wcmVzc2VkJ10gPSAnVXNlIHVuY29tcHJlc3NlZCc7CiRsYW5nWyd1c2VfdW5jb21wcmVzc2VkX3RleHQnXSA9ICdNaWdodCBoZWxwIGlmIHlvdSBoYXZlIHByb2JsZW1zIHVzaW5nIGluIFNhZmFyaS4nOwokbGFuZ1snZW5hYmxlX2llZGVzY3JpcHRpb24nXSA9ICdBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgZG9lcyBub3QgYmVoYXZlIHByb3Blcmx5IHdoZW4gdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIuIEVuYWJsZSB0aGlzIGF0IHlvdXIgb3duIHJpc2shJzsKJGxhbmdbJ2Zyb250ZW5kX3dpZHRoX3RpdGxlJ10gPSAnRnJvbnRlbmQgU3ludGF4YXJlYSB3aWR0aCAoaW4gcHgpJzsKJGxhbmdbJ2Zyb250ZW5kX2hlaWdodF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheGFyZWEgaGVpZ2h0IChpbiBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2RlJzsKJGxhbmdbJ3RoZW1lcyddID0gJ1RoZW1lJzsKJGxhbmdbJ2ZvbnRfc2l6ZSddID0gJ0ZvbnQgU2l6ZSc7CiRsYW5nWydmdWxsX2xpbmUnXSA9ICdGdWxsIExpbmUgU2VsZWN0aW9uJzsKJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICdIaWdobGlnaHQgQWN0aXZlIExpbmUnOwokbGFuZ1snc2hvd19pbnZpc2libGVzJ10gPSAnU2hvdyBJbnZpc2libGVzJzsKJGxhbmdbJ3BlcnNpc3RlbnRfaHNjcm9sbCddID0gJ1BlcnNpdGVudCBIU2Nyb2xsJzsKJGxhbmdbJ2tleV9iaW5kaW5nJ10gPSAnS2V5IEJpbmRpbmcnOwokbGFuZ1snc29mdF93cmFwJ10gPSAnU29mdCBXcmFwJzsKJGxhbmdbJ3Nob3dfZ3V0dGVyJ10gPSAnU2hvdyBHdXR0ZXInOwokbGFuZ1sncHJpbnRfbWFyZ2luJ10gPSAnU2hvdyBQcmludCBNYXJnaW4nOwokbGFuZ1snc29mdF90YWInXSA9ICdVc2UgU29mdCBUYWInOwokbGFuZ1snaGlnaGxpZ2h0X3NlbGVjdGVkJ10gPSAnSGlnaGxpZ2h0IHNlbGVjdGVkIHdvcmQnOwokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gJ0VuYWJsZSBCZWhhdmlvcnMnOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnUHJldmlldyc7CiRsYW5nWydqcyddID0gJ0phdmFTY3JpcHQnOwokbGFuZ1sncGxhaW4nXSA9ICdQbGFpbiBUZXh0JzsKJGxhbmdbJ3N2ZyddID0gJ1NWRyc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCc7CiRsYW5nWydjc3MnXSA9ICdDU1MnOwokbGFuZ1snc2NzcyddID0gJ1NDU1MnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0JzsKJGxhbmdbJ2pzb24nXSA9ICdKU09OJzsKJGxhbmdbJ3B5dGhvbiddID0gJ1B5dGhvbic7CiRsYW5nWydydWJ5J10gPSAnUnVieSc7CiRsYW5nWydwZXJsJ10gPSAnUGVybCc7CiRsYW5nWydwaHAnXSA9ICdQSFAnOwokbGFuZ1snamF2YSddID0gJ0phdmEnOwokbGFuZ1snY3NoYXJwJ10gPSAnQyMnOwokbGFuZ1snY19jcHAnXSA9ICdDKysnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUnOwokbGFuZ1snY29sZGZ1c2lvbiddID0gJ0NvbGRmdXNpb24nOwokbGFuZ1snaGF4ZSddID0gJ0hheGUnOwokbGFuZ1snbGF0ZXgnXSA9ICdMYXRleCc7CiRsYW5nWydsdWEnXSA9ICdMdWEnOwokbGFuZ1snbWFya2Rvd24nXSA9ICdNYXJrZG93bic7CiRsYW5nWydwb3dlcnNoZWxsJ10gPSAnUG93ZXJTaGVsbCc7CiRsYW5nWydzcWwnXSA9ICdTUUwnOwokbGFuZ1sncGdzcWwnXSA9ICdwZ1NRTCc7CiRsYW5nWydvY2FtbCddID0gJ09DYW1sJzsKJGxhbmdbJ3RleHRpbGUnXSA9ICdUZXh0aWxlJzsKJGxhbmdbJ2dyb292eSddID0gJ0dyb292eSc7CiRsYW5nWydzY2FsYSddID0gJ1NjYWxhJzsKJGxhbmdbJ2Nsb3VkcyddID0gJ0Nsb3Vkcyc7CiRsYW5nWydjaHJvbWUnXSA9ICdDaHJvbWUnOwokbGFuZ1snY2xvdWRzX21pZG5pZ2h0J10gPSAnQ2xvdWRzIE1pZG5pZ2h0JzsKJGxhbmdbJ2NvYmFsdCddID0gJ0NvYmFsdCc7CiRsYW5nWydjcmltc29uX2VkaXRvciddID0gJ0NyaW1zb24gRWRpdG9yJzsKJGxhbmdbJ2Rhd24nXSA9ICdEYXduJzsKJGxhbmdbJ2RyZWFtd2VhdmVyJ10gPSAnRHJlYW13ZWF2ZXInOwokbGFuZ1snZWNsaXBzZSddID0gJ0VjbGlwc2UnOwokbGFuZ1snaWRsZV9maW5nZXJzJ10gPSAnaWRsZUZpbmdlcnMnOwokbGFuZ1sna3JfdGhlbWUnXSA9ICdrclRoZW1lJzsKJGxhbmdbJ21lcmJpdm9yZSddID0gJ01lcmJpdm9yZSc7CiRsYW5nWydtZXJiaXZvcmVfc29mdCddID0gJ01lcmJpdm9yZSBTb2Z0JzsKJGxhbmdbJ21vbm9faW5kdXN0cmlhbCddID0gJ01vbm8gSW5kdXN0cmlhbCc7CiRsYW5nWydtb25va2FpJ10gPSAnTW9ub2thaSc7CiRsYW5nWydwYXN0ZWxfb25fZGFyayddID0gJ1Bhc3RlbCBvbiBkYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9kYXJrJ10gPSAnU29sYXJpemVkIERhcmsnOwokbGFuZ1snc29sYXJpemVkX2xpZ2h0J10gPSAnU29sYXJpemVkIExpZ2h0JzsKJGxhbmdbJ3RleHRtYXRlJ10gPSAnVGV4dE1hdGUnOwokbGFuZ1sndG9tb3Jyb3cnXSA9ICdUb21vcnJvdyc7CiRsYW5nWyd0b21vcnJvd19uaWdodCddID0gJ1RvbW9ycm93IE5pZ2h0JzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2JyaWdodCddID0gJ1RvbW9ycm93IE5pZ2h0IEJyaWdodCc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9ibHVlJ10gPSAnVG9tb3Jyb3cgTmlnaHQgQmx1ZSc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9laWdodGllcyddID0gJ1RvbW9ycm93IE5pZ2h0IEVpZ2h0aWVzJzsKJGxhbmdbJ3R3aWxpZ2h0J10gPSAnVHdpbGlnaHQnOwokbGFuZ1sndmlicmFudF9pbmsnXSA9ICdWaWJyYW50IEluayc7CiRsYW5nWydhY2UnXSA9ICdBY2UnOwokbGFuZ1sndmltJ10gPSAnVmltJzsKJGxhbmdbJ2VtYWNzJ10gPSAnRU1hY3MnOwokbGFuZ1snY3VzdG9tJ10gPSAnQ3VzdG9tJzsKJGxhbmdbJ29mZiddID0gJ09mZic7CiRsYW5nWyc0MCddID0gJzQwIENoYXJzJzsKJGxhbmdbJzgwJ10gPSAnODAgQ2hhcnMnOwokbGFuZ1snMTAwJ10gPSAnMTAwIENoYXJzJzsKJGxhbmdbJzE0MCddID0gJzE0MCBDaGFycyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXZlIFByZWZlcmVuY2VzJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdZb3VyIEFjZUVkaXRvciBzZXR0aW5ncyBoYXZlIGJlZW4gc2F2ZWQnOwokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc3NhdmVkJ10gPSAnWW91ciBBY2VFZGl0b3IgRnJvbnRlbmQgc2V0dGluZ3MgaGF2ZSBiZWVuIHNhdmVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQhIFNldCAmcXVvdDtNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcyZxdW90OyBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBtb2R1bGUhJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdBY2VFZGl0b3IgU3VjY2Vzc2Z1bGx5IFVuaW5zdGFsbGVkJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgQWNlRWRpdG9yPyBUaGluayBhZ2FpbiEnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICdNaXNzaW5nIFBlcm1pc3Npb24hLiBTZXQgJnF1b3Q7TW9kaWZ5IFRlbXBsYXRlcyZxdW90OyBvciAmcXVvdDtBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJnF1b3Q7IHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZS4nOwokbGFuZ1snaGVscF9wYXJhbV9hY3Rpb24nXSA9ICdpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG9mIE1vZHVsZSB0YWcuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJiMwMzk7ZGVmYXVsdCYjMDM5OyBhbmQgJiMwMzk7aGVhZCYjMDM5Oy4gQm90aCBhcmUgbmVlZGVkIGZvciBjb3JyZWN0IEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlcyddID0gJ2lzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJiMwMzk7bW9kZXMmIzAzOTsgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgPGhlYWQ+IG9mIFRlbXBsYXRlIG9yIFBhZ2Ugc3BlY2lmaWMgTWV0YWRhdGEuIFRoaXMgd2lsbCBvdmVycmlkZSB5b3UgUHJlZmVyZW5jZXMgc2VsZWN0ZWQgaW4gTW9kdWxlIEFkbWluIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAnaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAmIzAzOTt0aGVtZXMmIzAzOTsgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgPGhlYWQ+IG9mIFRlbXBsYXRlIG9yIFBhZ2Ugc3BlY2lmaWMgTWV0YWRhdGEuIFRoaXMgd2lsbCBvdmVycmlkZSB5b3UgUHJlZmVyZW5jZXMgc2VsZWN0ZWQgaW4gTW9kdWxlIEFkbWluIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIG1vZGUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV90aGVtZSddID0gJ2lzIHVzZWQgd2l0aGluIGEgcGFnZSB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2RlZmF1bHQmIzAzOTt9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciB0aGVtZSBmb3Igc3BlY2lmaWMgY29kZSBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fd2lkdGgnXSA9ICdzcGVjaWZpZXMgd2lkdGggb2YgU3ludGF4aGlnaGxpZ2h0ZXIgYXJlYSBpbiBwaXhlbC4nOwokbGFuZ1snaGVscF9wYXJhbV9oZWlnaHQnXSA9ICdzcGVjaWZpZXMgaGVpZ2h0IG9mIFN5bnRheGhpZ2hsaWdodGVyIGFyZWEgaW4gcGl4ZWwuJzsKJGxhbmdbJ2hlbHBfcGFyYW1fZGl2aWQnXSA9ICdpZCBvZiB0aGUgZWxlbWVudCBjb250YWluaW5nIHlvdXIgY29kZS4gVXNlIHVuaXF1ZSBpZCBmb3IgZWFjaCBjb2RlIGNodW5jay4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAnR2VuZXJhbCc7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGV4dCddID0gJzxoMz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9oMz4NCjxwPkFjZUVkaXRvciBpcyBhIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsZSB1c2luZyA8c3Ryb25nPkFjZTwvc3Ryb25nPiBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LjxiciAvPiANCkdvYWwgb2YgQWNlIGNvZGUgZWRpdG9yIGdyb3VwIGlzIHRvIGNyZWF0ZSBhIHdlYiBiYXNlZCBjb2RlIGVkaXRvciB0aGF0IG1hdGNoZXMgYW5kIGV4dGVuZHMgdGhlIGZlYXR1cmVzLCB1c2FiaWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIGV4aXN0aW5nIG5hdGl2ZSBlZGl0b3JzIHN1Y2ggYXMgVGV4dE1hdGUsIFZpbSBvciBFY2xpcHNlLjxiciAvPg0KSXQgY2FuIGJlIGVhc2lseSBlbWJlZGRlZCBpbiBhbnkgd2ViIHBhZ2UgYW5kIEphdmFTY3JpcHQgYXBwbGljYXRpb24uPGJyIC8+IA0KQWNlIGlzIGRldmVsb3BlZCBhcyB0aGUgcHJpbWFyeSBlZGl0b3IgZm9yIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbSI+Q2xvdWQ5IElERTwvYT4gYW5kIHRoZSBzdWNjZXNzb3Igb2YgdGhlIE1vemlsbGEgU2t5d3JpdGVyIChCZXNwaW4pIFByb2plY3QuPC9wPg0KPGgzPkFjZSBpcyBob3N0ZWQgb24gR2l0SHViPC9oMz4NCjxwPlRoZSBBY2Ugc291cmNlIGNvZGUgaXMgaG9zdGVkIG9uIEdpdEh1Yi4gSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1vemlsbGEgdHJpLWxpY2Vuc2UgKE1QTC9HUEwvTEdQTCkuPGJyIC8+DQpUaGlzIGlzIHRoZSBzYW1lIGxpY2Vuc2UgdXNlZCBieSBGaXJlZm94LiBUaGlzIGxpY2Vuc2UgaXMgZnJpZW5kbHkgdG8gYWxsIGtpbmRzIG9mIHByb2plY3RzLCB3aGV0aGVyIG9wZW4gc291cmNlIG9yIG5vdC48YnIgLz4NCiBUYWtlIGNoYXJnZSBvZiB5b3VyIGVkaXRvciBhbmQgYWRkIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UgaGlnaGxpZ2h0aW5nIGFuZCBrZXliaW5kaW5ncyE8L3A+DQo8aDM+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZTwvaDM+DQo8cD5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlIGlzIHNpbXBsZS48YnIgLz4NCkFmdGVyIEFjZUVkaXRvciB3YXMgaW5zdGFsbGVkIGdvIHRvICZxdW90O015IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlcyZxdW90OyBhbmQgY2hvb3NlIEFjZUVkaXRvciBhcyB5b3VyIFN5bnRheGhpZ2hsaWdodGVyIG9mIGNob2ljZSBmcm9tICZxdW90O1NlbGVjdCBzeW50YXggaGlnaGxpZ2h0ZXIgdG8gdXNlOiZxdW90OyBEcm9wZG93bi48YnIgLz4NCk1ha2Ugc3VyZSB5b3UgaGF2ZSAmIzAzOTtNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcyYjMDM5OyBQZXJtc2lzc2lvbi48L3A+DQo8aDM+U2V0dGluZ3M8L2gzPg0KPHA+WW91IGNhbiBjaGFuZ2UgZGVmYXVsdCBTZXR0aW5ncyBhbmQgVGhlbWVzIGluICZxdW90O0V4dGVuc2lvbnMgJnJhcXVvOyBBY2VFZGl0b3ImcXVvdDs8L3A+JzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnXSA9ICdLZXlib2FyZCBTaG9ydGN1dHMnOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50J10gPSAnICAgICAgPGgzPkRlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSJwYWdldGFibGUiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSJEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyI+Cjx0aGVhZD48dHI+Cjx0aD5QQyAoV2luZG93cy9MaW51eCk8L3RkPgo8dGg+TWFjPC90ZD4KPHRoPmFjdGlvbjwvdGQ+CjwvdHI+PC90aGVhZD4KPHRib2R5Pgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmV0dXJuPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJldHVybjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+ZnVsbHNjcmVlbjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVM8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnBlcmZvcm0gc2F2ZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUw8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmNlbnRlciBzZWxlY3Rpb248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPmNvcHkgbGluZXMgZG93bjwvdGQ+CjwvdHI+Cjx0ciBsY2Fzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+ZmluZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1LPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUc8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmZpbmQgbmV4dDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1LPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUc8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmZpbmQgcHJldmlvdXM8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkRvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPkRvd24sQ3RybC1OPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5VcCxDdHJsLVA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRW5kLEN0cmwtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1FbmQsQ29tbWFuZC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkxlZnQsQ3RybC1CPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUw8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gbGluZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVJpZ2h0LEVuZDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1SaWdodCxFbmQsQ3RybC1FPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUxlZnQsSG9tZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1MZWZ0LEhvbWUsQ3RybC1BPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcGFnZSBkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5SaWdodCxDdHJsLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUhvbWUsQ3RybC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gd29yZCByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+VGFiPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmluZGVudDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1UYWI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+b3V0ZGVudDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+SW5zZXJ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5JbnNlcnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPm92ZXJ3cml0ZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cGFnZWRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5wYWdldXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtWixDdHJsLVk8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtWixDb21tYW5kLVk8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlZG88L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1EPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgbGluZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB0byBsaW5lIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tQmFja3NwYWNlPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1CYWNrc3BhY2UsQ3RybC1BbHQtQmFja3NwYWNlPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1EZWxldGU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2U8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1PcHRpb24tRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVwbGFjZSBhbGw8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1BPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgYWxsPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUVuZDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGluZSBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUhvbWU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUhvbWU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBwYWdlIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VVcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcGFnZSB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcmlnaHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGxpbmUgZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtU2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tU2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3Qgd29yZCByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLU88L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNwbGl0IGxpbmU8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtNzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC03PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij50b2dnbGUgY29tbWVudDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnRyYW5zcG9zZSBsZXR0ZXJzPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVo8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtWjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+dW5kbzwvdGQ+CjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+JzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfdGl0bGUnXSA9ICdGcm9udGVuZCc7CiRsYW5nWydoZWxwX2Zyb250ZW5kX2NvbnRlbnQnXSA9ICc8cD5UaGlzIE1vZHVsZSBhbmQgQWNlIFNjcmlwdCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0ZXIuPGJyIC8+DQpUbyBtYWtlIGl0IHdvcmsgeW91IGhhdmUgdG8gaW5jbHVkZSBqUXVlcnkgRnJhbWV3b3JrLCBmb3IgZXhhbXBsZSB1c2luZyBDTVNNUyB7Y21zX2pxdWVyeX0gdGFnIGFuZCBhcyB3ZWxsIGluY2x1ZGUge0FjZUVkaXRvcn0gaW4geW91ciBwYWdlIHR3aWNlLiBGaXJzdCBhZGQgdGhlIG1vZHVsZSB0YWcgaW4geW91ciA8aGVhZD4gc2VjdGlvbiBvZiBUZW1wbGF0ZSBvciBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDsgZmllbGQgb2YgeW91ciBDb250ZW50IHBhZ2UsIGxpa2Uge0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSA8aGVhZD4gYXJlYSwgZm9yIGV4YW1wbGUgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIGluY2x1ZGVzIG5lZWRlZCBzY3JpcHRzIGZvciBBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgdG8gd29yay48YnIgLz4NCkluIE1vZHVsZXMgQWRtaW4gaW50ZXJmYWNlIHlvdSBjYW4gc2VsZWN0IGRlZmF1bHQgc2V0dGluZ3MgZm9yIHlvdXIgJiMwMzk7aGVhZCYjMDM5OyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0mIzAzOTtodG1sLGphdmFzY3JpcHQmIzAzOTsgYW5kIHRoZW1lcz0mIzAzOTt0ZXh0bWF0ZSYjMDM5OyB3aGljaCB3b3VsZCBvdmVycmlkZSBzZWxlY3RlZCBQcmVmZXJlbmNlcy48L3A+DQo8cD5Ob3cgd2hlbiB5b3UgaGF2ZSBuZWVkZWQgc2NyaXB0cyBpbmNsdWRlZCwgb25lIG1vcmUgTW9kdWxlIHRhZyBjYWxsIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUgaW4geW91ciBDb250ZW50IEVkaXRvciBhcmVhKSB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgb2YgeW91ciBQYWdlIHNob3VsZCBiZSBoaWdobGlnaHRlZC48L3A+DQoJPHByZT4NCgl7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O3NvbWUtaWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlIDxkaXY+IHdpdGggc3BlY2lmaWVkIGlkLjwvcD4nOwokbGFuZ1snaGVscF9mcm9udGVuZF9zYW1wbGUnXSA9ICc8cHJlIGlkPSJzb21lLWlkIj4KJmx0O2h0bWwmZ3Q7CiDCoCDCoCAmbHQ7aGVhZCZndDsKIMKgIMKgICZsdDtzdHlsZSB0eXBlPSJ0ZXh0L2NzcyImZ3Q7CiDCoCDCoCDCoCDCoCAudGV4dC1sYXllciB7CiDCoCDCoCDCoCDCoCDCoCDCoCBmb250LWZhbWlseTogTW9uYWNvLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7CiDCoCDCoCDCoCDCoCDCoCDCoCBmb250LXNpemU6IDEycHg7CiDCoCDCoCDCoCDCoCDCoCDCoCBjdXJzb3I6IHRleHQ7CiDCoCDCoCDCoCDCoCB9CiDCoCDCoCAmbHQ7L3N0eWxlJmd0OwogwqAgwqAgJmx0Oy9oZWFkJmd0OwogwqAgwqAgJmx0O2JvZHkmZ3Q7CiDCoCDCoCDCoCDCoCAmbHQ7aDEgc3R5bGU9ImNvbG9yOnJlZCImZ3Q7SnVodSBLaW5uZXJzJmx0Oy9oMSZndDsKIMKgIMKgICZsdDsvYm9keSZndDsgJmx0Oy9odG1sJmd0Owo8L3ByZT4nOwokbGFuZ1snaGVscF9hYm91dF90aXRsZSddID0gJ0EgcHJvcG9zJzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGV4dCddID0gJzxoMz5TdXBwb3J0PC9oMz4NCjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPjx1bmlxdTNlQGdtYWlsLmNvbT48L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0IiByZWw9ImV4dGVybmFsIj53d3cuaWNoLW1hY2gtZGFzLmF0PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCgk8aDM+VGVhbTwvaDM+DQoJPHVsPg0KCQk8bGk+R29yYW4gSWxpYyAodW5pcXUzKSBnLmlsaWNAaS1hcnRzLmV1IDxiciAvPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2xpPgkNCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQ0KCQk8bGk+Sm9uYXRoYW4gU2NobWlkIChGb2FseSopIGhpQGpvbmF0aGFuc2NobWlkLmRlIDxiciAvPnd3dy5qb25hdGhhbnNjaG1pZC5kZTwvbGk+DQoJPC91bD4NCic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCgk8bGk+VXNpbmcgQWNlIFZlcnNpb24gMC4yLjA8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMjwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIENUUkwtUyBLZXliaW5kaW5nPC9saT4NCgk8bGk+QWRkZWQgRnVsbHNjcmVlbm1vZGU8L2xpPg0KCTxsaT5BZGRlZCBGcm9udGVuZCBIaWdobGlnaHRpbmc8L2xpPg0KCTxsaT5VcGRhdGVkIEFjZTwvbGk+DQo8L3VsPg0KPGgzPlJvYWRtYXA8L2gzPg0KPHVsPg0KCTxsaT48ZGVsPkFkZCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmc8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBGdWxsc2NyZWVubW9kZTwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEtleWJpbmRpbmcgKENUUkwrUyk8L2RlbD48L2xpPg0KCTxsaT5BZGQgRWRpdG9yIGJlaGF2aW9yIChWaW0sIEVNYWNzKTwvbGk+DQoJPGxpPk1heWJlIGFkZCBUb29sYmFyPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTkyNDAwNzA4Ni4xMzI1MzI1NzUyLjEzMzA0NjEzNjkuMTMzMTkyMjYzMi4zJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTMzMTkyMjYzMi4zLjMudXRtY3NyPWdvb2dsZXx1dG1jY249KG9yZ2FuaWMpfHV0bWNtZD1vcmdhbmljfHV0bWN0cj0obm90IHByb3ZpZGVkKSc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMzI0OTU1MzI5LTEzMjEwOTY4OTA4NjYnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEzMzE5MjI2MzInOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvcic7CiRsYW5nWydzZXR0aW5nc190YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ2V4YW1wbGVfZG9jdW1lbnQnXSA9ICdEb2N1bWVudCc7CiRsYW5nWydzeW50YXhfbW9kZSddID0gJ01vZGUnOwokbGFuZ1sndGhlbWVzJ10gPSAnVGhlbWUnOwokbGFuZ1snZm9udF9zaXplJ10gPSAnRm9udCBTaXplJzsKJGxhbmdbJ2Z1bGxfbGluZSddID0gJ0Z1bGwgTGluZSc7CiRsYW5nWydoaWdobGlnaHRfYWN0aXZlJ10gPSAnSGlnaGxpZ2h0IEFjdGl2ZSBMaW5lJzsKJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gJ1Nob3cgSW52aXNpYmxlcyc7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICdQZXJzaXRlbnQgSFNjcm9sbCc7CiRsYW5nWydrZXlfYmluZGluZyddID0gJ0tleSBCaW5kaW5nJzsKJGxhbmdbJ3NvZnRfd3JhcCddID0gJ1NvZnQgV3JhcCc7CiRsYW5nWydzaG93X2d1dHRlciddID0gJ1Nob3cgR3V0dGVyJzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ1Nob3cgUHJpbnQgTWFyZ2luJzsKJGxhbmdbJ3NvZnRfdGFiJ10gPSAnVXNlIFNvZnQgVGFiJzsKJGxhbmdbJ2hpZ2hsaWdodF9zZWxlY3RlZCddID0gJ0hpZ2hsaWdodCBzZWxlY3RlZCB3b3JkJzsKJGxhbmdbJ2VuYWJsZV9iZWhhdmlvcnMnXSA9ICdFbmFibGUgQmVoYXZpb3JzJzsKJGxhbmdbJ3Rlc3RhcmVhdGV4dCddID0gJ1ByZXZpZXcnOwokbGFuZ1snanMnXSA9ICdKYXZhU2NyaXB0JzsKJGxhbmdbJ3BsYWluJ10gPSAnUGxhaW4gVGV4dCc7CiRsYW5nWydzdmcnXSA9ICdTVkcnOwokbGFuZ1snaHRtbCddID0gJ0hUTUwnOwokbGFuZ1snY3NzJ10gPSAnQ1NTJzsKJGxhbmdbJ3Njc3MnXSA9ICdTQ1NTJzsKJGxhbmdbJ2NvZmZlZSddID0gJ0NvZmZlZVNjcmlwdCc7CiRsYW5nWydqc29uJ10gPSAnSlNPTic7CiRsYW5nWydweXRob24nXSA9ICdQeXRob24nOwokbGFuZ1sncnVieSddID0gJ1J1YnknOwokbGFuZ1sncGVybCddID0gJ1BlcmwnOwokbGFuZ1sncGhwJ10gPSAnUEhQJzsKJGxhbmdbJ2phdmEnXSA9ICdKYXZhJzsKJGxhbmdbJ2NzaGFycCddID0gJ0MjJzsKJGxhbmdbJ2NfY3BwJ10gPSAnQysrJzsKJGxhbmdbJ2Nsb2p1cmUnXSA9ICdDbG9qdXJlJzsKJGxhbmdbJ29jYW1sJ10gPSAnT0NhbWwnOwokbGFuZ1sndGV4dGlsZSddID0gJ1RleHRpbGUnOwokbGFuZ1snZ3Jvb3Z5J10gPSAnR3Jvb3Z5JzsKJGxhbmdbJ3NjYWxhJ10gPSAnU2NhbGEnOwokbGFuZ1snY2xvdWRzJ10gPSAnQ2xvdWRzJzsKJGxhbmdbJ2Nsb3Vkc19taWRuaWdodCddID0gJ0Nsb3VkcyBNaWRuaWdodCc7CiRsYW5nWydjb2JhbHQnXSA9ICdDb2JhbHQnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvcic7CiRsYW5nWydkYXduJ10gPSAnRGF3bic7CiRsYW5nWydlY2xpcHNlJ10gPSAnRWNsaXBzZSc7CiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICdpZGxlRmluZ2Vycyc7CiRsYW5nWydrcl90aGVtZSddID0gJ2tyVGhlbWUnOwokbGFuZ1snbWVyYml2b3JlJ10gPSAnTWVyYml2b3JlJzsKJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAnTWVyYm92aW9yZSBTb2Z0JzsKJGxhbmdbJ21vbm9faW5kdXN0cmlhbCddID0gJ01vbm8gSW5kdXN0cmlhbCc7CiRsYW5nWydtb25va2FpJ10gPSAnTW9ub2thaSc7CiRsYW5nWydwYXN0ZWxfb25fZGFyayddID0gJ1Bhc3RlbCBvbiBkYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9kYXJrJ10gPSAnU29sYXJpemVkIERhcmsnOwokbGFuZ1snc29sYXJpemVkX2xpZ2h0J10gPSAnU29sYXJpemVkIExpZ2h0JzsKJGxhbmdbJ3RleHRtYXRlJ10gPSAnVGV4dE1hdGUnOwokbGFuZ1sndHdpbGlnaHQnXSA9ICdUd2lsaWdodCc7CiRsYW5nWyd2aWJyYW50X2luayddID0gJ1ZpYnJhbnQgSW5rJzsKJGxhbmdbJ2FjZSddID0gJ0FjZSc7CiRsYW5nWyd2aW0nXSA9ICdWaW0nOwokbGFuZ1snZW1hY3MnXSA9ICdFTWFjcyc7CiRsYW5nWydjdXN0b20nXSA9ICdDdXN0b20nOwokbGFuZ1snb2ZmJ10gPSAnT2ZmJzsKJGxhbmdbJzQwJ10gPSAnNDAgdGVnbic7CiRsYW5nWyc4MCddID0gJzgwIHRlZ24nOwokbGFuZ1snZnJlZSddID0gJ0ZyZWUnOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnTGFncmUgaW5uc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnRGluZSBBY2VFZGl0b3IgaW5uc3RpbGxpbmdlciBoYXIgYmxpdHQgbGFncmV0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQhIFNldCAmcXVvdDtNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcyZxdW90OyBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBtb2R1bGUhJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdBY2VFZGl0b3IgU3VjY2Vzc2Z1bGx5IFVuaW5zdGFsbGVkJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgQWNlRWRpdG9yPyBUaGluayBhZ2FpbiEnOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAnR2VuZXJhbCc7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3FjYSddID0gJ1AwLTUzNjg0OTExNS0xMzA3OTgzNDk1MjEwJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMjUxNzI4MDkxLjEzMjI0MzAzNzEuMTMyMjQzNTAxOS4xMzIyNTExMTE3LjMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzIyNDMwMzcxLjEuMS51dG1jc3I9KGRpcmVjdCl8dXRtY2NuPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4yLjEwLjEzMjI1MTExMTcnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvciAnOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0FjZUVkaXRvciBpcyBhIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsZSB1c2luZyA8c3Ryb25nPkFjZTwvc3Ryb25nPiBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LjxiciAvPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW50ZXJuZXQgRXhwbG9yZXIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQhJzsKJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzX3RhYiddID0gJ0Zyb250ZW5kIEluc3RlbGxpbmdlbic7CiRsYW5nWydmcm9udGVuZF9oZWFkX3NldHRpbmdzJ10gPSAnRnJvbnRlbmQgSGVhZCBJbnN0ZWxsaW5nZW4nOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgSW5zdGVsbGluZ2VuJzsKJGxhbmdbJ2hlYWRfZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBBY2Ugc2NyaXB0cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBwYWdlIDxjb2RlPjxoZWFkPjwvY29kZT4gd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPiBmcm9tIFBhZ2UgU3BlY2lmaWMgTWV0YWRhdGEgb3IgVGVtcGxhdGUuJzsKJGxhbmdbJ2NvbnRlbnRfZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBTeW50YXhoaWdobGlnaHRpbmcgYXJlYSB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0mIzAzOTtlZGl0b3ImIzAzOTt9PC9jb2RlPiB0YWcgd2l0aGluIGEgUGFnZS4nOwokbGFuZ1snc3ludGF4YXJlYWRlc2NyaXB0aW9uJ10gPSAnVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIGJlaGF2aW9yIHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O308L2NvZGU+IGZyb20gYSBQYWdlIG9yIFRlbXBsYXRlJzsKJGxhbmdbJ2V4YW1wbGVfZG9jdW1lbnQnXSA9ICdEb2N1bWVudCAnOwokbGFuZ1snd2lkdGhfdGl0bGUnXSA9ICdFZGl0b3IgYnJlZWR0ZSAoaW4gZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ0VkaXRvciBicmVlZHRlIChpbiBlbSknOwokbGFuZ1snZW5hYmxlX2llJ10gPSAnSW50ZXJuZXQgRXhwbG9yZXIgSW5zY2hha2VsZW4nOwokbGFuZ1sndXNlX3VuY29tcHJlc3NlZCddID0gJ0dlYnJ1aWsgb25nZWNvbXByaW1lZXJkJzsKJGxhbmdbJ3VzZV91bmNvbXByZXNzZWRfdGV4dCddID0gJ0RpdCBrYW4gaGVscGVuIGFscyB1IHByb2JsZW1lbiBlcnZhYXJ0IGluIFNhZmFyaS4nOwokbGFuZ1snZW5hYmxlX2llZGVzY3JpcHRpb24nXSA9ICdBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgZnVuY3Rpb25lZXJ0IG5pZXQgY29ycmVjdCBpbiBJbnRlcm5ldCBFeHBsb3Jlci4gR2VicnVpayBkaXQgb3AgZWlnZW4gcmlzaWNvISc7CiRsYW5nWydmcm9udGVuZF93aWR0aF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgYnJlZWR0ZSAoaW4gcHgpJzsKJGxhbmdbJ2Zyb250ZW5kX2hlaWdodF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgaG9vZ3RlIChpbiBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2R1cyc7CiRsYW5nWyd0aGVtZXMnXSA9ICdUaGVtYSc7CiRsYW5nWydmb250X3NpemUnXSA9ICdMZXR0ZXJncm9vdHRlJzsKJGxhbmdbJ2Z1bGxfbGluZSddID0gJ1ZvbGxlZGlnZSBsaWpuJzsKJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICdIaWdobGlnaHQgYWN0aWV2ZSByZWdlbCc7CiRsYW5nWydzaG93X2ludmlzaWJsZXMnXSA9ICdHZWVmIG9uemljaHRiYXJlIHdlZXInOwokbGFuZ1sncGVyc2lzdGVudF9oc2Nyb2xsJ10gPSAnUGVyc2l0ZW50IEhTY3JvbGwgJzsKJGxhbmdbJ2tleV9iaW5kaW5nJ10gPSAnS2V5IEJpbmRpbmcgJzsKJGxhbmdbJ3NvZnRfd3JhcCddID0gJ1NvZnQgV3JhcCAnOwokbGFuZ1snc2hvd19ndXR0ZXInXSA9ICdHZWVmIEd1dHRlciB3ZWVyJzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ0dlZWYgcHJpbnRtYXJnZSB3ZWVyJzsKJGxhbmdbJ3NvZnRfdGFiJ10gPSAnR2VicnVpayBTb2Z0IFRhYic7CiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICdIaWdobGlnaHQgaGV0IGdlc2VsZWN0ZWVyZGUgd29vcmQnOwokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gJ1NjaGFrZWwgQmVoYXZpb3JzIGluJzsKJGxhbmdbJ3Rlc3RhcmVhdGV4dCddID0gJ1Zvb3JiZWVsZCc7CiRsYW5nWydqcyddID0gJ0phdmFTY3JpcHQgJzsKJGxhbmdbJ3BsYWluJ10gPSAnUGxhdHRlIHRla3N0JzsKJGxhbmdbJ3N2ZyddID0gJ1NWRyAnOwokbGFuZ1snaHRtbCddID0gJ0hUTUwgJzsKJGxhbmdbJ2NzcyddID0gJ0NTUyAnOwokbGFuZ1snc2NzcyddID0gJ1NDU1MgJzsKJGxhbmdbJ2NvZmZlZSddID0gJ0NvZmZlZVNjcmlwdCAnOwokbGFuZ1snanNvbiddID0gJ0pTT04gJzsKJGxhbmdbJ3B5dGhvbiddID0gJ1B5dGhvbiAnOwokbGFuZ1sncnVieSddID0gJ1J1YnkgJzsKJGxhbmdbJ3BlcmwnXSA9ICdQZXJsICc7CiRsYW5nWydwaHAnXSA9ICdQSFAgJzsKJGxhbmdbJ2phdmEnXSA9ICdKYXZhICc7CiRsYW5nWydjc2hhcnAnXSA9ICdDIyAnOwokbGFuZ1snY19jcHAnXSA9ICdDKysgJzsKJGxhbmdbJ2Nsb2p1cmUnXSA9ICdDbG9qdXJlICc7CiRsYW5nWydjb2xkZnVzaW9uJ10gPSAnQ29sZGZ1c2lvbic7CiRsYW5nWydoYXhlJ10gPSAnSGF4ZSc7CiRsYW5nWydsYXRleCddID0gJ0xhdGV4JzsKJGxhbmdbJ2x1YSddID0gJ0x1YSc7CiRsYW5nWydtYXJrZG93biddID0gJ01hcmtkb3duJzsKJGxhbmdbJ3Bvd2Vyc2hlbGwnXSA9ICdQb3dlclNoZWxsJzsKJGxhbmdbJ3NxbCddID0gJ1NRTCc7CiRsYW5nWydwZ3NxbCddID0gJ3BnU1FMJzsKJGxhbmdbJ29jYW1sJ10gPSAnT0NhbWwgJzsKJGxhbmdbJ3RleHRpbGUnXSA9ICdUZXh0aWxlICc7CiRsYW5nWydncm9vdnknXSA9ICdHcm9vdnkgJzsKJGxhbmdbJ3NjYWxhJ10gPSAnU2NhbGEgJzsKJGxhbmdbJ2Nsb3VkcyddID0gJ0Nsb3VkcyAnOwokbGFuZ1snY2hyb21lJ10gPSAnQ2hyb21lICc7CiRsYW5nWydjbG91ZHNfbWlkbmlnaHQnXSA9ICdDbG91ZHMgTWlkbmlnaHQgJzsKJGxhbmdbJ2NvYmFsdCddID0gJ0NvYmFsdCAnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvciAnOwokbGFuZ1snZGF3biddID0gJ0Rhd24gJzsKJGxhbmdbJ2RyZWFtd2VhdmVyJ10gPSAnRHJlYW13ZWF2ZXIgJzsKJGxhbmdbJ2VjbGlwc2UnXSA9ICdFY2xpcHNlICc7CiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICdpZGxlRmluZ2VycyAnOwokbGFuZ1sna3JfdGhlbWUnXSA9ICdrclRoZW1lICc7CiRsYW5nWydtZXJiaXZvcmUnXSA9ICdNZXJiaXZvcmUgJzsKJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAnTWVyYml2aW9yZSBTb2Z0ICc7CiRsYW5nWydtb25vX2luZHVzdHJpYWwnXSA9ICdNb25vIEluZHVzdHJpYWwgJzsKJGxhbmdbJ21vbm9rYWknXSA9ICdNb25va2FpICc7CiRsYW5nWydwYXN0ZWxfb25fZGFyayddID0gJ1Bhc3RlbCBvbiBkYXJrICc7CiRsYW5nWydzb2xhcml6ZWRfZGFyayddID0gJ1NvbGFyaXplZCBEYXJrICc7CiRsYW5nWydzb2xhcml6ZWRfbGlnaHQnXSA9ICdTb2xhcml6ZWQgTGlnaHQgJzsKJGxhbmdbJ3RleHRtYXRlJ10gPSAnVGV4dE1hdGUgJzsKJGxhbmdbJ3RvbW9ycm93J10gPSAnVG9tb3Jyb3cgJzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0J10gPSAnVG9tb3Jyb3cgTmlnaHQgJzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2JyaWdodCddID0gJ1RvbW9ycm93IE5pZ2h0IEJyaWdodCAnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYmx1ZSddID0gJ1RvbW9ycm93IE5pZ2h0IEJsdWUgJzsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJ10gPSAnVG9tb3Jyb3cgTmlnaHQgRWlnaHRpZXMgJzsKJGxhbmdbJ3R3aWxpZ2h0J10gPSAnVHdpbGlnaHQgJzsKJGxhbmdbJ3ZpYnJhbnRfaW5rJ10gPSAnVmlicmFudCBJbmsgJzsKJGxhbmdbJ2FjZSddID0gJ0FjZSAnOwokbGFuZ1sndmltJ10gPSAnVmltICc7CiRsYW5nWydlbWFjcyddID0gJ0VNYWNzICc7CiRsYW5nWydjdXN0b20nXSA9ICdHZWF2YW5jZWVyZCc7CiRsYW5nWydvZmYnXSA9ICdVaXQnOwokbGFuZ1snNDAnXSA9ICc0MCBLYXJha3RlcnMnOwokbGFuZ1snODAnXSA9ICc4MCBLYXJha3RlcnMnOwokbGFuZ1snMTAwJ10gPSAnMTAwIEthcmFrdGVycyc7CiRsYW5nWycxNDAnXSA9ICcxNDAgS2FyYWt0ZXJzJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0luc3RlbGxpbmdlbiBvcHNsYWFuJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdVdyBBY2VFZGl0b3IgaW5zdGVsbGluZ2VuIHppam4gb3BnZXNsYWdlbic7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzc2F2ZWQnXSA9ICdVdyBBY2VFZGl0b3IgRnJvbnRlbmQgaW5zdGVsbGluZ2VuIHppam4gb3BnZXNsYWdlbic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0FjZUVkaXRvciBzdWNjZXN2b2wgZ2UmaXVtbDtuc3RhbGxlZXJkISBTdGVsICZxdW90O0Jld2VyayBzaXRldm9vcmtldXJlbiZxdW90OyBwZXJtaXNzaWVzIGluIG9tIGRlemUgbW9kdWxlIHRlIGdlYnJ1aWtlbiEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0FjZUVkaXRvciBzdWNjZXN2b2wgZ2UmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdFY2h0PyBXZWV0IHUgemVrZXIgZGF0IHUgQWNlRWRpdG9yIHdpbHQgdmVyd2lqZGVyZW4/IERlbmsgbm9nIGVlbnMgZ29lZCBuYSEnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICdNaXNzaW5nIFBlcm1pc3Npb24hLiBTZXQgJnF1b3Q7TW9kaWZ5IFRlbXBsYXRlcyZxdW90OyBvciAmcXVvdDtBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJnF1b3Q7IHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZS4nOwokbGFuZ1snaGVscF9wYXJhbV9hY3Rpb24nXSA9ICdpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG9mIE1vZHVsZSB0YWcuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJiMwMzk7ZGVmYXVsdCYjMDM5OyBhbmQgJiMwMzk7aGVhZCYjMDM5Oy4gQm90aCBhcmUgbmVlZGVkIGZvciBjb3JyZWN0IEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlcyddID0gJ2lzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJiMwMzk7bW9kZXMmIzAzOTsgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgJmFtcDtsdDtoZWFkJmFtcDtndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4gJzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAnaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAmIzAzOTt0aGVtZXMmIzAzOTsgdGhhdCB5b3Ugd2lsbCBiZSB1c2luZyBvbiB5b3VyIHdlYnNpdGUuIFRoaXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHlvdXIgJmFtcDtsdDtoZWFkJmFtcDtndDsgb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPiAnOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIG1vZGUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4gDQoNCic7CiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIHRoZW1lIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD4gJzsKJGxhbmdbJ2hlbHBfcGFyYW1fd2lkdGgnXSA9ICdCcmVlZHRlIHZhbiBkZSBTeW50YXhoaWdobGlnaHRlciBydWltdGUgaW4gcGl4ZWxzLic7CiRsYW5nWydoZWxwX3BhcmFtX2hlaWdodCddID0gJ0hvb2d0ZSB2YW4gZGUgU3ludGF4aGlnaGxpZ2h0ZXIgcnVpbXRlIGluIHBpeGVscy4nOwokbGFuZ1snaGVscF9wYXJhbV9kaXZpZCddID0gJ2lkIHZhbiBoZXQgZWxlbWVudCBkYXQgdXcgY29kZSBiZXZhdC4gR2VicnVpayBlZW4gdW5pZWtlIGlkIHZvb3IgZWxrIGNvZGUgYmxvay4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAnQWxnZW1lZW4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RleHQnXSA9ICc8aDM+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvaDM+DQo8cD5BY2VFZGl0b3IgaXMgYSBTeW50YXhoaWdobGlnaHRlciBtb2R1bGUgdXNpbmcgPHN0cm9uZz5BY2U8L3N0cm9uZz4gYSBzdGFuZGFsb25lIGNvZGUgZWRpdG9yIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC48YnIgLz4gDQpHb2FsIG9mIEFjZSBjb2RlIGVkaXRvciBncm91cCBpcyB0byBjcmVhdGUgYSB3ZWIgYmFzZWQgY29kZSBlZGl0b3IgdGhhdCBtYXRjaGVzIGFuZCBleHRlbmRzIHRoZSBmZWF0dXJlcywgdXNhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiBleGlzdGluZyBuYXRpdmUgZWRpdG9ycyBzdWNoIGFzIFRleHRNYXRlLCBWaW0gb3IgRWNsaXBzZS48YnIgLz4NCkl0IGNhbiBiZSBlYXNpbHkgZW1iZWRkZWQgaW4gYW55IHdlYiBwYWdlIGFuZCBKYXZhU2NyaXB0IGFwcGxpY2F0aW9uLjxiciAvPiANCkFjZSBpcyBkZXZlbG9wZWQgYXMgdGhlIHByaW1hcnkgZWRpdG9yIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmNsb3VkOWlkZS5jb20iPkNsb3VkOSBJREU8L2E+IGFuZCB0aGUgc3VjY2Vzc29yIG9mIHRoZSBNb3ppbGxhIFNreXdyaXRlciAoQmVzcGluKSBQcm9qZWN0LjwvcD4NCjxoMz5BY2UgaXMgaG9zdGVkIG9uIEdpdEh1YjwvaDM+DQo8cD5UaGUgQWNlIHNvdXJjZSBjb2RlIGlzIGhvc3RlZCBvbiBHaXRIdWIuIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNb3ppbGxhIHRyaS1saWNlbnNlIChNUEwvR1BML0xHUEwpLjxiciAvPg0KVGhpcyBpcyB0aGUgc2FtZSBsaWNlbnNlIHVzZWQgYnkgRmlyZWZveC4gVGhpcyBsaWNlbnNlIGlzIGZyaWVuZGx5IHRvIGFsbCBraW5kcyBvZiBwcm9qZWN0cywgd2hldGhlciBvcGVuIHNvdXJjZSBvciBub3QuPGJyIC8+DQogVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhPC9wPg0KPGgzPlVzaW5nIEFjZUVkaXRvciBNb2R1bGU8L2gzPg0KPHA+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZSBpcyBzaW1wbGUuPGJyIC8+DQpBZnRlciBBY2VFZGl0b3Igd2FzIGluc3RhbGxlZCBnbyB0byAmcXVvdDtNeSBQcmVmZXJlbmNlcyAmcmFxdW87IFVzZXIgUHJlZmVyZW5jZXMmcXVvdDsgYW5kIGNob29zZSBBY2VFZGl0b3IgYXMgeW91ciBTeW50YXhoaWdobGlnaHRlciBvZiBjaG9pY2UgZnJvbSAmcXVvdDtTZWxlY3Qgc3ludGF4IGhpZ2hsaWdodGVyIHRvIHVzZTomcXVvdDsgRHJvcGRvd24uPGJyIC8+DQpNYWtlIHN1cmUgeW91IGhhdmUgJiMwMzk7TW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMmIzAzOTsgUGVybXNpc3Npb24uPC9wPg0KPGgzPlNldHRpbmdzPC9oMz4NCjxwPllvdSBjYW4gY2hhbmdlIGRlZmF1bHQgU2V0dGluZ3MgYW5kIFRoZW1lcyBpbiAmcXVvdDtFeHRlbnNpb25zICZyYXF1bzsgQWNlRWRpdG9yJnF1b3Q7PC9wPic7CiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJ10gPSAnVG9ldHNlbmJvcmQgU25lbGtvcHBlbGluZ2VuJzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCddID0gJyAgICANCiAgICAgIDxoMz5EZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0czwvaDM+DQoNCjx0YWJsZSBjbGFzcz0icGFnZXRhYmxlIiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iRGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHMiPgo8dGhlYWQ+PHRyPgo8dGg+UEMgKFdpbmRvd3MvTGludXgpPC90ZD4KPHRoPk1hYzwvdGQ+Cjx0aD5hY3Rpb248L3RkPgo8L3RyPjwvdGhlYWQ+Cjx0Ym9keT4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVJldHVybjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1SZXR1cm48L3RkPgo8dGQgYWxpZ249ImxlZnQiPmZ1bGxzY3JlZW48L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5wZXJmb3JtIHNhdmU8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5jZW50ZXIgc2VsZWN0aW9uPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUFsdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLU9wdGlvbi1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIGRvd248L3RkPgo8L3RyPgo8dHIgbGNhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLU9wdGlvbi1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Y29weSBsaW5lcyB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1GPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmZpbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtSzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1HPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5maW5kIG5leHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtSzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1HPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5maW5kIHByZXZpb3VzPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Eb3duLEN0cmwtTjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gbGluZSBkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+VXAsQ3RybC1QPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUVuZCxDdHJsLURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRW5kLENvbW1hbmQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5MZWZ0LEN0cmwtQjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gbGVmdDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUw8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIGxpbmU8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1SaWdodCxFbmQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtUmlnaHQsRW5kLEN0cmwtRTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gbGluZSBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1MZWZ0LEhvbWU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTGVmdCxIb21lLEN0cmwtQTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gbGluZSBzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+UGFnZURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1QYWdlRG93bixDdHJsLVY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBwYWdlIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+UmlnaHQsQ3RybC1GPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1Ib21lLEN0cmwtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtSG9tZSxDb21tYW5kLVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gd29yZCBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHdvcmQgcmlnaHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlRhYjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+VGFiPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5pbmRlbnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+bW92ZSBsaW5lcyBkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+bW92ZSBsaW5lcyB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVGFiPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1UYWI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPm91dGRlbnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkluc2VydDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+SW5zZXJ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5vdmVyd3JpdGU8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+UGFnZURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPnBhZ2Vkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPlBhZ2VVcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cGFnZXVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LVosQ29tbWFuZC1ZPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZWRvPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVtb3ZlIGxpbmU8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1LPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLUJhY2tzcGFjZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVtb3ZlIHRvIGxpbmVzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtQmFja3NwYWNlLEN0cmwtQWx0LUJhY2tzcGFjZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVtb3ZlIHdvcmQgbGVmdDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtRGVsZXRlPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1SPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLU9wdGlvbi1GPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZXBsYWNlPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LVI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtT3B0aW9uLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2UgYWxsPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUE8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtQTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGFsbDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1FbmQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUVuZDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxpbmUgZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Ib21lPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Ib21lPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGluZSBzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VEb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcGFnZSBkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VVcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHBhZ2UgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVNoaWZ0LUVuZCxBbHQtU2hpZnQtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtU2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVNoaWZ0LUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGxpbmUgc3RhcnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtSG9tZSxBbHQtU2hpZnQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVNoaWZ0LUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB3b3JkIGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgcmlnaHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1PPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zcGxpdCBsaW5lPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLTc8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtNzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+dG9nZ2xlIGNvbW1lbnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtVDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij50cmFuc3Bvc2UgbGV0dGVyczwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1aPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVo8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnVuZG88L3RkPgo8L3RyPgo8L3Rib2R5Pgo8L3RhYmxlPic7CiRsYW5nWydoZWxwX2Zyb250ZW5kX3RpdGxlJ10gPSAnIEZyb250ZW5kJzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfY29udGVudCddID0gJzxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyICZhbXA7bHQ7aGVhZCZhbXA7Z3Q7IHNlY3Rpb24gb2YgVGVtcGxhdGUgb3IgaW4gJmFtcDtxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZhbXA7cXVvdDsgZmllbGQgb2YgeW91ciBDb250ZW50IHBhZ2UsIGxpa2Uge0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSAmYW1wO2x0O2hlYWQmYW1wO2d0OyBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmYW1wO3F1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJmFtcDtxdW90Ozo8L3A+DQoJPHByZT4NCgl7Y21zX2pxdWVyeX0NCgl7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fQ0KCTwvcHJlPg0KPHA+VGhpcyBpbmNsdWRlcyBuZWVkZWQgc2NyaXB0cyBmb3IgQWNlIFN5bnRheGhpZ2hsaWdodGVyIHRvIHdvcmsuPGJyIC8+DQpJbiBNb2R1bGVzIEFkbWluIGludGVyZmFjZSB5b3UgY2FuIHNlbGVjdCBkZWZhdWx0IHNldHRpbmdzIGZvciB5b3VyICYjMDM5O2hlYWQmIzAzOTsgYWN0aW9uIG9yIHVzZSBwYXJhbWV0ZXIgbW9kZXM9JiMwMzk7aHRtbCxqYXZhc2NyaXB0JiMwMzk7IGFuZCB0aGVtZXM9JiMwMzk7dGV4dG1hdGUmIzAzOTsgd2hpY2ggd291bGQgb3ZlcnJpZGUgc2VsZWN0ZWQgUHJlZmVyZW5jZXMuPC9wPg0KPHA+Tm93IHdoZW4geW91IGhhdmUgbmVlZGVkIHNjcmlwdHMgaW5jbHVkZWQsIG9uZSBtb3JlIE1vZHVsZSB0YWcgY2FsbCBpcyBuZWVkZWQgKGZvciBleGFtcGxlIGluIHlvdXIgQ29udGVudCBFZGl0b3IgYXJlYSkgdG8gc3BlY2lmeSB3aGljaCBhcmVhIG9mIHlvdXIgUGFnZSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQuPC9wPg0KCTxwcmU+DQoJe0FjZUVkaXRvciBkaXZpZD0mIzAzOTtzb21lLWlkJiMwMzk7fQ0KCTwvcHJlPg0KPHA+VGhpcyB0YWcgaW5jbHVkZXMgbmVlZGVkIFNjcmlwdCBhbmQgU3R5bGUgdGhhdCBpcyB1c2VkIHRvIEhpZ2hsaWdodCBzZWxlY3RlZCBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGlkLjxiciAvPg0KQWxsIHlvdSBuZWVkIHRoZW4gaXMgd3JpdGUgeW91ciBDb2RlIHRoYXQgeW91IHdhbnQgdG8gSGlnaGxpZ2h0IGFuZCB3cmFwIGl0IGluc2lkZSBhbiBlbGVtZW4gbGlrZSAmYW1wO2x0O2RpdiZhbXA7Z3Q7IHdpdGggc3BlY2lmaWVkIGlkLjwvcD4gJzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfc2FtcGxlJ10gPSAnPHByZSBpZD0ic29tZS1pZCI+CiZsdDtodG1sJmd0OwogwqAgwqAgJmx0O2hlYWQmZ3Q7CiDCoCDCoCAmbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0OwogwqAgwqAgwqAgwqAgLnRleHQtbGF5ZXIgewogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1mYW1pbHk6IE1vbmFjbywgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1zaXplOiAxMnB4OwogwqAgwqAgwqAgwqAgwqAgwqAgY3Vyc29yOiB0ZXh0OwogwqAgwqAgwqAgwqAgfQogwqAgwqAgJmx0Oy9zdHlsZSZndDsKIMKgIMKgICZsdDsvaGVhZCZndDsKIMKgIMKgICZsdDtib2R5Jmd0OwogwqAgwqAgwqAgwqAgJmx0O2gxIHN0eWxlPSJjb2xvcjpyZWQiJmd0O0p1aHUgS2lubmVycyZsdDsvaDEmZ3Q7CiDCoCDCoCAmbHQ7L2JvZHkmZ3Q7ICZsdDsvaHRtbCZndDsKPC9wcmU+JzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGl0bGUnXSA9ICdPdmVyJzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGV4dCddID0gJzxoMz5TdXBwb3J0PC9oMz4gDQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmFtcDtjb3B5OyAyMDEyLCBHb3JhbiBJbGljIDxhIGhyZWY9Im1haWx0bzp1bmlxdTNlQGdtYWlsLmNvbSI+JmFtcDtsdDt1bmlxdTNlQGdtYWlsLmNvbSZhbXA7Z3Q7PC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LmljaC1tYWNoLWRhcy5hdCIgcmVsPSJleHRlcm5hbCI+d3d3LmljaC1tYWNoLWRhcy5hdDwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+DQoJPGgzPlRlYW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+JzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJw0KPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQmIzAzOTtzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4xPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+DQoJPGxpPlVwZGF0ZWQgQUNFIHdpdGggdGhlbWVzPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjIuMjwvaDM+DQo8dWw+DQoJPGxpPkZpeCBmb3IgU2FmYXJpL01hYzwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjM8L2gzPg0KPHVsPg0KICAgIDxsaT5VcGRhdGVkIHRvIGxhdGVzdCBhY2UgZnJvbSBnaXRodWI8L2xpPg0KICAgIDxsaT5BZGRlZCBhZGRpdGlvbmFsIHByZWZlcmVuY2VzIChNb2RpZnkgVGVtcGxhdGVzLCBBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlKTwvbGk+DQogICAgPGxpPkFkZGVkIGFiaWxpdHkgdG8gY2hhbmdlIEFjZUVkaXRvciBwcmVmZXJlbmNlcyBwZXIgdXNlcjwvbGk+DQogICAgPGxpPk1vdmVkIG1vZHVsZSBmcm9tIGV4dGVuaW9ucyB0byBteXByZWZzPC9saT4NCjwvdWw+DQo8aDM+Um9hZG1hcDwvaDM+DQo8dWw+DQoJPGxpPjxkZWw+QWRkIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZzwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEZ1bGxzY3JlZW5tb2RlPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgS2V5YmluZGluZyAoQ1RSTCtTKTwvZGVsPjwvbGk+DQoJPGxpPkFkZCBFZGl0b3IgYmVoYXZpb3IgKFZpbSwgRU1hY3MpPC9saT4NCgk8bGk+TWF5YmUgYWRkIFRvb2xiYXI8L2xpPg0KPC91bD4gJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTAwMzQzNjU4OS4xMzMwODgyNTgwLjEzMzA4ODI1ODAuMTMzMDg4MjU4MC4xJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTMzMDg4MjU4MC4xLjEudXRtY2NuPShkaXJlY3QpfHV0bWNzcj0oZGlyZWN0KXx1dG1jbWQ9KG5vbmUpJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sr_YU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvcic7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnQWNlRWRpdG9yIGplIDxlbT5TeW50YXhoaWdobGlnaHRlcjwvZW0+IG1vZHVsIGtvamkga29yaXN0aSA8c3Ryb25nPkFjZTwvc3Ryb25nPiwgZWRpdG9yIGtvZGEgcGlzYW4gdSBKYXZhU2NyaXB0LXUuJzsKJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gJ1ByZWZyZW5jaWplJzsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NfdGFiJ10gPSAnUHJlZmVyZW5jaWplIHphIGtvcmlzbmnEjWtpIGRlbyc7CiRsYW5nWydmcm9udGVuZF9oZWFkX3NldHRpbmdzJ10gPSAnRnJvbnRlbmQgSGVhZCBQcmVmZXJlbmNlcyc7CiRsYW5nWydmcm9udGVuZF9zeW50YXhhcmVhX3NldHRpbmdzJ10gPSAnRnJvbnRlbmQgU3ludGF4YXJlYSBQcmVmZXJlbmNlcyc7CiRsYW5nWydoZWFkX2Rlc2NyaXB0aW9uJ10gPSAnVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIHNjcmlwdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gcGFnZSA8Y29kZT48aGVhZD48L2NvZGU+IHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gZnJvbSBQYWdlIFNwZWNpZmljIE1ldGFkYXRhIG9yIFRlbXBsYXRlLic7CiRsYW5nWydjb250ZW50X2Rlc2NyaXB0aW9uJ10gPSAnVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgU3ludGF4aGlnaGxpZ2h0aW5nIGFyZWEgd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7ZWRpdG9yJiMwMzk7fTwvY29kZT4gdGFnIHdpdGhpbiBhIFBhZ2UuJzsKJGxhbmdbJ3N5bnRheGFyZWFkZXNjcmlwdGlvbiddID0gJ1RoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0mIzAzOTtmb28mIzAzOTt9PC9jb2RlPiBmcm9tIGEgUGFnZSBvciBUZW1wbGF0ZSc7CiRsYW5nWydleGFtcGxlX2RvY3VtZW50J10gPSAnRG9rdW1lbnQnOwokbGFuZ1snd2lkdGhfdGl0bGUnXSA9ICcmU2Nhcm9uO2lyaW5hIGVkaXRvcmEgKHUgZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ1Zpc2luYSBlZGl0b3JhICh1IGVtKSc7CiRsYW5nWydlbmFibGVfaWUnXSA9ICdPbW9ndcSHaSBpIHphIEludGVybmV0IEV4cGxvcmVyJzsKJGxhbmdbJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJ10gPSAnPGVtPkFjZSBTeW50YXhoaWdobGlnaHRlcjwvZW0+IG5lIHJhZGkgYmEmc2Nhcm9uOyBuYWpib2xqZSB1IEludGVybmV0IEV4cGxvcmVydS4gT3Z1IG9wY2lqdSB1a2xqdcSNaXRlIG5hIHNvcHN0dmVuaSByaXppayEnOwokbGFuZ1snZnJvbnRlbmRfd2lkdGhfdGl0bGUnXSA9ICcmU2Nhcm9uO2lyaW5hIHphIGtvcmlzbmnEjWtpIGRlbyAodSBweCknOwokbGFuZ1snZnJvbnRlbmRfaGVpZ2h0X3RpdGxlJ10gPSAnVmlzaW5hIHphIGtvcmlzbmnEjWtpIGRlbyAodSBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2QgcmFkYSc7CiRsYW5nWyd0aGVtZXMnXSA9ICdUZW1hJzsKJGxhbmdbJ2ZvbnRfc2l6ZSddID0gJ1ZlbGnEjWluYSBmb250YSc7CiRsYW5nWydmdWxsX2xpbmUnXSA9ICdTZWxla3R1aiBjZWx1IGxpbmlqdSc7CiRsYW5nWydoaWdobGlnaHRfYWN0aXZlJ10gPSAnT3puYcSNaSBha3Rpdm51IGxpbmlqdSc7CiRsYW5nWydzaG93X2ludmlzaWJsZXMnXSA9ICdQcmlrYcW+aSBuZXZpZGxqaXZlIGthcmFrdGVyZSc7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICdQZXJzaXRlbnQgSFNjcm9sbCc7CiRsYW5nWydrZXlfYmluZGluZyddID0gJ0tleSBCaW5kaW5nJzsKJGxhbmdbJ3NvZnRfd3JhcCddID0gJ1ByZWxhbWFuamUgbGluaWphJzsKJGxhbmdbJ3Nob3dfZ3V0dGVyJ10gPSAnUHJpa2HFvmkgPGVtPkd1dHRlcjwvZW0+JzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ1ByaWthxb5pIG1hcmdpbnUgemEgJnNjYXJvbjt0YW1wdSc7CiRsYW5nWydzb2Z0X3RhYiddID0gJ1VzZSBTb2Z0IFRhYic7CiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICdPem5hxI1pIHNlbGVrdG92YW51IHJlxI0nOwokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gJ0VuYWJsZSBCZWhhdmlvcnMnOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnUHJlZ2xlZCc7CiRsYW5nWydqcyddID0gJ0phdmFTY3JpcHQnOwokbGFuZ1sncGxhaW4nXSA9ICdPYmnEjW5pIHRla3N0JzsKJGxhbmdbJ3N2ZyddID0gJ1NWRyc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCc7CiRsYW5nWydjc3MnXSA9ICdDU1MnOwokbGFuZ1snc2NzcyddID0gJ1NDU1MnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0JzsKJGxhbmdbJ2pzb24nXSA9ICdKU09OJzsKJGxhbmdbJ3B5dGhvbiddID0gJ1B5dGhvbic7CiRsYW5nWydydWJ5J10gPSAnUnVieSc7CiRsYW5nWydwZXJsJ10gPSAnUGVybCc7CiRsYW5nWydwaHAnXSA9ICdQSFAnOwokbGFuZ1snamF2YSddID0gJ0phdmEnOwokbGFuZ1snY3NoYXJwJ10gPSAnQyMnOwokbGFuZ1snY19jcHAnXSA9ICdDKysnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUnOwokbGFuZ1snb2NhbWwnXSA9ICdPQ2FtbCc7CiRsYW5nWyd0ZXh0aWxlJ10gPSAnVGV4dGlsZSc7CiRsYW5nWydncm9vdnknXSA9ICdHcm9vdnknOwokbGFuZ1snc2NhbGEnXSA9ICdTY2FsYSc7CiRsYW5nWydjbG91ZHMnXSA9ICdDbG91ZHMnOwokbGFuZ1snY2hyb21lJ10gPSAnQ2hyb21lJzsKJGxhbmdbJ2Nsb3Vkc19taWRuaWdodCddID0gJ0Nsb3VkcyBNaWRuaWdodCc7CiRsYW5nWydjb2JhbHQnXSA9ICdDb2JhbHQnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvcic7CiRsYW5nWydkYXduJ10gPSAnRGF3bic7CiRsYW5nWydkcmVhbXdlYXZlciddID0gJ0RyZWFtd2VhdmVyJzsKJGxhbmdbJ2VjbGlwc2UnXSA9ICdFY2xpcHNlJzsKJGxhbmdbJ2lkbGVfZmluZ2VycyddID0gJ2lkbGVGaW5nZXJzJzsKJGxhbmdbJ2tyX3RoZW1lJ10gPSAna3JUaGVtZSc7CiRsYW5nWydtZXJiaXZvcmUnXSA9ICdNZXJiaXZvcmUnOwokbGFuZ1snbWVyYml2b3JlX3NvZnQnXSA9ICdNZXJiaXZvcmUgU29mdCc7CiRsYW5nWydtb25vX2luZHVzdHJpYWwnXSA9ICdNb25vIEluZHVzdHJpYWwnOwokbGFuZ1snbW9ub2thaSddID0gJ01vbm9rYWknOwokbGFuZ1sncGFzdGVsX29uX2RhcmsnXSA9ICdQYXN0ZWwgb24gZGFyayc7CiRsYW5nWydzb2xhcml6ZWRfZGFyayddID0gJ1NvbGFyaXplZCBEYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9saWdodCddID0gJ1NvbGFyaXplZCBMaWdodCc7CiRsYW5nWyd0ZXh0bWF0ZSddID0gJ1RleHRNYXRlJzsKJGxhbmdbJ3RvbW9ycm93J10gPSAnVG9tb3Jyb3cnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9icmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCBCcmlnaHQnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYmx1ZSddID0gJ1RvbW9ycm93IE5pZ2h0IEJsdWUnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnXSA9ICdUb21vcnJvdyBOaWdodCBFaWdodGllcyc7CiRsYW5nWyd0d2lsaWdodCddID0gJ1R3aWxpZ2h0JzsKJGxhbmdbJ3ZpYnJhbnRfaW5rJ10gPSAnVmlicmFudCBJbmsnOwokbGFuZ1snYWNlJ10gPSAnQWNlJzsKJGxhbmdbJ3ZpbSddID0gJ1ZpbSc7CiRsYW5nWydlbWFjcyddID0gJ0VNYWNzJzsKJGxhbmdbJ2N1c3RvbSddID0gJ0tvcmlzbmnEjWtpIGRlZmluaXNhbm8nOwokbGFuZ1snb2ZmJ10gPSAnSXNrbGp1xI1lbm8nOwokbGFuZ1snNDAnXSA9ICc0MCBrYXJha3RlcmEnOwokbGFuZ1snODAnXSA9ICc4MCBrYXJha3RlcmEnOwokbGFuZ1snMTAwJ10gPSAnMTAwIGthcmFrdGVyYSc7CiRsYW5nWycxNDAnXSA9ICcxNDAga2FyYWt0ZXJhJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ1NhxI11dmFqIHBvZGUmc2Nhcm9uO2F2YW5qYSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnVmEmc2Nhcm9uO2EgcG9kZSZzY2Fyb247YXZhbmphIEFjZUVkaXRvcmEgc3Ugc2HEjXV2YW5hJzsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NzYXZlZCddID0gJ1ZhJnNjYXJvbjthIHBvZGUmc2Nhcm9uO2F2YW5qYSBBY2VFZGl0b3JhIHphIGtvcmlzbmnEjWtpIGRlbyBzYWp0YSBzdSBzYcSNdXZhbmEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdBY2VFZGl0b3IgamUgdXNwZSZzY2Fyb247bm8gaW5zdGFsaXJhbiEgUG9kZXNpdGUgJnF1b3Q7TWVuamFuamUgcG9kZSZzY2Fyb247YXZhbmphIHNhanRhJnF1b3Q7IGRvenZvbGUgZGEgYmlzdGUga29yaXN0aWxpIG92YWogbW9kdWwuJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdBY2VFZGl0b3IgamUgdXNwZSZzY2Fyb247bm8gZGVpbnN0YWxpcmFuJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdTdHZhcm5vPyBTaWd1cm5pIHN0ZSBkYSDFvmVsaXRlIGRhIGRlaW5zdGFsaXJhdGUgQWNlRWRpdG9yPyBSYXptaXNsaXRlIGpvJnNjYXJvbjsgamVkbm9tLi4uJzsKJGxhbmdbJ2hlbHBfcGFyYW1fYWN0aW9uJ10gPSAnaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdGlvbiBvZiBNb2R1bGUgdGFnLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICYjMDM5O2RlZmF1bHQmIzAzOTsgYW5kICYjMDM5O2hlYWQmIzAzOTsuIEJvdGggYXJlIG5lZWRlZCBmb3IgY29ycmVjdCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmcgZnVuY3Rpb24uIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmhlYWQ8L2xpPg0KCTxsaT5kZWZhdWx0PC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZXMnXSA9ICdpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICYjMDM5O21vZGVzJiMwMzk7IHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyIDxoZWFkPiBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5qYXZhc2NyaXB0PC9saT4gDQoJPGxpPnBsYWluPC9saT4gDQoJPGxpPnN2ZzwvbGk+IA0KCTxsaT5odG1sPC9saT4NCgk8bGk+Y3NzPC9saT4NCgk8bGk+c2NzczwvbGk+DQoJPGxpPmNvZmZlZTwvbGk+DQoJPGxpPmpzb248L2xpPg0KCTxsaT5weXRob248L2xpPg0KCTxsaT5ydWJ5PC9saT4NCgk8bGk+cGVybDwvbGk+DQoJPGxpPnBocDwvbGk+DQoJPGxpPmphdmE8L2xpPg0KCTxsaT5jc2hhcnA8L2xpPg0KCTxsaT5jX2NwcDwvbGk+DQoJPGxpPmNsb2p1cmU8L2xpPg0KCTxsaT5vY2FtbDwvbGk+DQoJPGxpPnRleHRpbGU8L2xpPg0KCTxsaT5ncm9vdnk8L2xpPg0KCTxsaT5zY2FsYTwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lcyddID0gJ2lzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJiMwMzk7dGhlbWVzJiMwMzk7IHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyIDxoZWFkPiBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZSddID0gJ2lzIHVzZWQgd2l0aGluIGEgcGFnZSB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2RlZmF1bHQmIzAzOTt9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciBtb2RlIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWUnXSA9ICdpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtkZWZhdWx0JiMwMzk7fTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgdGhlbWUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3dpZHRoJ10gPSAnb2RyZcSRdWplICZzY2Fyb247aXJpbnUgU3ludGF4aGlnaGxpZ2h0ZXIgdSBwaWtzZWxpbWEuJzsKJGxhbmdbJ2hlbHBfcGFyYW1faGVpZ2h0J10gPSAnb2RyZcSRdWplIHZpc2ludSBTeW50YXhoaWdobGlnaHRlciB1IHBpa3NlbGltYS4nOwokbGFuZ1snaGVscF9wYXJhbV9kaXZpZCddID0gJ0lEIGVsZW1lbnRhIGtvamkgc2FkcsW+aSBWYSZzY2Fyb247IGtvZC4gS29yaXN0aXRlIGplZGluc3R2ZW51IElEIG96bmFrdSB6YSBzdmFraSBrb21hZCBrb2RhLic7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGl0bGUnXSA9ICdPcCZzY2Fyb247dGEnOwokbGFuZ1snaGVscF9nZW5lcmFsX3RleHQnXSA9ICc8aDM+JlNjYXJvbjt0YSBvdm8gcmFkaT88L2gzPg0KPHA+QWNlRWRpdG9yIGplIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsIGtvamkga29yaXN0aSA8c3Ryb25nPkFjZTwvc3Ryb25nPiBlZGl0b3Iga29kYSBwaXNhbiB1IEphdmFTY3JpcHQtdS48YnIgLz4gDQpOYW1qZXJhIGdydXBlIGtvamEgcmF6dmlqYSBBY2UgZWRpdG9yIGtvZGEgamUgc3R2YXJhbmplIGVkaXRvcmEga29kYSBuYW1lbmplbm9nIFZlYnUga29qaSBpbWEgaXN0ZSBpIMSNYWsgYm9samUgbW9ndcSHbm9zdGksIHVwb3RyZWJsaml2b3N0IGkgcGVyZm9ybWFuc2Uga2FvIHBvc3RvamXEh2kgZWRpdG9yIHRpcGEgVGV4dE1hdGUsIFZpbSBpbGkgRWNsaXBzZS48YnIgLz4NCkxha28gc2UgbW/FvmUgaW1wbGVtZW50aXJhcmkgdSBiaWxvIGtvanUgVmViIHN0cmFuaWN1IGkgSmF2YVNjcmlwdCBhcGxpa2FjaWp1LjxiciAvPiANCkFjZSBqZSByYXp2aWphbiBrYW8gcHJpbWFybmkgZWRpdG9yIHphIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbSI+Q2xvdWQ5IElERTwvYT4gaSBuYXNsZWRuaWsgamUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVrdGEuPC9wPg0KPGgzPkFjZSBqZSBob3N0b3ZhbiBuYSBHaXRIdWItdTwvaDM+DQo8cD5JenZvcm5pIGtvZCBBY2UgZWRpdG9yYSBqZSBob3N0b3ZhbiBuYSBHaXRIdWItdS4gUG9kbGXFvmUgdHJvc3RydWtvaiBNb3ppbGxhIGxpY2VuY2kgKE1QTC9HUEwvTEdQTCkuPGJyIC8+DQpJc3R1IGxpY2VuY3Uga29yaXN0aSBGaXJlZm94LiBPdmEgbGljZW5jYSBqZSBuYWtsb25qZW5hIHN2aW0gdnJzdGFtYSBwcm9qZWthdGEsIGJpbG8gZGEgc3UgPGVtPm9wZW4gc291cmNlPC9lbT4gaWxpIG5lLjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5LYWtvIHNlIGtvcmlzdGk/PC9oMz4NCjxwPlVwb3RlYmEgQWNlRWRpdG9yIE1vZHVsYSBqZSBwcm9zdGEuPGJyIC8+DQpOYWtvbiAmc2Nhcm9uO3RvIGluc3RhbGlyYXRlIEFjZUVkaXRvciBpZGl0ZSBuYSAmcXVvdDtNb2plIHByZWZlcmVuY2lqZSAmcmFxdW87IEtvcmlzbmnEjWtlIHByZWZlcmVuY2lqZSZxdW90OyBpIGl6YWJlcml0ZSBBY2VFZGl0b3Iga2FvIFZhJnNjYXJvbjsgPGVtPnN5bnRheGhpZ2hsaWdodGVyPC9lbT4gdSAmcXVvdDtJemFiZXJpdGUgc3ludGF4IGhpZ2hsaWdodGVyIHphIHVwb3RyZWJ1OiZxdW90OyBwYWRhanXEh29qIGxpc3RpLjxiciAvPg0KUG9zdGFyYWp0ZSBzZSBkYSBpbWF0ZSBkb3p2b2x1ICZxdW90O01lbmphbmplIHBvZGUmc2Nhcm9uO2F2YW5qYSBzYWp0YSZxdW90Oy48L3A+DQo8aDM+UG9kZSZzY2Fyb247YXZhbmphPC9oMz4NCjxwPk1vxb5ldGUgcHJvbWVuaXRpIHBvZHJhenVtZXZhbmEgcG9kZSZzY2Fyb247YXZhbmphIGkgdGVtZSBuYWtvIG9kZXRlIG5hICZxdW90O0Vrc3RlbnppamUgJnJhcXVvOyBBY2VFZGl0b3ImcXVvdDs8L3A+JzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnXSA9ICdQcmXEjWljZSBuYSB0YXN0YXR1cmknOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50J10gPSAnICAgICAgPGgzPlBvZHJhenVtZW5hbmUgcHJlxI1pY2UgbmEgdGFzdGF0dXJpPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSZxdW90O3BhZ2V0YWJsZSZxdW90OyBjZWxsc3BhY2luZz0mcXVvdDswJnF1b3Q7IHN1bW1hcnk9JnF1b3Q7RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHMmcXVvdDs+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5mdWxsc2NyZWVuPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVM8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cGVyZm9ybSBzYXZlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y29weSBsaW5lcyBkb3duPC90ZD4NCjwvdHI+DQo8dHIgbGNhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmNvcHkgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBuZXh0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBwcmV2aW91czwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkRvd24sQ3RybC1OPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gbGluZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1FbmQsQ29tbWFuZC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkxlZnQsQ3RybC1CPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1SaWdodCxFbmQsQ3RybC1FPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1MZWZ0LEhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1MZWZ0LEhvbWUsQ3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBwYWdlIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcGFnZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodCxDdHJsLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1Ib21lLEN0cmwtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+aW5kZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5vdXRkZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pkluc2VydDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5JbnNlcnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+b3ZlcndyaXRlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBhZ2V1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtWixDb21tYW5kLVk8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVkbzwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1EPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB0byBsaW5lc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1CYWNrc3BhY2UsQ3RybC1BbHQtQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVwbGFjZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBhbGw8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1FbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBwYWdlIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUVuZCxBbHQtU2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSG9tZSxBbHQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3Qgd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c3BsaXQgbGluZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC03PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnRvZ2dsZSBjb21tZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtVDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1aPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz51bmRvPC90ZD4NCjwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT4nOwokbGFuZ1snaGVscF9mcm9udGVuZF90aXRsZSddID0gJ0tvcmlzbmnEjWtpIGRlbyc7CiRsYW5nWydoZWxwX2Zyb250ZW5kX2NvbnRlbnQnXSA9ICc8cD5UaGlzIE1vZHVsZSBhbmQgQWNlIFNjcmlwdCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0ZXIuPGJyIC8+DQpUbyBtYWtlIGl0IHdvcmsgeW91IGhhdmUgdG8gaW5jbHVkZSBqUXVlcnkgRnJhbWV3b3JrLCBmb3IgZXhhbXBsZSB1c2luZyBDTVNNUyB7Y21zX2pxdWVyeX0gdGFnIGFuZCBhcyB3ZWxsIGluY2x1ZGUge0FjZUVkaXRvcn0gaW4geW91ciBwYWdlIHR3aWNlLiBGaXJzdCBhZGQgdGhlIG1vZHVsZSB0YWcgaW4geW91ciA8aGVhZD4gc2VjdGlvbiBvZiBUZW1wbGF0ZSBvciBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDsgZmllbGQgb2YgeW91ciBDb250ZW50IHBhZ2UsIGxpa2Uge0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSA8aGVhZD4gYXJlYSwgZm9yIGV4YW1wbGUgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIGluY2x1ZGVzIG5lZWRlZCBzY3JpcHRzIGZvciBBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgdG8gd29yay48YnIgLz4NCkluIE1vZHVsZXMgQWRtaW4gaW50ZXJmYWNlIHlvdSBjYW4gc2VsZWN0IGRlZmF1bHQgc2V0dGluZ3MgZm9yIHlvdXIgJiMwMzk7aGVhZCYjMDM5OyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0mIzAzOTtodG1sLGphdmFzY3JpcHQmIzAzOTsgYW5kIHRoZW1lcz0mIzAzOTt0ZXh0bWF0ZSYjMDM5OyB3aGljaCB3b3VsZCBvdmVycmlkZSBzZWxlY3RlZCBQcmVmZXJlbmNlcy48L3A+DQo8cD5Ob3cgd2hlbiB5b3UgaGF2ZSBuZWVkZWQgc2NyaXB0cyBpbmNsdWRlZCwgb25lIG1vcmUgTW9kdWxlIHRhZyBjYWxsIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUgaW4geW91ciBDb250ZW50IEVkaXRvciBhcmVhKSB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgb2YgeW91ciBQYWdlIHNob3VsZCBiZSBoaWdobGlnaHRlZC48L3A+DQoJPHByZT4NCgl7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O3NvbWUtaWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlIDxkaXY+IHdpdGggc3BlY2lmaWVkIGlkLjwvcD4nOwokbGFuZ1snaGVscF9mcm9udGVuZF9zYW1wbGUnXSA9ICc8cHJlIGlkPSZxdW90O3NvbWUtaWQmcXVvdDs+DQo8aHRtbD4NCiAmbmJzcDsgJm5ic3A7IDxoZWFkPg0KICZuYnNwOyAmbmJzcDsgPHN0eWxlIHR5cGU9JnF1b3Q7dGV4dC9jc3MmcXVvdDs+DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IC50ZXh0LWxheWVyIHsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBmb250LWZhbWlseTogTW9uYWNvLCAmcXVvdDtDb3VyaWVyIE5ldyZxdW90OywgbW9ub3NwYWNlOw0KICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGZvbnQtc2l6ZTogMTJweDsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBjdXJzb3I6IHRleHQ7DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IH0NCiAmbmJzcDsgJm5ic3A7IDwvc3R5bGU+DQogJm5ic3A7ICZuYnNwOyA8L2hlYWQ+DQogJm5ic3A7ICZuYnNwOyA8Ym9keT4NCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgPGgxIHN0eWxlPSZxdW90O2NvbG9yOnJlZCZxdW90Oz5KdWh1IEtpbm5lcnM8L2gxPg0KICZuYnNwOyAmbmJzcDsgPC9ib2R5PiA8L2h0bWw+DQo8L3ByZT4nOwokbGFuZ1snaGVscF9hYm91dF90aXRsZSddID0gJ08gbW9kdWx1JzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGV4dCddID0gJzxoMz5Qb2RyJnNjYXJvbjtrYTwvaDM+DQo8cD5VIHNrbGFkdSBzYSBHUEwsIG92YWogc29mdHZlciBWYW0gamUgcHJ1xb5lbiAmcXVvdDt1IHZpxJFlbm9tIHN0YW5qdSZxdW90Oy4gTW9saW1vIHByb8SNaXRhanRlIGxpY2VuY3UgemEgxI1pdGF2dSBpemphdnUgbyBvZHJpY2FuanUgb2Qgb2Rnb3Zvcm5vc3RpLjwvcD4NCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEyLCBHb3JhbiBJbGljIDxhIGhyZWY9Im1haWx0bzp1bmlxdTNlQGdtYWlsLmNvbSI+PHVuaXF1M2VAZ21haWwuY29tPjwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy5pY2gtbWFjaC1kYXMuYXQiIHJlbD0iZXh0ZXJuYWwiPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+DQo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPg0KCTxoMz5UaW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+DQonOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQmIzAzOTtzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4xPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+DQoJPGxpPlVwZGF0ZWQgQUNFIHdpdGggdGhlbWVzPC9saT4NCjwvdWw+DQo8aDM+Um9hZG1hcDwvaDM+DQo8dWw+DQoJPGxpPjxkZWw+QWRkIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZzwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEZ1bGxzY3JlZW5tb2RlPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgS2V5YmluZGluZyAoQ1RSTCtTKTwvZGVsPjwvbGk+DQoJPGxpPkFkZCBFZGl0b3IgYmVoYXZpb3IgKFZpbSwgRU1hY3MpPC9saT4NCgk8bGk+TWF5YmUgYWRkIFRvb2xiYXI8L2xpPg0KPC91bD4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zNDc4OTQyMTAuMTMyNzMyMDAxMC4xMzI3MzIwMDEwLjEzMjczMjAwMTAuMSc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMjczMjAwMTAuMS4xLnV0bWNjbj0oZGlyZWN0KXx1dG1jc3I9KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCgkvLyBCYWNrZW5kIGVkaXRvciBwcmVmcw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCd3aWR0aCcsJzgwJyk7DQogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2hlaWdodCcsJzQwJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ21vZGUnLCdodG1sJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RoZW1lJywndGV4dG1hdGUnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZm9udHNpemUnLCcxMnB4Jyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Z1bGxfbGluZScsMSk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9pZScsMCk7CQ0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzaG93X2ludmlzaWJsZXMnLDApOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzb2Z0X3dyYXAnLCc4MCw4MCcpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWdobGlnaHRfYWN0aXZlJywxKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGVyc2lzdGVudF9oc2Nyb2xsJywxKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgna2V5X2JpbmRpbmcnLCdhY2UnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc29mdF90YWInLDEpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcmludF9tYXJnaW4nLDApOwkNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlnaGxpZ2h0X3NlbGVjdGVkJywxKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX2JlaGF2aW9ycycsMSk7DQoNCgkvLyBGcm9udGVuZCBzeW50YXhhcmVhIHByZWZzDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX21vZGUnLCdodG1sJyk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZScsJ2h0bWwnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsJ3RleHRtYXRlJyk7CQkNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfdGhlbWUnLCd0ZXh0bWF0ZScpOw0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9mb250c2l6ZScsJzEycHgnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfd2lkdGgnLCc1MDAnKTsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfaGVpZ2h0JywnNDAwJyk7DQogICAgDQogICAgLy8gcGVybWlzc2lvbnMNCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZScsJ0FjZUVkaXRvciBVc2VyIFByZWZlcmVuY2UnKTsJDQoJCQ0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQogICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogQWNlRWRpdG9yIC0gU3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IgaHR0cDovL2FjZS5hamF4Lm9yZy8uDQojIFZlcnNpb246IDAuMi4zLCBHb3JhbiBJbGljIHVuaXF1M2VAZ21haWwuY29tIGh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0DQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDcgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoNCiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0DQojICAgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy8NCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQ0KIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQ0KIyAtIENoZWNrIG91dCB0aGUgZm9ydW1zIGF0IGh0dHA6Ly9mb3J1bXMuY21zbWFkZXNpbXBsZS5vcmcNCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7DQoNCnN3aXRjaCgkb2xkdmVyc2lvbikgew0KICAgIGNhc2UgJzAuMi4wJzoNCgkgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX2llJywwKTsNCiAgICBjYXNlICcwLjIuMic6DQogICAgICAgIC8vIHBlcm1pc3Npb25zDQogICAgICAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdBY2VFZGl0b3IgVXNlciBQcmVmZXJlbmNlJywnQWNlRWRpdG9yIFVzZXIgUHJlZmVyZW5jZScpOw0KfSAgICANCj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/ace.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRleHRhcmVhIGlkPSJ7JHRleHRhcmVhaWR9IiBuYW1lPSJ7JHRleHRhcmVhbmFtZX0iPnskc3ludGF4X2NvbnRlbnR9PC90ZXh0YXJlYT4NCgk8c3R5bGU+DQoJI3skZWRpdG9yaWR9IHtsZGVsaW19DQoJCXBvc2l0aW9uOiByZWxhdGl2ZTsNCgkgICAgd2lkdGg6IHskd2lkdGh9ZW07DQoJICAgIGhlaWdodDogeyRoZWlnaHR9ZW07DQoJICAgIGJvcmRlcjogNXB4IHNvbGlkICNkZGQ7DQoJICAgIGJhY2tncm91bmQ6ICNmZWZlZmU7IA0KCXtyZGVsaW19DQoJI3skZWRpdG9yaWR9LmZ1bGxzY3JlZW4ge2xkZWxpbX0NCgkJcG9zaXRpb246IGFic29sdXRlOw0KCQl6LWluZGV4OiA5OTk5Ow0KCQltYXJnaW46MDsNCgkJbGVmdDowOw0KCQl0b3A6MDsNCgkJe3JkZWxpbX0NCgk8L3N0eWxlPgkNCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCgkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2xkZWxpbX0NCglpZiAoIXdpbmRvdy5hY2UpcmV0dXJuOw0KCWlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oaVBvZHxpUGhvbmV8aVBhZCkvKSkgcmV0dXJuOw0KCXtpZiAkZW5hYmxlX2llID09ICdmYWxzZSd9DQoJaWYgKCQuYnJvd3Nlci5tc2llKSByZXR1cm47CQ0KCXsvaWZ9DQoJCQ0KCQkkKCcjeyR0ZXh0YXJlYWlkfScpLmJlZm9yZSgnPGRpdiBpZD0ieyRlZGl0b3JpZH0iPjwvZGl2PicpOw0KCQkvLyBpbml0IGVkaXRvcg0KCQl2YXIgZWRpdG9yID0gYWNlLmVkaXQoInskZWRpdG9yaWR9Iik7DQoJCXZhciB0ZXh0YXJlYSA9ICQoJyN7JHRleHRhcmVhaWR9JykuaGlkZSgpOw0KDQoJCS8vIHJlc2l6ZSBhY2Ugd2l0aCBqdWkNCgkJJCgnI3skZWRpdG9yaWR9JykucmVzaXphYmxlKHtsZGVsaW19DQoJCQlzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpe2xkZWxpbX0NCgkJCQllZGl0b3IucmVuZGVyZXIub25SZXNpemUodHJ1ZSk7DQoJCQkJZWRpdG9yLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKTsNCgkJCQllZGl0b3IuZm9jdXMoKTsNCgkJCXtyZGVsaW19LAkJCQ0KCQkJZ2hvc3Q6IHRydWUNCgkJe3JkZWxpbX0pOw0KDQoJCS8vIHNldCB0aGVtZQ0KCQllZGl0b3Iuc2V0VGhlbWUoImFjZS90aGVtZS97JHRoZW1lfSIpOw0KCQkvLyBzZXQgaGlnaGxpZ2h0ZXIgbW9kZQ0KCQl7aWYgJG1vZGUgIT0gJ3BsYWluJ30NCgkJDQoJCXZhciBzZXRNb2RlID0gcmVxdWlyZSgiYWNlL21vZGUveyRtb2RlfSIpLk1vZGU7DQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShuZXcgc2V0TW9kZSgpKTsNCgkJey9pZn0NCgkJLy8gc2V0IGZvbnRzaXplDQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd7JGVkaXRvcmlkfScpLnN0eWxlLmZvbnRTaXplPSd7JGZvbnRzaXplfSc7DQoJCS8vIGZ1bGwgbGluZSBzZWxlY3Rpb24NCgkJZWRpdG9yLnNldFNlbGVjdGlvblN0eWxlKCd7JGZ1bGxfbGluZX0nKTsNCgkJLy8gaGlnaGxpZ2h0IGFjdGl2ZSBsaW5lDQoJCWVkaXRvci5zZXRIaWdobGlnaHRBY3RpdmVMaW5lKHskaGlnaGxpZ2h0X2FjdGl2ZX0pOw0KCQkvLyBoaWdobGlnaHQgc2VsZWN0ZWQgd29yZA0KCQllZGl0b3Iuc2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkKHskaGlnaGxpZ2h0X3NlbGVjdGVkfSk7DQoJCS8vIHNob3cgaW52aXNpYmxlcw0KCQllZGl0b3Iuc2V0U2hvd0ludmlzaWJsZXMoeyRzaG93X2ludmlzaWJsZXN9KTsNCgkJLy8gcGVyc2lzdGVudCBoc2Nyb2xsDQoJCWVkaXRvci5yZW5kZXJlci5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSh7JHBlcnNpc3RlbnRfaHNjcm9sbH0pOw0KCQkvLyBzaG93IGd1dHRlcg0KCQllZGl0b3IucmVuZGVyZXIuc2V0U2hvd0d1dHRlcih7JHNob3dfZ3V0dGVyfSk7DQoJCXtpZiAkc29mdF93cmFwICE9ICdvZmYnfQ0KCQkvLyAgc29mdCB3cmFwDQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7DQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0V3JhcExpbWl0UmFuZ2UoeyRzb2Z0X3dyYXB9KTsNCgkJey9pZn0NCgkJLy8gc2V0IHNvZnQgdGFiDQoJCWVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlU29mdFRhYnMoeyRzb2Z0X3RhYn0pOw0KCQkvLyBzZXQgcHJpbnQgbWFyZ2luDQoJCWVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oeyRwcmludF9tYXJnaW59KTsNCgkJDQoJICAgICAgICAvLyBiaW5kIGN0cmwrZW50ZXIgdG8gZnVsbCBzY3JlZW4gbW9kZS4NCiAgICAgICAgICAgICAgICB7bGl0ZXJhbH0NCgkJZWRpdG9yLmNvbW1hbmRzLmFkZENvbW1hbmQoew0KICAgICAgICAgICAgICAgICAgbmFtZTogJ2Z1bGxTY3JlZW5FZGl0aW5nJywNCiAgICAgICAgICAgICAgICAgIGJpbmRLZXk6IHsNCiAgICAgICAgICAgICAgICAgICAgd2luOiAnQ3RybC1SZXR1cm4nLA0KICAgICAgICAgICAgICAgICAgICBtYWM6ICdDb21tYW5kLVJldHVybicsDQogICAgICAgICAgICAgICAgICAgIHNlbmRlcjogJ2VkaXRvcicNCiAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICBleGVjOiBmdW5jdGlvbihlbnYsYXJncyxyZXF1ZXN0KSB7DQoJICAgICAgICAgICAgdmFyIGVkaXRvckRpdiA9ICQoJyN7L2xpdGVyYWx9eyRlZGl0b3JpZH17bGl0ZXJhbH0nKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIGVkaXRvckRpdi5oYXNDbGFzcygnZnVsbHNjcmVlbicpICkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gZnVsbCBzY3JlZW4NCgkgICAgICAgICAgICAgICBlZGl0b3JEaXYucmVtb3ZlQ2xhc3MoJ2Z1bGxzY3JlZW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IGVkaXRvckRpdi5kYXRhKCk7DQogICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckRpdi53aWR0aCh0bXAub3JpZ1dpZHRoKTsNCgkJICAgICAgIGVkaXRvckRpdi5oZWlnaHQodG1wLm9yaWdIZWlnaHQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJuIG9uIGZ1bGwgc2NyZWVuDQoJCSAgICAgICBlZGl0b3JEaXYuYWRkQ2xhc3MoJ2Z1bGxzY3JlZW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGl2LmRhdGEoJ29yaWdXaWR0aCcsZWRpdG9yRGl2LndpZHRoKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JEaXYuZGF0YSgnb3JpZ0hlaWdodCcsZWRpdG9yRGl2LmhlaWdodCgpKTsNCgkJICAgICAgIAkJICAgZWRpdG9yRGl2LndpZHRoKCQod2luZG93KS53aWR0aCgpKjAuOTk1KTsNCiAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGl2LmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkqMC45OCk7DQogICAgICAgICAgICAgICAgICAgIH0NCgkJICAgIGVkaXRvci5yZW5kZXJlci5vblJlc2l6ZSh0cnVlKTsNCgkgICAgICAgICAgICBlZGl0b3IucmVuZGVyZXIudXBkYXRlRnVsbCgpOw0KCSAgICAgICAgICAgIGVkaXRvci5mb2N1cygpOw0KICAgICAgICAgICAgICAgICAgICAvL2VkaXRvci5yZWZyZXNoKCk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQoJCWVkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKHsNCiAgICAgICAgICAgICAgICAgIG5hbWU6ICdteXNhdmUnLA0KICAgICAgICAgICAgICAgICAgYmluZEtleTogew0KICAgICAgICAgICAgICAgICAgICB3aW46ICdDdHJsLVMnLA0KICAgICAgICAgICAgICAgICAgICBtYWM6ICdDb21tYW5kLVMnLA0KICAgICAgICAgICAgICAgICAgICBzZW5kZXI6ICdlZGl0b3InDQogICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oZW52LGFyZ3MscmVxdWVzdCkgew0KCQkgICAgLy8gdXBkYXRlIHRoZSB0ZXh0IGFyZWEgZmllbGQuDQogICAgICAgICAJICAgIHZhciB0ZXh0ID0gZWRpdG9yLmdldFNlc3Npb24oKS5nZXRWYWx1ZSgpOw0KCQkgICAgdGV4dGFyZWEudmFsKHRleHQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBwYXJlbnQgZm9ybS4gYW5kIGEgY2hpbGQgYnV0dG9uIG5hbWVkICdhcHBseScsIGFuZCBjbGljayBpdC4NCiAgICAgICAgICAgICAgICAgICAgJCgney9saXRlcmFsfSN7JGVkaXRvcmlkfXtsaXRlcmFsfScpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdbbmFtZSQ9ImFwcGx5Il0nKS5maXJzdCgpLmNsaWNrKCk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICB7L2xpdGVyYWx9DQoNCgkJLy8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRleHRhcmVhDQoJCXZhciBpbnRpYWxEYXRhID0gJCgnI3skdGV4dGFyZWFpZH0nKS52YWwoKTsNCgkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRWYWx1ZShpbnRpYWxEYXRhKTsNCgkJLy8gVXBkYXRlIHRoZSB0ZXh0YXJlYSBvbiBjaGFuZ2UuDQoJCWVkaXRvci5nZXRTZXNzaW9uKCkub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCl7bGRlbGltfQ0KCQkJLy8gR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IgYW5kIHBsYWNlIGl0IGludG8gdGhlIHRleHRhcmVhLg0KCQkJdmFyIHRleHQgPSBlZGl0b3IuZ2V0U2Vzc2lvbigpLmdldFZhbHVlKCk7DQoJCQl0ZXh0YXJlYS52YWwodGV4dCk7DQoJCQkvL2FsZXJ0KHRleHQpOw0KCQl7cmRlbGltfSk7DQoJe3JkZWxpbX0pOw0KPC9zY3JpcHQ+DQo=]]></data>
	</file>
	<file>
	  <filename>/templates/frontendsettings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQ0KeyRzdGFydGZvcm19DQo8ZmllbGRzZXQ+DQoJPGxlZ2VuZD4NCgkJeyRzZXR0aW5nc3RleHR9DQoJPC9sZWdlbmQ+DQoJPHA+eyRoZWFkX2Rlc2NyaXB0aW9ufTwvcD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRmcm9udGVuZF9zeW50YXhfbW9kZX0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZnJvbnRlbmRfc3ludGF4X21vZGVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHRoZW1ldGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZnJvbnRlbmRfdGhlbWVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KPC9maWVsZHNldD4NCjxmaWVsZHNldD4JDQoJPGxlZ2VuZD4NCgkJeyRzeW50YXhfc2V0dGluZ3N0ZXh0fQ0KCTwvbGVnZW5kPg0KCTxwPnskY29udGVudF9kZXNjcmlwdGlvbn08L3A+CQkJDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskd2lkdGhfdGl0bGV9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHdpZHRoX2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGhlaWdodF90aXRsZX0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskaGVpZ2h0X2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGZyb250ZW5kX3N5bnRheF9tb2RlfQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRmcm9udGVuZF9zeW50YXhhcmVhX21vZGVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2PgkJDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskdGhlbWV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyR0aGVtZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskZm9udHNpemV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRmb250c2l6ZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQkJCQkJCQ0KPC9maWVsZHNldD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJJm5ic3A7DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHN1Ym1pdH0NCgkJPC9wPg0KCTwvZGl2Pg0KeyRlbmRmb3JtfQ0Key9zdHJpcH0NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQ0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij4NCgk8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+DQoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz4NCgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IkZMSDJBTjg5VVBQQUciIC8+DQoJCTxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9HQi9pL2J0bi9idG5fZG9uYXRlX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsIOKAlCBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZS4iIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7IiAvPg0KCQk8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZGVfREUvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPg0KCTwvZm9ybT4NCjwvZGl2Pg0KPGRpdiBpZD0icGFnZV90YWJzIj4NCgk8ZGl2IGlkPSJnZW5lcmFsIj4NCgkJeyRoZWxwX2dlbmVyYWxfdGl0bGV9DQoJPC9kaXY+DQoJPGRpdiBpZD0ic2hvcnRjdXRzIj4NCgkJeyRoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlfQ0KCTwvZGl2Pg0KCTxkaXYgaWQ9ImZyb250ZW5kIj4NCgkJeyRoZWxwX2Zyb250ZW5kX3RpdGxlfQ0KCTwvZGl2PgkNCgk8ZGl2IGlkPSJhYm91dCI+DQoJCXskaGVscF9hYm91dF90aXRsZX0NCgk8L2Rpdj4JDQo8L2Rpdj4NCjxkaXYgY2xhc3M9ImNsZWFyYiI+PC9kaXY+DQo8ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPg0KCTxkaXYgaWQ9ImdlbmVyYWxfYyI+DQoJCTxpbWcgc3R5bGU9ImZsb2F0OnJpZ2h0O21hcmdpbjowIDEwcHggMTBweCAxMHB4OyBib3JkZXI6IDVweCBzb2xpZCAjZjBmMGYwOyIgc3JjPSJ7JG1vZHVsZV9wYXRofS9pbWFnZXMvZWRpdG9yLmpwZyIgYWx0PSJFZGl0b3IiIHdpZHRoPSIzMTYiIGhlaWdodD0iMjU5IiAvPg0KCQl7JGhlbHBfZ2VuZXJhbF90ZXh0fQ0KCQk8YnIgc3R5bGUgPSJjbGVhcjpib3RoOyIgLz4NCgk8L2Rpdj4NCgk8ZGl2IGlkPSJzaG9ydGN1dHNfYyI+DQoJCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCXskaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50fQ0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8ZGl2IGlkPSJmcm9udGVuZF9jIj4NCgkJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJeyRoZWxwX2Zyb250ZW5kX2NvbnRlbnR9DQoJCTxwcmU+eyRoZWxwX2Zyb250ZW5kX3NhbXBsZX08L3ByZT4NCgkJPC9kaXY+DQoJPC9kaXY+DQoJPGRpdiBpZD0iYWJvdXRfYyI+DQoJCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCXskaGVscF9hYm91dF90ZXh0fQ0KCQk8L2Rpdj4NCgk8L2Rpdj4JCQ0KPC9kaXY+DQp7L3N0cmlwfQ0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_default.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2xkZWxpbX0NCgl2YXIgdHh0ID0gJCgnI3skZGl2aWR9JykudGV4dCgpOw0KICAJdmFyIGVkaXRvciA9IGFjZS5lZGl0KCd7JGRpdmlkfScpOw0KICAJCWVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsNCiAgCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneyRkaXZpZH0nKS5zdHlsZS5mb250U2l6ZT0neyRmb250c2l6ZX0nOw0Ke2lmIGlzc2V0KCR0aGVtZSl9DQoJCWVkaXRvci5zZXRUaGVtZSgnYWNlL3RoZW1lL3skdGhlbWV9Jyk7DQp7L2lmfQ0Ke2lmIGlzc2V0KCRtb2RlKX0NCgkJdmFyIHRoZU1vZGUgPSByZXF1aXJlKCdhY2UvbW9kZS97JG1vZGV9JykuTW9kZTsNCiAgCQllZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUobmV3IHRoZU1vZGUpOw0Key9pZn0NCiAgCQllZGl0b3IucmVuZGVyZXIuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsNCiAgCQllZGl0b3IuZ2V0U2Vzc2lvbigpLnNldFZhbHVlKHR4dCk7DQp7cmRlbGltfSk7DQo8L3NjcmlwdD4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJI3skZGl2aWR9IHtsZGVsaW19DQoJCXBvc2l0aW9uOiByZWxhdGl2ZTsNCgkJaGVpZ2h0OiB7JGhlaWdodH1weDsNCgkJd2lkdGg6IHskd2lkdGh9cHg7DQoJCWJhY2tncm91bmQ6ICNmZmY7DQoJCWRpc3BsYXk6IGJsb2NrOw0KCXtyZGVsaW19DQo8L3N0eWxlPg0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_head.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy9hY2UuanMiPjwvc2NyaXB0Pg0Ke2ZvcmVhY2ggZnJvbT0kbW9kZXMgaXRlbT0nbW9kZSd9DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0ieyRhY2VfdXJsfS9hY2Uvc3JjL21vZGUteyRtb2RlfS5qcyI+PC9zY3JpcHQ+DQp7L2ZvcmVhY2h9DQp7aWYgaXNzZXQoJHRoZW1lcyl9DQp7Zm9yZWFjaCBmcm9tPSR0aGVtZXMgaXRlbT0ndGhlbWUnfQ0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy90aGVtZS17JHRoZW1lfS5qcyI+PC9zY3JpcHQ+DQp7L2ZvcmVhY2h9DQp7L2lmfQ0K]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQ0KeyRzdGFydGZvcm19DQo8ZmllbGRzZXQ+DQoJPGxlZ2VuZD4NCgkJeyRzZXR0aW5nc3RleHR9DQoJPC9sZWdlbmQ+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskd2lkdGhfdGl0bGV9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHdpZHRoX2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGhlaWdodF90aXRsZX0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskaGVpZ2h0X2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskZW5hYmxlX2lldGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZW5hYmxlX2llaW5wdXR9IHskZW5hYmxlX2llZGVzY3J9DQoJCTwvcD4NCgk8L2Rpdj4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyR1c2VfdW5jb21wcmVzc2VkX3RpdGxlfQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyR1c2VfdW5jb21wcmVzc2VkX2lucHV0fSB7JHVzZV91bmNvbXByZXNzZWRfdGV4dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHN5bnRheF9tb2RlfQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRzeW50YXhfbW9kZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskdGhlbWV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyR0aGVtZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskZm9udHNpemV0ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRmb250c2l6ZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGZ1bGxfbGluZXRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JGZ1bGxfbGluZWlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskaGlnaGxpZ2h0X2FjdGl2ZXRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JGhpZ2hsaWdodF9hY3RpdmVpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHNob3dfaW52aXNpYmxlc3RleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHNob3dfaW52aXNpYmxlc2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+DQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskcGVyc2lzdGVudF9oc2Nyb2xsdGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskcGVyc2lzdGVudF9oc2Nyb2xsaW5wdXR9DQoJCTwvcD4NCgk8L2Rpdj4NCgl7Kg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JGtleV9iaW5kaW5ndGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXska2V5X2JpbmRpbmdpbnB1dH0NCgkJPC9wPg0KCTwvZGl2Pg0KCSp9CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHNvZnRfd3JhcHRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHNvZnRfd3JhcGlucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+DQoJCQl7JHNob3dfZ3V0dGVydGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskc2hvd19ndXR0ZXJpbnB1dH0NCgkJPC9wPg0KCTwvZGl2PgkNCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRwcmludF9tYXJnaW50ZXh0fQ0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRwcmludF9tYXJnaW5pbnB1dH0NCgkJPC9wPg0KCTwvZGl2PgkNCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRzb2Z0X3RhYnRleHR9DQoJCTwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQoJCQl7JHNvZnRfdGFiaW5wdXR9DQoJCTwvcD4NCgk8L2Rpdj4JDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCXskaGlnaGxpZ2h0X3NlbGVjdGVkdGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskaGlnaGxpZ2h0X3NlbGVjdGVkaW5wdXR9DQoJCTwvcD4NCgk8L2Rpdj4NCgl7KgkNCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPg0KCQkJeyRlbmFibGVfYmVoYXZpb3JzdGV4dH0NCgkJPC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskZW5hYmxlX2JlaGF2aW9yc2lucHV0fQ0KCQk8L3A+DQoJPC9kaXY+CQ0KCSp9CQkJCQkJDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4NCgkJCSZuYnNwOw0KCQk8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KCQkJeyRzdWJtaXR9DQoJCTwvcD4NCgk8L2Rpdj4NCjwvZmllbGRzZXQ+DQo8ZmllbGRzZXQ+DQoJPGxlZ2VuZD57JHRlc3RhcmVhdGV4dH08L2xlZ2VuZD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4NCgkJCXskdGVzdGFyZWF9DQoJCTwvcD4NCgk8L2Rpdj4JDQoJDQo8L2ZpZWxkc2V0Pg0KeyRlbmRmb3JtfSANCnsvc3RyaXB9DQo=]]></data>
	</file>
</module>
