LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZQogKiBDb3B5cmlnaHQgMjAwMiBab2x5IE5hZ3kKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19IVU5HQVJJQU4sIFNVQkxBTkdfREVGQVVMVAp7CiBQT1BVUCAiJkbhamwiIHsKICBNRU5VSVRFTSAiJk1lZ255aXThcy4uLiIsIE1OSURfRklMRV9PUEVOCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZOeW9tdGF04XMiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiTnlvbXRhdPMgJmJl4Wxs7XThcy4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJktpbOlw6XMiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZTemVya2VzenTpcyIgewogICBNRU5VSVRFTSAiJk3hc29s4XMuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZKZWd5emV0Li4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJkv2bnl2amVsevUiIHsKICAgTUVOVUlURU0gIiZEZWZpbmnhbOFzLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIiZT+mfzIiB7CiAgIE1FTlVJVEVNICImSGFzem7hbGF0IiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiTWluZGlnICZsZWdmZWz8bCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybeFjafMuLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiYmQSBXSU5FLXLzbCIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgovKiBTdHJpbmdzICovCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUCnsKU1RJRF9XSU5FX0hFTFAsIAkiV0lORSBz+mfzIgpTVElEX1dIRVJST1IsIAkJIkhJQkEiClNUSURfV0FSTklORywgIAkJIkZJR1lFTE1FWlRFVMlTIgpTVElEX0lORk8sICAJCSJJbmZvcm3hY2nzIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJOaW5jcyBpbXBsZW1lbnThbHZhIgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJIaWJhIGEgYCVzJyBmaWxlIG9sdmFz4XNha29yIgpTVElEX0NPTlRFTlRTLCAJCSImVGFydGFsb20iClNUSURfU0VBUkNILCAJCSImS2VyZXPpcyIKU1RJRF9CQUNLLCAJCSImVmlzc3phIgpTVElEX0hJU1RPUlksIAkJIiZFbPV6belueSIKU1RJRF9UT1BJQ1MsCQkiJlTpbWFr9nL2ayIKU1RJRF9BTExfRklMRVMsIAkiTWluZGVuIGbhamwgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiU/pn8yBm4Wpsb2sgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJDYW5ub3QgZmluZCAnJXMnLiBEbyB5b3Ugd2FudCB0byBmaW5kIHRoaXMgZmlsZSB5b3Vyc2VsZj8iCn0K