LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMsIDIwMDQgSm9z6SBNYW51ZWwgRmVycmVyIE9ydGl6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5oZWxwX3Jlcy5oIgoKTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX05FVVRSQUwKCi8qIE1lbnUgKi8KCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJjaGl2byIgewogIE1FTlVJVEVNICJBJmJyaXIuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYWNp824gaW1wcmVzb3JhLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2FsaXIiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZFZGl0YXIiIHsKICAgTUVOVUlURU0gIiZDb3BpYXIuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm90YXIuLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICImTWFyY2Fkb3IiIHsKICAgTUVOVUlURU0gIiZEZWZpbmlyLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIiZPcGNpb25lcyIgewogICBQT1BVUAkiQXl1ZGEgc2llbXByZSB2aXNpYmxlIgogICBCRUdJTgogICAgIE1FTlVJVEVNICJQb3IgZGVmZWN0byIsCU1OSURfT1BUU19IRUxQX0RFRkFVTFQKICAgICBNRU5VSVRFTSAiVmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX1ZJU0lCTEUKICAgICBNRU5VSVRFTSAiTm8gdmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yaWFsIiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIkZ1ZW50ZXMiCiAgQkVHSU4KICAgIE1FTlVJVEVNICJQZXF1ZfFhIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiR3JhbmRlIiwgICAgIAlNTklEX09QVFNfRk9OVFNfTEFSR0UKICBFTkQKICBNRU5VSVRFTSAiVXNhciBjb2xvcmVzIGRlbCBzaXN0ZW1hIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICJBJnl1ZGEiIHsKICAgTUVOVUlURU0gIiZBeXVkYSBzb2JyZSBsYSBheXVkYSIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIiZTaWVtcHJlIHZpc2libGUiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiB9Cn0KCklERF9JTkRFWCBESUFMT0cgMCwgMCwgMjAwLCAxOTAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAizW5kaWNlIgp7CiAgICBMSVNUQk9YIElEQ19JTkRFWExJU1QsIDEwLCAxMCwgMTgwLCAxNTAsIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgp9CgpJRERfU0VBUkNIIERJQUxPRyAwLCAwLCAyMDAsIDE5MApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJCdXNjYXIiCnsKICAgIExURVhUICAiQfpuIG5vIGltcGxlbWVudGFkbyIsIC0xLCAxMCwgMTAsIDE4MCwgMTUwCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUKewpTVElEX1dJTkVfSEVMUCwgCSJBeXVkYSBkZSBXaW5lIgpTVElEX1dIRVJST1IsIAkJIkVSUk9SIgpTVElEX1dBUk5JTkcsICAJCSJBRFZFUlRFTkNJQSIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYWNp824iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIkH6biBubyBpbXBsZW1lbnRhZG8iClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkVycm9yIGFsIGxlZXIgZWwgYXJjaGl2byBkZSBheXVkYSBgJXMnIgpTVElEX0lOREVYLCAJCSImzW5kaWNlIgpTVElEX0NPTlRFTlRTLAkJIlJlc3VtZW4iClNUSURfQkFDSywgCQkiJkFudGVyaW9yIgpTVElEX0FMTF9GSUxFUywgCSJUb2RvcyBsb3MgYXJjaGl2b3MgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiQXJjaGl2b3MgZGUgYXl1ZGEgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJObyBzZSBwdWRvIGVuY29udHJhciAnJXMnLiC/RGVzZWEgYnVzY2FyIGVzdGUgYXJjaGl2byB1c3RlZCBtaXNtbz8iClNUSURfTk9fUklDSEVESVQJIk5vIHNlIHB1ZG8gZW5jb250cmFyIHVuYSBpbXBsZW1lbnRhY2nzbiBkZSByaWNoZWRpdC4uLiBBYm9ydGFuZG8iClNUSURfUFNIX0lOREVYLAkJIlRlbWFzIGRlIGF5dWRhOiAiCn0K