LyoKICogc3lzdGVtLmMKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KLyoKICogU3lzdGVtIGRlcGVuZGVudCByb3V0aW5lcyBnbyBoZXJlCiAqLwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGVycm5vLmg+CgojaWYgSEFWRV9JT19ICiNpbmNsdWRlIDxpby5oPgojZW5kaWYKI2lmIEhBVkVfRElSRUNUX0gKI2luY2x1ZGUgPGRpcmVjdC5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TT0NLSU9fSAojaW5jbHVkZSA8c3lzL3NvY2tpby5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCgojaWZkZWYgSEFWRV9OTElTVF9ICiNpbmNsdWRlIDxubGlzdC5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19GSUxFX0gKI2luY2x1ZGUgPHN5cy9maWxlLmg+CiNlbmRpZgoKI2lmIEhBVkVfS1NUQVRfSAojaW5jbHVkZSA8a3N0YXQuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgoKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX0ZDTlRMX0gKI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19VVFNOQU1FX0gKI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NZU1RFTUNGR19ICiNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NZU1RFTUlORk9fSAojaW5jbHVkZSA8c3lzL3N5c3RlbWluZm8uaD4KI2VuZGlmCgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc3lzdGVtLmg+ICAgIC8qIGZvciAiaW50ZXJuYWwiIGRlZmluaXRpb25zICovCgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9yZWFkX2NvbmZpZy5oPiAvKiBmb3IgZ2V0X3RlbXBfZmlsZV9wYXR0ZXJuKCkgKi8KCiNpZm5kZWYgSUZGX0xPT1BCQUNLCiMJZGVmaW5lIElGRl9MT09QQkFDSyAwCiNlbmRpZgoKI2lmZGVmICBJTkFERFJfTE9PUEJBQ0sKIyBkZWZpbmUgTE9PUEJBQ0sgICAgSU5BRERSX0xPT1BCQUNLCiNlbHNlCiMgZGVmaW5lIExPT1BCQUNLICAgIDB4N2YwMDAwMDEKI2VuZGlmCgovKioKICogZm9yayBjdXJyZW50IHByb2Nlc3MgaW50byB0aGUgYmFja2dyb3VuZC4KICoKICogVGhpcyBmdW5jdGlvbiBmb3JrcyBhIHByb2Nlc3MgaW50byB0aGUgYmFja2dyb3VuZCwgaW4gb3JkZXIgdG8KICogYmVjb21lIGEgZGFlbW9uIHByb2Nlc3MuIEl0IGRvZXMgYSBmZXcgdGhpbmdzIGFsb25nIHRoZSB3YXk6CiAqCiAqIC0gYmVjb21pbmcgYSBwcm9jZXNzL3Nlc3Npb24gZ3JvdXAgbGVhZGVyLCBhbmQgIGZvcmtpbmcgYSBzZWNvbmQgdGltZSBzbwogKiAgIHRoYXQgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciBjYW4gZXhpdC4KICoKICogLSBjaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gLwogKgogKiAtIGNsb3Npbmcgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyICh1bmxlc3Mgc3RkZXJyX2xvZyBpcyBzZXQpIGFuZAogKiAgIHJlZGlyZWN0aW5nIHRoZW0gdG8gL2Rldi9udWxsCiAqCiAqIEBwYXJhbSBxdWl0X2ltbWVkaWF0ZWx5IDogaW5kaWNhdGVzIGlmIHRoZSBwYXJlbnQgcHJvY2VzcyBzaG91bGQKICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IGFmdGVyIGEgc3VjY2Vzc2Z1bCBmb3JrLgogKiBAcGFyYW0gc3RkZXJyX2xvZyAgICAgICA6IGluZGljYXRlcyBpZiBzdGRlcnIgaXMgYmVpbmcgdXNlZCBmb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nIGFuZCBzaG91bGRuJ3QgYmUgY2xvc2VkCiAqIEByZXR1cm5zIC0xIDogZm9yayBlcnJvcgogKiAgICAgICAgICAgMCA6IGNoaWxkIHByb2Nlc3MgcmV0dXJuaW5nCiAqICAgICAgICAgID4wIDogcGFyZW50IHByb2Nlc3MgcmV0dXJuaW5nLiByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgY2hpbGQgUElELgogKi8KaW50Cm5ldHNubXBfZGFlbW9uaXplKGludCBxdWl0X2ltbWVkaWF0ZWx5LCBpbnQgc3RkZXJyX2xvZykKewogICAgaW50IGkgPSAwOwogICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwiZGVhbW9uaXppbmcuLi5cbiIpKTsKI2lmIEhBVkVfRk9SSwogICAgLyoKICAgICAqIEZvcmsgdG8gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGludm9raW5nIHByb2Nlc3MgYW5kIHRvCiAgICAgKiBndWFyYW50ZWUgdGhhdCB3ZSBhcmVuJ3QgYSBwcm9jZXNzIGdyb3VwIGxlYWRlci4KICAgICAqLwogICAgaSA9IGZvcmsoKTsKICAgIGlmIChpICE9IDApIHsKICAgICAgICAvKiBQYXJlbnQuICovCiAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwiZmlyc3QgZm9yayByZXR1cm5lZCAlZC5cbiIsIGkpKTsKICAgICAgICBpZihpID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsImZpcnN0IGZvcmsgZmFpbGVkIChlcnJubyAlZCkgaW4gIgogICAgICAgICAgICAgICAgICAgICAibmV0c25tcF9kYWVtb25pemUoKVxuIiwgZXJybm8pOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChxdWl0X2ltbWVkaWF0ZWx5KSB7CiAgICAgICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsInBhcmVudCBleGl0aW5nXG4iKSk7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBDaGlsZC4gKi8KI2lmZGVmIEhBVkVfU0VUU0lECiAgICAgICAgLyogQmVjb21lIGEgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlci4gKi8KICAgICAgICBzZXRzaWQoKTsKI2VuZGlmCiAgICAgICAgLyoKICAgICAgICAgKiBGb3JrIHRvIGxldCB0aGUgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciBleGl0LgogICAgICAgICAqLwogICAgICAgIGlmICgoaSA9IGZvcmsoKSkgIT0gMCkgewogICAgICAgICAgICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJzZWNvbmQgZm9yayByZXR1cm5lZCAlZC5cbiIsIGkpKTsKICAgICAgICAgICAgaWYoaSA9PSAtMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwic2Vjb25kIGZvcmsgZmFpbGVkIChlcnJubyAlZCkgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgIm5ldHNubXBfZGFlbW9uaXplKClcbiIsIGVycm5vKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBQYXJlbnQuICovCiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQojaWZuZGVmIFdJTjMyCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qIENoaWxkLiAqLwogICAgICAgICAgICAKICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwiY2hpbGQgY29udGludWluZ1xuIikpOwoKICAgICAgICAgICAgLyogQXZvaWQga2VlcGluZyBhbnkgZGlyZWN0b3J5IGluIHVzZS4gKi8KICAgICAgICAgICAgY2hkaXIoIi8iKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RkZXJyX2xvZykgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIENsb3NlIGluaGVyaXRlZCBmaWxlIGRlc2NyaXB0b3JzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgKiBrZWVwaW5nIHVubmVjZXNzYXJ5IHJlZmVyZW5jZXMuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNsb3NlKDApOwogICAgICAgICAgICAgICAgY2xvc2UoMSk7CiAgICAgICAgICAgICAgICBjbG9zZSgyKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFJlZGlyZWN0IHN0ZHtpbixvdXQsZXJyfSB0byAvZGV2L251bGwsIGp1c3QgaW4KICAgICAgICAgICAgICAgICAqIGNhc2UuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CiAgICAgICAgICAgICAgICBkdXAoMCk7CiAgICAgICAgICAgICAgICBkdXAoMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZiAvKiAhV0lOMzIgKi8KICAgIH0KI2VuZGlmIC8qIEhBVkVfRk9SSyAqLwogICAgcmV0dXJuIGk7Cn0KCi8qCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKICovCiNpZmRlZgkJCQkJCQlXSU4zMgojCWRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCiMJZGVmaW5lIFdJTjMySU9fSVNfU1RESU8KIwlkZWZpbmUgUEFUSExFTgkxMDI0CgojCWluY2x1ZGUgPHRjaGFyLmg+CiMJaW5jbHVkZSA8d2luZG93cy5oPgoKLyoKICogTWluR1cgZGVmaW5lcyBXSU4zMiwgYnV0IGhhcyB3b3JraW5nIGRpcmVudCBzdHVmZi4KICovCiNpZm5kZWYgSEFWRV9ESVJFTlRfSCAKCi8qCiAqIFRoZSBpZGVhIGhlcmUgaXMgdG8gcmVhZCBhbGwgdGhlIGRpcmVjdG9yeSBuYW1lcyBpbnRvIGEgc3RyaW5nIHRhYmxlCiAqICogKHNlcGFyYXRlZCBieSBudWxscykgYW5kIHdoZW4gb25lIG9mIHRoZSBvdGhlciBkaXIgZnVuY3Rpb25zIGlzIGNhbGxlZAogKiAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBmaWxlIG5hbWUuCiAqLwpESVIgICAgICAgICAgICAqCm9wZW5kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCnsKICAgIERJUiAgICAgICAgICAgICpwOwogICAgbG9uZyAgICAgICAgICAgIGxlbjsKICAgIGxvbmcgICAgICAgICAgICBpZHg7CiAgICBjaGFyICAgICAgICAgICAgc2Nhbm5hbWVzcGNbUEFUSExFTl07CiAgICBjaGFyICAgICAgICAgICAqc2Nhbm5hbWUgPSBzY2FubmFtZXNwYzsKICAgIHN0cnVjdCBzdGF0ICAgICBzYnVmOwogICAgV0lOMzJfRklORF9EQVRBIEZpbmREYXRhOwogICAgSEFORExFICAgICAgICAgIGZoOwoKICAgIC8qCiAgICAgKiBjaGVjayB0byBzZWUgaWYgZmlsZW5hbWUgaXMgYSBkaXJlY3RvcnkgCiAgICAgKi8KICAgIGlmICgoc3RhdChmaWxlbmFtZSwgJnNidWYpIDwgMCkgfHwgKChzYnVmLnN0X21vZGUgJiBTX0lGRElSKSA9PSAwKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qCiAgICAgKiBnZXQgdGhlIGZpbGUgc3lzdGVtIGNoYXJhY3RlcmlzdGljcyAKICAgICAqLwogICAgLyoKICAgICAqIGlmKEdldEZ1bGxQYXRoTmFtZShmaWxlbmFtZSwgU05NUF9NQVhQQVRILCByb290LCAmZHVtbXkpKSB7CiAgICAgKiAqICAgIGlmKGR1bW15ID0gc3RyY2hyKHJvb3QsICdcXCcpKQogICAgICogKiAgICAgICAgKisrZHVtbXkgPSAnXDAnOwogICAgICogKiAgICBpZihHZXRWb2x1bWVJbmZvcm1hdGlvbihyb290LCB2b2xuYW1lLCBTTk1QX01BWFBBVEgsICZzZXJpYWwsCiAgICAgKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhuYW1lLCAmZmxhZ3MsIDAsIDApKSB7CiAgICAgKiAqICAgICAgICBkb3duY2FzZSA9ICEoZmxhZ3MgJiBGU19DQVNFX0lTX1BSRVNFUlZFRCk7CiAgICAgKiAqICAgIH0KICAgICAqICogIH0KICAgICAqICogIGVsc2UgewogICAgICogKiAgICBkb3duY2FzZSA9IFRSVUU7CiAgICAgKiAqICB9CiAgICAgKi8KCiAgICAvKgogICAgICogQ3JlYXRlIHRoZSBzZWFyY2ggcGF0dGVybiAKICAgICAqLwogICAgc3RyY3B5KHNjYW5uYW1lLCBmaWxlbmFtZSk7CgogICAgaWYgKHN0cmNocigiL1xcIiwgKihzY2FubmFtZSArIHN0cmxlbihzY2FubmFtZSkgLSAxKSkgPT0gTlVMTCkKICAgICAgICBzdHJjYXQoc2Nhbm5hbWUsICIvKiIpOwogICAgZWxzZQogICAgICAgIHN0cmNhdChzY2FubmFtZSwgIioiKTsKCiAgICAvKgogICAgICogZG8gdGhlIEZpbmRGaXJzdEZpbGUgY2FsbCAKICAgICAqLwogICAgZmggPSBGaW5kRmlyc3RGaWxlKHNjYW5uYW1lLCAmRmluZERhdGEpOwogICAgaWYgKGZoID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIEdldCB1cyBhIERJUiBzdHJ1Y3R1cmUgCiAgICAgKi8KICAgIHAgPSAoRElSICopIG1hbGxvYyhzaXplb2YoRElSKSk7CiAgICAvKgogICAgICogTmV3eigxMzAzLCBwLCAxLCBESVIpOyAKICAgICAqLwogICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogbm93IGFsbG9jYXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgdGFibGUgZm9yCiAgICAgKiAqIHRoZSBmaWxlbmFtZXMgdGhhdCB3ZSBmaW5kLgogICAgICovCiAgICBpZHggPSBzdHJsZW4oRmluZERhdGEuY0ZpbGVOYW1lKSArIDE7CiAgICBwLT5zdGFydCA9IChjaGFyICopIG1hbGxvYyhpZHgpOwogICAgLyoKICAgICAqIE5ldygxMzA0LCBwLT5zdGFydCwgaWR4LCBjaGFyKTsKICAgICAqLwogICAgaWYgKHAtPnN0YXJ0ID09IE5VTEwpIHsKICAgICAgICBmcmVlKHApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgc3RyY3B5KHAtPnN0YXJ0LCBGaW5kRGF0YS5jRmlsZU5hbWUpOwogICAgLyoKICAgICAqIGlmKGRvd25jYXNlKQogICAgICogKiAgICBzdHJsd3IocC0+c3RhcnQpOwogICAgICovCiAgICBwLT5uZmlsZXMgPSAwOwoKICAgIC8qCiAgICAgKiBsb29wIGZpbmRpbmcgYWxsIHRoZSBmaWxlcyB0aGF0IG1hdGNoIHRoZSB3aWxkY2FyZAogICAgICogKiAod2hpY2ggc2hvdWxkIGJlIGFsbCBvZiB0aGVtIGluIHRoaXMgZGlyZWN0b3J5ISkuCiAgICAgKiAqIHRoZSB2YXJpYWJsZSBpZHggc2hvdWxkIHBvaW50IG9uZSBwYXN0IHRoZSBudWxsIHRlcm1pbmF0b3IKICAgICAqICogb2YgdGhlIHByZXZpb3VzIHN0cmluZyBmb3VuZC4KICAgICAqLwogICAgd2hpbGUgKEZpbmROZXh0RmlsZShmaCwgJkZpbmREYXRhKSkgewogICAgICAgIGxlbiA9IHN0cmxlbihGaW5kRGF0YS5jRmlsZU5hbWUpOwogICAgICAgIC8qCiAgICAgICAgICogYnVtcCB0aGUgc3RyaW5nIHRhYmxlIHNpemUgYnkgZW5vdWdoIGZvciB0aGUKICAgICAgICAgKiAqIG5ldyBuYW1lIGFuZCBpdCdzIG51bGwgdGVybWluYXRvcgogICAgICAgICAqLwogICAgICAgIHAtPnN0YXJ0ID0gKGNoYXIgKikgcmVhbGxvYygodm9pZCAqKSBwLT5zdGFydCwgaWR4ICsgbGVuICsgMSk7CiAgICAgICAgLyoKICAgICAgICAgKiBSZW5ldyhwLT5zdGFydCwgaWR4K2xlbisxLCBjaGFyKTsKICAgICAgICAgKi8KICAgICAgICBpZiAocC0+c3RhcnQgPT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKHApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgc3RyY3B5KCZwLT5zdGFydFtpZHhdLCBGaW5kRGF0YS5jRmlsZU5hbWUpOwogICAgICAgIC8qCiAgICAgICAgICogaWYgKGRvd25jYXNlKSAKICAgICAgICAgKiAqICAgICAgICBzdHJsd3IoJnAtPnN0YXJ0W2lkeF0pOwogICAgICAgICAqLwogICAgICAgIHAtPm5maWxlcysrOwogICAgICAgIGlkeCArPSBsZW4gKyAxOwogICAgfQogICAgRmluZENsb3NlKGZoKTsKICAgIHAtPnNpemUgPSBpZHg7CiAgICBwLT5jdXJyID0gcC0+c3RhcnQ7CiAgICByZXR1cm4gcDsKfQoKCi8qCiAqIFJlYWRkaXIganVzdCByZXR1cm5zIHRoZSBjdXJyZW50IHN0cmluZyBwb2ludGVyIGFuZCBidW1wcyB0aGUKICogKiBzdHJpbmcgcG9pbnRlciB0byB0aGUgbkRsbEV4cG9ydCBlbnRyeS4KICovCnN0cnVjdCBkaXJlY3QgICoKcmVhZGRpcihESVIgKiBkaXJwKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgc3RhdGljIGludCAgICAgIGR1bW15ID0gMDsKCiAgICBpZiAoZGlycC0+Y3VycikgewogICAgICAgIC8qCiAgICAgICAgICogZmlyc3Qgc2V0IHVwIHRoZSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIAogICAgICAgICAqLwogICAgICAgIGxlbiA9IHN0cmxlbihkaXJwLT5jdXJyKTsKICAgICAgICBzdHJjcHkoZGlycC0+ZGlyc3RyLmRfbmFtZSwgZGlycC0+Y3Vycik7CiAgICAgICAgZGlycC0+ZGlyc3RyLmRfbmFtbGVuID0gbGVuOwoKICAgICAgICAvKgogICAgICAgICAqIEZha2UgYW4gaW5vZGUgCiAgICAgICAgICovCiAgICAgICAgZGlycC0+ZGlyc3RyLmRfaW5vID0gZHVtbXkrKzsKCiAgICAgICAgLyoKICAgICAgICAgKiBOb3cgc2V0IHVwIGZvciB0aGUgbkRsbEV4cG9ydCBjYWxsIHRvIHJlYWRkaXIgCiAgICAgICAgICovCiAgICAgICAgZGlycC0+Y3VyciArPSBsZW4gKyAxOwogICAgICAgIGlmIChkaXJwLT5jdXJyID49IChkaXJwLT5zdGFydCArIGRpcnAtPnNpemUpKSB7CiAgICAgICAgICAgIGRpcnAtPmN1cnIgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICYoZGlycC0+ZGlyc3RyKTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybiBOVUxMOwp9CgovKgogKiBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IG9wZW5kaXIgCiAqLwppbnQKY2xvc2VkaXIoRElSICogZGlycCkKewogICAgZnJlZShkaXJwLT5zdGFydCk7CiAgICBmcmVlKGRpcnApOwogICAgcmV0dXJuIDE7Cn0KI2VuZGlmIC8qIEhBVkVfRElSRU5UX0ggKi8KCiNpZm5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKCmludApnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQp7CiAgICBzdHJ1Y3QgX3RpbWViICAgdGltZWJ1ZmZlcjsKCiAgICBfZnRpbWUoJnRpbWVidWZmZXIpOwogICAgdHYtPnR2X3VzZWMgPSB0aW1lYnVmZmVyLm1pbGxpdG0gKiAxMDAwOwogICAgdHYtPnR2X3NlYyA9IHRpbWVidWZmZXIudGltZTsKICAgIHJldHVybiAoMCk7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhSEFWRV9HRVRUSU1FT0ZEQVkgKi8KCmluX2FkZHJfdApnZXRfbXlhZGRyKHZvaWQpCnsKICAgIGNoYXIgICAgICAgICAgICBsb2NhbF9ob3N0WzEzMF07CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwogICAgTFBIT1NURU5UICAgICAgIGxwc3RIb3N0ZW50OwogICAgU09DS0FERFJfSU4gICAgIGluX2FkZHIsIHJlbW90ZV9pbl9hZGRyOwogICAgU09DS0VUICAgICAgICAgIGhTb2NrOwogICAgaW50ICAgICAgICAgICAgIG5BZGRyU2l6ZSA9IHNpemVvZihTT0NLQUREUik7CgogICAgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwoKICAgIHJlc3VsdCA9IGdldGhvc3RuYW1lKGxvY2FsX2hvc3QsIHNpemVvZihsb2NhbF9ob3N0KSk7CiAgICBpZiAocmVzdWx0ID09IDApIHsKICAgICAgICBscHN0SG9zdGVudCA9IGdldGhvc3RieW5hbWUoKExQU1RSKSBsb2NhbF9ob3N0KTsKICAgICAgICBpZiAobHBzdEhvc3RlbnQpIHsKICAgICAgICAgICAgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIgPQogICAgICAgICAgICAgICAgKigodV9sb25nIEZBUiAqKSAobHBzdEhvc3RlbnQtPmhfYWRkcikpOwogICAgICAgICAgICByZXR1cm4gKChpbl9hZGRyX3QpIGluX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIGlmIHdlIGFyZSBoZXJlLCB0aGFuIHdlIGRvbid0IGhhdmUgaG9zdCBhZGRyIAogICAgICovCiAgICBoU29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKICAgIGlmIChoU29jayAhPSBJTlZBTElEX1NPQ0tFVCkgewogICAgICAgIC8qCiAgICAgICAgICogY29ubmVjdCB0byBhbnkgcG9ydCBhbmQgYWRkcmVzcyAKICAgICAgICAgKi8KICAgICAgICByZW1vdGVfaW5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgICAgICByZW1vdGVfaW5fYWRkci5zaW5fcG9ydCA9IGh0b25zKElQUE9SVF9FQ0hPKTsKICAgICAgICByZW1vdGVfaW5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoIjAuMC4wLjAiKTsKICAgICAgICByZXN1bHQgPQogICAgICAgICAgICBjb25uZWN0KGhTb2NrLCAoTFBTT0NLQUREUikgJiByZW1vdGVfaW5fYWRkciwKICAgICAgICAgICAgICAgICAgICBzaXplb2YoU09DS0FERFIpKTsKICAgICAgICBpZiAocmVzdWx0ICE9IFNPQ0tFVF9FUlJPUikgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBnZXQgbG9jYWwgaXAgYWRkcmVzcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldHNvY2tuYW1lKGhTb2NrLCAoTFBTT0NLQUREUikgJiBpbl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAoaW50IEZBUiAqKSAmbkFkZHJTaXplKTsKICAgICAgICB9CiAgICAgICAgY2xvc2Vzb2NrZXQoaFNvY2spOwogICAgfQogICAgcmV0dXJuICgoaW5fYWRkcl90KSBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkcik7Cn0KCmxvbmcKZ2V0X3VwdGltZSh2b2lkKQp7CiAgICBsb25nICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKICAgIERXT1JEICAgICAgICAgICBidWZmZXJzaXplID0gKHNpemVvZihQRVJGX0RBVEFfQkxPQ0spICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQRVJGX09CSkVDVF9UWVBFKSksCiAgICAgICAgdHlwZSA9IFJFR19FWFBBTkRfU1o7CiAgICBQUEVSRl9EQVRBX0JMT0NLIHBlcmZkYXRhID0gTlVMTDsKCiAgICAvKgogICAgICogbWluIHJlcXVpcmVtZW50IGlzIG9uZSBQRVJGX0RBVEFfQkxPQ0sgcGx1cyBvbmUgUEVSRl9PQkpFQ1RfVFlQRSAKICAgICAqLwogICAgcGVyZmRhdGEgPSAoUFBFUkZfREFUQV9CTE9DSykgbWFsbG9jKGJ1ZmZlcnNpemUpOwogICAgaWYgKCFwZXJmZGF0YSkKICAgICAgICByZXR1cm4gMDsKCiAgICBtZW1zZXQocGVyZmRhdGEsIDAsIGJ1ZmZlcnNpemUpOwoKICAgIFJlZ1F1ZXJ5VmFsdWVFeChIS0VZX1BFUkZPUk1BTkNFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgIkdsb2JhbCIsIE5VTEwsICZ0eXBlLCAoTFBCWVRFKSBwZXJmZGF0YSwgJmJ1ZmZlcnNpemUpOwoKICAgIC8qCiAgICAgKiB3ZSBjYW4gbm90IHJlbHkgb24gdGhlIHJldHVybiB2YWx1ZSBzaW5jZSB0aGVyZSBpcyBhbHdheXMgbW9yZSBzbwogICAgICogd2UgY2hlY2sgdGhlIHNpZ25hdHVyZSAKICAgICAqLwoKICAgIGlmICh3Y3NuY21wKHBlcmZkYXRhLT5TaWduYXR1cmUsIEwiUEVSRiIsIDQpID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqIHNpZ25hdHVyZSBvaywgYW5kIGFsbCB3ZSBuZWVkIGlzIGluIHRoZSBpbiB0aGUgUEVSRl9EQVRBX0JMT0NLIAogICAgICAgICAqLwogICAgICAgIHJldHVybl92YWx1ZSA9IChsb25nKSAoKHBlcmZkYXRhLT5QZXJmVGltZTEwMG5TZWMuUXVhZFBhcnQgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMT05HTE9ORykgMTAwMDAwKSk7CiAgICB9IGVsc2UKICAgICAgICByZXR1cm5fdmFsdWUgPSBHZXRUaWNrQ291bnQoKSAvIDEwOwoKICAgIFJlZ0Nsb3NlS2V5KEhLRVlfUEVSRk9STUFOQ0VfREFUQSk7CiAgICBmcmVlKHBlcmZkYXRhKTsKCiAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwp9CgpjaGFyICAgICAgICAgICAqCndpbnNvY2tfc3RhcnR1cCh2b2lkKQp7CiAgICBXT1JEICAgICAgICAgICAgVmVyc2lvblJlcXVlc3RlZDsKICAgIFdTQURBVEEgICAgICAgICBzdFdTQURhdGE7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHN0YXRpYyBjaGFyICAgICBlcnJtc2dbMTAwXTsKCgkvKiB3aW5zb2NrIDE6IHVzZSBNQUtFV09SRCgxLDEpICovCgkvKiB3aW5zb2NrIDI6IHVzZSBNQUtFV09SRCgyLDIpICovCgogICAgVmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEKDIsMik7CiAgICBpID0gV1NBU3RhcnR1cChWZXJzaW9uUmVxdWVzdGVkLCAmc3RXU0FEYXRhKTsKICAgIGlmIChpICE9IDApIHsKICAgICAgICBpZiAoaSA9PSBXU0FWRVJOT1RTVVBQT1JURUQpCiAgICAgICAgICAgIHNwcmludGYoZXJybXNnLAogICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gaW5pdC4gc29ja2V0IGxpYiwgZG9lcyBub3Qgc3VwcG9ydCAxLjEiKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3ByaW50ZihlcnJtc2csICJTb2NrZXQgU3RhcnR1cCBlcnJvciAlZCIsIGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGVycm1zZyk7CiAgICB9CiAgICByZXR1cm4gKE5VTEwpOwp9Cgp2b2lkCndpbnNvY2tfY2xlYW51cCh2b2lkKQp7CiAgICBXU0FDbGVhbnVwKCk7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogISBXSU4zMiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIFhYWCAgV2hhdCBpZiB3ZSBoYXZlIG11bHRpcGxlIGFkZHJlc3Nlcz8gIE9yIG5vIGFkZHJlc3NlcyBmb3IgdGhhdCBtYXR0ZXI/CiAqIFhYWCAgQ291bGQgaXQgYmUgY29tcHV0ZWQgb25jZSB0aGVuIGNhY2hlZD8gIFByb2JhYmx5IG5vdCB3b3J0aCBpdCAobm90CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHZlcnkgb2Z0ZW4pLgogKi8KaW5fYWRkcl90CmdldF9teWFkZHIodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHNkLCBpLCBsYXN0bGVuID0gMDsKICAgIHN0cnVjdCBpZmNvbmYgICBpZmM7CiAgICBzdHJ1Y3QgaWZyZXEgICAqaWZycCA9IE5VTEw7CiAgICBpbl9hZGRyX3QgICAgICAgYWRkcjsKICAgIGNoYXIgICAgICAgICAgICpidWYgPSBOVUxMOwoKICAgIGlmICgoc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBDb3BlIHdpdGggbG90cyBvZiBpbnRlcmZhY2VzIGFuZCBicm9rZW5uZXNzIG9mIGlvY3RsIFNJT0NHSUZDT05GIG9uCiAgICAgKiBzb21lIHBsYXRmb3Jtczsgc2VlIFcuIFIuIFN0ZXZlbnMsIGBgVW5peCBOZXR3b3JrIFByb2dyYW1taW5nIFZvbHVtZQogICAgICogSScnLCBwLjQzNS4gIAogICAgICovCgogICAgZm9yIChpID0gODs7IGkgKz0gOCkgewogICAgICAgIGJ1ZiA9IChjaGFyICopIGNhbGxvYyhpLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CiAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmYy5pZmNfbGVuID0gaSAqIHNpemVvZihzdHJ1Y3QgaWZyZXEpOwogICAgICAgIGlmYy5pZmNfYnVmID0gKGNhZGRyX3QpIGJ1ZjsKCiAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikgJmlmYykgPCAwKSB7CiAgICAgICAgICAgIGlmIChlcnJubyAhPSBFSU5WQUwgfHwgbGFzdGxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogU29tZXRoaW5nIGhhcyBnb25lIGdlbnVpbmVseSB3cm9uZy4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgICAgICAgICBjbG9zZShzZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBPdGhlcndpc2UsIGl0IGNvdWxkIGp1c3QgYmUgdGhhdCB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4gIAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaWZjLmlmY19sZW4gPT0gbGFzdGxlbikgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZSBsZW5ndGggaXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgdGltZTsgd2UncmUgZG9uZS4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0bGVuID0gaWZjLmlmY19sZW47CiAgICAgICAgfQogICAgICAgIGZyZWUoYnVmKTsKICAgIH0KCiAgICBmb3IgKGlmcnAgPSBpZmMuaWZjX3JlcTsKICAgICAgICAoY2hhciAqKWlmcnAgPCAoY2hhciAqKWlmYy5pZmNfcmVxICsgaWZjLmlmY19sZW47CiNpZmRlZiBTVFJVQ1RfU09DS0FERFJfSEFTX1NBX0xFTgogICAgICAgIGlmcnAgPSAoc3RydWN0IGlmcmVxICopKCgoY2hhciAqKSBpZnJwKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlmcnAtPmlmcl9uYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZycC0+aWZyX2FkZHIuc2FfbGVuKQojZWxzZQogICAgICAgIGlmcnArKwojZW5kaWYKICAgICAgICApIHsKICAgICAgICBpZiAoaWZycC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGlmcnAtPmlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkcjsKCiAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopIGlmcnApIDwgMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKChpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfVVApCiNpZmRlZiBJRkZfUlVOTklORwogICAgICAgICAgICAmJiAoaWZycC0+aWZyX2ZsYWdzICYgSUZGX1JVTk5JTkcpCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUZGX1JVTk5JTkcgKi8KICAgICAgICAgICAgJiYgIShpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAgICAgICAgICAgICYmIGFkZHIgIT0gTE9PUEJBQ0spIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSSAqcmVhbGx5KiBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4gIFBlcmhhcHMgZm9yCiAgICAgICAgICAgICAqIHNvbWUgYnJva2VuIHBsYXRmb3JtPyAgTGVhdmUgaXQgZm9yIG5vdy4gIEpCUE4gIAogICAgICAgICAgICAgKi8KI2lmZGVmIFNZU19JT0NUTF9IX0hBU19TSU9DR0lGQUREUgogICAgICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZBRERSLCAoY2hhciAqKSBpZnJwKSA8IDApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZHIgPQogICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZnJwLT5pZnJfYWRkcikpLT5zaW5fYWRkci4KICAgICAgICAgICAgICAgIHNfYWRkcjsKI2VuZGlmCiAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gYWRkcjsKICAgICAgICB9CiAgICB9CiAgICBmcmVlKGJ1Zik7CiAgICBjbG9zZShzZCk7CiAgICByZXR1cm4gMDsKfQoKCiNpZiAhZGVmaW5lZChzb2xhcmlzMikgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGN5Z3dpbikKLyoKICogUmV0dXJucyBib290dGltZSBpbiBjZW50aXNlY29uZHMoISkuCiAqICAgICAgQ2FjaGVzIHRoaXMgZm9yIGZ1dHVyZSB1c2UuCiAqLwpsb25nCmdldF9ib290dGltZSh2b2lkKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgYm9vdHRpbWVfY3NlY3MgPSAwOwojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IHBzdF9zdGF0aWMgcHN0X2J1ZjsKI2Vsc2UKICAgIHN0cnVjdCB0aW1ldmFsICBib290dGltZTsKI2lmZGVmCU5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIGludCAgICAgICAgICAgICBtaWJbMl07CiAgICBzaXplX3QgICAgICAgICAgbGVuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9OTElTVCkKICAgIGludCAgICAgICAgICAgICBrbWVtOwogICAgc3RhdGljIHN0cnVjdCBubGlzdCBubFtdID0gewojaWYgIWRlZmluZWQoaHB1eCkKICAgICAgICB7KGNoYXIgKikgIl9ib290dGltZSJ9LAojZWxzZQogICAgICAgIHsoY2hhciAqKSAiYm9vdHRpbWUifSwKI2VuZGlmCiAgICAgICAgeyhjaGFyICopICIifQogICAgfTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDEwIHx8IGhwdXggMTEgKi8KCgogICAgaWYgKGJvb3R0aW1lX2NzZWNzICE9IDApCiAgICAgICAgcmV0dXJuIChib290dGltZV9jc2Vjcyk7CgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgcHN0YXRfZ2V0c3RhdGljKCZwc3RfYnVmLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0aWMpLCAxLCAwKTsKICAgIGJvb3R0aW1lX2NzZWNzID0gcHN0X2J1Zi5ib290X3RpbWUgKiAxMDA7CiNlbGlmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIG1pYlswXSA9IENUTF9LRVJOOwogICAgbWliWzFdID0gS0VSTl9CT09UVElNRTsKCiAgICBsZW4gPSBzaXplb2YoYm9vdHRpbWUpOwoKICAgIHN5c2N0bChtaWIsIDIsICZib290dGltZSwgJmxlbiwgTlVMTCwgMCk7CiAgICBib290dGltZV9jc2VjcyA9IChib290dGltZS50dl9zZWMgKiAxMDApICsgKGJvb3R0aW1lLnR2X3VzZWMgLyAxMDAwMCk7CiNlbGlmIGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX05MSVNUKQogICAgaWYgKChrbWVtID0gb3BlbigiL2Rldi9rbWVtIiwgMCkpIDwgMCkKICAgICAgICByZXR1cm4gMDsKICAgIG5saXN0KEtFUk5FTF9MT0MsIG5sKTsKICAgIGlmIChubFswXS5uX3R5cGUgPT0gMCkgewogICAgICAgIGNsb3NlKGttZW0pOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGxzZWVrKGttZW0sIChsb25nKSBubFswXS5uX3ZhbHVlLCBMX1NFVCk7CiAgICByZWFkKGttZW0sICZib290dGltZSwgc2l6ZW9mKGJvb3R0aW1lKSk7CiAgICBjbG9zZShrbWVtKTsKICAgIGJvb3R0aW1lX2NzZWNzID0gKGJvb3R0aW1lLnR2X3NlYyAqIDEwMCkgKyAoYm9vdHRpbWUudHZfdXNlYyAvIDEwMDAwKTsKI2Vsc2UKICAgIHJldHVybiAwOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMCB8fCBocHV4IDExICovCgogICAgcmV0dXJuIChib290dGltZV9jc2Vjcyk7Cn0KI2VuZGlmCgovKgogKiBSZXR1cm5zIHVwdGltZSBpbiBjZW50aXNlY29uZHMoISkuCiAqLwpsb25nCmdldF91cHRpbWUodm9pZCkKewojaWYgIWRlZmluZWQoc29sYXJpczIpICYmICFkZWZpbmVkKGxpbnV4KSAmJiAhZGVmaW5lZChjeWd3aW4pICYmICFkZWZpbmVkKGFpeDQpICYmICFkZWZpbmVkKGFpeDUpICYmICFkZWZpbmVkKGFpeDYpCiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwogICAgbG9uZyAgICAgICAgICAgIGJvb3R0aW1lX2NzZWNzLCBub3d0aW1lX2NzZWNzOwoKICAgIGJvb3R0aW1lX2NzZWNzID0gZ2V0X2Jvb3R0aW1lKCk7CiAgICBpZiAoYm9vdHRpbWVfY3NlY3MgPT0gMCkKICAgICAgICByZXR1cm4gMDsKICAgIGdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopIDApOwogICAgbm93dGltZV9jc2VjcyA9IChub3cudHZfc2VjICogMTAwKSArIChub3cudHZfdXNlYyAvIDEwMDAwKTsKCiAgICByZXR1cm4gKG5vd3RpbWVfY3NlY3MgLSBib290dGltZV9jc2Vjcyk7CiNlbmRpZgoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICBzdHJ1Y3Qgbmxpc3Qgbmw7CiAgICBpbnQga21lbTsKICAgIHRpbWVfdCBsYm9sdDsKICAgIG5sLm5fbmFtZSA9IChjaGFyICopICJsYm9sdCI7CiAgICBpZihrbmxpc3QoJm5sLCAxLCBzaXplb2Yoc3RydWN0IG5saXN0KSkgIT0gMCkgcmV0dXJuKDApOwogICAgaWYobmwubl90eXBlID09IDAgfHwgbmwubl92YWx1ZSA9PSAwKSByZXR1cm4oMCk7CiAgICBpZigoa21lbSA9IG9wZW4oIi9kZXYvbWVtIiwgMCkpIDwgMCkgcmV0dXJuIDA7CiAgICBsc2VlayhrbWVtLCAobG9uZykgbmwubl92YWx1ZSwgTF9TRVQpOwogICAgcmVhZChrbWVtLCAmbGJvbHQsIHNpemVvZihsYm9sdCkpOwogICAgY2xvc2Uoa21lbSk7CiAgICByZXR1cm4obGJvbHQpOwojZW5kaWYKCiNpZmRlZiBzb2xhcmlzMgogICAga3N0YXRfY3RsX3QgICAgKmtzYyA9IGtzdGF0X29wZW4oKTsKICAgIGtzdGF0X3QgICAgICAgICprczsKICAgIGtpZF90ICAgICAgICAgICBraWQ7CiAgICBrc3RhdF9uYW1lZF90ICAqbmFtZWQ7CiAgICB1X2xvbmcgICAgICAgICAgbGJvbHQgPSAwOwoKICAgIGlmIChrc2MpIHsKICAgICAgICBrcyA9IGtzdGF0X2xvb2t1cChrc2MsICJ1bml4IiwgLTEsICJzeXN0ZW1fbWlzYyIpOwogICAgICAgIGlmIChrcykgewogICAgICAgICAgICBraWQgPSBrc3RhdF9yZWFkKGtzYywga3MsIE5VTEwpOwogICAgICAgICAgICBpZiAoa2lkICE9IC0xKSB7CiAgICAgICAgICAgICAgICBuYW1lZCA9IGtzdGF0X2RhdGFfbG9va3VwKGtzLCAibGJvbHQiKTsKICAgICAgICAgICAgICAgIGlmIChuYW1lZCkgewojaWZkZWYgS1NUQVRfREFUQV9VSU5UMzIKICAgICAgICAgICAgICAgICAgICBsYm9sdCA9IG5hbWVkLT52YWx1ZS51aTMyOwojZWxzZQogICAgICAgICAgICAgICAgICAgIGxib2x0ID0gbmFtZWQtPnZhbHVlLnVsOwojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrc3RhdF9jbG9zZShrc2MpOwogICAgfQogICAgcmV0dXJuIGxib2x0OwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojaWZkZWYgbGludXgKICAgIEZJTEUgICAgICAgICAgICppbiA9IGZvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpOwogICAgbG9uZyAgICAgICAgICAgIHVwdGltID0gMCwgYSwgYjsKICAgIGlmIChpbikgewogICAgICAgIGlmICgyID09IGZzY2FuZihpbiwgIiVsZC4lbGQiLCAmYSwgJmIpKQogICAgICAgICAgICB1cHRpbSA9IGEgKiAxMDAgKyBiOwogICAgICAgIGZjbG9zZShpbik7CiAgICB9CiAgICByZXR1cm4gdXB0aW07CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KCiNpZmRlZiBjeWd3aW4KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KI2VuZGlmCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogISBXSU4zMiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSEFWRV9TVFJOQ0FTRUNNUAoKLyoKICogdGVzdCBmb3IgTlVMTCBwb2ludGVycyBiZWZvcmUgYW5kIE5VTEwgY2hhcmFjdGVycyBhZnRlcgogKiAqIGNvbXBhcmluZyBwb3NzaWJseSBub24tTlVMTCBzdHJpbmdzLgogKiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgY2hlY2sgZm9yIGFycmF5IG92ZXJmbG93LgogKi8KaW50CnN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG5jaCkKewogICAgc2l6ZV90ICAgICAgICAgIGlpOwogICAgaW50ICAgICAgICAgICAgIHJlcyA9IC0xOwoKICAgIGlmICghczEpIHsKICAgICAgICBpZiAoIXMyKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIGlmICghczIpCiAgICAgICAgcmV0dXJuICgxKTsKCiAgICBmb3IgKGlpID0gMDsgKGlpIDwgbmNoKSAmJiAqczEgJiYgKnMyOyBpaSsrLCBzMSsrLCBzMisrKSB7CiAgICAgICAgcmVzID0gKGludCkgKHRvbG93ZXIoKnMxKSAtIHRvbG93ZXIoKnMyKSk7CiAgICAgICAgaWYgKHJlcyAhPSAwKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAoaWkgPT0gbmNoKSB7CiAgICAgICAgczEtLTsKICAgICAgICBzMi0tOwogICAgfQoKICAgIGlmICghKnMxKSB7CiAgICAgICAgaWYgKCEqczIpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQogICAgaWYgKCEqczIpCiAgICAgICAgcmV0dXJuICgxKTsKCiAgICByZXR1cm4gKHJlcyk7Cn0KCmludApzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKewogICAgcmV0dXJuIHN0cm5jYXNlY21wKHMxLCBzMiwgMTAwMDAwMCk7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TVFJOQ0FTRUNNUCAqLwoKCiNpZm5kZWYgSEFWRV9TVFJEVVAKY2hhciAgICAgICAgICAgKgpzdHJkdXAoY29uc3QgY2hhciAqc3JjKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgY2hhciAgICAgICAgICAgKmRzdDsKCiAgICBsZW4gPSBzdHJsZW4oc3JjKSArIDE7CiAgICBpZiAoKGRzdCA9IChjaGFyICopIG1hbGxvYyhsZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICBzdHJjcHkoZHN0LCBzcmMpOwogICAgcmV0dXJuIChkc3QpOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TVFJEVVAgKi8KCiNpZm5kZWYgSEFWRV9TRVRFTlYKaW50CnNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IG92ZXJ3cml0ZSkKewogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAob3ZlcndyaXRlID09IDApIHsKICAgICAgICBpZiAoZ2V0ZW52KG5hbWUpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNwID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihuYW1lKSArIHN0cmxlbih2YWx1ZSkgKyAyKTsKICAgIGlmIChjcCA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKICAgIHNwcmludGYoY3AsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKICAgIHJldCA9IHB1dGVudihjcCk7CiNpZmRlZiBXSU4zMgogICAgZnJlZShjcCk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU0VURU5WICovCgovKiByZXR1cm5zIGNlbnRpc2Vjb25kcyAqLwppbnQKY2FsY3VsYXRlX3RpbWVfZGlmZihzdHJ1Y3QgdGltZXZhbCAqbm93LCBzdHJ1Y3QgdGltZXZhbCAqdGhlbikKewogICAgc3RydWN0IHRpbWV2YWwgIHRtcCwgZGlmZjsKICAgIG1lbWNweSgmdG1wLCBub3csIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwogICAgdG1wLnR2X3NlYy0tOwogICAgdG1wLnR2X3VzZWMgKz0gMTAwMDAwMEw7CiAgICBkaWZmLnR2X3NlYyA9IHRtcC50dl9zZWMgLSB0aGVuLT50dl9zZWM7CiAgICBkaWZmLnR2X3VzZWMgPSB0bXAudHZfdXNlYyAtIHRoZW4tPnR2X3VzZWM7CiAgICBpZiAoZGlmZi50dl91c2VjID4gMTAwMDAwMEwpIHsKICAgICAgICBkaWZmLnR2X3VzZWMgLT0gMTAwMDAwMEw7CiAgICAgICAgZGlmZi50dl9zZWMrKzsKICAgIH0KICAgIHJldHVybiAoKGRpZmYudHZfc2VjICogMTAwKSArIChkaWZmLnR2X3VzZWMgLyAxMDAwMCkpOwp9CgovKiByZXR1cm5zIGRpZmYgaW4gcm91bmRlZCBzZWNvbmRzICovCnVfaW50CmNhbGN1bGF0ZV9zZWN0aW1lX2RpZmYoc3RydWN0IHRpbWV2YWwgKm5vdywgc3RydWN0IHRpbWV2YWwgKnRoZW4pCnsKICAgIHN0cnVjdCB0aW1ldmFsICB0bXAsIGRpZmY7CiAgICBtZW1jcHkoJnRtcCwgbm93LCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKICAgIHRtcC50dl9zZWMtLTsKICAgIHRtcC50dl91c2VjICs9IDEwMDAwMDBMOwogICAgZGlmZi50dl9zZWMgPSB0bXAudHZfc2VjIC0gdGhlbi0+dHZfc2VjOwogICAgZGlmZi50dl91c2VjID0gdG1wLnR2X3VzZWMgLSB0aGVuLT50dl91c2VjOwogICAgaWYgKGRpZmYudHZfdXNlYyA+IDEwMDAwMDBMKSB7CiAgICAgICAgZGlmZi50dl91c2VjIC09IDEwMDAwMDBMOwogICAgICAgIGRpZmYudHZfc2VjKys7CiAgICB9CiAgICBpZiAoZGlmZi50dl91c2VjID49IDUwMDAwMEwpCiAgICAgICAgcmV0dXJuIGRpZmYudHZfc2VjICsgMTsKICAgIHJldHVybiAgZGlmZi50dl9zZWM7Cn0KCiNpZm5kZWYgSEFWRV9TVFJDQVNFU1RSCi8qCiAqIG9ubHkgZ2xpYmMyIGhhcyB0aGlzLgogKi8KY2hhciAgICAgICAgICAgKgpzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDEgPSBoYXlzdGFjaywgKmNwMiA9IG5lZWRsZTsKICAgIGNvbnN0IGNoYXIgICAgICpjeDsKICAgIGludCAgICAgICAgICAgICB0c3RjaDEsIHRzdGNoMjsKCiAgICAvKgogICAgICogcHJpbnRmKCJsb29raW5nIGZvciAnJXMnIGluICclcydcbiIsIG5lZWRsZSwgaGF5c3RhY2spOyAKICAgICAqLwogICAgaWYgKGNwMSAmJiBjcDIgJiYgKmNwMSAmJiAqY3AyKQogICAgICAgIGZvciAoY3AxID0gaGF5c3RhY2ssIGNwMiA9IG5lZWRsZTsgKmNwMTspIHsKICAgICAgICAgICAgY3ggPSBjcDE7CiAgICAgICAgICAgIGNwMiA9IG5lZWRsZTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW50ZigiVCclYycgIiwgKmNwMSk7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoISpjcDIpIHsgICAgLyogZm91bmQgdGhlIG5lZWRsZSAqLwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogcHJpbnRmKCJcbmZvdW5kICclcycgaW4gJyVzJ1xuIiwgbmVlZGxlLCBjeCk7IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHJldHVybiBORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIGN4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghKmNwMSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICB0c3RjaDEgPSB0b3VwcGVyKCpjcDEpOwogICAgICAgICAgICAgICAgdHN0Y2gyID0gdG91cHBlcigqY3AyKTsKICAgICAgICAgICAgICAgIGlmICh0c3RjaDEgIT0gdHN0Y2gyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW50ZigiTSclYycgIiwgKmNwMSk7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjcDErKzsKICAgICAgICAgICAgICAgIGNwMisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgxKTsKICAgICAgICAgICAgaWYgKCpjcDEpCiAgICAgICAgICAgICAgICBjcDErKzsKICAgICAgICB9CiAgICAvKgogICAgICogcHJpbnRmKCJcbiIpOyAKICAgICAqLwogICAgaWYgKGNwMSAmJiAqY3AxKQogICAgICAgIHJldHVybiBORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIGNwMSk7CgogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmCgppbnQKbWtkaXJoaWVyKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSwgaW50IHNraXBsYXN0KQp7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2J1ZjsKICAgIGNoYXIgICAgICAgICAgICpvdXJjb3B5ID0gc3RyZHVwKHBhdGhuYW1lKTsKICAgIGNoYXIgICAgICAgICAgICplbnRyeTsKICAgIGNoYXIgICAgICAgICAgICpidWYgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKnN0ID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICByZXM7CgogICAgcmVzID0gU05NUEVSUl9HRU5FUlI7CiAgICBpZiAoIW91cmNvcHkpCiAgICAgICAgZ290byBvdXQ7CgogICAgYnVmID0gbWFsbG9jKHN0cmxlbihwYXRobmFtZSkgKyAyKTsKICAgIGlmICghYnVmKQogICAgICAgIGdvdG8gb3V0OwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICAvKiBjb252ZXJ0IGJhY2tzbGFzaCB0byBmb3J3YXJkIHNsYXNoICovCiAgICBmb3IgKGVudHJ5ID0gb3VyY29weTsgKmVudHJ5OyBlbnRyeSsrKQogICAgICAgIGlmICgqZW50cnkgPT0gJ1xcJykKICAgICAgICAgICAgKmVudHJ5ID0gJy8nOwojZW5kaWYKCiAgICBlbnRyeSA9IHN0cnRva19yKG91cmNvcHksICIvIiwgJnN0KTsKCiAgICBidWZbMF0gPSAnXDAnOwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICAvKgogICAgICogQ2hlY2sgaWYgZmlyc3QgZW50cnkgY29udGFpbnMgYSBkcml2ZS1sZXR0ZXIKICAgICAqICAgZS5nICAiYzovcGF0aCIKICAgICAqLwogICAgaWYgKChlbnRyeSkgJiYgKCc6JyA9PSBlbnRyeVsxXSkgJiYKICAgICAgICAoKCdcMCcgPT0gZW50cnlbMl0pIHx8ICgnLycgPT0gZW50cnlbMl0pKSkgewogICAgICAgIHN0cmNhdChidWYsIGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsICIvIiwgJnN0KTsKICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIGNoZWNrIHRvIHNlZSBpZiBmaWxlbmFtZSBpcyBhIGRpcmVjdG9yeSAKICAgICAqLwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgc3RyY2F0KGJ1ZiwgIi8iKTsKICAgICAgICBzdHJjYXQoYnVmLCBlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCAiLyIsICZzdCk7CiAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwgJiYgc2tpcGxhc3QpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmIChzdGF0KGJ1ZiwgJnNidWYpIDwgMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBETkUsIG1ha2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIkNyZWF0aW5nIGRpcmVjdG9yeTogJXNcbiIsIGJ1Zik7CiNpZmRlZiBXSU4zMgogICAgICAgICAgICBpZiAoQ3JlYXRlRGlyZWN0b3J5KGJ1ZiwgTlVMTCkgPT0gMCkKI2Vsc2UKICAgICAgICAgICAgaWYgKG1rZGlyKGJ1ZiwgbW9kZSkgPT0gLTEpCiNlbmRpZgogICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZXhpc3RzLCBpcyBpdCBhIGZpbGU/IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKChzYnVmLnN0X21vZGUgJiBTX0lGRElSKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogYWNrISBjYW4ndCBtYWtlIGEgZGlyZWN0b3J5IG9uIHRvcCBvZiBhIGZpbGUgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmVzID0gU05NUEVSUl9TVUNDRVNTOwpvdXQ6CiAgICBmcmVlKGJ1Zik7CiAgICBmcmVlKG91cmNvcHkpOwogICAgcmV0dXJuIHJlczsKfQoKLyoqCiAqIG5ldHNubXBfbWt0ZW1wIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBiYXNlZCBvbiB0aGUKICogICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgdGVtcEZpbGVQYXR0ZXJuCiAqCiAqIEByZXR1cm4gZmlsZSBkZXNjcmlwdG9yCiAqLwpjb25zdCBjaGFyICAgICAqCm5ldHNubXBfbWt0ZW1wKHZvaWQpCnsKI2lmZGVmIFBBVEhfTUFYCiAgICBzdGF0aWMgY2hhciAgICAgbmFtZVtQQVRIX01BWF07CiNlbHNlCiAgICBzdGF0aWMgY2hhciAgICAgbmFtZVsyNTZdOwojZW5kaWYKICAgIGludCAgICAgICAgICAgICBmZCA9IC0xOwoKICAgIHN0cmxjcHkobmFtZSwgZ2V0X3RlbXBfZmlsZV9wYXR0ZXJuKCksIHNpemVvZihuYW1lKSk7CiNpZmRlZiBIQVZFX01LU1RFTVAKICAgIHsKICAgICAgICBtb2RlX3Qgb2xkbWFzayA9IHVtYXNrKH4oU19JUlVTUiB8IFNfSVdVU1IpKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydChvbGRtYXNrICE9IChtb2RlX3QpKC0xKSk7CiAgICAgICAgZmQgPSBta3N0ZW1wKG5hbWUpOwogICAgICAgIHVtYXNrKG9sZG1hc2spOwogICAgfQojZWxzZQogICAgaWYgKG1rdGVtcChuYW1lKSkgewojIGlmbmRlZiBXSU4zMgogICAgICAgIGZkID0gb3BlbihuYW1lLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIFNfSVJVU1IgfCBTX0lXVVNSKTsKIyBlbHNlCiAgICAgICAgLyoKICAgICAgICAgKiBXaW4zMiBuZWVkcyBfU19JUkVBRCB8IF9TX0lXUklURSB0byBzZXQgcGVybWlzc2lvbnMgb24gZmlsZQogICAgICAgICAqIGFmdGVyIGNsb3NpbmcKICAgICAgICAgKi8KICAgICAgICBmZCA9IF9vcGVuKG5hbWUsIF9PX0NSRUFUIHwgX09fRVhDTCB8IF9PX1dST05MWSwgX1NfSVJFQUQgfCBfU19JV1JJVEUpOwojIGVuZGlmCiAgICB9CiNlbmRpZgogICAgaWYgKGZkID49IDApIHsKICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgREVCVUdNU0dUTCgoIm5ldHNubXBfbWt0ZW1wIiwgInRlbXAgZmlsZSBjcmVhdGVkOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CiAgICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgICBzbm1wX2xvZyhMT0dfRVJSLCAibmV0c25tcF9ta3RlbXA6IGVycm9yIGNyZWF0aW5nIGZpbGUgJXNcbiIsCiAgICAgICAgICAgICBuYW1lKTsKICAgIHJldHVybiBOVUxMOwp9CgovKgogKiBUaGlzIGZ1bmN0aW9uIHdhcyBjcmVhdGVkIHRvIGRpZmZlcmVudGlhdGUgYWN0aW9ucwogKiB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgTGludXggMi40IGtlcm5lbHMsIGJ1dCBub3QgbGF0ZXIga2VybmVscy4KICoKICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB0ZXN0IGtlcm5lbHMgb24gYW55IHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgdW5hbWUoKS4KICoKICogSWYgbm90IHJ1bm5pbmcgYSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIHVuYW1lKCksIHJldHVybiAtMS4KICoKICogSWYgb3NwbmFtZSBtYXRjaGVzLCBhbmQgdGhlIHJlbGVhc2UgbWF0Y2hlcyB1cCB0aHJvdWdoIHRoZSBwcmVmaXgsCiAqICByZXR1cm4gMC4KICogSWYgdGhlIHJlbGVhc2UgaXMgb3JkZXJlZCBoaWdoZXIsIHJldHVybiAxLgogKiBCZSBhd2FyZSB0aGF0ICJvcmRlcmVkIGhpZ2hlciIgaXMgbm90IGEgZ3VhcmFudGVlIG9mIGNvcnJlY3RuZXNzLgogKi8KaW50Cm5ldHNubXBfb3NfcHJlbWF0Y2goY29uc3QgY2hhciAqb3NwbW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3NwbXJlbHByZWZpeCkKewojaWYgSEFWRV9TWVNfVVRTTkFNRV9ICiAgc3RhdGljIGludCBwcmludE9Tb25jZSA9IDE7CiAgc3RydWN0IHV0c25hbWUgdXRzYnVmOwogIGlmICggMCA+IHVuYW1lKCZ1dHNidWYpKQogICAgcmV0dXJuIC0xOwoKICBpZiAocHJpbnRPU29uY2UpIHsKICAgIHByaW50T1NvbmNlID0gMDsKICAgIC8qIHNob3cgdGhlIGZvdXIgZWxlbWVudHMgdGhhdCB0aGUga2VybmVsIGNhbiBiZSBzdXJlIG9mICovCiAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwic3lzbmFtZSAnJXMnLFxucmVsZWFzZSAnJXMnLFxudmVyc2lvbiAnJXMnLFxubWFjaGluZSAnJXMnXG4iLAogICAgICB1dHNidWYuc3lzbmFtZSwgdXRzYnVmLnJlbGVhc2UsIHV0c2J1Zi52ZXJzaW9uLCB1dHNidWYubWFjaGluZSkpOwogIH0KICBpZiAoMCAhPSBzdHJjYXNlY21wKHV0c2J1Zi5zeXNuYW1lLCBvc3BtbmFtZSkpIHJldHVybiAtMTsKCiAgLyogUmVxdWlyZWQgdG8gbWF0Y2ggb25seSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzICovCiAgcmV0dXJuIHN0cm5jYXNlY21wKHV0c2J1Zi5yZWxlYXNlLCBvc3BtcmVscHJlZml4LCBzdHJsZW4ob3NwbXJlbHByZWZpeCkpOwoKI2Vsc2UKCiAgcmV0dXJuIC0xOwoKI2VuZGlmIC8qIEhBVkVfU1lTX1VUU05BTUVfSCAqLwp9CgovKioKICogbmV0c25tcF9vc19rZXJuZWxfd2lkdGggZGV0ZXJtaW5lcyBrZXJuZWwgd2lkdGggYXQgcnVudGltZQogKiBDdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIElSSVgsIEFJWCBhbmQgVHJ1NjQgVW5peAogKgogKiBAcmV0dXJuIGtlcm5lbCB3aWR0aCAodXN1YWxseSAzMiBvciA2NCkgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKICovCmludApuZXRzbm1wX29zX2tlcm5lbF93aWR0aCh2b2lkKQp7CiNpZmRlZiBpcml4NgogIGNoYXIgYnVmWzhdOwogIHN5c2luZm8oX01JUFNfU0lfT1NfTkFNRSwgYnVmLCA3KTsKICBpZiAoc3RybmNtcCgiSVJJWDY0IiwgYnVmLCA2KSA9PSAwKSB7CiAgICByZXR1cm4gNjQ7CiAgfSBlbHNlIGlmIChzdHJuY21wKCJJUklYIiwgYnVmLCA0KSA9PSAwKSB7CiAgICByZXR1cm4gMzI7CiAgfSBlbHNlIHsKICAgIHJldHVybiAtMTsKICB9CiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgcmV0dXJuIChfX0tFUk5FTF8zMigpID8gMzIgOiAoX19LRVJORUxfNjQoKSA/IDY0IDogLTEpKTsKI2VsaWYgZGVmaW5lZChvc2Y0KSB8fCBkZWZpbmVkKG9zZjUpIHx8IGRlZmluZWQoX19hbHBoYSkKICByZXR1cm4gNjQ7IC8qIEFscGhhIGlzIGFsd2F5cyA2NGJpdCAqLwojZWxzZQogIC8qIGtlcm5lbCB3aWR0aCBkZXRlY3Rpb24gbm90IGltcGxlbWVudGVkICovCiAgcmV0dXJuIC0xOwojZW5kaWYKfQoK