LyoKICogc3lzdGVtLmMKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIFN5c3RlbSBkZXBlbmRlbnQgcm91dGluZXMgZ28gaGVyZQogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZiBIQVZFX0lPX0gKI2luY2x1ZGUgPGlvLmg+CiNlbmRpZgojaWYgSEFWRV9ESVJFQ1RfSAojaW5jbHVkZSA8ZGlyZWN0Lmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgoKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9ORVREQl9ICiNpbmNsdWRlIDxuZXRkYi5oPgojZW5kaWYKCgojaWYgSEFWRV9TWVNfU09DS0lPX0gKI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfTkxJU1RfSAojaW5jbHVkZSA8bmxpc3QuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKCiNpZiBIQVZFX0tTVEFUX0gKI2luY2x1ZGUgPGtzdGF0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9GQ05UTF9ICiNpbmNsdWRlIDxmY250bC5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiNpbmNsdWRlIDxzeXMvcHN0YXQuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfVVRTTkFNRV9ICiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TWVNURU1DRkdfSAojaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TWVNURU1JTkZPX0gKI2luY2x1ZGUgPHN5cy9zeXN0ZW1pbmZvLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoZGFyd2luOSkKI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+ICAgICAgICAvKiBmb3IgX05TR2V0QXJndigpICovCiNlbmRpZgoKI2lmIEhBVkVfUFdEX0gKI2luY2x1ZGUgPHB3ZC5oPgojZW5kaWYKI2lmIEhBVkVfR1JQX0gKI2luY2x1ZGUgPGdycC5oPgojZW5kaWYKCiNpZiBIQVZFX0xJTUlUU19ICiNpbmNsdWRlIDxsaW1pdHMuaD4KI2VuZGlmCgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiNpZiAxIC8qSEFWRV9BUlBBX05BTUVTRVJfSCovCiNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KI2VuZGlmCiNpbmNsdWRlIDx2YWxpZGF0b3IvdmFsaWRhdG9yLmg+Ci8qIE5ldFNOTVAgYW5kIEROU1NFQy1Ub29scyBib3RoIGRlZmluZSBGUkVFLiBXZSdsbCBub3QgdXNlIGVpdGhlciBoZXJlLiAqLwojdW5kZWYgRlJFRQojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3N5c3RlbS5oPiAgICAvKiBmb3IgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcmVhZF9jb25maWcuaD4gLyogZm9yIGdldF90ZW1wX2ZpbGVfcGF0dGVybigpICovCgojaW5jbHVkZSAiaW5ldF9udG9wLmgiCgovKiBOZXRTTk1QIGFuZCBETlNTRUMtVG9vbHMgYm90aCBkZWZpbmUgRlJFRS4gV2UnbGwgbm90IHVzZSBlaXRoZXIgaGVyZS4gKi8KI3VuZGVmIEZSRUUKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihzeXN0ZW1fYWxsLCBsaWJuZXRzbm1wKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHVzZXJfaW5mb3JtYXRpb24sIHN5c3RlbV9hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihjYWxjdWxhdGVfc2VjdGltZV9kaWZmLCBzeXN0ZW1fYWxsKQoKI2lmbmRlZiBJRkZfTE9PUEJBQ0sKIwlkZWZpbmUgSUZGX0xPT1BCQUNLIDAKI2VuZGlmCgojaWZkZWYgIElOQUREUl9MT09QQkFDSwojIGRlZmluZSBMT09QQkFDSyAgICBJTkFERFJfTE9PUEJBQ0sKI2Vsc2UKIyBkZWZpbmUgTE9PUEJBQ0sgICAgMHg3ZjAwMDAwMQojZW5kaWYKCiNpZm5kZWYgRUFJX0ZBSUwKIyBkZWZpbmUgRUFJX0ZBSUwgICAgLTQgICAgLyogTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXMuICAqLwojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfRk9SSykKc3RhdGljIHZvaWQKX2RhZW1vbl9wcmVwKGludCBzdGRlcnJfbG9nKQp7CiAgICAvKiBBdm9pZCBrZWVwaW5nIGFueSBkaXJlY3RvcnkgaW4gdXNlLiAqLwogICAgY2hkaXIoIi8iKTsKCiAgICBpZiAoc3RkZXJyX2xvZykKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIENsb3NlIGluaGVyaXRlZCBmaWxlIGRlc2NyaXB0b3JzIHRvIGF2b2lkCiAgICAgKiBrZWVwaW5nIHVubmVjZXNzYXJ5IHJlZmVyZW5jZXMuCiAgICAgKi8KICAgIGNsb3NlKDApOwogICAgY2xvc2UoMSk7CiAgICBjbG9zZSgyKTsKCiAgICAvKgogICAgICogUmVkaXJlY3Qgc3Rke2luLG91dCxlcnJ9IHRvIC9kZXYvbnVsbCwganVzdCBpbiBjYXNlLgogICAgICovCiAgICBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOwogICAgZHVwKDApOwogICAgZHVwKDApOwp9CiNlbmRpZgoKLyoqCiAqIGZvcmsgY3VycmVudCBwcm9jZXNzIGludG8gdGhlIGJhY2tncm91bmQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gZm9ya3MgYSBwcm9jZXNzIGludG8gdGhlIGJhY2tncm91bmQsIGluIG9yZGVyIHRvCiAqIGJlY29tZSBhIGRhZW1vbiBwcm9jZXNzLiBJdCBkb2VzIGEgZmV3IHRoaW5ncyBhbG9uZyB0aGUgd2F5OgogKgogKiAtIGJlY29taW5nIGEgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciwgYW5kICBmb3JraW5nIGEgc2Vjb25kIHRpbWUgc28KICogICB0aGF0IHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIgY2FuIGV4aXQuCiAqCiAqIC0gY2hhbmdpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIC8KICoKICogLSBjbG9zaW5nIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciAodW5sZXNzIHN0ZGVycl9sb2cgaXMgc2V0KSBhbmQKICogICByZWRpcmVjdGluZyB0aGVtIHRvIC9kZXYvbnVsbAogKgogKiBAcGFyYW0gcXVpdF9pbW1lZGlhdGVseSA6IGluZGljYXRlcyBpZiB0aGUgcGFyZW50IHByb2Nlc3Mgc2hvdWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCBhZnRlciBhIHN1Y2Nlc3NmdWwgZm9yay4KICogQHBhcmFtIHN0ZGVycl9sb2cgICAgICAgOiBpbmRpY2F0ZXMgaWYgc3RkZXJyIGlzIGJlaW5nIHVzZWQgZm9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZyBhbmQgc2hvdWxkbid0IGJlIGNsb3NlZAogKiBAcmV0dXJucyAtMSA6IGZvcmsgZXJyb3IKICogICAgICAgICAgIDAgOiBjaGlsZCBwcm9jZXNzIHJldHVybmluZwogKiAgICAgICAgICA+MCA6IHBhcmVudCBwcm9jZXNzIHJldHVybmluZy4gcmV0dXJuZWQgdmFsdWUgaXMgdGhlIGNoaWxkIFBJRC4KICovCmludApuZXRzbm1wX2RhZW1vbml6ZShpbnQgcXVpdF9pbW1lZGlhdGVseSwgaW50IHN0ZGVycl9sb2cpCnsKICAgIGludCBpID0gMDsKICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImRlYW1vbml6aW5nLi4uXG4iKSk7CiNpZiBIQVZFX0ZPUksKI2lmIGRlZmluZWQoZGFyd2luOSkKICAgICBjaGFyICAgICAgICAgICAgcGF0aCBbUEFUSF9NQVhdID0gIiI7CiAgICAgdWludDMyX3QgICAgICAgIHNpemUgPSBzaXplb2YgKHBhdGgpOwoKICAgICAvKgogICAgICAqIGlmIHdlIGFyZSBhbHJlYWR5IGxhdW5jaGVkIGluIGEgImRhZW1vbml6ZWQgc3RhdGUiLCBqdXN0CiAgICAgICogY2xvc2UgJiByZWRpcmVjdCB0aGUgZmlsZSBkZXNjcmlwdG9ycwogICAgICAqLwogICAgIGlmKGdldHBwaWQoKSA8PSAyKSB7CiAgICAgICAgIF9kYWVtb25fcHJlcChzdGRlcnJfbG9nKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQoKICAgICBpZiAoX05TR2V0RXhlY3V0YWJsZVBhdGggKHBhdGgsICZzaXplKSkKICAgICAgICAgcmV0dXJuIC0xOwojZW5kaWYKICAgIC8qCiAgICAgKiBGb3JrIHRvIHJldHVybiBjb250cm9sIHRvIHRoZSBpbnZva2luZyBwcm9jZXNzIGFuZCB0bwogICAgICogZ3VhcmFudGVlIHRoYXQgd2UgYXJlbid0IGEgcHJvY2VzcyBncm91cCBsZWFkZXIuCiAgICAgKi8KICAgIGkgPSBmb3JrKCk7CiAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgLyogUGFyZW50LiAqLwogICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImZpcnN0IGZvcmsgcmV0dXJuZWQgJWQuXG4iLCBpKSk7CiAgICAgICAgaWYoaSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJmaXJzdCBmb3JrIGZhaWxlZCAoZXJybm8gJWQpIGluICIKICAgICAgICAgICAgICAgICAgICAgIm5ldHNubXBfZGFlbW9uaXplKClcbiIsIGVycm5vKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAocXVpdF9pbW1lZGlhdGVseSkgewogICAgICAgICAgICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJwYXJlbnQgZXhpdGluZ1xuIikpOwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogQ2hpbGQuICovCiNpZmRlZiBIQVZFX1NFVFNJRAogICAgICAgIC8qIEJlY29tZSBhIHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIuICovCiAgICAgICAgc2V0c2lkKCk7CiNlbmRpZgogICAgICAgIC8qCiAgICAgICAgICogRm9yayB0byBsZXQgdGhlIHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIgZXhpdC4KICAgICAgICAgKi8KICAgICAgICBpZiAoKGkgPSBmb3JrKCkpICE9IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwic2Vjb25kIGZvcmsgcmV0dXJuZWQgJWQuXG4iLCBpKSk7CiAgICAgICAgICAgIGlmKGkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInNlY29uZCBmb3JrIGZhaWxlZCAoZXJybm8gJWQpIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRzbm1wX2RhZW1vbml6ZSgpXG4iLCBlcnJubyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogUGFyZW50LiAqLwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KI2lmbmRlZiBXSU4zMgogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiBDaGlsZC4gKi8KICAgICAgICAgICAgCiAgICAgICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImNoaWxkIGNvbnRpbnVpbmdcbiIpKTsKCiNpZiAhIGRlZmluZWQoZGFyd2luOSkKICAgICAgICAgICAgX2RhZW1vbl9wcmVwKHN0ZGVycl9sb2cpOwojZWxzZQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNvbWUgZGFyd2luIGNhbGxzICh1c2luZyBtYWNoIHBvcnRzKSBkb24ndCB3b3JrIGFmdGVyCiAgICAgICAgICAgICAgKiBhIGZvcmsuIFNvLCBub3cgdGhhdCB3ZSd2ZSBmb3JrZWQsIHdlIHJlLWV4ZWMgb3Vyc2VsZgogICAgICAgICAgICAgICogdG8gZW5zdXJlIHRoYXQgdGhlIGNoaWxkJ3MgbWFjaCBwb3J0cyBhcmUgYWxsIHNldCB1cCBjb3JyZWN0bHksCiAgICAgICAgICAgICAgKiB0aGUgZ2V0cHBpZCBjYWxsIGFib3ZlIHdpbGwgcHJldmVudCB0aGUgZXhlYyBjaGlsZCBmcm9tCiAgICAgICAgICAgICAgKiBmb3JraW5nLi4uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGNoYXIgKiBjb25zdCAqYXJndiA9ICpfTlNHZXRBcmd2ICgpOwogICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwicmUtZXhlY2luZyBmb3JrZWQgY2hpbGRcbiIpKTsKICAgICAgICAgICAgIGV4ZWN2IChwYXRoLCBhcmd2KTsKICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIkZvcmtlZCBjaGlsZCB1bmFibGUgdG8gcmUtZXhlYyAtICVzLlxuIiwgc3RyZXJyb3IgKGVycm5vKSk7CiAgICAgICAgICAgICBleGl0ICgwKTsKI2VuZGlmCiAgICAgICAgfQojZW5kaWYgLyogIVdJTjMyICovCiAgICB9CiNlbmRpZiAvKiBIQVZFX0ZPUksgKi8KICAgIHJldHVybiBpOwp9CgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCiAqLwojaWZkZWYJCQkJCQkJV0lOMzIKaW5fYWRkcl90CmdldF9teWFkZHIodm9pZCkKewogICAgY2hhciAgICAgICAgICAgIGxvY2FsX2hvc3RbMTMwXTsKICAgIGludCAgICAgICAgICAgICByZXN1bHQ7CiAgICBMUEhPU1RFTlQgICAgICAgbHBzdEhvc3RlbnQ7CiAgICBTT0NLQUREUl9JTiAgICAgaW5fYWRkciwgcmVtb3RlX2luX2FkZHI7CiAgICBTT0NLRVQgICAgICAgICAgaFNvY2s7CiAgICBpbnQgICAgICAgICAgICAgbkFkZHJTaXplID0gc2l6ZW9mKFNPQ0tBRERSKTsKCiAgICBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CgogICAgcmVzdWx0ID0gZ2V0aG9zdG5hbWUobG9jYWxfaG9zdCwgc2l6ZW9mKGxvY2FsX2hvc3QpKTsKICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgIGxwc3RIb3N0ZW50ID0gZ2V0aG9zdGJ5bmFtZSgoTFBTVFIpIGxvY2FsX2hvc3QpOwogICAgICAgIGlmIChscHN0SG9zdGVudCkgewogICAgICAgICAgICBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9CiAgICAgICAgICAgICAgICAqKCh1X2xvbmcgRkFSICopIChscHN0SG9zdGVudC0+aF9hZGRyKSk7CiAgICAgICAgICAgIHJldHVybiAoKGluX2FkZHJfdCkgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogaWYgd2UgYXJlIGhlcmUsIHRoYW4gd2UgZG9uJ3QgaGF2ZSBob3N0IGFkZHIgCiAgICAgKi8KICAgIGhTb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogICAgaWYgKGhTb2NrICE9IElOVkFMSURfU09DS0VUKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjb25uZWN0IHRvIGFueSBwb3J0IGFuZCBhZGRyZXNzIAogICAgICAgICAqLwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoSVBQT1JUX0VDSE8pOwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMC4wLjAuMCIpOwogICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgIGNvbm5lY3QoaFNvY2ssIChMUFNPQ0tBRERSKSAmIHJlbW90ZV9pbl9hZGRyLAogICAgICAgICAgICAgICAgICAgIHNpemVvZihTT0NLQUREUikpOwogICAgICAgIGlmIChyZXN1bHQgIT0gU09DS0VUX0VSUk9SKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGdldCBsb2NhbCBpcCBhZGRyZXNzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0c29ja25hbWUoaFNvY2ssIChMUFNPQ0tBRERSKSAmIGluX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgRkFSICopICZuQWRkclNpemUpOwogICAgICAgIH0KICAgICAgICBjbG9zZXNvY2tldChoU29jayk7CiAgICB9CiAgICByZXR1cm4gKChpbl9hZGRyX3QpIGluX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKfQoKbG9uZwpnZXRfdXB0aW1lKHZvaWQpCnsKICAgIGxvbmcgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAwOwogICAgRFdPUkQgICAgICAgICAgIGJ1ZmZlcnNpemUgPSAoc2l6ZW9mKFBFUkZfREFUQV9CTE9DSykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBFUkZfT0JKRUNUX1RZUEUpKSwKICAgICAgICB0eXBlID0gUkVHX0VYUEFORF9TWjsKICAgIFBQRVJGX0RBVEFfQkxPQ0sgcGVyZmRhdGEgPSBOVUxMOwoKICAgIC8qCiAgICAgKiBtaW4gcmVxdWlyZW1lbnQgaXMgb25lIFBFUkZfREFUQV9CTE9DSyBwbHVzIG9uZSBQRVJGX09CSkVDVF9UWVBFIAogICAgICovCiAgICBwZXJmZGF0YSA9IChQUEVSRl9EQVRBX0JMT0NLKSBtYWxsb2MoYnVmZmVyc2l6ZSk7CiAgICBpZiAoIXBlcmZkYXRhKQogICAgICAgIHJldHVybiAwOwoKICAgIG1lbXNldChwZXJmZGF0YSwgMCwgYnVmZmVyc2l6ZSk7CgogICAgUmVnUXVlcnlWYWx1ZUV4KEhLRVlfUEVSRk9STUFOQ0VfREFUQSwKICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIiwgTlVMTCwgJnR5cGUsIChMUEJZVEUpIHBlcmZkYXRhLCAmYnVmZmVyc2l6ZSk7CgogICAgLyoKICAgICAqIHdlIGNhbiBub3QgcmVseSBvbiB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHRoZXJlIGlzIGFsd2F5cyBtb3JlIHNvCiAgICAgKiB3ZSBjaGVjayB0aGUgc2lnbmF0dXJlIAogICAgICovCgogICAgaWYgKHdjc25jbXAocGVyZmRhdGEtPlNpZ25hdHVyZSwgTCJQRVJGIiwgNCkgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogc2lnbmF0dXJlIG9rLCBhbmQgYWxsIHdlIG5lZWQgaXMgaW4gdGhlIGluIHRoZSBQRVJGX0RBVEFfQkxPQ0sgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuX3ZhbHVlID0gKGxvbmcpICgocGVyZmRhdGEtPlBlcmZUaW1lMTAwblNlYy5RdWFkUGFydCAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkdMT05HKSAxMDAwMDApKTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybl92YWx1ZSA9IEdldFRpY2tDb3VudCgpIC8gMTA7CgogICAgUmVnQ2xvc2VLZXkoSEtFWV9QRVJGT1JNQU5DRV9EQVRBKTsKICAgIGZyZWUocGVyZmRhdGEpOwoKICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cn0KCmNoYXIgICAgICAgICAgICoKd2luc29ja19zdGFydHVwKHZvaWQpCnsKICAgIFdPUkQgICAgICAgICAgICBWZXJzaW9uUmVxdWVzdGVkOwogICAgV1NBREFUQSAgICAgICAgIHN0V1NBRGF0YTsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RhdGljIGNoYXIgICAgIGVycm1zZ1sxMDBdOwoKCS8qIHdpbnNvY2sgMTogdXNlIE1BS0VXT1JEKDEsMSkgKi8KCS8qIHdpbnNvY2sgMjogdXNlIE1BS0VXT1JEKDIsMikgKi8KCiAgICBWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoMiwyKTsKICAgIGkgPSBXU0FTdGFydHVwKFZlcnNpb25SZXF1ZXN0ZWQsICZzdFdTQURhdGEpOwogICAgaWYgKGkgIT0gMCkgewogICAgICAgIGlmIChpID09IFdTQVZFUk5PVFNVUFBPUlRFRCkKICAgICAgICAgICAgc3ByaW50ZihlcnJtc2csCiAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBpbml0LiBzb2NrZXQgbGliLCBkb2VzIG5vdCBzdXBwb3J0IDEuMSIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBzcHJpbnRmKGVycm1zZywgIlNvY2tldCBTdGFydHVwIGVycm9yICVkIiwgaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoZXJybXNnKTsKICAgIH0KICAgIHJldHVybiAoTlVMTCk7Cn0KCnZvaWQKd2luc29ja19jbGVhbnVwKHZvaWQpCnsKICAgIFdTQUNsZWFudXAoKTsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhIFdJTjMyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogWFhYICBXaGF0IGlmIHdlIGhhdmUgbXVsdGlwbGUgYWRkcmVzc2VzPyAgT3Igbm8gYWRkcmVzc2VzIGZvciB0aGF0IG1hdHRlcj8KICogWFhYICBDb3VsZCBpdCBiZSBjb21wdXRlZCBvbmNlIHRoZW4gY2FjaGVkPyAgUHJvYmFibHkgbm90IHdvcnRoIGl0IChub3QKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdmVyeSBvZnRlbikuCiAqLwppbl9hZGRyX3QKZ2V0X215YWRkcih2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgc2QsIGksIGxhc3RsZW4gPSAwOwogICAgc3RydWN0IGlmY29uZiAgIGlmYzsKICAgIHN0cnVjdCBpZnJlcSAgICppZnJwID0gTlVMTDsKICAgIGluX2FkZHJfdCAgICAgICBhZGRyOwogICAgY2hhciAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CgogICAgaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIENvcGUgd2l0aCBsb3RzIG9mIGludGVyZmFjZXMgYW5kIGJyb2tlbm5lc3Mgb2YgaW9jdGwgU0lPQ0dJRkNPTkYgb24KICAgICAqIHNvbWUgcGxhdGZvcm1zOyBzZWUgVy4gUi4gU3RldmVucywgYGBVbml4IE5ldHdvcmsgUHJvZ3JhbW1pbmcgVm9sdW1lCiAgICAgKiBJJycsIHAuNDM1LiAgCiAgICAgKi8KCiAgICBmb3IgKGkgPSA4OzsgaSArPSA4KSB7CiAgICAgICAgYnVmID0gKGNoYXIgKikgY2FsbG9jKGksIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWZjLmlmY19sZW4gPSBpICogc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CiAgICAgICAgaWZjLmlmY19idWYgPSAoY2FkZHJfdCkgYnVmOwoKICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZDT05GLCAoY2hhciAqKSAmaWZjKSA8IDApIHsKICAgICAgICAgICAgaWYgKGVycm5vICE9IEVJTlZBTCB8fCBsYXN0bGVuICE9IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBTb21ldGhpbmcgaGFzIGdvbmUgZ2VudWluZWx5IHdyb25nLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaXQgY291bGQganVzdCBiZSB0aGF0IHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpZmMuaWZjX2xlbiA9PSBsYXN0bGVuKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIGxlbmd0aCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCB0aW1lOyB3ZSdyZSBkb25lLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RsZW4gPSBpZmMuaWZjX2xlbjsKICAgICAgICB9CiAgICAgICAgZnJlZShidWYpOwogICAgfQoKICAgIGZvciAoaWZycCA9IGlmYy5pZmNfcmVxOwogICAgICAgIChjaGFyICopaWZycCA8IChjaGFyICopaWZjLmlmY19yZXEgKyBpZmMuaWZjX2xlbjsKI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NBX0xFTgogICAgICAgIGlmcnAgPSAoc3RydWN0IGlmcmVxICopKCgoY2hhciAqKSBpZnJwKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlmcnAtPmlmcl9uYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZycC0+aWZyX2FkZHIuc2FfbGVuKQojZWxzZQogICAgICAgIGlmcnArKwojZW5kaWYKICAgICAgICApIHsKICAgICAgICBpZiAoaWZycC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGlmcnAtPmlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkcjsKCiAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopIGlmcnApIDwgMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKChpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfVVApCiNpZmRlZiBJRkZfUlVOTklORwogICAgICAgICAgICAmJiAoaWZycC0+aWZyX2ZsYWdzICYgSUZGX1JVTk5JTkcpCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUZGX1JVTk5JTkcgKi8KICAgICAgICAgICAgJiYgIShpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAgICAgICAgICAgICYmIGFkZHIgIT0gTE9PUEJBQ0spIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSSAqcmVhbGx5KiBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4gIFBlcmhhcHMgZm9yCiAgICAgICAgICAgICAqIHNvbWUgYnJva2VuIHBsYXRmb3JtPyAgTGVhdmUgaXQgZm9yIG5vdy4gIEpCUE4gIAogICAgICAgICAgICAgKi8KI2lmZGVmIFNZU19JT0NUTF9IX0hBU19TSU9DR0lGQUREUgogICAgICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZBRERSLCAoY2hhciAqKSBpZnJwKSA8IDApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZHIgPQogICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZnJwLT5pZnJfYWRkcikpLT5zaW5fYWRkci4KICAgICAgICAgICAgICAgIHNfYWRkcjsKI2VuZGlmCiAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gYWRkcjsKICAgICAgICB9CiAgICB9CiAgICBmcmVlKGJ1Zik7CiAgICBjbG9zZShzZCk7CiAgICByZXR1cm4gMDsKfQoKCiNpZiAhZGVmaW5lZChzb2xhcmlzMikgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGN5Z3dpbikKLyoKICogUmV0dXJucyBib290dGltZSBpbiBjZW50aXNlY29uZHMoISkuCiAqICAgICAgQ2FjaGVzIHRoaXMgZm9yIGZ1dHVyZSB1c2UuCiAqLwpsb25nCmdldF9ib290dGltZSh2b2lkKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgYm9vdHRpbWVfY3NlY3MgPSAwOwojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IHBzdF9zdGF0aWMgcHN0X2J1ZjsKI2Vsc2UKICAgIHN0cnVjdCB0aW1ldmFsICBib290dGltZTsKI2lmZGVmCU5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIGludCAgICAgICAgICAgICBtaWJbMl07CiAgICBzaXplX3QgICAgICAgICAgbGVuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9OTElTVCkKICAgIGludCAgICAgICAgICAgICBrbWVtOwogICAgc3RhdGljIHN0cnVjdCBubGlzdCBubFtdID0gewojaWYgIWRlZmluZWQoaHB1eCkKICAgICAgICB7KGNoYXIgKikgIl9ib290dGltZSJ9LAojZWxzZQogICAgICAgIHsoY2hhciAqKSAiYm9vdHRpbWUifSwKI2VuZGlmCiAgICAgICAgeyhjaGFyICopICIifQogICAgfTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDEwIHx8IGhwdXggMTEgKi8KCgogICAgaWYgKGJvb3R0aW1lX2NzZWNzICE9IDApCiAgICAgICAgcmV0dXJuIChib290dGltZV9jc2Vjcyk7CgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgcHN0YXRfZ2V0c3RhdGljKCZwc3RfYnVmLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0aWMpLCAxLCAwKTsKICAgIGJvb3R0aW1lX2NzZWNzID0gcHN0X2J1Zi5ib290X3RpbWUgKiAxMDA7CiNlbGlmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIG1pYlswXSA9IENUTF9LRVJOOwogICAgbWliWzFdID0gS0VSTl9CT09UVElNRTsKCiAgICBsZW4gPSBzaXplb2YoYm9vdHRpbWUpOwoKICAgIHN5c2N0bChtaWIsIDIsICZib290dGltZSwgJmxlbiwgTlVMTCwgMCk7CiAgICBib290dGltZV9jc2VjcyA9IChib290dGltZS50dl9zZWMgKiAxMDApICsgKGJvb3R0aW1lLnR2X3VzZWMgLyAxMDAwMCk7CiNlbGlmIGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX05MSVNUKQogICAgaWYgKChrbWVtID0gb3BlbigiL2Rldi9rbWVtIiwgMCkpIDwgMCkKICAgICAgICByZXR1cm4gMDsKICAgIG5saXN0KEtFUk5FTF9MT0MsIG5sKTsKICAgIGlmIChubFswXS5uX3R5cGUgPT0gMCkgewogICAgICAgIGNsb3NlKGttZW0pOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGxzZWVrKGttZW0sIChsb25nKSBubFswXS5uX3ZhbHVlLCBMX1NFVCk7CiAgICByZWFkKGttZW0sICZib290dGltZSwgc2l6ZW9mKGJvb3R0aW1lKSk7CiAgICBjbG9zZShrbWVtKTsKICAgIGJvb3R0aW1lX2NzZWNzID0gKGJvb3R0aW1lLnR2X3NlYyAqIDEwMCkgKyAoYm9vdHRpbWUudHZfdXNlYyAvIDEwMDAwKTsKI2Vsc2UKICAgIHJldHVybiAwOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMCB8fCBocHV4IDExICovCgogICAgcmV0dXJuIChib290dGltZV9jc2Vjcyk7Cn0KI2VuZGlmCgovKioKICogUmV0dXJucyB0aGUgc3lzdGVtIHVwdGltZSBpbiBjZW50aXNlY29uZHMuCiAqCiAqIEBub3RlIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBpZGVudGljYWwgdG8gc3lzVXBUaW1lCiAqICAgZGVmaW5lZCBpbiBSRkMgMTIxMy4gZ2V0X3VwdGltZSgpIHJldHVybnMgdGhlIHN5c3RlbSB1cHRpbWUgd2hpbGUKICogICBzeXNVcFRpbWUgcmVwcmVzZW50cyB0aGUgdGltZSB0aGF0IGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBtb3N0IHJlY2VudAogKiAgIHJlc3RhcnQgb2YgdGhlIG5ldHdvcmsgbWFuYWdlciAoc25tcGQpLgogKgogKiBAc2VlIFNlZSBhbHNvIG5ldHNubXBfZ2V0X2FnZW50X3VwdGltZSgpLgogKi8KbG9uZwpnZXRfdXB0aW1lKHZvaWQpCnsKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgIHN0cnVjdCBubGlzdCBubDsKICAgIGludCBrbWVtOwogICAgdGltZV90IGxib2x0OwogICAgbmwubl9uYW1lID0gImxib2x0IjsKICAgIGlmKGtubGlzdCgmbmwsIDEsIHNpemVvZihzdHJ1Y3Qgbmxpc3QpKSAhPSAwKSByZXR1cm4oMCk7CiAgICBpZihubC5uX3R5cGUgPT0gMCB8fCBubC5uX3ZhbHVlID09IDApIHJldHVybigwKTsKICAgIGlmKChrbWVtID0gb3BlbigiL2Rldi9tZW0iLCAwKSkgPCAwKSByZXR1cm4gMDsKICAgIGxzZWVrKGttZW0sIChsb25nKSBubC5uX3ZhbHVlLCBMX1NFVCk7CiAgICByZWFkKGttZW0sICZsYm9sdCwgc2l6ZW9mKGxib2x0KSk7CiAgICBjbG9zZShrbWVtKTsKICAgIHJldHVybihsYm9sdCk7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiAgICBrc3RhdF9jdGxfdCAgICAqa3NjID0ga3N0YXRfb3BlbigpOwogICAga3N0YXRfdCAgICAgICAgKmtzOwogICAga2lkX3QgICAgICAgICAgIGtpZDsKICAgIGtzdGF0X25hbWVkX3QgICpuYW1lZDsKICAgIHVfbG9uZyAgICAgICAgICBsYm9sdCA9IDA7CgogICAgaWYgKGtzYykgewogICAgICAgIGtzID0ga3N0YXRfbG9va3VwKGtzYywgInVuaXgiLCAtMSwgInN5c3RlbV9taXNjIik7CiAgICAgICAgaWYgKGtzKSB7CiAgICAgICAgICAgIGtpZCA9IGtzdGF0X3JlYWQoa3NjLCBrcywgTlVMTCk7CiAgICAgICAgICAgIGlmIChraWQgIT0gLTEpIHsKICAgICAgICAgICAgICAgIG5hbWVkID0ga3N0YXRfZGF0YV9sb29rdXAoa3MsICJsYm9sdCIpOwogICAgICAgICAgICAgICAgaWYgKG5hbWVkKSB7CiNpZmRlZiBLU1RBVF9EQVRBX1VJTlQzMgogICAgICAgICAgICAgICAgICAgIGxib2x0ID0gbmFtZWQtPnZhbHVlLnVpMzI7CiNlbHNlCiAgICAgICAgICAgICAgICAgICAgbGJvbHQgPSBuYW1lZC0+dmFsdWUudWw7CiNlbmRpZgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGtzdGF0X2Nsb3NlKGtzYyk7CiAgICB9CiAgICByZXR1cm4gbGJvbHQ7CiNlbGlmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoY3lnd2luKQogICAgRklMRSAgICAgICAgICAgKmluID0gZm9wZW4oIi9wcm9jL3VwdGltZSIsICJyIik7CiAgICBsb25nICAgICAgICAgICAgdXB0aW0gPSAwLCBhLCBiOwogICAgaWYgKGluKSB7CiAgICAgICAgaWYgKDIgPT0gZnNjYW5mKGluLCAiJWxkLiVsZCIsICZhLCAmYikpCiAgICAgICAgICAgIHVwdGltID0gYSAqIDEwMCArIGI7CiAgICAgICAgZmNsb3NlKGluKTsKICAgIH0KICAgIHJldHVybiB1cHRpbTsKI2Vsc2UKICAgIHN0cnVjdCB0aW1ldmFsICBub3c7CiAgICBsb25nICAgICAgICAgICAgYm9vdHRpbWVfY3NlY3MsIG5vd3RpbWVfY3NlY3M7CgogICAgYm9vdHRpbWVfY3NlY3MgPSBnZXRfYm9vdHRpbWUoKTsKICAgIGlmIChib290dGltZV9jc2VjcyA9PSAwKQogICAgICAgIHJldHVybiAwOwogICAgZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CiAgICBub3d0aW1lX2NzZWNzID0gKG5vdy50dl9zZWMgKiAxMDApICsgKG5vdy50dl91c2VjIC8gMTAwMDApOwoKICAgIHJldHVybiAobm93dGltZV9jc2VjcyAtIGJvb3R0aW1lX2NzZWNzKTsKI2VuZGlmCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogISBXSU4zMiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZmRlZiBETlNTRUNfTE9DQUxfVkFMSURBVElPTgpzdGF0aWMgdmFsX2NvbnRleHRfdCAqX3ZhbF9jb250ZXh0ID0gTlVMTDsKCnN0YXRpYyB2YWxfY29udGV4dF90ICoKbmV0c25tcF92YWxpZGF0b3JfY29udGV4dCh2b2lkKQp7CiAgICBpZiAoTlVMTCA9PSBfdmFsX2NvbnRleHQpIHsKICAgICAgICBpbnQgcmM7CiAgICAgICAgY2hhciAqYXBwdHlwZSA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQVFlQRSk7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpzZWM6Y29udGV4dCIsICJjcmVhdGluZyBkbnNzZWMgY29udGV4dCBmb3IgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgYXBwdHlwZSkpOwogICAgICAgIHJjID0gdmFsX2NyZWF0ZV9jb250ZXh0KGFwcHR5cGUsICZfdmFsX2NvbnRleHQpOwogICAgfQoKICAgIHJldHVybiBfdmFsX2NvbnRleHQ7Cn0KI2VuZGlmIC8qIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OICovCgppbnQKbmV0c25tcF9nZXRob3N0YnluYW1lX3Y0KGNvbnN0IGNoYXIqIG5hbWUsIGluX2FkZHJfdCAqYWRkcl9vdXQpCnsKI2lmIEhBVkVfR0VUQUREUklORk8KICAgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcnMgPSBOVUxMOwogICAgc3RydWN0IGFkZHJpbmZvIGhpbnQ7CiAgICBpbnQgICAgICAgICAgICAgZXJyOwoKICAgIG1lbXNldCgmaGludCwgMCwgc2l6ZW9mIGhpbnQpOwogICAgaGludC5haV9mbGFncyA9IDA7CiAgICBoaW50LmFpX2ZhbWlseSA9IFBGX0lORVQ7CiAgICBoaW50LmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKICAgIGhpbnQuYWlfcHJvdG9jb2wgPSAwOwoKICAgIGVyciA9IG5ldHNubXBfZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnQsICZhZGRycyk7CiAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKGFkZHJzICE9IE5VTEwpIHsKICAgICAgICBtZW1jcHkoYWRkcl9vdXQsCiAgICAgICAgICAgICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBhZGRycy0+YWlfYWRkciktPnNpbl9hZGRyLAogICAgICAgICAgICAgICBzaXplb2YoaW5fYWRkcl90KSk7CiAgICAgICAgZnJlZWFkZHJpbmZvKGFkZHJzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIElQdjQgaG9zdG5hbWVcbiIpKTsKICAgIH0KICAgIHJldHVybiAwOwoKI2VsaWYgSEFWRV9HRVRIT1NUQllOQU1FCiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwoKICAgIGhwID0gbmV0c25tcF9nZXRob3N0YnluYW1lKG5hbWUpOwogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKGNvdWxkbid0IHJlc29sdmUpXG4iKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIGlmIChocC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChub3QgQUZfSU5FVCEpXG4iKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKHJlc29sdmVkIG9rYXkpXG4iKSk7CiAgICAgICAgbWVtY3B5KGFkZHJfb3V0LCBocC0+aF9hZGRyLCBzaXplb2YoaW5fYWRkcl90KSk7CiAgICB9CiAgICByZXR1cm4gMDsKCiNlbGlmIEhBVkVfR0VUSVBOT0RFQllOQU1FCiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIGVycjsKCiAgICBocCA9IGdldGlwbm9kZWJ5bmFtZShwZWVybmFtZSwgQUZfSU5FVCwgMCwgJmVycik7CiAgICBpZiAoaHAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAoY291bGRuJ3QgcmVzb2x2ZSA9ICVkKVxuIiwgZXJyKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKHJlc29sdmVkIG9rYXkpXG4iKSk7CiAgICBtZW1jcHkoYWRkcl9vdXQsIGhwLT5oX2FkZHIsIHNpemVvZihpbl9hZGRyX3QpKTsKICAgIHJldHVybiAwOwoKI2Vsc2UgLyogSEFWRV9HRVRJUE5PREVCWU5BTUUgKi8KICAgIHJldHVybiAtMTsKI2VuZGlmCn0KCmludApuZXRzbm1wX2dldGFkZHJpbmZvKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywgc3RydWN0IGFkZHJpbmZvICoqcmVzKQp7CiNpZiBIQVZFX0dFVEFERFJJTkZPCiAgICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJzID0gTlVMTDsKICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50OwogICAgaW50ICAgICAgICAgICAgIGVycjsKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiAgICB2YWxfc3RhdHVzX3QgICAgdmFsX3N0YXR1czsKI2VuZGlmCgogICAgREVCVUdNU0dUTCgoImRuczpnZXRhZGRyaW5mbyIsICJsb29raW5nIHVwICIpKTsKICAgIGlmIChuYW1lKQogICAgICAgIERFQlVHTVNHKCgiZG5zOmdldGFkZHJpbmZvIiwgIlwiJXNcIiIsIG5hbWUpKTsKICAgIGVsc2UKICAgICAgICBERUJVR01TRygoImRuczpnZXRhZGRyaW5mbyIsICI8TlVMTD4iKSk7CgogICAgaWYgKHNlcnZpY2UpCglERUJVR01TRygoImRuczpnZXRhZGRyaW5mbyIsICI6XCIlc1wiIiwgc2VydmljZSkpOwoKICAgIGlmIChoaW50cykKCURFQlVHTVNHKCgiZG5zOmdldGFkZHJpbmZvIiwgIiB3aXRoIGhpbnQgKHsgLi4uIH0pIikpOwogICAgZWxzZQoJREVCVUdNU0coKCJkbnM6Z2V0YWRkcmluZm8iLCAiIHdpdGggbm8gaGludCIpKTsKCiAgICBERUJVR01TRygoImRuczpnZXRhZGRyaW5mbyIsICJcbiIpKTsKCiAgICBpZiAoTlVMTCA9PSBoaW50cykgewogICAgICAgIG1lbXNldCgmaGludCwgMCwgc2l6ZW9mIGhpbnQpOwogICAgICAgIGhpbnQuYWlfZmxhZ3MgPSAwOwogICAgICAgIGhpbnQuYWlfZmFtaWx5ID0gUEZfSU5FVDsKICAgICAgICBoaW50LmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKICAgICAgICBoaW50LmFpX3Byb3RvY29sID0gMDsKICAgICAgICBoaW50cyA9ICZoaW50OwogICAgfSBlbHNlIHsKICAgICAgICBtZW1jcHkoJmhpbnQsIGhpbnRzLCBzaXplb2YgaGludCk7CiAgICB9CgojaWZuZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiAgICBlcnIgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludCwgJmFkZHJzKTsKI2Vsc2UgLyogRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04gKi8KICAgIGVyciA9IHZhbF9nZXRhZGRyaW5mbyhuZXRzbm1wX3ZhbGlkYXRvcl9jb250ZXh0KCksIG5hbWUsIE5VTEwsICZoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRycywgJnZhbF9zdGF0dXMpOwogICAgREVCVUdNU0dUTCgoImRuczpzZWM6dmFsIiwgImVyciAlZCwgdmFsX3N0YXR1cyAlZCAvICVzOyB0cnVzdGVkOiAlZFxuIiwKICAgICAgICAgICAgICAgIGVyciwgdmFsX3N0YXR1cywgcF92YWxfc3RhdHVzKHZhbF9zdGF0dXMpLAogICAgICAgICAgICAgICAgdmFsX2lzdHJ1c3RlZCh2YWxfc3RhdHVzKSkpOwogICAgaWYgKCEgdmFsX2lzdHJ1c3RlZCh2YWxfc3RhdHVzKSkgewogICAgICAgIGludCByYzsKICAgICAgICBpZiAoKGVyciAhPSAwKSAmJiBWQUxfR0VUQUREUklORk9fSEFTX1NUQVRVUyhlcnIpKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogVU5UUlVTVEVEIGVycm9yIGluIEROUyByZXNvbHV0aW9uIGZvciAlcyFcbiIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgICByYyA9IEVBSV9GQUlMOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAiVGhlIGF1dGhlbnRpY2l0eSBvZiBETlMgcmVzcG9uc2UgaXMgbm90IHRydXN0ZWQgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgcF92YWxfc3RhdHVzKHZhbF9zdGF0dXMpKTsKICAgICAgICAgICAgcmMgPSBFQUlfTk9OQU1FOwogICAgICAgIH0KICAgICAgICAvKiogY29udGludWUgYW55d2F5cyBpZiBETlNTRUNfV0FSTl9PTkxZIGlzIHNldCAqLwogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ETlNTRUNfV0FSTl9PTkxZKSkKICAgICAgICAgICAgcmV0dXJuIHJjOwogICAgfQoKCiNlbmRpZiAvKiBETlNTRUNfTE9DQUxfVkFMSURBVElPTiAqLwogICAgKnJlcyA9IGFkZHJzOwogICAgaWYgKCgwID09IGVycikgJiYgYWRkcnMgJiYgYWRkcnMtPmFpX2FkZHIpIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGFkZHJpbmZvIiwgImFuc3dlciB7IEFGX0lORVQsICVzOiVodSB9XG4iLAogICAgICAgICAgICAgICAgICAgIGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkcnMtPmFpX2FkZHIpLT5zaW5fYWRkciksCiAgICAgICAgICAgICAgICAgICAgbnRvaHMoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWFkZHJzLT5haV9hZGRyKS0+c2luX3BvcnQpKSk7CiAgICB9CiAgICByZXR1cm4gZXJyOwojZWxzZQogICAgTkVUU05NUF9MT0dPTkNFKChMT0dfRVJSLCAiZ2V0YWRkcmluZm8gbm90IGF2YWlsYWJsZSIpKTsKICAgIHJldHVybiBFQUlfRkFJTDsKI2VuZGlmIC8qIGdldGFkZHJpbmZvICovCn0KCnN0cnVjdCBob3N0ZW50ICoKbmV0c25tcF9nZXRob3N0YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCnsKI2lmIEhBVkVfR0VUSE9TVEJZTkFNRQojaWZkZWYgRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04KICAgIHZhbF9zdGF0dXNfdCB2YWxfc3RhdHVzOwojZW5kaWYKICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CgogICAgaWYgKE5VTEwgPT0gbmFtZSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieW5hbWUiLCAibG9va2luZyB1cCAlc1xuIiwgbmFtZSkpOwoKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiAgICBocCAgPSB2YWxfZ2V0aG9zdGJ5bmFtZShuZXRzbm1wX3ZhbGlkYXRvcl9jb250ZXh0KCksIG5hbWUsICZ2YWxfc3RhdHVzKTsKICAgIERFQlVHTVNHVEwoKCJkbnM6c2VjOnZhbCIsICJ2YWxfc3RhdHVzICVkIC8gJXM7IHRydXN0ZWQ6ICVkXG4iLAogICAgICAgICAgICAgICAgdmFsX3N0YXR1cywgcF92YWxfc3RhdHVzKHZhbF9zdGF0dXMpLAogICAgICAgICAgICAgICAgdmFsX2lzdHJ1c3RlZCh2YWxfc3RhdHVzKSkpOwogICAgaWYgKCF2YWxfaXN0cnVzdGVkKHZhbF9zdGF0dXMpKSB7CiAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgIlRoZSBhdXRoZW50aWNpdHkgb2YgRE5TIHJlc3BvbnNlIGlzIG5vdCB0cnVzdGVkICglcylcbiIsCiAgICAgICAgICAgICAgICAgcF92YWxfc3RhdHVzKHZhbF9zdGF0dXMpKTsKICAgICAgICAvKiogY29udGludWUgYW55d2F5cyBpZiBETlNTRUNfV0FSTl9PTkxZIGlzIHNldCAqLwogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ETlNTRUNfV0FSTl9PTkxZKSkKICAgICAgICAgICAgaHAgPSBOVUxMOwogICAgfQogICAgZWxzZSBpZiAodmFsX2RvZXNfbm90X2V4aXN0KHZhbF9zdGF0dXMpICYmIGhwKQogICAgICAgIGhwID0gTlVMTDsKI2Vsc2UKICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKI2VuZGlmCiAgICBpZiAoaHAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5bmFtZSIsCiAgICAgICAgICAgICAgICAgICAgImNvdWxkbid0IHJlc29sdmUgJXNcbiIsIG5hbWUpKTsKICAgIH0gZWxzZSBpZiAoaHAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5bmFtZSIsCiAgICAgICAgICAgICAgICAgICAgIndhcm5pbmc6IHJlc3BvbnNlIGZvciAlcyBub3QgQUZfSU5FVCFcbiIsIG5hbWUpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnluYW1lIiwKICAgICAgICAgICAgICAgICAgICAiJXMgcmVzb2x2ZWQgb2theVxuIiwgbmFtZSkpOwogICAgfQogICAgcmV0dXJuIGhwOwojZWxzZQogICAgTkVUU05NUF9MT0dPTkNFKChMT0dfRVJSLCAiZ2V0aG9zdGJ5bmFtZSBub3QgYXZhaWxhYmxlIikpOwogICAgcmV0dXJuIE5VTEw7CiNlbmRpZiAvKiBIQVZFX0dFVEhPU1RCWU5BTUUgKi8KfQoKLyoqCiAqIExvb2sgdXAgdGhlIGhvc3QgbmFtZSB2aWEgRE5TLgogKgogKiBAcGFyYW1baW5dIGFkZHIgUG9pbnRlciB0byB0aGUgYWRkcmVzcyB0byByZXNvbHZlLiBUaGlzIGFyZ3VtZW50IHBvaW50cyBlLmcuCiAqICAgdG8gYSBzdHJ1Y3QgaW5fYWRkciBmb3IgQUZfSU5FVCBvciB0byBhIHN0cnVjdCBpbjZfYWRkciBmb3IgQUZfSU5FVDYuCiAqIEBwYXJhbVtpbl0gbGVuICBMZW5ndGggaW4gYnl0ZXMgb2YgKmFkZHIuCiAqIEBwYXJhbVtpbl0gdHlwZSBBZGRyZXNzIGZhbWlseSwgZS5nLiBBRl9JTkVUIG9yIEFGX0lORVQ2LgogKgogKiBAcmV0dXJuIFBvaW50ZXIgdG8gYSBob3N0ZW50IHN0cnVjdHVyZSBpZiBhZGRyZXNzIGxvb2t1cCBzdWNjZWVkZWQgb3IgTlVMTAogKiAgIGlmIHRoZSBsb29rdXAgZmFpbGVkLgogKgogKiBAc2VlIFNlZSBhbHNvIHRoZSBnZXRob3N0YnlhZGRyKCkgbWFuIHBhZ2UuCiAqLwpzdHJ1Y3QgaG9zdGVudCAqCm5ldHNubXBfZ2V0aG9zdGJ5YWRkcihjb25zdCB2b2lkICphZGRyLCBzb2NrbGVuX3QgbGVuLCBpbnQgdHlwZSkKewojaWYgSEFWRV9HRVRIT1NUQllBRERSCiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwogICAgY2hhciBidWZbNjRdOwoKICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5YWRkciIsICJyZXNvbHZpbmcgJXNcbiIsCiAgICAgICAgICAgICAgICBpbmV0X250b3AodHlwZSwgYWRkciwgYnVmLCBzaXplb2YoYnVmKSkpKTsKCiNpZmRlZiBETlNTRUNfTE9DQUxfVkFMSURBVElPTgogICAgdmFsX3N0YXR1c190IHZhbF9zdGF0dXM7CiAgICBocCA9IHZhbF9nZXRob3N0YnlhZGRyKG5ldHNubXBfdmFsaWRhdG9yX2NvbnRleHQoKSwgYWRkciwgbGVuLCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsX3N0YXR1cyk7CiAgICBERUJVR01TR1RMKCgiZG5zOnNlYzp2YWwiLCAidmFsX3N0YXR1cyAlZCAvICVzOyB0cnVzdGVkOiAlZFxuIiwKICAgICAgICAgICAgICAgIHZhbF9zdGF0dXMsIHBfdmFsX3N0YXR1cyh2YWxfc3RhdHVzKSwKICAgICAgICAgICAgICAgIHZhbF9pc3RydXN0ZWQodmFsX3N0YXR1cykpKTsKICAgIGlmICghdmFsX2lzdHJ1c3RlZCh2YWxfc3RhdHVzKSkgewogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICJUaGUgYXV0aGVudGljaXR5IG9mIEROUyByZXNwb25zZSBpcyBub3QgdHJ1c3RlZCAoJXMpXG4iLAogICAgICAgICAgICAgICAgIHBfdmFsX3N0YXR1cyh2YWxfc3RhdHVzKSk7CiAgICAgICAgLyoqIGNvbnRpbnVlIGFueXdheXMgaWYgRE5TU0VDX1dBUk5fT05MWSBpcyBzZXQgKi8KICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE5TU0VDX1dBUk5fT05MWSkpCiAgICAgICAgICAgIGhwID0gTlVMTDsKICAgIH0KICAgIGVsc2UgaWYgKHZhbF9kb2VzX25vdF9leGlzdCh2YWxfc3RhdHVzKSAmJiBocCkKICAgICAgICBocCA9IE5VTEw7CiNlbHNlCiAgICBocCA9IGdldGhvc3RieWFkZHIoYWRkciwgbGVuLCB0eXBlKTsKI2VuZGlmCiAgICBpZiAoaHAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5YWRkciIsICJjb3VsZG4ndCByZXNvbHZlIGFkZHJcbiIpKTsKICAgIH0gZWxzZSBpZiAoaHAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5YWRkciIsCiAgICAgICAgICAgICAgICAgICAgIndhcm5pbmc6IHJlc3BvbnNlIGZvciBhZGRyIG5vdCBBRl9JTkVUIVxuIikpOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieWFkZHIiLCAiYWRkciByZXNvbHZlZCBva2F5XG4iKSk7CiAgICB9CiAgICByZXR1cm4gaHA7CiNlbHNlCiAgICBORVRTTk1QX0xPR09OQ0UoKExPR19FUlIsICJnZXRob3N0YnlhZGRyIG5vdCBhdmFpbGFibGUiKSk7CiAgICByZXR1cm4gTlVMTDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBIQVZFX1NUUk5DQVNFQ01QCgovKgogKiB0ZXN0IGZvciBOVUxMIHBvaW50ZXJzIGJlZm9yZSBhbmQgTlVMTCBjaGFyYWN0ZXJzIGFmdGVyCiAqICogY29tcGFyaW5nIHBvc3NpYmx5IG5vbi1OVUxMIHN0cmluZ3MuCiAqICogV0FSTklORzogVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBjaGVjayBmb3IgYXJyYXkgb3ZlcmZsb3cuCiAqLwppbnQKc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbmNoKQp7CiAgICBzaXplX3QgICAgICAgICAgaWk7CiAgICBpbnQgICAgICAgICAgICAgcmVzID0gLTE7CgogICAgaWYgKCFzMSkgewogICAgICAgIGlmICghczIpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQogICAgaWYgKCFzMikKICAgICAgICByZXR1cm4gKDEpOwoKICAgIGZvciAoaWkgPSAwOyAoaWkgPCBuY2gpICYmICpzMSAmJiAqczI7IGlpKyssIHMxKyssIHMyKyspIHsKICAgICAgICByZXMgPSAoaW50KSAodG9sb3dlcigqczEpIC0gdG9sb3dlcigqczIpKTsKICAgICAgICBpZiAocmVzICE9IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmIChpaSA9PSBuY2gpIHsKICAgICAgICBzMS0tOwogICAgICAgIHMyLS07CiAgICB9CgogICAgaWYgKCEqczEpIHsKICAgICAgICBpZiAoISpzMikKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICBpZiAoISpzMikKICAgICAgICByZXR1cm4gKDEpOwoKICAgIHJldHVybiAocmVzKTsKfQoKaW50CnN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQp7CiAgICByZXR1cm4gc3RybmNhc2VjbXAoczEsIHMyLCAxMDAwMDAwKTsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX1NUUk5DQVNFQ01QICovCgoKI2lmbmRlZiBIQVZFX1NUUkRVUApjaGFyICAgICAgICAgICAqCnN0cmR1cChjb25zdCBjaGFyICpzcmMpCnsKICAgIGludCAgICAgICAgICAgICBsZW47CiAgICBjaGFyICAgICAgICAgICAqZHN0OwoKICAgIGxlbiA9IHN0cmxlbihzcmMpICsgMTsKICAgIGlmICgoZHN0ID0gKGNoYXIgKikgbWFsbG9jKGxlbikpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHN0cmNweShkc3QsIHNyYyk7CiAgICByZXR1cm4gKGRzdCk7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX1NUUkRVUCAqLwoKI2lmbmRlZiBIQVZFX1NFVEVOVgppbnQKc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgb3ZlcndyaXRlKQp7CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIGlmIChvdmVyd3JpdGUgPT0gMCkgewogICAgICAgIGlmIChnZXRlbnYobmFtZSkpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQogICAgY3AgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKG5hbWUpICsgc3RybGVuKHZhbHVlKSArIDIpOwogICAgaWYgKGNwID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwogICAgc3ByaW50ZihjcCwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOwogICAgcmV0ID0gcHV0ZW52KGNwKTsKI2lmZGVmIFdJTjMyCiAgICBmcmVlKGNwKTsKI2VuZGlmCiAgICByZXR1cm4gcmV0Owp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TRVRFTlYgKi8KCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihjYWxjdWxhdGVfdGltZV9kaWZmLCBuZXRzbm1wX3VudXNlZCkKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0NBTENVTEFURV9USU1FX0RJRkYKLyoqCiAqIENvbXB1dGUgKCpub3cgLSAqdGhlbikgaW4gY2VudGlzZWNvbmRzLgogKi8KaW50CmNhbGN1bGF0ZV90aW1lX2RpZmYoY29uc3Qgc3RydWN0IHRpbWV2YWwgKm5vdywgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRoZW4pCnsKICAgIHN0cnVjdCB0aW1ldmFsICBkaWZmOwoKICAgIE5FVFNOTVBfVElNRVJTVUIobm93LCB0aGVuLCAmZGlmZik7CiAgICByZXR1cm4gKGludCkoZGlmZi50dl9zZWMgKiAxMDAgKyBkaWZmLnR2X3VzZWMgLyAxMDAwMCk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMQ1VMQVRFX1RJTUVfRElGRiAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0NBTENVTEFURV9TRUNUSU1FX0RJRkYKLyoqIENvbXB1dGUgcm91bmRlZCAoKm5vdyAtICp0aGVuKSBpbiBzZWNvbmRzLiAqLwp1X2ludApjYWxjdWxhdGVfc2VjdGltZV9kaWZmKGNvbnN0IHN0cnVjdCB0aW1ldmFsICpub3csIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0aGVuKQp7CiAgICBzdHJ1Y3QgdGltZXZhbCAgZGlmZjsKCiAgICBORVRTTk1QX1RJTUVSU1VCKG5vdywgdGhlbiwgJmRpZmYpOwogICAgcmV0dXJuIGRpZmYudHZfc2VjICsgKGRpZmYudHZfdXNlYyA+PSA1MDAwMDBMKTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9DQUxDVUxBVEVfU0VDVElNRV9ESUZGICovCgojaWZuZGVmIEhBVkVfU1RSQ0FTRVNUUgovKgogKiBvbmx5IGdsaWJjMiBoYXMgdGhpcy4KICovCmNoYXIgICAgICAgICAgICoKc3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3AxID0gaGF5c3RhY2ssICpjcDIgPSBuZWVkbGU7CiAgICBjb25zdCBjaGFyICAgICAqY3g7CiAgICBpbnQgICAgICAgICAgICAgdHN0Y2gxLCB0c3RjaDI7CgogICAgLyoKICAgICAqIHByaW50ZigibG9va2luZyBmb3IgJyVzJyBpbiAnJXMnXG4iLCBuZWVkbGUsIGhheXN0YWNrKTsgCiAgICAgKi8KICAgIGlmIChjcDEgJiYgY3AyICYmICpjcDEgJiYgKmNwMikKICAgICAgICBmb3IgKGNwMSA9IGhheXN0YWNrLCBjcDIgPSBuZWVkbGU7ICpjcDE7KSB7CiAgICAgICAgICAgIGN4ID0gY3AxOwogICAgICAgICAgICBjcDIgPSBuZWVkbGU7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBwcmludGYoIlQnJWMnICIsICpjcDEpOyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCEqY3AyKSB7ICAgIC8qIGZvdW5kIHRoZSBuZWVkbGUgKi8KICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIHByaW50ZigiXG5mb3VuZCAnJXMnIGluICclcydcbiIsIG5lZWRsZSwgY3gpOyAKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBjeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoISpjcDEpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgdHN0Y2gxID0gdG91cHBlcigqY3AxKTsKICAgICAgICAgICAgICAgIHRzdGNoMiA9IHRvdXBwZXIoKmNwMik7CiAgICAgICAgICAgICAgICBpZiAodHN0Y2gxICE9IHRzdGNoMikKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBwcmludGYoIk0nJWMnICIsICpjcDEpOyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY3AxKys7CiAgICAgICAgICAgICAgICBjcDIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoMSk7CiAgICAgICAgICAgIGlmICgqY3AxKQogICAgICAgICAgICAgICAgY3AxKys7CiAgICAgICAgfQogICAgLyoKICAgICAqIHByaW50ZigiXG4iKTsgCiAgICAgKi8KICAgIGlmIChjcDEgJiYgKmNwMSkKICAgICAgICByZXR1cm4gTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBjcDEpOwoKICAgIHJldHVybiBOVUxMOwp9CiNlbmRpZgoKaW50Cm1rZGlyaGllcihjb25zdCBjaGFyICpwYXRobmFtZSwgbW9kZV90IG1vZGUsIGludCBza2lwbGFzdCkKewogICAgc3RydWN0IHN0YXQgICAgIHNidWY7CiAgICBjaGFyICAgICAgICAgICAqb3VyY29weSA9IHN0cmR1cChwYXRobmFtZSk7CiAgICBjaGFyICAgICAgICAgICAqZW50cnk7CiAgICBjaGFyICAgICAgICAgICAqYnVmID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpzdCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgcmVzOwoKICAgIHJlcyA9IFNOTVBFUlJfR0VORVJSOwogICAgaWYgKCFvdXJjb3B5KQogICAgICAgIGdvdG8gb3V0OwoKICAgIGJ1ZiA9IG1hbGxvYyhzdHJsZW4ocGF0aG5hbWUpICsgMik7CiAgICBpZiAoIWJ1ZikKICAgICAgICBnb3RvIG91dDsKCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgLyogY29udmVydCBiYWNrc2xhc2ggdG8gZm9yd2FyZCBzbGFzaCAqLwogICAgZm9yIChlbnRyeSA9IG91cmNvcHk7ICplbnRyeTsgZW50cnkrKykKICAgICAgICBpZiAoKmVudHJ5ID09ICdcXCcpCiAgICAgICAgICAgICplbnRyeSA9ICcvJzsKI2VuZGlmCgogICAgZW50cnkgPSBzdHJ0b2tfcihvdXJjb3B5LCAiLyIsICZzdCk7CgogICAgYnVmWzBdID0gJ1wwJzsKCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgLyoKICAgICAqIENoZWNrIGlmIGZpcnN0IGVudHJ5IGNvbnRhaW5zIGEgZHJpdmUtbGV0dGVyCiAgICAgKiAgIGUuZyAgImM6L3BhdGgiCiAgICAgKi8KICAgIGlmICgoZW50cnkpICYmICgnOicgPT0gZW50cnlbMV0pICYmCiAgICAgICAgKCgnXDAnID09IGVudHJ5WzJdKSB8fCAoJy8nID09IGVudHJ5WzJdKSkpIHsKICAgICAgICBzdHJjYXQoYnVmLCBlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCAiLyIsICZzdCk7CiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBjaGVjayB0byBzZWUgaWYgZmlsZW5hbWUgaXMgYSBkaXJlY3RvcnkgCiAgICAgKi8KICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIHN0cmNhdChidWYsICIvIik7CiAgICAgICAgc3RyY2F0KGJ1ZiwgZW50cnkpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgIi8iLCAmc3QpOwogICAgICAgIGlmIChlbnRyeSA9PSBOVUxMICYmIHNraXBsYXN0KQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoc3RhdChidWYsICZzYnVmKSA8IDApIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRE5FLCBtYWtlIGl0IAogICAgICAgICAgICAgKi8KI2lmZGVmIFdJTjMyCiAgICAgICAgICAgIGlmIChDcmVhdGVEaXJlY3RvcnkoYnVmLCBOVUxMKSA9PSAwKQojZWxzZQogICAgICAgICAgICBpZiAobWtkaXIoYnVmLCBtb2RlKSA9PSAtMSkKI2VuZGlmCiAgICAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJDcmVhdGVkIGRpcmVjdG9yeTogJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZXhpc3RzLCBpcyBpdCBhIGZpbGU/IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKChzYnVmLnN0X21vZGUgJiBTX0lGRElSKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogYWNrISBjYW4ndCBtYWtlIGEgZGlyZWN0b3J5IG9uIHRvcCBvZiBhIGZpbGUgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmVzID0gU05NUEVSUl9TVUNDRVNTOwpvdXQ6CiAgICBmcmVlKGJ1Zik7CiAgICBmcmVlKG91cmNvcHkpOwogICAgcmV0dXJuIHJlczsKfQoKLyoqCiAqIG5ldHNubXBfbWt0ZW1wIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBiYXNlZCBvbiB0aGUKICogICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgdGVtcEZpbGVQYXR0ZXJuCiAqCiAqIEByZXR1cm4gZmlsZSBkZXNjcmlwdG9yCiAqLwpjb25zdCBjaGFyICAgICAqCm5ldHNubXBfbWt0ZW1wKHZvaWQpCnsKI2lmZGVmIFBBVEhfTUFYCiAgICBzdGF0aWMgY2hhciAgICAgbmFtZVtQQVRIX01BWF07CiNlbHNlCiAgICBzdGF0aWMgY2hhciAgICAgbmFtZVsyNTZdOwojZW5kaWYKICAgIGludCAgICAgICAgICAgICBmZCA9IC0xOwoKICAgIHN0cmxjcHkobmFtZSwgZ2V0X3RlbXBfZmlsZV9wYXR0ZXJuKCksIHNpemVvZihuYW1lKSk7CiNpZmRlZiBIQVZFX01LU1RFTVAKICAgIHsKICAgICAgICBtb2RlX3Qgb2xkbWFzayA9IHVtYXNrKH4oU19JUlVTUiB8IFNfSVdVU1IpKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydChvbGRtYXNrICE9IChtb2RlX3QpKC0xKSk7CiAgICAgICAgZmQgPSBta3N0ZW1wKG5hbWUpOwogICAgICAgIHVtYXNrKG9sZG1hc2spOwogICAgfQojZWxzZQogICAgaWYgKG1rdGVtcChuYW1lKSkgewojIGlmbmRlZiBXSU4zMgogICAgICAgIGZkID0gb3BlbihuYW1lLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIFNfSVJVU1IgfCBTX0lXVVNSKTsKIyBlbHNlCiAgICAgICAgLyoKICAgICAgICAgKiBXaW4zMiBuZWVkcyBfU19JUkVBRCB8IF9TX0lXUklURSB0byBzZXQgcGVybWlzc2lvbnMgb24gZmlsZQogICAgICAgICAqIGFmdGVyIGNsb3NpbmcKICAgICAgICAgKi8KICAgICAgICBmZCA9IF9vcGVuKG5hbWUsIF9PX0NSRUFUIHwgX09fRVhDTCB8IF9PX1dST05MWSwgX1NfSVJFQUQgfCBfU19JV1JJVEUpOwojIGVuZGlmCiAgICB9CiNlbmRpZgogICAgaWYgKGZkID49IDApIHsKICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfbWt0ZW1wIiwgInRlbXAgZmlsZSBjcmVhdGVkOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CiAgICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgICBzbm1wX2xvZyhMT0dfRVJSLCAibmV0c25tcF9ta3RlbXA6IGVycm9yIGNyZWF0aW5nIGZpbGUgJXNcbiIsCiAgICAgICAgICAgICBuYW1lKTsKICAgIHJldHVybiBOVUxMOwp9CgovKgogKiBUaGlzIGZ1bmN0aW9uIHdhcyBjcmVhdGVkIHRvIGRpZmZlcmVudGlhdGUgYWN0aW9ucwogKiB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgTGludXggMi40IGtlcm5lbHMsIGJ1dCBub3QgbGF0ZXIga2VybmVscy4KICoKICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB0ZXN0IGtlcm5lbHMgb24gYW55IHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgdW5hbWUoKS4KICoKICogSWYgbm90IHJ1bm5pbmcgYSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIHVuYW1lKCksIHJldHVybiAtMS4KICoKICogSWYgb3NwbmFtZSBtYXRjaGVzLCBhbmQgdGhlIHJlbGVhc2UgbWF0Y2hlcyB1cCB0aHJvdWdoIHRoZSBwcmVmaXgsCiAqICByZXR1cm4gMC4KICogSWYgdGhlIHJlbGVhc2UgaXMgb3JkZXJlZCBoaWdoZXIsIHJldHVybiAxLgogKiBCZSBhd2FyZSB0aGF0ICJvcmRlcmVkIGhpZ2hlciIgaXMgbm90IGEgZ3VhcmFudGVlIG9mIGNvcnJlY3RuZXNzLgogKi8KaW50Cm5ldHNubXBfb3NfcHJlbWF0Y2goY29uc3QgY2hhciAqb3NwbW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3NwbXJlbHByZWZpeCkKewojaWYgSEFWRV9TWVNfVVRTTkFNRV9ICnN0YXRpYyBpbnQgcHJpbnRPU29uY2UgPSAxOwogIHN0cnVjdCB1dHNuYW1lIHV0c2J1ZjsKICBpZiAoIDAgIT0gdW5hbWUoJnV0c2J1ZikpCiAgICByZXR1cm4gLTE7CgogIGlmIChwcmludE9Tb25jZSkgewogICAgcHJpbnRPU29uY2UgPSAwOwogICAgLyogc2hvdyB0aGUgZm91ciBlbGVtZW50cyB0aGF0IHRoZSBrZXJuZWwgY2FuIGJlIHN1cmUgb2YgKi8KICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJzeXNuYW1lICclcycsXG5yZWxlYXNlICclcycsXG52ZXJzaW9uICclcycsXG5tYWNoaW5lICclcydcbiIsCiAgICAgIHV0c2J1Zi5zeXNuYW1lLCB1dHNidWYucmVsZWFzZSwgdXRzYnVmLnZlcnNpb24sIHV0c2J1Zi5tYWNoaW5lKSk7CiAgfQogIGlmICgwICE9IHN0cmNhc2VjbXAodXRzYnVmLnN5c25hbWUsIG9zcG1uYW1lKSkgcmV0dXJuIC0xOwoKICAvKiBSZXF1aXJlZCB0byBtYXRjaCBvbmx5IHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgKi8KICByZXR1cm4gc3RybmNhc2VjbXAodXRzYnVmLnJlbGVhc2UsIG9zcG1yZWxwcmVmaXgsIHN0cmxlbihvc3BtcmVscHJlZml4KSk7CgojZWxzZQoKICByZXR1cm4gLTE7CgojZW5kaWYgLyogSEFWRV9TWVNfVVRTTkFNRV9IICovCn0KCi8qKgogKiBuZXRzbm1wX29zX2tlcm5lbF93aWR0aCBkZXRlcm1pbmVzIGtlcm5lbCB3aWR0aCBhdCBydW50aW1lCiAqIEN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgSVJJWCwgQUlYIGFuZCBUcnU2NCBVbml4CiAqCiAqIEByZXR1cm4ga2VybmVsIHdpZHRoICh1c3VhbGx5IDMyIG9yIDY0KSBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgogKi8KaW50Cm5ldHNubXBfb3Nfa2VybmVsX3dpZHRoKHZvaWQpCnsKI2lmZGVmIGlyaXg2CiAgY2hhciBidWZbOF07CiAgc3lzaW5mbyhfTUlQU19TSV9PU19OQU1FLCBidWYsIDcpOwogIGlmIChzdHJuY21wKCJJUklYNjQiLCBidWYsIDYpID09IDApIHsKICAgIHJldHVybiA2NDsKICB9IGVsc2UgaWYgKHN0cm5jbXAoIklSSVgiLCBidWYsIDQpID09IDApIHsKICAgIHJldHVybiAzMjsKICB9IGVsc2UgewogICAgcmV0dXJuIC0xOwogIH0KI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogIHJldHVybiAoX19LRVJORUxfMzIoKSA/IDMyIDogKF9fS0VSTkVMXzY0KCkgPyA2NCA6IC0xKSk7CiNlbGlmIGRlZmluZWQob3NmNCkgfHwgZGVmaW5lZChvc2Y1KSB8fCBkZWZpbmVkKF9fYWxwaGEpCiAgcmV0dXJuIDY0OyAvKiBBbHBoYSBpcyBhbHdheXMgNjRiaXQgKi8KI2Vsc2UKICAvKiBrZXJuZWwgd2lkdGggZGV0ZWN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwogIHJldHVybiAtMTsKI2VuZGlmCn0KCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihzdHJfdG9fdWlkLCB1c2VyX2luZm9ybWF0aW9uKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1RSX1RPX1VJRAovKioKICogQ29udmVydCBhIHVzZXIgbmFtZSBvciBudW1iZXIgaW50byBudW1lcmljIGZvcm0uCiAqCiAqIEBwYXJhbVtpbl0gdXNlcm9ydWlkIEVpdGhlciBhIFVuaXggdXNlciBuYW1lIG9yIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbgogKiAgIG9mIGEgdXNlciBudW1iZXIuCiAqCiAqIEByZXR1cm4gRWl0aGVyIGEgdXNlciBudW1iZXIgPiAwIG9yIDAgaWYgdXNlcm9ydWlkIGlzIG5vdCBhIHZhbGlkIHVzZXIKICogICBuYW1lLCBub3QgYSB2YWxpZCB1c2VyIG51bWJlciBvciB0aGUgbmFtZSBvZiB0aGUgcm9vdCB1c2VyLgogKi8KaW50IG5ldHNubXBfc3RyX3RvX3VpZChjb25zdCBjaGFyICp1c2Vyb3J1aWQpIHsKICAgIGludCB1aWQ7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgIHN0cnVjdCBwYXNzd2QgKnB3ZDsKI2VuZGlmCgogICAgdWlkID0gYXRvaSh1c2Vyb3J1aWQpOwoKICAgIGlmICh1aWQgPT0gMCkgewojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgcHdkID0gZ2V0cHduYW0odXNlcm9ydWlkKTsKICAgICAgICB1aWQgPSBwd2QgPyBwd2QtPnB3X3VpZCA6IDA7CiAgICAgICAgZW5kcHdlbnQoKTsKI2VuZGlmCiAgICAgICAgaWYgKHVpZCA9PSAwKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgIkNhbid0IGlkZW50aWZ5IHVzZXIgKCVzKS5cbiIsIHVzZXJvcnVpZCk7CiAgICB9CiAgICByZXR1cm4gdWlkOwogICAgCn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1RSX1RPX1VJRCAqLwoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHN0cl90b19naWQsIHVzZXJfaW5mb3JtYXRpb24pCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TVFJfVE9fR0lECi8qKgogKiBDb252ZXJ0IGEgZ3JvdXAgbmFtZSBvciBudW1iZXIgaW50byBudW1lcmljIGZvcm0uCiAqCiAqIEBwYXJhbVtpbl0gZ3JvdXBvcmdpZCBFaXRoZXIgYSBVbml4IGdyb3VwIG5hbWUgb3IgdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uCiAqICAgb2YgYSBncm91cCBudW1iZXIuCiAqCiAqIEByZXR1cm4gRWl0aGVyIGEgZ3JvdXAgbnVtYmVyID4gMCBvciAwIGlmIGdyb3Vwb3JnaWQgaXMgbm90IGEgdmFsaWQgZ3JvdXAKICogICBuYW1lLCBub3QgYSB2YWxpZCBncm91cCBudW1iZXIgb3IgdGhlIHJvb3QgZ3JvdXAuCiAqLwppbnQgbmV0c25tcF9zdHJfdG9fZ2lkKGNvbnN0IGNoYXIgKmdyb3Vwb3JnaWQpCnsKICAgIGludCBnaWQ7CgogICAgZ2lkID0gYXRvaShncm91cG9yZ2lkKTsKCiAgICBpZiAoZ2lkID09IDApIHsKI2lmIEhBVkVfR0VUR1JOQU0gJiYgSEFWRV9HUlBfSAogICAgICAgIHN0cnVjdCBncm91cCAgKmdycDsKCiAgICAgICAgZ3JwID0gZ2V0Z3JuYW0oZ3JvdXBvcmdpZCk7CiAgICAgICAgZ2lkID0gZ3JwID8gZ3JwLT5ncl9naWQgOiAwOwogICAgICAgIGVuZGdyZW50KCk7CiNlbmRpZgogICAgICAgIGlmIChnaWQgPT0gMCkKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJDYW4ndCBpZGVudGlmeSBncm91cCAoJXMpLlxuIiwgZ3JvdXBvcmdpZCk7CiAgICB9CgogICAgcmV0dXJuIGdpZDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TVFJfVE9fR0lEICovCg==