LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBTd2VkaXNoIGxhbmd1YWdlIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICogQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqIENvcHlyaWdodCAyMDA3LCAyMDA4IERhbmllbCBOeWxhbmRlciA8cG9AZGFuaWVsbnlsYW5kZXIuc2U+CiAqIENvcHlyaWdodCAyMDA5IEFuZGVycyBKb25zc29uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5oZWxwX3Jlcy5oIgoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKewogUE9QVVAgIiZBcmtpdiIgewogIE1FTlVJVEVNICIm1nBwbmEiLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2tyaXYgdXQiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiU2tyaXZhciZrb25maWd1cmF0aW9uLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJBJnZzbHV0YSIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiUiZlZGlnZXJhIiB7CiAgIE1FTlVJVEVNICImS29waWVyYS4uLiIsIE1OSURfRURJVF9DT1BZRExHCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJktvbW1lbnRlcmEuLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICImQm9rbeRya2UiIHsKICAgTUVOVUlURU0gIiZEZWZpbmllcmEuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiQSZsdGVybmF0aXYiIHsKICAgUE9QVVAJIkhq5GxwZW4gYWxsdGlkIHN5bmxpZyIKICAgQkVHSU4KICAgICBNRU5VSVRFTSAiU3RhbmRhcmQiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIlN5bmxpZyIsCU1OSURfT1BUU19IRUxQX1ZJU0lCTEUKICAgICBNRU5VSVRFTSAiSW50ZSBzeW5saWciLAlNTklEX09QVFNfSEVMUF9OT05WSVNJQkxFCiAgRU5ECiAgTUVOVUlURU0gIkhpc3RvcmlrIiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIlR5cHNuaXR0IgogIEJFR0lOCiAgICBNRU5VSVRFTSAiTGl0ZXQiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiTm9ybWFsdCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiU3RvcnQiLCAgICAgCU1OSURfT1BUU19GT05UU19MQVJHRQogIEVORAogIE1FTlVJVEVNICJBbnbkbmQgc3lzdGVtZuRyZ2VyIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICImSGrkbHAiIHsKICAgTUVOVUlURU0gIkhq5GxwICZm9nIgaGrkbHAiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICJBbGx0aWQgJvZ2ZXJzdCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm8uLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZPbSBXaW5lIiwgTU5JRF9IRUxQX1dJTkUKI2VuZGlmCiB9Cn0KCklERF9JTkRFWCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjAwLCAxOTAgTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5kZXgiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCn0KCklERF9TRUFSQ0ggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIlP2ayIKewogICAgTFRFWFQgICJJbnRlIGltcGxlbWVudGVyYXQg5G5udSIsIC0xLCAxMCwgMTAsIDE4MCwgMTUwCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKewpTVElEX1dJTkVfSEVMUCwgCSJXaW5lIEhq5GxwIgpTVElEX1dIRVJST1IsIAkJIkZFTCIKU1RJRF9XQVJOSU5HLCAgCQkiVkFSTklORyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYXRpb24iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIkludGUgaW1wbGVtZW50ZXJhdCIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiRmVsIHZpZCBs5HNuaW5nIGF2IGhq5GxwZmlsZW4gYCVzJyIKU1RJRF9JTkRFWCwgCQkiJklubmVo5WxsIgpTVElEX0NPTlRFTlRTLAkJIlNhbW1hbmRyYWciClNUSURfQkFDSywgCQkiJkJha+V0IgpTVElEX0FMTF9GSUxFUywgCSJBbGxhIGZpbGVyICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIkhq5GxwZmlsZXIgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJLYW4gaW50ZSBoaXR0YSAnJXMnLiBWaWxsIGR1IHP2a2EgZWZ0ZXIgZGVubmEgZmlsPyIKU1RJRF9OT19SSUNIRURJVAkiS2FuIGludGUgaGl0dGEgZW4gaW1wbGVtZW50YXRpb24gYXYgcmljaGVkaXQuLi4gQXZzbHV0YXIiClNUSURfUFNIX0lOREVYLAkJIkhq5GxwcnVicmlrZXI6ICIKfQoKQ09OVEVYVF9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKQkVHSU4KICAgIFBPUFVQICIiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICJLb21tZW50YXIuLi4iLCAgICAgICAgTU5JRF9DVFhUX0FOTk9UQVRFCiAgICAgICAgTUVOVUlURU0gIktvcGllcmEiLCAgICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKICAgICAgICBNRU5VSVRFTSAiU2tyaXYgdXQuLi4iLCAgICAgICAgIE1OSURfQ1RYVF9QUklOVAogICAgICAgIFBPUFVQICAgICJUeXBzbml0dCIKICAgICAgICBCRUdJTgogICAgICAgICAgICBNRU5VSVRFTSAiTGl0ZXQiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfU01BTEwKICAgICAgICAgICAgTUVOVUlURU0gIk5vcm1hbHQiLCAgICAgIE1OSURfQ1RYVF9GT05UU19OT1JNQUwKICAgICAgICAgICAgTUVOVUlURU0gIlN0b3J0IiwgICAgICAgIE1OSURfQ1RYVF9GT05UU19MQVJHRQogICAgICAgIEVORAogICAgICAgIFBPUFVQICAgIkhq5GxwIGFsbHRpZCBzeW5saWciCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIlN0YW5kYXJkIiwgICAgIE1OSURfQ1RYVF9IRUxQX0RFRkFVTFQKICAgICAgICAgICAgTUVOVUlURU0gIlN5bmxpZyIsICAgICAgIE1OSURfQ1RYVF9IRUxQX1ZJU0lCTEUKICAgICAgICAgICAgTUVOVUlURU0gIkVqIHN5bmxpZyIsICBNTklEX0NUWFRfSEVMUF9OT05WSVNJQkxFCiAgICAgICAgRU5ECiAgICAgICAgTUVOVUlURU0gIkFuduRuZCBzeXN0ZW1m5HJnZXIiLCAgIE1OSURfQ1RYVF9TWVNURU1fQ09MT1JTCiAgICBFTkQKRU5ECg==