LyoKICAgIGkyYy12aWEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgIExpbnV4IGtlcm5lbCBtb2R1bGVzCiAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIGkyYyBTdXBwb3J0IGZvciBWaWEgVGVjaG5vbG9naWVzIDgyQzU4NkIgU291dGggQnJpZGdlCgogICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgovKiBQb3dlciBtYW5hZ2VtZW50IHJlZ2lzdGVycyAqLwojZGVmaW5lIFBNX0NGR19SRVZJRAkweDA4CS8qIHNpbGljb24gcmV2aXNpb24gY29kZSAqLwojZGVmaW5lIFBNX0NGR19JT0JBU0UwCTB4MjAKI2RlZmluZSBQTV9DRkdfSU9CQVNFMQkweDQ4CgojZGVmaW5lIEkyQ19ESVIJCShwbV9pb19iYXNlKzB4NDApCiNkZWZpbmUgSTJDX09VVAkJKHBtX2lvX2Jhc2UrMHg0MikKI2RlZmluZSBJMkNfSU4JCShwbV9pb19iYXNlKzB4NDQpCiNkZWZpbmUgSTJDX1NDTAkJMHgwMgkvKiBjbG9jayBiaXQgaW4gRElSL09VVC9JTiByZWdpc3RlciAqLwojZGVmaW5lIEkyQ19TREEJCTB4MDQKCi8qIGlvLXJlZ2lvbiByZXNlcnZhdGlvbiAqLwojZGVmaW5lIElPU1BBQ0UJCTB4MDYKI2RlZmluZSBJT1RFWFQJCSJ2aWEtaTJjIgoKc3RhdGljIHUxNiBwbV9pb19iYXNlID0gMDsKCi8qCiAgIEl0IGRvZXMgbm90IGFwcGVhciBmcm9tIHRoZSBkYXRhc2hlZXQgdGhhdCB0aGUgR1BJTyBwaW5zIGFyZQogICBvcGVuIGRyYWluLiBTbyBhIHdlIHNldCBhIGxvdyB2YWx1ZSBieSBzZXR0aW5nIHRoZSBkaXJlY3Rpb24gdG8KICAgb3V0cHV0IGFuZCBhIGhpZ2ggdmFsdWUgYnkgc2V0dGluZyB0aGUgZGlyZWN0aW9uIHRvIGlucHV0IGFuZAogICByZWx5aW5nIG9uIHRoZSByZXF1aXJlZCBJMkMgcHVsbHVwLiBUaGUgZGF0YSB2YWx1ZSBpcyBpbml0aWFsaXplZAogICB0byAwIGluIHZpYV9pbml0KCkgYW5kIG5ldmVyIGNoYW5nZWQuCiovCnN0YXRpYyB2b2lkIGJpdF92aWFfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKewoJb3V0YihzdGF0ZSA/IGluYihJMkNfRElSKSAmIH5JMkNfU0NMIDogaW5iKEkyQ19ESVIpIHwgSTJDX1NDTCwgSTJDX0RJUik7Cn0KCnN0YXRpYyB2b2lkIGJpdF92aWFfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKewoJb3V0YihzdGF0ZSA/IGluYihJMkNfRElSKSAmIH5JMkNfU0RBIDogaW5iKEkyQ19ESVIpIHwgSTJDX1NEQSwgSTJDX0RJUik7Cn0KCnN0YXRpYyBpbnQgYml0X3ZpYV9nZXRzY2wodm9pZCAqZGF0YSkKewoJcmV0dXJuICgwICE9IChpbmIoSTJDX0lOKSAmIEkyQ19TQ0wpKTsKfQoKc3RhdGljIGludCBiaXRfdmlhX2dldHNkYSh2b2lkICpkYXRhKQp7CglyZXR1cm4gKDAgIT0gKGluYihJMkNfSU4pICYgSTJDX1NEQSkpOwp9CgoKc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBiaXRfZGF0YSA9IHsKCS5zZXRzZGEJCT0gYml0X3ZpYV9zZXRzZGEsCgkuc2V0c2NsCQk9IGJpdF92aWFfc2V0c2NsLAoJLmdldHNkYQkJPSBiaXRfdmlhX2dldHNkYSwKCS5nZXRzY2wJCT0gYml0X3ZpYV9nZXRzY2wsCgkudWRlbGF5CQk9IDUsCgkubWRlbGF5CQk9IDUsCgkudGltZW91dAk9IEhaCn07CgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTg2Yl9hZGFwdGVyID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAoJLm5hbWUJCT0gIlZJQSBpMmMiLAoJLmFsZ29fZGF0YQk9ICZiaXRfZGF0YSwKfTsKCgpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdnQ1ODZiX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8zKSB9LAoJeyAwLCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHZ0NTg2Yl9pZHMpOwoKc3RhdGljIGludCBfX2RldmluaXQgdnQ1ODZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKewoJdTE2IGJhc2U7Cgl1OCByZXY7CglpbnQgcmVzOwoKCWlmIChwbV9pb19iYXNlKSB7CgkJZGV2X2VycigmZGV2LT5kZXYsICJpMmMtdmlhOiBXaWxsIG9ubHkgc3VwcG9ydCBvbmUgaG9zdFxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQTV9DRkdfUkVWSUQsICZyZXYpOwoKCXN3aXRjaCAocmV2KSB7CgljYXNlIDB4MDA6CgkJYmFzZSA9IFBNX0NGR19JT0JBU0UwOwoJCWJyZWFrOwoJY2FzZSAweDAxOgoJY2FzZSAweDEwOgoJCWJhc2UgPSBQTV9DRkdfSU9CQVNFMTsKCQlicmVhazsKCglkZWZhdWx0OgoJCWJhc2UgPSBQTV9DRkdfSU9CQVNFMTsKCQkvKiBsYXRlciByZXZpc2lvbiAqLwoJfQoKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgYmFzZSwgJnBtX2lvX2Jhc2UpOwoJcG1faW9fYmFzZSAmPSAoMHhmZiA8PCA4KTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UsIElPVEVYVCkpIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgIklPIDB4JXgtMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgSTJDX0RJUiwgSTJDX0RJUiArIElPU1BBQ0UpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCW91dGIoaW5iKEkyQ19ESVIpICYgfihJMkNfU0RBIHwgSTJDX1NDTCksIEkyQ19ESVIpOwoJb3V0YihpbmIoSTJDX09VVCkgJiB+KEkyQ19TREEgfCBJMkNfU0NMKSwgSTJDX09VVCk7CgoJLyogc2V0IHVwIHRoZSBkcml2ZXJmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCgl2dDU4NmJfYWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwoKCXJlcyA9IGkyY19iaXRfYWRkX2J1cygmdnQ1ODZiX2FkYXB0ZXIpOwoJaWYgKCByZXMgPCAwICkgewoJCXJlbGVhc2VfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UpOwoJCXBtX2lvX2Jhc2UgPSAwOwoJCXJldHVybiByZXM7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0IHZ0NTg2Yl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKewoJaTJjX2JpdF9kZWxfYnVzKCZ2dDU4NmJfYWRhcHRlcik7CglyZWxlYXNlX3JlZ2lvbihJMkNfRElSLCBJT1NQQUNFKTsKCXBtX2lvX2Jhc2UgPSAwOwp9CgoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZ0NTg2Yl9kcml2ZXIgPSB7CgkubmFtZQkJPSAidnQ1ODZiX3NtYnVzIiwKCS5pZF90YWJsZQk9IHZ0NTg2Yl9pZHMsCgkucHJvYmUJCT0gdnQ1ODZiX3Byb2JlLAoJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2dDU4NmJfcmVtb3ZlKSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGkyY192dDU4NmJfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdnQ1ODZiX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfdnQ1ODZiX2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2dDU4NmJfZHJpdmVyKTsKfQoKCk1PRFVMRV9BVVRIT1IoIkt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBmb3IgVmlhIHZ0ODJjNTg2YiBzb3V0aGJyaWRnZSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdChpMmNfdnQ1ODZiX2luaXQpOwptb2R1bGVfZXhpdChpMmNfdnQ1ODZiX2V4aXQpOwo=