LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBDb3B5cmlnaHQgMjAwNyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVFguLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPGRybS9kcm0uaD4KI2luY2x1ZGUgInhmODZkcmkuaCIKI2luY2x1ZGUgInhmODZkcm0uaCIKI2luY2x1ZGUgInN0ZGlvLmgiCiNpbmNsdWRlICJzeXMvdHlwZXMuaCIKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJzeXMvbW1hbi5oIgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgZW51bQogICAgewoJaGF2ZU5vdGhpbmcsCgloYXZlRGlzcGxheSwKCWhhdmVDb25uZWN0aW9uLAoJaGF2ZURyaXZlck5hbWUsCgloYXZlRGV2aWNlSW5mbywKCWhhdmVEUk0sCgloYXZlQ29udGV4dAogICAgfQogICAgc3RhdGU7CgogICAgRGlzcGxheSAqZGlzcGxheTsKICAgIGludCBzY3JlZW47CiAgICBkcm1faGFuZGxlX3Qgc0FyZWFPZmZzZXQ7CiAgICBjaGFyICpjdXJCdXNJRDsKICAgIGNoYXIgKmRyaXZlck5hbWU7CiAgICBpbnQgZHJtRkQ7CiAgICBYVmlzdWFsSW5mbyB2aXN1YWxJbmZvOwogICAgWElEIGlkOwogICAgZHJtX2NvbnRleHRfdCBod0NvbnRleHQ7CiAgICB2b2lkICpkcmlQcml2OwogICAgaW50IGRyaVByaXZTaXplOwogICAgaW50IGZiU2l6ZTsKICAgIGludCBmYk9yaWdpbjsKICAgIGludCBmYlN0cmlkZTsKICAgIGRybV9oYW5kbGVfdCBmYkhhbmRsZTsKICAgIGludCBkZHhEcml2ZXJNYWpvcjsKICAgIGludCBkZHhEcml2ZXJNaW5vcjsKICAgIGludCBkZHhEcml2ZXJQYXRjaDsKfSBUaW55RFJJQ29udGV4dDsKCiNpZm5kZWYgX194ODZfNjRfXwpzdGF0aWMgdW5zaWduZWQKZmFzdHJkdHNjKHZvaWQpCnsKICAgIHVuc2lnbmVkIGVheDsKICAgIF9fYXNtX18gdm9sYXRpbGUgKCJcdCIKCSJwdXNobCAgJSVlYnhcblx0IgoJImNwdWlkXG5cdCIgIi5ieXRlIDB4MGYsIDB4MzFcblx0IiAicG9wbCAlJWVieFxuIjoiPWEiIChlYXgpCgk6IjAiKDApCgk6ImVjeCIsICJlZHgiLCAiY2MiKTsKCiAgICByZXR1cm4gZWF4Owp9CiNlbHNlCnN0YXRpYyB1bnNpZ25lZApmYXN0cmR0c2Modm9pZCkKewogICAgdW5zaWduZWQgZWF4OwogICAgX19hc21fXyB2b2xhdGlsZSAoIlx0IiAiY3B1aWRcblx0IiAiLmJ5dGUgMHgwZiwgMHgzMVxuXHQiOiI9YSIgKGVheCkKCToiMCIoMCkKCToiZWN4IiwgImVkeCIsICJlYngiLCAiY2MiKTsKCiAgICByZXR1cm4gZWF4Owp9CiNlbmRpZgoKdm9pZApibUVycm9yKGludCB2YWwsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBpbnQgbGluZSkKewogICAgZnByaW50ZihzdGRlcnIsICJGYXRhbCB2aWRlbyBtZW1vcnkgbWFuYWdlciBlcnJvciBcIiVzXCIuXG4iCgkiQ2hlY2sga2VybmVsIGxvZ3Mgb3Igc2V0IHRoZSBMSUJHTF9ERUJVR1xuIgoJImVudmlyb25tZW50IHZhcmlhYmxlIHRvIFwidmVyYm9zZVwiIGZvciBtb3JlIGluZm8uXG4iCgkiRGV0ZWN0ZWQgaW4gZmlsZSAlcywgbGluZSAlZCwgZnVuY3Rpb24gJXMuXG4iLAoJc3RyZXJyb3IoLXZhbCksIGZpbGUsIGxpbmUsIGZ1bmN0aW9uKTsKICAgIGFib3J0KCk7Cn0KCiNkZWZpbmUgQk1fQ0tGQVRBTCh2YWwpCQkJCQkgICAgICAgXAogIGRvewkJCQkJCQkgICAgICAgXAogICAgaW50IHRzdFZhbCA9ICh2YWwpOwkJCQkJICAgICAgIFwKICAgIGlmICh0c3RWYWwpIAkJCQkJICAgICAgIFwKICAgICAgYm1FcnJvcih0c3RWYWwsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgICAgICAgXAogIH0gd2hpbGUoMCk7CgpzdGF0aWMgdW5zaWduZWQKdGltZV9kaWZmKHVuc2lnbmVkIHQsIHVuc2lnbmVkIHQyKQp7CiAgICByZXR1cm4gKCh0IDwgdDIpID8gdDIgLSB0IDogMHhGRkZGRkZGRlUgLSAodCAtIHQyIC0gMSkpOwp9CgpzdGF0aWMgaW50CnJlbGVhc2VDb250ZXh0KFRpbnlEUklDb250ZXh0ICogY3R4KQp7CiAgICBzd2l0Y2ggKGN0eC0+c3RhdGUpIHsKICAgIGNhc2UgaGF2ZUNvbnRleHQ6Cgl1bmlEUklEZXN0cm95Q29udGV4dChjdHgtPmRpc3BsYXksIGN0eC0+c2NyZWVuLCBjdHgtPmlkKTsKICAgIGNhc2UgaGF2ZURSTToKCWRybUNsb3NlKGN0eC0+ZHJtRkQpOwogICAgY2FzZSBoYXZlRGV2aWNlSW5mbzoKCVhGcmVlKGN0eC0+ZHJpUHJpdik7CiAgICBjYXNlIGhhdmVEcml2ZXJOYW1lOgoJWEZyZWUoY3R4LT5kcml2ZXJOYW1lKTsKICAgIGNhc2UgaGF2ZUNvbm5lY3Rpb246CglYRnJlZShjdHgtPmN1ckJ1c0lEKTsKCXVuaURSSUNsb3NlQ29ubmVjdGlvbihjdHgtPmRpc3BsYXksIGN0eC0+c2NyZWVuKTsKICAgIGNhc2UgaGF2ZURpc3BsYXk6CglYQ2xvc2VEaXNwbGF5KGN0eC0+ZGlzcGxheSk7CiAgICBkZWZhdWx0OgoJYnJlYWs7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCnN0YXRpYyB2b2lkCnJlYWRCdWYodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCnsKICAgIHZvbGF0aWxlIHVuc2lnbmVkICpidWYzMiA9ICh1bnNpZ25lZCAqKWJ1ZjsKICAgIHVuc2lnbmVkICplbmQgPSAodW5zaWduZWQgKilidWYzMiArIHNpemUgLyBzaXplb2YoKmJ1ZjMyKTsKCiAgICB3aGlsZSAoYnVmMzIgPCBlbmQpIHsKCSh2b2lkKSpidWYzMisrOwogICAgfQp9CgpzdGF0aWMgaW50CmJlbmNobWFya0J1ZmZlcihUaW55RFJJQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgbG9uZyBzaXplLAogICAgdW5zaWduZWQgbG9uZyAqdGlja3MpCnsKICAgIHVuc2lnbmVkIGxvbmcgY3VyVGltZSwgb2xkVGltZTsKICAgIGludCByZXQ7CiAgICBkcm1CTyBidWY7CiAgICB2b2lkICp2aXJ0dWFsOwoKICAgIC8qCiAgICAgKiBUZXN0IHN5c3RlbSBtZW1vcnkgb2JqZWN0cy4KICAgICAqLwogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgQk1fQ0tGQVRBTChkcm1CT0NyZWF0ZShjdHgtPmRybUZELCBzaXplLCAwLCBOVUxMLAoJCQkgICBEUk1fQk9fRkxBR19SRUFEIHwKCQkJICAgRFJNX0JPX0ZMQUdfV1JJVEUgfAoJCQkgICBEUk1fQk9fRkxBR19NRU1fTE9DQUwsIDAsICZidWYpKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIEJNX0NLRkFUQUwoZHJtQk9NYXAoY3R4LT5kcm1GRCwgJmJ1ZiwKCSAgICBEUk1fQk9fRkxBR19SRUFEIHwgRFJNX0JPX0ZMQUdfV1JJVEUsIDAsICZ2aXJ0dWFsKSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBtZW1zZXQodmlydHVhbCwgMHhGMCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgbWVtc2V0KHZpcnR1YWwsIDB4MEYsIGJ1Zi5zaXplKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIHJlYWRCdWYodmlydHVhbCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgQk1fQ0tGQVRBTChkcm1CT1VubWFwKGN0eC0+ZHJtRkQsICZidWYpKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIC8qCiAgICAgKiBUZXN0IFRUIGJvdW5kIGJ1ZmZlciBvYmplY3RzLgogICAgICovCgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgQk1fQ0tGQVRBTChkcm1CT1NldFN0YXR1cyhjdHgtPmRybUZELCAmYnVmLAoJCQkgICAgIERSTV9CT19GTEFHX01FTV9UVCwgCgkJCSAgICAgRFJNX0JPX01BU0tfTUVNLCAKCQkJICAgICAgMCwwLDApKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIEJNX0NLRkFUQUwoZHJtQk9NYXAoY3R4LT5kcm1GRCwgJmJ1ZiwKCSAgICBEUk1fQk9fRkxBR19SRUFEIHwgRFJNX0JPX0ZMQUdfV1JJVEUsIDAsICZ2aXJ0dWFsKSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBtZW1zZXQodmlydHVhbCwgMHhGMCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgbWVtc2V0KHZpcnR1YWwsIDB4MEYsIGJ1Zi5zaXplKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIHJlYWRCdWYodmlydHVhbCwgYnVmLnNpemUpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgQk1fQ0tGQVRBTChkcm1CT1VubWFwKGN0eC0+ZHJtRkQsICZidWYpKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICBCTV9DS0ZBVEFMKGRybUJPU2V0U3RhdHVzKGN0eC0+ZHJtRkQsICZidWYsCgkJCSAgICAgRFJNX0JPX0ZMQUdfTUVNX0xPQ0FMLCBEUk1fQk9fTUFTS19NRU0sIDAsIDAsMCkpOwogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgLyoKICAgICAqIFRlc3QgY2FjaGVkIGJ1ZmZlcnMgb2JqZWN0cy4KICAgICAqLwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIHJldCA9IGRybUJPU2V0U3RhdHVzKGN0eC0+ZHJtRkQsICZidWYsCgkJCSBEUk1fQk9fRkxBR19NRU1fVFQgfCAKCQkJIERSTV9CT19GTEFHX0NBQ0hFRCB8IAoJCQkgRFJNX0JPX0ZMQUdfRk9SQ0VfQ0FDSElORywKCQkJIERSTV9CT19NQVNLX01FTVRZUEUgfCAKCQkJIERSTV9CT19GTEFHX0ZPUkNFX0NBQ0hJTkcsCgkJCSAwLCAwLCAwKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKCiAgICBpZiAocmV0KSB7CglwcmludGYoIkNvdWxkbid0IGJpbmQgY2FjaGVkLiBQcm9iYWJseSBubyBzdXBwb3J0XG4iKTsKCUJNX0NLRkFUQUwoZHJtQk9VbnJlZmVyZW5jZShjdHgtPmRybUZELCAmYnVmKSk7CglyZXR1cm4gMTsKICAgIH0KICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIEJNX0NLRkFUQUwoZHJtQk9NYXAoY3R4LT5kcm1GRCwgJmJ1ZiwKCSAgICBEUk1fQk9fRkxBR19SRUFEIHwgRFJNX0JPX0ZMQUdfV1JJVEUsIDAsICZ2aXJ0dWFsKSk7CgogICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOwogICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CgogICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOwogICAgbWVtc2V0KHZpcnR1YWwsIDB4RjAsIGJ1Zi5zaXplKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKICAgIG1lbXNldCh2aXJ0dWFsLCAweDBGLCBidWYuc2l6ZSk7CiAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CiAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKCiAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CiAgICByZWFkQnVmKHZpcnR1YWwsIGJ1Zi5zaXplKTsKICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOwoKICAgIEJNX0NLRkFUQUwoZHJtQk9Vbm1hcChjdHgtPmRybUZELCAmYnVmKSk7CiAgICBCTV9DS0ZBVEFMKGRybUJPVW5yZWZlcmVuY2UoY3R4LT5kcm1GRCwgJmJ1ZikpOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAp0ZXN0QUdQKFRpbnlEUklDb250ZXh0ICogY3R4KQp7CiAgICB1bnNpZ25lZCBsb25nIHRpY2tzWzEyOF0sICpwVGlja3M7CiAgICB1bnNpZ25lZCBsb25nIHNpemUgPSA4ICogMTAyNDsKICAgIGludCByZXQ7CgogICAgcmV0ID0gYmVuY2htYXJrQnVmZmVyKGN0eCwgc2l6ZSwgdGlja3MpOwogICAgaWYgKHJldCA8IDApIHsKCWZwcmludGYoc3RkZXJyLCAiQnVmZmVyIGVycm9yICVzXG4iLCBzdHJlcnJvcigtcmV0KSk7CglyZXR1cm47CiAgICB9CiAgICBwVGlja3MgPSB0aWNrczsKCiAgICBwcmludGYoIkJ1ZmZlciBzaXplICVkIGJ5dGVzXG4iLCBzaXplKTsKICAgIHByaW50ZigiU3lzdGVtIG1lbW9yeSB0aW1pbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgIHByaW50ZigiQ3JlYXRpb24gdG9vayAgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJNYXBwaW5nIHRvb2sgICAgICAgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIldyaXRpbmcgdG9vayAgICAgICAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiV3JpdGluZyBBZ2FpbiB0b29rICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJSZWFkaW5nIHRvb2sgICAgICAgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIlVubWFwcGluZyB0b29rICAgICAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKCiAgICBwcmludGYoIlxuVFQgTWVtb3J5IHRpbWluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgIHByaW50ZigiTW92aW5nIHRvIFRUIHRvb2sgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJNYXBwaW5nIGluIFRUIHRvb2sgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIldyaXRpbmcgdG8gVFQgdG9vayAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiV3JpdGluZyBhZ2FpbiB0byBUVCB0b29rICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJSZWFkaW5nIGZyb20gVFQgdG9vayAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIk1vdmluZyB0byBzeXN0ZW0gdG9vayAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKCiAgICBpZiAocmV0ID09IDEpCglyZXR1cm47CgogICAgcHJpbnRmKCJcbkNhY2hlZCBUVCBNZW1vcnkgdGltaW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAgICBwcmludGYoIk1vdmluZyB0byBDVFQgdG9vayAgICAgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiTWFwcGluZyBpbiBDVFQgdG9vayAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJXcml0aW5nIHRvIENUVCB0b29rICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CiAgICBwcmludGYoIlJlLXdyaXRpbmcgdG8gQ1RUIHRvb2sgICAlMTJsdSB0aWNrc1xuIiwgKnBUaWNrcysrKTsKICAgIHByaW50ZigiUmVhZGluZyBmcm9tIENUVCB0b29rICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOwogICAgcHJpbnRmKCJcblxuIik7Cn0KCmludAptYWluKCkKewogICAgaW50IHJldCwgc2NyZWVuLCBpc0NhcGFibGU7CiAgICBjaGFyICpkaXNwbGF5TmFtZSA9ICI6MCI7CiAgICBUaW55RFJJQ29udGV4dCBjdHg7CiAgICB1bnNpZ25lZCBtYWdpYzsKCiAgICBjdHguc2NyZWVuID0gMDsKICAgIGN0eC5zdGF0ZSA9IGhhdmVOb3RoaW5nOwogICAgY3R4LmRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheU5hbWUpOwogICAgaWYgKCFjdHguZGlzcGxheSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBkaXNwbGF5XG4iKTsKCXJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKICAgIH0KICAgIGN0eC5zdGF0ZSA9IGhhdmVEaXNwbGF5OwoKICAgIHJldCA9Cgl1bmlEUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGUoY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sCgkmaXNDYXBhYmxlKTsKICAgIGlmICghcmV0IHx8ICFpc0NhcGFibGUpIHsKCWZwcmludGYoc3RkZXJyLCAiTm8gRFJJIG9uIHRoaXMgZGlzcGxheTpzY2VlblxuIik7CglyZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CiAgICB9CgogICAgaWYgKCF1bmlEUklPcGVuQ29ubmVjdGlvbihjdHguZGlzcGxheSwgY3R4LnNjcmVlbiwgJmN0eC5zQXJlYU9mZnNldCwKCSAgICAmY3R4LmN1ckJ1c0lEKSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBEUkkgY29ubmVjdGlvbi5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQogICAgY3R4LnN0YXRlID0gaGF2ZUNvbm5lY3Rpb247CgogICAgaWYgKCF1bmlEUklHZXRDbGllbnREcml2ZXJOYW1lKGN0eC5kaXNwbGF5LCBjdHguc2NyZWVuLAoJICAgICZjdHguZGR4RHJpdmVyTWFqb3IsICZjdHguZGR4RHJpdmVyTWlub3IsCgkgICAgJmN0eC5kZHhEcml2ZXJQYXRjaCwgJmN0eC5kcml2ZXJOYW1lKSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IERSSSBkcml2ZXIgbmFtZS5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQogICAgY3R4LnN0YXRlID0gaGF2ZURyaXZlck5hbWU7CgogICAgaWYgKCF1bmlEUklHZXREZXZpY2VJbmZvKGN0eC5kaXNwbGF5LCBjdHguc2NyZWVuLAoJICAgICZjdHguZmJIYW5kbGUsICZjdHguZmJPcmlnaW4sICZjdHguZmJTaXplLAoJICAgICZjdHguZmJTdHJpZGUsICZjdHguZHJpUHJpdlNpemUsICZjdHguZHJpUHJpdikpIHsKCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGdldCBEUkkgZGV2aWNlIGluZm8uXG4iKTsKCXJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKICAgIH0KICAgIGN0eC5zdGF0ZSA9IGhhdmVEcml2ZXJOYW1lOwoKICAgIGlmICgoY3R4LmRybUZEID0gZHJtT3BlbihOVUxMLCBjdHguY3VyQnVzSUQpKSA8IDApIHsKCXBlcnJvcigiRFJNIERldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIik7CglyZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CiAgICB9CiAgICBjdHguc3RhdGUgPSBoYXZlRFJNOwoKICAgIGRybUdldE1hZ2ljKGN0eC5kcm1GRCwgJm1hZ2ljKTsKICAgIGlmICghdW5pRFJJQXV0aENvbm5lY3Rpb24oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIG1hZ2ljKSkgewoJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IFggc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSB1cy5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQoKICAgIHJldCA9IFhNYXRjaFZpc3VhbEluZm8oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIDI0LCBUcnVlQ29sb3IsCgkmY3R4LnZpc3VhbEluZm8pOwogICAgaWYgKCFyZXQpIHsKCXJldCA9IFhNYXRjaFZpc3VhbEluZm8oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIDE2LCBUcnVlQ29sb3IsCgkgICAgJmN0eC52aXN1YWxJbmZvKTsKCWlmICghcmV0KSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHZpc3VhbC5cbiIpOwoJICAgIHJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKCX0KICAgIH0KCiAgICBpZiAoIXVuaURSSUNyZWF0ZUNvbnRleHQoY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIGN0eC52aXN1YWxJbmZvLnZpc3VhbCwKCSAgICAmY3R4LmlkLCAmY3R4Lmh3Q29udGV4dCkpIHsKCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSBEUkkgY29udGV4dC5cbiIpOwoJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOwogICAgfQogICAgY3R4LnN0YXRlID0gaGF2ZUNvbnRleHQ7CgogICAgdGVzdEFHUCgmY3R4KTsKCiAgICByZWxlYXNlQ29udGV4dCgmY3R4KTsKICAgIHByaW50ZigiVGVybWluYXRpbmcgbm9ybWFsbHlcbiIpOwogICAgcmV0dXJuIDA7Cn0K