LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbGV4YW5kZXIgTi4gU/hybmVzIDxhbGV4QHRoZWhhbmRvZmFnb255LmNvbT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIndpbmhlbHBfcmVzLmgiCgovKiBNZW51ICovCgpNQUlOX01FTlUgTUVOVSBMQU5HVUFHRSBMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMCnsKIFBPUFVQICImRmlsIiB7CiAgTUVOVUlURU0gIibFcG5lIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2tyaXYgJnV0IiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIk9wcCZzZXR0IGF2IHNrcml2ZXJlbi4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkF2c2x1dHQiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIlImZWRpZ2VyIiB7CiAgIE1FTlVJVEVNICImS29waWVyLi4uIiwgTU5JRF9FRElUX0NPUFlETEcKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICJLJm9tbWVudGVyLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJkJva21lcmtlIiB7CiAgIE1FTlVJVEVNICImRGVmaW5lci4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICImSW5uc3RpbGxpbmdlciIgewogICBQT1BVUAkiU3lubGlnaGV0IgogICBCRUdJTgogICAgIE1FTlVJVEVNICJTdGFuZGFyZCIsCU1OSURfT1BUU19IRUxQX0RFRkFVTFQKICAgICBNRU5VSVRFTSAiU3lubGlnIiwJTU5JRF9PUFRTX0hFTFBfVklTSUJMRQogICAgIE1FTlVJVEVNICJJa2tlIHN5bmxpZyIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yaWtrIiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIlNrcmlmdHN0+HJyZWxzZSIKICBCRUdJTgogICAgTUVOVUlURU0gIkxpdGVuIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiU3RvciIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIkJydWsgc3lzdGVtZmFyZ2VyIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICImSGplbHAiIHsKICAgTUVOVUlURU0gIiZIamVscCB0aWwgSGplbHAiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICJBbGwmdGlkIPh2ZXJzdCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWFzam9uLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImT20gV2luZSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpJRERfSU5ERVggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5uaG9sZCIKewogICAgTElTVEJPWCBJRENfSU5ERVhMSVNULCAxMCwgMTAsIDE4MCwgMTUwLCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKfQoKSUREX1NFQVJDSCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjAwLCAxOTAgTEFOR1VBR0UgTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJT+GsiCnsKICAgIExURVhUICAiSWtrZSBsYWdldCBlbm7lIiwgLTEsIDEwLCAxMCwgMTgwLCAxNTAKfQoKLyogU3RyaW5ncyAqLwpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMCnsKU1RJRF9XSU5FX0hFTFAsIAkiSGplbHAiClNUSURfV0hFUlJPUiwgCQkiRkVJTCIKU1RJRF9XQVJOSU5HLCAgCQkiQURWQVJTRUwiClNUSURfSU5GTywgIAkJIkluZm9ybWFzam9uIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJJa2tlIGltcGxlbWVudGVydCIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiS2xhcnRlIGlra2UgbGVzZSBoamVscGVmaWxlbiCrJXO7IgpTVElEX0lOREVYLCAJCSImSW5uaG9sZCIKU1RJRF9DT05URU5UUywgCQkiJk9wcHN1bW1lcmluZyIKU1RJRF9CQUNLLCAJCSJUaWwmYmFrZSIKU1RJRF9BTExfRklMRVMsIAkiQWxsZSBmaWxlciAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJIamVscC1maWxlciAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MJIktsYXJ0ZSBpa2tlIGZpbm5lIKslc7suIFZpbCBkdSBmaW5uZSBmaWxlbiBzZWx2PyIKU1RJRF9OT19SSUNIRURJVAkiS2xhcnRlIGlra2UgZmlubmUgcmljaGVkaXQ7IGF2YnJ5dGVyIgpTVElEX1BTSF9JTkRFWCwJCSJFbW5lciBpIEhqZWxwOiAiCn0KCkNPTlRFWFRfTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUwKQkVHSU4KICAgIFBPUFVQICIiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICJLb21tZW50YXIuLi4iLCAgICAgICBNTklEX0NUWFRfQU5OT1RBVEUKICAgICAgICBNRU5VSVRFTSAiS29waWVyIiwgICAgICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKICAgICAgICBNRU5VSVRFTSAiU2tyaXYgdXQuLi4iLCAgICAgICAgICAgIE1OSURfQ1RYVF9QUklOVAogICAgICAgIFBPUFVQICAgICJTa3JpZnRzdPhycmVsc2UiCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIkxpdGVuIiwgICAgICAgTU5JRF9DVFhUX0ZPTlRTX1NNQUxMCiAgICAgICAgICAgIE1FTlVJVEVNICJOb3JtYWwiLCAgICAgIE1OSURfQ1RYVF9GT05UU19OT1JNQUwKICAgICAgICAgICAgTUVOVUlURU0gIlN0b3IiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfTEFSR0UKICAgICAgICBFTkQKICAgICAgICBQT1BVUCAgICJTeW5saWdoZXQiCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIlN0YW5kYXJkIiwgICAgIE1OSURfQ1RYVF9IRUxQX0RFRkFVTFQKICAgICAgICAgICAgTUVOVUlURU0gIlN5bmxpZyIsICAgICBNTklEX0NUWFRfSEVMUF9WSVNJQkxFCiAgICAgICAgICAgIE1FTlVJVEVNICJJa2tlIHN5bmxpZyIsIE1OSURfQ1RYVF9IRUxQX05PTlZJU0lCTEUKICAgICAgICBFTkQKICAgICAgICBNRU5VSVRFTSAiQnJ1ayBzeXN0ZW1mYXJnZXIiLCAgIE1OSURfQ1RYVF9TWVNURU1fQ09MT1JTCiAgICBFTkQKRU5ECg==