LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMTk5OSBQYWJsbyBTYXJhdHhhZ2EKICogQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5oZWxwX3Jlcy5oIgoKI2lmZGVmIExBTkdfV0FMT04KCkxBTkdVQUdFIExBTkdfV0FMT04sIFNVQkxBTkdfREVGQVVMVAoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaXRjaO4iIHsKICBNRU5VSVRFTSAiJkRyb3buLi4uIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJleGhlIiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIiZBcG9udGlhZWRqZSBkZWwgc2NyaXJlY2UuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIk1vdXNz7iAmRm/7IiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICImQ2FuZGruIiB7CiAgIE1FTlVJVEVNICImQ29wee4uLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZTaWNy7nJlLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJlJpbeVya2VzIiB7CiAgIE1FTlVJVEVNICImRGVmaW5pLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIiZPcHRpb25zIiB7CiAgIFBPUFVQCSJIZWxwIGFsd2F5cyB2aXNpYmxlIgogICBCRUdJTgogICAgIE1FTlVJVEVNICJEZWZhdWx0IiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICJWaXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfVklTSUJMRQogICAgIE1FTlVJVEVNICJOb24gdmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yeSIsCQlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJGb250cyIKICBCRUdJTgogICAgTUVOVUlURU0gIlNtYWxsIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiTGFyZ2UiLCAgICAgCU1OSURfT1BUU19GT05UU19MQVJHRQogIEVORAogIE1FTlVJVEVNICJVc2Ugc3lzdGVtIGNvbG9ycyIsCU1OSURfT1BUU19TWVNURU1fQ09MT1JTCiB9CiBQT1BVUCAiJkFpZGUiIHsKICAgTUVOVUlURU0gIiZBaWRlIHNvIGwnIEFpZGUiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICJUb2RpICZWaXNpYmUiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvcm3lY2lvbi4uLiIsIE1OSURfSEVMUF9BQk9VVAogfQp9CgovKiBTdHJpbmdzICovCgpTVFJJTkdUQUJMRQp7ClNUSURfV0lORV9IRUxQLCAJIkFpZGFuY2UgZGkgV2luZSIKU1RJRF9XSEVSUk9SLCAJCSJBUk9LRSIKU1RJRF9XQVJOSU5HLCAgCQkiQURWRVJUSVhITUlOVCIKU1RJRF9JTkZPLCAgCQkiSW5mb3Jt5WNpb24iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIk7pbiBjbyBwb3NzaWJlIgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJZ5WsgbicgYSBu6W4gc3TuIOUgbW91bWludCBkaSBsZXJlIGxpIGZpdGNo7iBkJyBhaWRlIGAlcyciClNUSURfSU5ERVgsIAkJIsUmZHZpbnMiClNUSURfQ09OVEVOVFMsCQkiU3VtbWFyeSIKU1RJRF9CQUNLLCAJCSLIbiAmRXLuIgpTVElEX0FMTF9GSUxFUywgCSJUb3MgbGVzIGZpdGNo7nMgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiRml0Y2jucyBkJyBhaWRlICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcwkiQ2Fubm90IGZpbmQgJyVzJy4gRG8geW91IHdhbnQgdG8gZmluZCB0aGlzIGZpbGUgeW91cnNlbGY/IgpTVElEX05PX1JJQ0hFRElUCSJDYW5ub3QgZmluZCBhIHJpY2hlZGl0IGltcGxlbWVudGF0aW9uLi4uIEFib3J0aW5nIgp9CgojZW5kaWYgIC8qIExBTkdfV0FMT04gKi8K