LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiB1Y29udigxKTogYW4gaWNvbnYoMSktbGlrZSBjb252ZXJ0ZXIgdXNpbmcgSUNVLgogKgogKiBPcmlnaW5hbCBjb2RlIGJ5IEpvbmFzIFV0dGVyc3Ry9m0gPGpvbmFzLnV0dGVyc3Ryb21Adml0dHJhbi5ub3Jybm9kLnNlPgogKiBjb250cmlidXRlZCBpbiAxOTk5LgogKgogKiBDb252ZXJzaW9uIHRvIHRoZSBDIGNvbnZlcnNpb24gQVBJIGFuZCBtYW55IGltcHJvdmVtZW50cyBieQogKiBZdmVzIEFycm91eWUgPHl2ZXNAcmVhbG5hbWVzLmNvbT4sIGN1cnJlbnQgbWFpbnRhaW5lci4KICoKICovCgojaW5jbHVkZSA8dW5pY29kZS91dHlwZXMuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPgojaW5jbHVkZSA8dW5pY29kZS91ZW51bS5oPgojaW5jbHVkZSA8dW5pY29kZS91bmlzdHIuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdHJhbnNsaXQuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdWNsZWFuLmg+CgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgImNtZW1vcnkuaCIKI2luY2x1ZGUgImNzdHJpbmcuaCIKI2luY2x1ZGUgInVzdHJmbXQuaCIKCiNpbmNsdWRlICJ1bmljb2RlL3V3bXNnLmgiCgojaWZkZWYgV0lOMzIKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8aW8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgoKI2lmZGVmIFVDT05WTVNHX0xJTksKLyogYmVsb3cgZnJvbSB0aGUgUkVBRE1FICovCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgojaW5jbHVkZSAidW5pY29kZS91ZGF0YS5oIgpVX0NGVU5DIGNoYXIgdWNvbnZtc2dfZGF0W107CiNlbmRpZgoKI2RlZmluZSBERUZBVUxUX0JVRlNaICAgNDA5NgojZGVmaW5lIFVDT05WTVNHICJ1Y29udm1zZyIKCnN0YXRpYyBVUmVzb3VyY2VCdW5kbGUgKmdCdW5kbGUgPSAwOyAgICAvKiBCdW5kbGUgY29udGFpbmluZyBtZXNzYWdlcy4gKi8KCi8qCiAqIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgYnVuZGxlIHNvIHRoYXQgbWVzc2FnZSBzdHJpbmdzIGNhbiBiZSBmZXRjaGVkCiAqIGJ5IHVfd21zZygpLgogKgogKi8KCnN0YXRpYyB2b2lkIGluaXRNc2coY29uc3QgY2hhciAqcG5hbWUpIHsKICAgIHN0YXRpYyBpbnQgcHMgPSAwOwoKICAgIGlmICghcHMpIHsKICAgICAgICBjaGFyIGRhdGFQYXRoWzIwNDhdOyAgICAgICAgLyogWFhYIFNsb3BweTogc2hvdWxkIGJlIFBBVEhfTUFYLiAqLwogICAgICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgICAgICBwcyA9IDE7CgogICAgICAgIC8qIFNldCB1cCBvdXIgc3RhdGljIGRhdGEgLSBpZiBhbnkgKi8KI2lmZGVmIFVDT05WTVNHX0xJTksKICAgICAgICB1ZGF0YV9zZXRBcHBEYXRhKFVDT05WTVNHLCAoY29uc3Qgdm9pZCopIHVjb252bXNnX2RhdCwgJmVycik7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nLCBwcm9ibGVtIGluc3RhbGxpbmcgb3VyIHN0YXRpYyByZXNvdXJjZSBidW5kbGUgZGF0YSB1Y29udm1zZzogJXMgLSB0cnlpbmcgYW55d2F5cy5cbiIsCiAgICAgICAgICAgICAgICAgIHBuYW1lLCB1X2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsgLyogSXQgbWF5IHN0aWxsIGZhaWwgKi8KICAgICAgICB9CiNlbmRpZgoKICAgICAgICAvKiBHZXQgbWVzc2FnZXMuICovCiAgICAgICAgZ0J1bmRsZSA9IHVfd21zZ19zZXRQYXRoKFVDT05WTVNHLCAmZXJyKTsKICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBjb3VsZG4ndCBvcGVuIGJ1bmRsZSAlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcG5hbWUsIFVDT05WTVNHLCB1X2Vycm9yTmFtZShlcnIpKTsKI2lmZGVmIFVDT05WTVNHX0xJTksKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgIiVzOiBzZXRBcHBEYXRhIHdhcyBjYWxsZWQsIGludGVybmFsIGRhdGEgJXMgZmFpbGVkIHRvIGxvYWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBuYW1lLCBVQ09OVk1TRyk7CiNlbmRpZgogCiAgICAgICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgICAgICAgICAgLyogdGhhdCB3YXMgdHJ5ICMxLCB0cnkgYWdhaW4gd2l0aCBhIHBhdGggKi8KICAgICAgICAgICAgdXBydl9zdHJjcHkoZGF0YVBhdGgsIHVfZ2V0RGF0YURpcmVjdG9yeSgpKTsKICAgICAgICAgICAgdXBydl9zdHJjYXQoZGF0YVBhdGgsIFVfRklMRV9TRVBfU1RSSU5HKTsKICAgICAgICAgICAgdXBydl9zdHJjYXQoZGF0YVBhdGgsIFVDT05WTVNHKTsKCiAgICAgICAgICAgIGdCdW5kbGUgPSB1X3dtc2dfc2V0UGF0aChkYXRhUGF0aCwgJmVycik7CiAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBzdGlsbCBjb3VsZG4ndCBvcGVuIGJ1bmRsZSAlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcG5hbWUsIGRhdGFQYXRoLCB1X2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmc6IG1lc3NhZ2VzIHdpbGwgbm90IGJlIGRpc3BsYXllZFxuIiwgcG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovKiBNYXBwaW5nIG9mIGNhbGxiYWNrIG5hbWVzIHRvIHRoZSBjYWxsYmFja3MgcGFzc2VkIHRvIHRoZSBjb252ZXJ0ZXIKICAgQVBJLiAqLwoKc3RhdGljIHN0cnVjdCBjYWxsYmFja19lbnQgewogICAgY29uc3QgY2hhciAqbmFtZTsKICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIGZyb211OwogICAgY29uc3Qgdm9pZCAqZnJvbXVjdHh0OwogICAgVUNvbnZlcnRlclRvVUNhbGxiYWNrIHRvdTsKICAgIGNvbnN0IHZvaWQgKnRvdWN0eHQ7Cn0gdHJhbnNjb2RlX2NhbGxiYWNrc1tdID0gewogICAgeyAic3Vic3RpdHV0ZSIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX1NVQlNUSVRVVEUsIDAsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19TVUJTVElUVVRFLCAwIH0sCiAgICB7ICJza2lwIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU0tJUCwgMCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX1NLSVAsIDAgfSwKICAgIHsgInN0b3AiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19TVE9QLCAwLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfU1RPUCwgMCB9LAogICAgeyAiZXNjYXBlIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCAwLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCAwfSwKICAgIHsgImVzY2FwZS1pY3UiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX0lDVSwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfSUNVIH0sCiAgICB7ICJlc2NhcGUtamF2YSIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfSkFWQSwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfSkFWQSB9LAogICAgeyAiZXNjYXBlLWMiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX0MsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX0MgfSwKICAgIHsgImVzY2FwZS14bWwiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9IRVgsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9IRVggfSwKICAgIHsgImVzY2FwZS14bWwtaGV4IiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfSEVYLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfSEVYIH0sCiAgICB7ICJlc2NhcGUteG1sLWRlYyIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0RFQywKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0RFQyB9LAogICAgeyAiZXNjYXBlLXVuaWNvZGUiLCBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1VOSUNPREUsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1VOSUNPREUgfQp9OwoKLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIGNhbGxiYWNrIHJlY29yZCBnaXZlbiBpdHMgbmFtZS4gKi8KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY2FsbGJhY2tfZW50ICpmaW5kQ2FsbGJhY2soY29uc3QgY2hhciAqbmFtZSkgewogICAgaW50IGksIGNvdW50ID0KICAgICAgICBzaXplb2YodHJhbnNjb2RlX2NhbGxiYWNrcykgLyBzaXplb2YoKnRyYW5zY29kZV9jYWxsYmFja3MpOwoKICAgIC8qIFdlJ2xsIGRvIGEgbGluZWFyIHNlYXJjaCwgdGhlcmUgYXJlbid0IG1hbnkgb2YgdGhlbSBhbmQgYnNlYXJjaCgpCiAgICAgICBtYXkgbm90IGJlIHRoYXQgcG9ydGFibGUuICovCgogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICBpZiAoIXVwcnZfc3RyaWNtcChuYW1lLCB0cmFuc2NvZGVfY2FsbGJhY2tzW2ldLm5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiAmdHJhbnNjb2RlX2NhbGxiYWNrc1tpXTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8qIFByaW50IGNvbnZlcnRlciBpbmZvcm1hdGlvbi4gSWYgbG9va2ZvciBpcyBzZXQsIG9ubHkgdGhhdCBjb252ZXJ0ZXIgd2lsbAogICBiZSBwcmludGVkLCBvdGhlcndpc2UgYWxsIGNvbnZlcnRlcnMgd2lsbCBiZSBwcmludGVkLiBJZiBjYW5vbiBpcyBub24KICAgemVybywgdGFncyBhbmQgYWxpYXNlcyBmb3IgZWFjaCBjb252ZXJ0ZXIgYXJlIHByaW50ZWQgdG9vLCBpbiB0aGUgZm9ybWF0CiAgIGV4cGVjdGVkIGZvciBjb252cnRlcnMudHh0KDUpLiAqLwoKc3RhdGljIGludCBwcmludENvbnZlcnRlcnMoY29uc3QgY2hhciAqcG5hbWUsIGNvbnN0IGNoYXIgKmxvb2tmb3IsCiAgICBpbnQgY2Fub24pCnsKICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgaW50MzJfdCBudW07CiAgICB1aW50MTZfdCBudW1fc3RkczsKICAgIGNvbnN0IGNoYXIgKipzdGRzOwoKICAgIC8qIElmIHRoZXJlIGlzIGEgc3BlY2lmaWVkIG5hbWUsIGp1c3QgaGFuZGxlIHRoYXQgbm93LiAqLwoKICAgIGlmIChsb29rZm9yKSB7CiAgICAgICAgaWYgKCFjYW5vbikgewogICAgICAgICAgICBwcmludGYoIiVzXG4iLCBsb29rZm9yKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAvKiAgQmVjYXVzZSB3ZSBhcmUgcHJpbnRpbmcgYSBjYW5vbmljYWwgbmFtZSwgd2UgbmVlZCB0aGUKICAgICAgICAgICAgdHJ1ZSBjb252ZXJ0ZXIgbmFtZS4gV2UndmUgZG9uZSB0aGF0IGFscmVhZHkgZXhjZXB0IGZvcgogICAgICAgICAgICB0aGUgZGVmYXVsdCBuYW1lIChiZWNhdXNlIHdlIHdhbnQgdG8gcHJpbnQgdGhlIGV4YWN0CiAgICAgICAgICAgIG5hbWUgb25lIHdvdWxkIGdldCB3aGVuIGNhbGxpbmcgdWNudl9nZXREZWZhdWx0TmFtZSgpCiAgICAgICAgICAgIGluIG5vbi1jYW5vbiBtb2RlKS4gQnV0IHNpbmNlIHdlIGRvIG5vdCBrbm93IGF0IHRoaXMKICAgICAgICAgICAgcG9pbnQgaWYgd2UgaGF2ZSB0aGUgZGVmYXVsdCBuYW1lIG9yIHNvbWV0aGluZyBlbHNlLCB3ZQogICAgICAgICAgICBuZWVkIHRvIG5vcm1hbGl6ZSBhZ2FpbiB0byB0aGUgY2Fub25pY2FsIGNvbnZlcnRlcgogICAgICAgICAgICBuYW1lLiAqLwoKICAgICAgICAgICAgY29uc3QgY2hhciAqdHJ1ZW5hbWUgPSB1Y252X2dldEFsaWFzKGxvb2tmb3IsIDAsICZlcnIpOwogICAgICAgICAgICBpZiAoVV9TVUNDRVNTKGVycikpIHsKICAgICAgICAgICAgICAgIGxvb2tmb3IgPSB0cnVlbmFtZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBQcmludCBjb252ZXJ0ZXIgbmFtZXMuIFdlIGNvbWUgaGVyZSBmb3Igb25lIG9mIHR3byByZWFzb25zOiB3ZQogICAgICAgYXJlIHByaW50aW5nIGFsbCB0aGUgbmFtZXMgKGxvb2tmb3Igd2FzIG51bGwpLCBvciB3ZSBoYXZlIGEKICAgICAgIHNpbmdsZSBjb252ZXJ0ZXIgdG8gcHJpbnQgYnV0IGluIGNhbm9uIG1vZGUsIGhlbmNlIHdlIG5lZWQgdG8KICAgICAgIGdldCB0byBpdCBpbiBvcmRlciB0byBwcmludCBldmVyeXRoaW5nLiAqLwoKICAgIG51bSA9IHVjbnZfY291bnRBdmFpbGFibGUoKTsKICAgIGlmIChudW0gPD0gMCkgewogICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0TmFtZXMiKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAobG9va2ZvcikgewogICAgICAgIG51bSA9IDE7ICAgICAgICAgICAgICAgIC8qIFdlIGtub3cgd2hlcmUgd2Ugd2FudCB0byBiZS4gKi8KICAgIH0KCiAgICBudW1fc3RkcyA9IHVjbnZfY291bnRTdGFuZGFyZHMoKTsKICAgIHN0ZHMgPSAoY29uc3QgY2hhciAqKikgdXBydl9tYWxsb2MobnVtX3N0ZHMgKiBzaXplb2YoKnN0ZHMpKTsKICAgIGlmICghc3RkcykgewogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0VGFnIiwgdV93bXNnX2Vycm9yTmFtZShVX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIHsKICAgICAgICB1aW50MTZfdCBzOwoKICAgICAgICBpZiAoY2Fub24pIHsKICAgICAgICAgICAgcHJpbnRmKCJ7ICIpOwogICAgICAgIH0KICAgICAgICBmb3IgKHMgPSAwOyBzIDwgbnVtX3N0ZHM7ICsrcykgewogICAgICAgICAgICBzdGRzW3NdID0gdWNudl9nZXRTdGFuZGFyZChzLCAmZXJyKTsKICAgICAgICAgICAgaWYgKGNhbm9uKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVzICIsIHN0ZHNbc10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXRUYWciLCB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjYW5vbikgewogICAgICAgICAgICBwdXRzKCJ9Iik7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgICB1aW50MTZfdCBudW1fYWxpYXNlczsKCiAgICAgICAgLyogU2V0IHRoZSBuYW1lIGVpdGhlciB0byB3aGF0IHdlIGFyZSBsb29raW5nIGZvciwgb3IKICAgICAgICB0byB0aGUgY3VycmVudCBjb252ZXJ0ZXIgbmFtZS4gKi8KCiAgICAgICAgaWYgKGxvb2tmb3IpIHsKICAgICAgICAgICAgbmFtZSA9IGxvb2tmb3I7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZSA9IHVjbnZfZ2V0QXZhaWxhYmxlTmFtZShpKTsKICAgICAgICB9CgogICAgICAgIC8qIEdldCBhbGwgdGhlIGFsaWFzZXMgYXNzb2NpYXRlZCB0byB0aGUgbmFtZS4gKi8KCiAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgIG51bV9hbGlhc2VzID0gdWNudl9jb3VudEFsaWFzZXMobmFtZSwgJmVycik7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIHByaW50ZigiJXMiLCBuYW1lKTsKCiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKG5hbWUsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihuYW1lKSArIDEpKTsKICAgICAgICAgICAgcHV0Y2hhcignXHQnKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXRBbGlhc2VzIiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVpbnQxNl90IGEsIHMsIHQ7CgogICAgICAgICAgICAvKiBXcml0ZSBhbGwgdGhlIGFsaWFzZXMgYW5kIHRoZWlyIHRhZ3MuICovCgogICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgbnVtX2FsaWFzZXM7ICsrYSkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWxpYXMgPSB1Y252X2dldEFsaWFzKG5hbWUsIGEsICZlcnIpOwoKICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKG5hbWUsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihuYW1lKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKCdcdCcpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0QWxpYXNlcyIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogUHJpbnQgdGhlIGN1cnJlbnQgYWxpYXMgc28gdGhhdCBpdCBsb29rcyByaWdodC4gKi8KICAgICAgICAgICAgICAgIHByaW50ZigiJXMlcyVzIiwgKGNhbm9uID8gKGEgPT0gMD8gIiIgOiAiXHQiICkgOiAiIikgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbm9uID8gIiIgOiAiICIpKTsKCiAgICAgICAgICAgICAgICAvKiBMb29rIChzbG93bHksIGxpbmVhciBzZWFyY2hpbmcpIGZvciBhIHRhZy4gKi8KCiAgICAgICAgICAgICAgICBpZiAoY2Fub24pIHsKICAgICAgICAgICAgICAgICAgICAvKiAtMSB0byBza2lwIHRoZSBsYXN0IHN0YW5kYXJkICovCiAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gdCA9IDA7IHMgPCBudW1fc3Rkcy0xOyArK3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVUVudW1lcmF0aW9uICpuYW1lRW51bSA9IHVjbnZfb3BlblN0YW5kYXJkTmFtZXMobmFtZSwgc3Rkc1tzXSwgJmVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVX1NVQ0NFU1MoZXJyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlzdCB0aGUgc3RhbmRhcmQgdGFncyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhbmRhcmROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgaXNGaXJzdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlIGVudW1FcnJvciA9IFVfWkVST19FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhbmRhcmROYW1lID0gdWVudW1fbmV4dChuYW1lRW51bSwgTlVMTCwgJmVudW1FcnJvcikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlIGlmIHRoaXMgYWxpYXMgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgc3RhbmRhcmQuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RhbmRhcmROYW1lLCBhbGlhcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiB7Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmludCBhICogYWZ0ZXIgdGhlIGRlZmF1bHQgc3RhbmRhcmQgbmFtZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyVzIiwgc3Rkc1tzXSwgKGlzRmlyc3QgPyAiKiIgOiAiIikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgfSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGlzIGVudHJ5LiAqLwogICAgICAgICAgICAgICAgaWYgKGNhbm9uKSB7CiAgICAgICAgICAgICAgICAgICAgcHV0cygiIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogTW92ZSBvbi4gKi8KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBUZXJtaW5hdGUgdGhpcyBlbnRyeS4gKi8KICAgICAgICAgICAgaWYgKCFjYW5vbikgewogICAgICAgICAgICAgICAgcHV0cygiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogRnJlZSB0ZW1wb3JhcnkgZGF0YS4gKi8KCiAgICB1cHJ2X2ZyZWUoc3Rkcyk7CgogICAgLyogU3VjY2Vzcy4gKi8KCiAgICByZXR1cm4gMDsKfQoKLyogUHJpbnQgYWxsIGF2YWlsYWJsZSB0cmFuc2xpdGVyYXRvcnMuIElmIGNhbm9uIGlzIG5vbiB6ZXJvLCBwcmludAogICBvbmUgdHJhbnNsaXRlcmF0b3IgcGVyIGxpbmUuICovCgpzdGF0aWMgaW50IHByaW50VHJhbnNsaXRlcmF0b3JzKGludCBjYW5vbikKewojaWYgVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIHByaW50Zigibm8gdHJhbnNsaXRlcmF0b3JzIGF2YWlsYWJsZSBiZWNhdXNlIG9mIFVDT05GSUdfTk9fVFJBTlNMSVRFUkFUSU9OLCBzZWUgdWNvbmZpZy5oXG4iKTsKICAgIHJldHVybiAxOwojZWxzZQogICAgaW50MzJfdCBudW10cmFucyA9IHV0cmFuc19jb3VudEF2YWlsYWJsZUlEcygpLCBpOwogICAgaW50IGJ1ZmxlbiA9IDUxMjsKICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopIHVwcnZfbWFsbG9jKGJ1Zmxlbik7CiAgICBjaGFyIHN0YXRpY2J1Zls1MTJdOwoKICAgIGNoYXIgc2VwY2hhciA9IGNhbm9uID8gJ1xuJyA6ICcgJzsKCiAgICBpZiAoIWJ1ZikgewogICAgICAgIGJ1ZiA9IHN0YXRpY2J1ZjsKICAgICAgICBidWZsZW4gPSBzaXplb2Yoc3RhdGljYnVmKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtdHJhbnM7ICsraSkgewogICAgICAgIGludDMyX3QgbGVuID0gdXRyYW5zX2dldEF2YWlsYWJsZUlEKGksIGJ1ZiwgYnVmbGVuKTsKICAgICAgICBpZiAobGVuID49IGJ1ZmxlbiAtIDEpIHsKICAgICAgICAgICAgaWYgKGJ1ZiAhPSBzdGF0aWNidWYpIHsKICAgICAgICAgICAgICAgIGJ1ZmxlbiA8PD0gMTsKICAgICAgICAgICAgICAgIGlmIChidWZsZW4gPCBsZW4pIHsKICAgICAgICAgICAgICAgICAgICBidWZsZW4gPSBsZW4gKyA2NDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJ1ZiA9IChjaGFyICopIHVwcnZfcmVhbGxvYyhidWYsIGJ1Zmxlbik7CiAgICAgICAgICAgICAgICBpZiAoIWJ1ZikgewogICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHN0YXRpY2J1ZjsKICAgICAgICAgICAgICAgICAgICBidWZsZW4gPSBzaXplb2Yoc3RhdGljYnVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1dHJhbnNfZ2V0QXZhaWxhYmxlSUQoaSwgYnVmLCBidWZsZW4pOwogICAgICAgICAgICBpZiAobGVuID49IGJ1ZmxlbikgewogICAgICAgICAgICAgICAgdXBydl9zdHJjcHkoYnVmICsgYnVmbGVuIC0gNCwgIi4uLiIpOyAvKiBUcnVuY2F0ZSB0aGUgbmFtZS4gKi8KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCIlcyIsIGJ1Zik7CiAgICAgICAgaWYgKGkgPCBudW10cmFucyAtIDEpIHsKICAgICAgICAgICAgcHV0Y2hhcihzZXBjaGFyKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQWRkIGEgdGVybWluYXRpbmcgbmV3bGluZSBpZiBuZWVkZWQuICovCgogICAgaWYgKHNlcGNoYXIgIT0gJ1xuJykgewogICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICB9CgogICAgLyogRnJlZSB0ZW1wb3JhcnkgZGF0YS4gKi8KCiAgICBpZiAoYnVmICE9IHN0YXRpY2J1ZikgewogICAgICAgIHVwcnZfZnJlZShidWYpOwogICAgfQoKICAgIC8qIFN1Y2Nlc3MuICovCgogICAgcmV0dXJuIDA7CiNlbmRpZgp9CgovKiBSZXR1cm4gdGhlIG9mZnNldCBvZiBhIGJ5dGUgaW4gaXRzIHNvdXJjZSwgZ2l2ZW4gdGhlIGZyb20gYW5kIHRvIG9mZnNldHMKICAgdmVjdG9ycyBhbmQgdGhlIGJ5dGUgb2Zmc2V0IGl0c2VsZi4gKi8KCnN0YXRpYyBpbmxpbmUgaW50MzJfdCBkYXRhT2Zmc2V0KGludDMyX3Qgd2hlcmV0bywKICAgIGNvbnN0IGludDMyX3QgKmZyb21vZmZzZXRzLCBpbnQzMl90IGZyb21zeiwKICAgIGNvbnN0IGludDMyX3QgKnRvb2Zmc2V0cywgaW50MzJfdCB0b3N6KSB7CiAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCB0b3N6KSB7CiAgICAgICAgd2hlcmV0byA9IHRvb2Zmc2V0c1t3aGVyZXRvXTsKICAgICAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCBmcm9tc3opIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21vZmZzZXRzW3doZXJldG9dOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLy8gQ29udmVydCBhIGZpbGUgZnJvbSBvbmUgZW5jb2RpbmcgdG8gYW5vdGhlcgpzdGF0aWMgVUJvb2wgY29udmVydEZpbGUoY29uc3QgY2hhciAqcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tY3BhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0b3VjdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9jcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIGZyb211Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmc3osCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFuc2xpdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluZmlsZXN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBvdXRmaWxlLCBpbnQgdmVyYm9zZSkKewogICAgRklMRSAqaW5maWxlOwogICAgVUJvb2wgcmV0ID0gVFJVRTsKICAgIFVDb252ZXJ0ZXIgKmNvbnZmcm9tID0gMDsKICAgIFVDb252ZXJ0ZXIgKmNvbnZ0byA9IDA7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVCb29sIGZsdXNoOwogICAgY29uc3QgY2hhciAqY2J1ZnA7CiAgICBjaGFyICpidWZwOwogICAgY2hhciAqYnVmID0gMDsKCiAgICB1aW50MzJfdCBpbmZvZmZzZXQgPSAwLCBvdXRmb2Zmc2V0ID0gMDsgICAvKiBXaGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUsIGZvciBlcnJvciByZXBvcnRpbmcuICovCgogICAgY29uc3QgVUNoYXIgKnVuaWJ1ZmJwOwogICAgVUNoYXIgKnVuaWJ1ZnA7CiAgICBVQ2hhciAqdW5pYnVmID0gMDsKICAgIGludDMyX3QgKmZyb21vZmZzZXRzID0gMCwgKnRvb2Zmc2V0cyA9IDA7CgogICAgc2l6ZV90IHJkLCB3ciwgdG9idWZzejsKCiNpZiAhVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIFRyYW5zbGl0ZXJhdG9yICp0ID0gMDsgICAgICAvLyBUcmFuc2xpdGVyYXRvciBhY3Rpbmcgb24gVW5pY29kZSBkYXRhLgojZW5kaWYKICAgIFVuaWNvZGVTdHJpbmcgdTsgICAgICAgICAgICAvLyBTdHJpbmcgdG8gZG8gdGhlIHRyYW5zbGl0ZXJhdGlvbi4KCiAgICAvLyBPcGVuIHRoZSBjb3JyZWN0IGlucHV0IGZpbGUgb3IgY29ubmVjdCB0byBzdGRpbiBmb3IgcmVhZGluZyBpbnB1dAoKICAgIGlmIChpbmZpbGVzdHIgIT0gMCAmJiBzdHJjbXAoaW5maWxlc3RyLCAiLSIpKSB7CiAgICAgICAgaW5maWxlID0gZm9wZW4oaW5maWxlc3RyLCAicmIiKTsKICAgICAgICBpZiAoaW5maWxlID09IDApIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKGluZmlsZXN0ciwgIiIpOwogICAgICAgICAgICBzdHIxLmFwcGVuZCgoVUNoYXIzMikgMCk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgc3RyMi5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuSW5wdXRGIiwgc3RyMS5nZXRCdWZmZXIoKSwgc3RyMi5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGluZmlsZXN0ciA9ICItIjsKICAgICAgICBpbmZpbGUgPSBzdGRpbjsKI2lmZGVmIFdJTjMyCiAgICAgICAgaWYgKHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpID09IC0xKSB7CiAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldEluQmluTW9kZSIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQojZW5kaWYKICAgIH0KCiAgICBpZiAodmVyYm9zZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBpbmZpbGVzdHIpOwogICAgfQoKI2lmICFVQ09ORklHX05PX1RSQU5TTElURVJBVElPTgogICAgLy8gQ3JlYXRlIHRyYW5zbGl0ZXJhdG9yIGFzIG5lZWRlZC4KCiAgICBpZiAodHJhbnNsaXQgIT0gTlVMTCAmJiAqdHJhbnNsaXQpIHsKICAgICAgICBVUGFyc2VFcnJvciBwYXJzZTsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cih0cmFuc2xpdCksIHBlc3RyOwoKICAgICAgICAvKiBDcmVhdGUgZnJvbSBydWxlcyBvciBieSBJRCBhcyBuZWVkZWQuICovCgogICAgICAgIHBhcnNlLmxpbmUgPSAtMTsKCiAgICAgICAgaWYgKHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnOicpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPicpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPCcpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPicpKSB7CiAgICAgICAgICAgIHQgPSBUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlRnJvbVJ1bGVzKCJVY29udiIsIHN0ciwgVVRSQU5TX0ZPUldBUkQsIHBhcnNlLCBlcnIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHQgPSBUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlSW5zdGFuY2UodHJhbnNsaXQsIFVUUkFOU19GT1JXQVJELCBlcnIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIHN0ci5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKCiAgICAgICAgICAgIGlmIChwYXJzZS5saW5lID49IDApIHsKICAgICAgICAgICAgICAgIFVDaGFyIGxpbmVidWZbMjBdLCBvZmZzZXRidWZbMjBdOwogICAgICAgICAgICAgICAgdXBydl9pdG91KGxpbmVidWYsIDIwLCBwYXJzZS5saW5lLCAxMCwgMCk7CiAgICAgICAgICAgICAgICB1cHJ2X2l0b3Uob2Zmc2V0YnVmLCAyMCwgcGFyc2Uub2Zmc2V0LCAxMCwgMCk7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudENyZWF0ZVRyYW5zbGl0UGFyc2VFcnIiLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpLCBsaW5lYnVmLCBvZmZzZXRidWYpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRDcmVhdGVUcmFuc2xpdCIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgZGVsZXRlIHQ7CiAgICAgICAgICAgICAgICB0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgfQogICAgfQojZW5kaWYKCiAgICAvLyBDcmVhdGUgY29kZXBhZ2UgY29udmVydGVyLiBJZiB0aGUgY29kZXBhZ2Ugb3IgaXRzIGFsaWFzZXMgd2VyZW4ndAogICAgLy8gYXZhaWxhYmxlLCBpdCByZXR1cm5zIE5VTEwgYW5kIGEgZmFpbHVyZSBjb2RlLiBXZSBhbHNvIHNldCB0aGUKICAgIC8vIGNhbGxiYWNrcywgYW5kIHJldHVybiBlcnJvcnMgaW4gdGhlIHNhbWUgd2F5LgoKICAgIGNvbnZmcm9tID0gdWNudl9vcGVuKGZyb21jcGFnZSwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihmcm9tY3BhZ2UsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihmcm9tY3BhZ2UpICsgMSkpOwogICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50T3BlbkZyb21Db2Rlc2V0Iiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KICAgIHVjbnZfc2V0VG9VQ2FsbEJhY2soY29udmZyb20sIHRvdWNhbGxiYWNrLCB0b3VjdHh0LCAwLCAwLCAmZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50U2V0Q2FsbGJhY2siLCB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KCiAgICBjb252dG8gPSB1Y252X29wZW4odG9jcGFnZSwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cih0b2NwYWdlLCAoaW50MzJfdCkodXBydl9zdHJsZW4odG9jcGFnZSkgKyAxKSk7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuVG9Db2Rlc2V0Iiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KICAgIHVjbnZfc2V0RnJvbVVDYWxsQmFjayhjb252dG8sIGZyb211Y2FsbGJhY2ssIGZyb211Y3R4dCwgMCwgMCwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldENhbGxiYWNrIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICB9CiAgICB1Y252X3NldEZhbGxiYWNrKGNvbnZ0bywgZmFsbGJhY2spOwoKICAgIC8vIFRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgYWx3YXlzIGlzIG9mIGVub3VnaCBzaXplLCB3ZQogICAgLy8gbXVzdCB0YWtlIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvLCB0aGF0IGlzIHRoZSBjaGFyYWN0ZXIgaW4KICAgIC8vIHRoZSBjb2RlcGFnZSB0aGF0IHVzZXMgdGhlIG1vc3QgYnl0ZXMgYW5kIG11bHRpcGx5IGl0IGFnYWluc3QKICAgIC8vIHRoZSBidWZmZXIgc2l6ZS4KCiAgICAvLyB1c2UgYnVmc3orMSB0byBhbGxvdyBmb3IgYWRkaXRpb25hbCBCT00vc2lnbmF0dXJlIGNoYXJhY3RlciAoVStGRUZGKQogICAgdG9idWZzeiA9IChidWZzeisxKSAqIHVjbnZfZ2V0TWF4Q2hhclNpemUoY29udnRvKTsKCiAgICBidWYgPSBuZXcgY2hhclt0b2J1ZnN6XTsKICAgIHVuaWJ1ZiA9IG5ldyBVQ2hhcltidWZzel07CgogICAgZnJvbW9mZnNldHMgPSBuZXcgaW50MzJfdFtidWZzel07CiAgICB0b29mZnNldHMgPSBuZXcgaW50MzJfdFt0b2J1ZnN6XTsKCiAgICAvLyBPSywgd2UgY2FuIGNvbnZlcnQgbm93LgoKICAgIGRvIHsKICAgICAgICBjaGFyIHdpbGxleGl0ID0gMDsKCiAgICAgICAgcmQgPSBmcmVhZChidWYsIDEsIGJ1ZnN6LCBpbmZpbGUpOwogICAgICAgIGlmIChmZXJyb3IoaW5maWxlKSAhPSAwKSB7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgIHN0ci5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRSZWFkIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydCB0aGUgcmVhZCBidWZmZXIgaW50byB0aGUgbmV3IGNvZGluZwogICAgICAgIC8vIEFmdGVyIHRoZSBjYWxsICd1bmlidWZwJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdAogICAgICAgIC8vIGNoYXJhY3RlciB0aGF0IHdhcyBjb252ZXJ0ZWQgaW4gdGhlICd1bmlidWYnLgogICAgICAgIC8vIEFsc28gdGhlICdjYnVmcCcgaXMgcG9zaXRpb25lZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQKICAgICAgICAvLyBjaGFyYWN0ZXIuCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiBpbiB0aGUgZmlsZSwgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwogICAgICAgIC8vIHRydWUgc28gdGhhdCB3ZSBnZXQgYWxsIGNoYXJhY3RlcnMgY29udmVydGVkCiAgICAgICAgLy8KICAgICAgICAvLyBUaGUgY29udmVydGVyIG11c3QgYmUgZmx1c2hlZCBhdCB0aGUgZW5kIG9mIGNvbnZlcnNpb24gc28KICAgICAgICAvLyB0aGF0IGNoYXJhY3RlcnMgb24gaG9sZCBhbHNvIHdpbGwgYmUgd3JpdHRlbi4KCiAgICAgICAgdW5pYnVmcCA9IHVuaWJ1ZjsKICAgICAgICBjYnVmcCA9IGJ1ZjsKICAgICAgICBmbHVzaCA9IHJkICE9IGJ1ZnN6OwogICAgICAgIHVjbnZfdG9Vbmljb2RlKGNvbnZmcm9tLCAmdW5pYnVmcCwgdW5pYnVmcCArIGJ1ZnN6LCAmY2J1ZnAsCiAgICAgICAgICAgIGNidWZwICsgcmQsIGZyb21vZmZzZXRzLCBmbHVzaCwgJmVycik7CgogICAgICAgIGluZm9mZnNldCArPSAodWludDMyX3QpKGNidWZwIC0gYnVmKTsKCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIGNoYXIgcG9zWzMyXTsKICAgICAgICAgICAgc3ByaW50Zihwb3MsICIldSIsIGluZm9mZnNldCAtIDEpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihwb3MpICsgMSkpOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInByb2JsZW1DdnRUb1UiLCBzdHIuZ2V0QnVmZmVyKCksIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOyAvKiByZXNldCB0aGUgZXJyb3IgZm9yIHRoZSByZXN0IG9mIHRoZSBjb252ZXJzaW9uLiAqLwogICAgICAgIH0KCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiwgdGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHNob3VsZCBiZQogICAgICAgIC8vIGVxdWFsIHRvIG51bWJlciBvZiBjaGFycyByZWFkLgoKICAgICAgICBpZiAoZmx1c2ggJiYgIXdpbGxleGl0ICYmIGNidWZwICE9IChidWYgKyByZCkpIHsKICAgICAgICAgICAgY2hhciBwb3NbMzJdOwogICAgICAgICAgICBzcHJpbnRmKHBvcywgIiV1IiwgaW5mb2Zmc2V0KTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIocG9zLCAoaW50MzJfdCkodXBydl9zdHJsZW4ocG9zKSArIDEpKTsKICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJwcmVtRW5kSW5wdXQiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgfQoKICAgICAgICAvLyBQcmVwYXJlIHRvIHRyYW5zbGl0ZXJhdGUgYW5kIGNvbnZlcnQuIFRyYW5zbGl0ZXJhdGUgaWYgbmVlZGVkLgoKI2lmICFVQ09ORklHX05PX1RSQU5TTElURVJBVElPTgogICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIHUuc2V0VG8odW5pYnVmLCAoaW50MzJfdCkodW5pYnVmcCAtIHVuaWJ1ZikpOyAvLyBDb3B5IGludG8gc3RyaW5nLgogICAgICAgICAgICB0LT50cmFuc2xpdGVyYXRlKHUpOwogICAgICAgIH0gZWxzZQojZW5kaWYKICAgICAgICB7CiAgICAgICAgICAgIHUuc2V0VG8odW5pYnVmLCAoaW50MzJfdCkodW5pYnVmcCAtIHVuaWJ1ZiksIChpbnQzMl90KShidWZzeikpOyAvLyBTaGFyZSB0aGUgYnVmZmVyLgogICAgICAgIH0KCiAgICAgICAgaW50MzJfdCB1bGVuID0gdS5sZW5ndGgoKTsKCiAgICAgICAgLy8gQ29udmVydCB0aGUgVW5pY29kZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gY29kZXBhZ2UKICAgICAgICAvLyBBZ2FpbiAnYnVmcCcgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGxhc3QgY29udmVydGVkIGNoYXJhY3RlcgogICAgICAgIC8vIEFuZCAndW5pYnVmYnAnIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBsYXN0IGNvbnZlcnRlZCB1bmljb2RlIGNoYXJhY3RlcgogICAgICAgIC8vIEF0IHRoZSBsYXN0IGNvbnZlcnNpb24gZmx1c2ggc2hvdWxkIGJlIHNldCB0byB0cnVlIHRvIGVuc3VyZSB0aGF0CiAgICAgICAgLy8gYWxsIGNoYXJhY3RlcnMgbGVmdCBnZXQgY29udmVydGVkCgogICAgICAgIGNvbnN0IFVDaGFyICp1bmlidWZ1ID0gdW5pYnVmYnAgPSB1LmdldEJ1ZmZlcigpOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgIGludDMyX3QgbGVuID0gdWxlbiA+IChpbnQzMl90KWJ1ZnN6ID8gKGludDMyX3QpYnVmc3ogOiB1bGVuOwoKICAgICAgICAgICAgYnVmcCA9IGJ1ZjsKICAgICAgICAgICAgdW5pYnVmcCA9IChVQ2hhciAqKSAodW5pYnVmYnAgKyBsZW4pOwoKICAgICAgICAgICAgdWNudl9mcm9tVW5pY29kZShjb252dG8sICZidWZwLCBidWZwICsgdG9idWZzeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5pYnVmYnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29mZnNldHMsIGZsdXNoLCAmZXJyKTsKCiAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJydGFnOwogICAgICAgICAgICAgICAgY2hhciBwb3NbMzJdOwoKICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9mZnNldCA9CiAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCgoaW50MzJfdCkoYnVmcCAtIGJ1ZiAtIDEpLCBmcm9tb2Zmc2V0cywgKGludDMyX3QpKGJ1ZnN6KSwgdG9vZmZzZXRzLCAoaW50MzJfdCkodG9idWZzeikpOwogICAgICAgICAgICAgICAgaW50MzJfdCBmZXJyb2Zmc2V0ID0gKGludDMyX3QpKGluZm9mZnNldCAtICh1bmlidWZwIC0gdW5pYnVmdSkgKyBlcnJvZmZzZXQpOwoKICAgICAgICAgICAgICAgIGlmICgoaW50MzJfdCkgZmVycm9mZnNldCA8IDApIHsKICAgICAgICAgICAgICAgICAgICBmZXJyb2Zmc2V0ID0gKGludDMyX3QpKG91dGZvZmZzZXQgKyAoYnVmcCAtIGJ1ZikpOwogICAgICAgICAgICAgICAgICAgIGVycnRhZyA9ICJwcm9ibGVtQ3Z0RnJvbVVPdXQiOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlcnJ0YWcgPSAicHJvYmxlbUN2dEZyb21VIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNwcmludGYocG9zLCAiJXUiLCBmZXJyb2Zmc2V0KTsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHBvcywgKGludDMyX3QpKHVwcnZfc3RybGVuKHBvcykgKyAxKSk7CiAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsIGVycnRhZywgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEF0IHRoZSBsYXN0IGNvbnZlcnNpb24sIHRoZSBjb252ZXJ0ZWQgY2hhcmFjdGVycyBzaG91bGQgYmUgZXF1YWwgdG8gbnVtYmVyCiAgICAgICAgICAgIC8vIG9mIGNvbnN1bWVkIGNoYXJhY3RlcnMuCiAgICAgICAgICAgIGlmIChmbHVzaCAmJiAhd2lsbGV4aXQgJiYgdW5pYnVmYnAgIT0gKHVuaWJ1ZnUgKyAoc2l6ZV90KSAodW5pYnVmcCAtIHVuaWJ1ZnUpKSkgewogICAgICAgICAgICAgICAgY2hhciBwb3NbMzJdOwogICAgICAgICAgICAgICAgc3ByaW50Zihwb3MsICIldSIsIGluZm9mZnNldCk7CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihwb3MpICsgMSkpOwogICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAicHJlbUVuZCIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICB3aWxsZXhpdCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZpbmFsbHksIHdyaXRlIHRoZSBjb252ZXJ0ZWQgYnVmZmVyIHRvIHRoZSBvdXRwdXQgZmlsZQoKCiAgICAgICAgICAgIHJkID0gKHNpemVfdCkgKGJ1ZnAgLSBidWYpOwogICAgICAgICAgICBvdXRmb2Zmc2V0ICs9IChpbnQzMl90KSh3ciA9IGZ3cml0ZShidWYsIDEsIHJkLCBvdXRmaWxlKSk7CiAgICAgICAgICAgIGlmICh3ciAhPSByZCkgewogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoc3RyZXJyb3IoZXJybm8pLCAiIik7CiAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50V3JpdGUiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgd2lsbGV4aXQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAod2lsbGV4aXQpIHsKICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCh1bGVuIC09IChpbnQzMl90KShidWZzeikpID4gMCk7CiAgICB9IHdoaWxlICghZmx1c2gpOyAgICAgICAgICAgLy8gU3RvcCB3aGVuIHdlIGhhdmUgZmx1c2hlZCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0ZXJzICh0aGlzIG1lYW5zIHRoYXQgaXQncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbmQgb2Ygb3V0cHV0KQoKICAgIGdvdG8gbm9ybWFsX2V4aXQ7CgplcnJvcl9leGl0OgogICAgcmV0ID0gRkFMU0U7Cgpub3JtYWxfZXhpdDoKICAgIC8vIENsZWFudXAuCgogICAgaWYgKGNvbnZmcm9tKSB1Y252X2Nsb3NlKGNvbnZmcm9tKTsKICAgIGlmIChjb252dG8pIHVjbnZfY2xvc2UoY29udnRvKTsKCiNpZiAhVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIGlmICh0KSBkZWxldGUgdDsKI2VuZGlmCgogICAgaWYgKGJ1ZikgZGVsZXRlW10gYnVmOwogICAgaWYgKHVuaWJ1ZikgZGVsZXRlW10gdW5pYnVmOwoKICAgIGlmIChmcm9tb2Zmc2V0cykgZGVsZXRlW10gZnJvbW9mZnNldHM7CiAgICBpZiAodG9vZmZzZXRzKSBkZWxldGVbXSB0b29mZnNldHM7CgogICAgaWYgKGluZmlsZSAhPSBzdGRpbikgewogICAgICAgIGZjbG9zZShpbmZpbGUpOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKnBuYW1lLCBpbnQgZWNvZGUpIHsKICAgIGNvbnN0IFVDaGFyICptc2c7CiAgICBpbnQzMl90IG1zZ0xlbjsKICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgRklMRSAqZnAgPSBlY29kZSA/IHN0ZGVyciA6IHN0ZG91dDsKICAgIGludCByZXM7CgogICAgaW5pdE1zZyhwbmFtZSk7CiAgICBtc2cgPQogICAgICAgIHVyZXNfZ2V0U3RyaW5nQnlLZXkoZ0J1bmRsZSwgZWNvZGUgPyAibGNVc2FnZVdvcmQiIDogInVjVXNhZ2VXb3JkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dMZW4sICZlcnIpOwogICAgVW5pY29kZVN0cmluZyB1cG5hbWUocG5hbWUsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihwbmFtZSkgKyAxKSk7CiAgICBVbmljb2RlU3RyaW5nIG1uYW1lKG1zZywgbXNnTGVuICsgMSk7CgogICAgcmVzID0gdV93bXNnKGZwLCAidXNhZ2UiLCBtbmFtZS5nZXRCdWZmZXIoKSwgdXBuYW1lLmdldEJ1ZmZlcigpKTsKICAgIGlmICghZWNvZGUpIHsKICAgICAgICBpZiAoIXJlcykgewogICAgICAgICAgICBmcHV0YygnXG4nLCBmcCk7CiAgICAgICAgfQogICAgICAgIGlmICghdV93bXNnKGZwLCAiaGVscCIpKSB7CiAgICAgICAgICAgIC8qIE5vdyBkdW1wIGNhbGxiYWNrcyBhbmQgZmluaXNoLiAqLwoKICAgICAgICAgICAgaW50IGksIGNvdW50ID0KICAgICAgICAgICAgICAgIHNpemVvZih0cmFuc2NvZGVfY2FsbGJhY2tzKSAvIHNpemVvZigqdHJhbnNjb2RlX2NhbGxiYWNrcyk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICVzIiwgdHJhbnNjb2RlX2NhbGxiYWNrc1tpXS5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcHV0YygnXG4nLCBmcCk7CiAgICAgICAgfQogICAgfQoKICAgIGV4aXQoZWNvZGUpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIEZJTEUgKm91dGZpbGU7CiAgICBpbnQgcmV0ID0gMDsKICAgIGludCBzZWVuZiA9IDA7CgogICAgc2l6ZV90IGJ1ZnN6ID0gREVGQVVMVF9CVUZTWjsKCiAgICBjb25zdCBjaGFyICpmcm9tY3BhZ2UgPSAwOwogICAgY29uc3QgY2hhciAqdG9jcGFnZSA9IDA7CiAgICBjb25zdCBjaGFyICp0cmFuc2xpdCA9IDA7CiAgICBjb25zdCBjaGFyICpvdXRmaWxlc3RyID0gMDsKICAgIGludCBmYWxsYmFjayA9IDA7CgogICAgVUNvbnZlcnRlckZyb21VQ2FsbGJhY2sgZnJvbXVjYWxsYmFjayA9IFVDTlZfRlJPTV9VX0NBTExCQUNLX1NUT1A7CiAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQgPSAwOwogICAgVUNvbnZlcnRlclRvVUNhbGxiYWNrIHRvdWNhbGxiYWNrID0gVUNOVl9UT19VX0NBTExCQUNLX1NUT1A7CiAgICBjb25zdCB2b2lkICp0b3VjdHh0ID0gMDsKCiAgICBjaGFyICoqaXRlcjsKICAgIGNoYXIgKiplbmQgPSBhcmd2ICsgYXJnYzsKCiAgICBjb25zdCBjaGFyICpwbmFtZTsKCiAgICBpbnQgcHJpbnRDb252cyA9IDAsIHByaW50Q2Fub24gPSAwOwogICAgY29uc3QgY2hhciAqcHJpbnROYW1lID0gMDsKICAgIGludCBwcmludFRyYW5zbGl0cyA9IDA7CgogICAgaW50IHZlcmJvc2UgPSAwOwogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CgogICAgLyogSW5pdGlhbGl6ZSBJQ1UgKi8KICAgIHVfaW5pdCgmc3RhdHVzKTsKICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbiBub3QgaW5pdGlhbGl6ZSBJQ1UuICBzdGF0dXMgPSAlc1xuIiwKICAgICAgICAgICAgYXJndlswXSwgdV9lcnJvck5hbWUoc3RhdHVzKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICAvLyBHZXQgYW5kIHByZXR0aWZ5IHBuYW1lLgogICAgcG5hbWUgPSB1cHJ2X3N0cnJjaHIoKmFyZ3YsIFVfRklMRV9TRVBfQ0hBUik7CiNpZmRlZiBXSU4zMgogICAgaWYgKCFwbmFtZSkgewogICAgICAgIHBuYW1lID0gdXBydl9zdHJyY2hyKCphcmd2LCAnLycpOwogICAgfQojZW5kaWYKICAgIGlmICghcG5hbWUpIHsKICAgICAgICBwbmFtZSA9ICphcmd2OwogICAgfSBlbHNlIHsKICAgICAgICArK3BuYW1lOwogICAgfQoKICAgIC8vIEZpcnN0LCBnZXQgdGhlIGFyZ3VtZW50cyBmcm9tIGNvbW1hbmQtbGluZQogICAgLy8gdG8ga25vdyB0aGUgY29kZXBhZ2VzIHRvIGNvbnZlcnQgYmV0d2VlbgoKICAgIC8vIFhYWCBXaGVuIHlvdSBhZGQgdG8gdGhpcyBsb29wLCB5b3UgbmVlZCB0byBhZGQgdG8gdGhlIHNpbWlsYXIgbG9vcAogICAgLy8gYmVsb3cuCgogICAgZm9yIChpdGVyID0gYXJndiArIDE7IGl0ZXIgIT0gZW5kOyBpdGVyKyspIHsKICAgICAgICAvLyBDaGVjayBmb3IgZnJvbSBjaGFyc2V0CiAgICAgICAgaWYgKHN0cmNtcCgiLWYiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWZyb20tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkKICAgICAgICAgICAgICAgIGZyb21jcGFnZSA9ICppdGVyOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi10IiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS10by1jb2RlIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKQogICAgICAgICAgICAgICAgdG9jcGFnZSA9ICppdGVyOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi14IiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpCiAgICAgICAgICAgICAgICB0cmFuc2xpdCA9ICppdGVyOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGZhbGxiYWNrID0gMTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tbm8tZmFsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgZmFsbGJhY2sgPSAwOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItYiIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tYmxvY2stc2l6ZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkgewogICAgICAgICAgICAgICAgYnVmc3ogPSBhdG9pKCppdGVyKTsKICAgICAgICAgICAgICAgIGlmICgoaW50KSBidWZzeiA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoKml0ZXIpOwogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJiYWRCbG9ja1NpemUiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1sIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1saXN0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGlmIChwcmludFRyYW5zbGl0cykgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50Q29udnMgPSAxOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWRlZmF1bHQtY29kZSIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIGlmIChwcmludFRyYW5zbGl0cykgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50TmFtZSA9IHVjbnZfZ2V0RGVmYXVsdE5hbWUoKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1saXN0LWNvZGUiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgZSA9IFVfWkVST19FUlJPUjsKICAgICAgICAgICAgICAgIHByaW50TmFtZSA9IHVjbnZfZ2V0QWxpYXMoKml0ZXIsIDAsICZlKTsKICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZSkgfHwgIXByaW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKCppdGVyKTsKICAgICAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAibm9TdWNoQ29kZXNldCIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWNhbm9uIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgcHJpbnRDYW5vbiA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1MIiwgKml0ZXIpID09IDAKICAgICAgICAgICAgfHwgIXN0cmNtcCgiLS1saXN0LXRyYW5zbGl0ZXJhdG9ycyIsICppdGVyKSkgewogICAgICAgICAgICBpZiAocHJpbnRDb252cykgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50VHJhbnNsaXRzID0gMTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWgiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItPyIsICppdGVyKQogICAgICAgICAgICB8fCAhc3RyY21wKCItLWhlbHAiLCAqaXRlcikpIHsKICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDApOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWMiLCAqaXRlcikpIHsKICAgICAgICAgICAgZnJvbXVjYWxsYmFjayA9IFVDTlZfRlJPTV9VX0NBTExCQUNLX1NLSVA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLXRvLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY2FsbGJhY2tfZW50ICpjYmUgPSBmaW5kQ2FsbGJhY2soKml0ZXIpOwogICAgICAgICAgICAgICAgaWYgKGNiZSkgewogICAgICAgICAgICAgICAgICAgIGZyb211Y2FsbGJhY2sgPSBjYmUtPmZyb211OwogICAgICAgICAgICAgICAgICAgIGZyb211Y3R4dCA9IGNiZS0+ZnJvbXVjdHh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInVua25vd25DYWxsYmFjayIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tZnJvbS1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNhbGxiYWNrX2VudCAqY2JlID0gZmluZENhbGxiYWNrKCppdGVyKTsKICAgICAgICAgICAgICAgIGlmIChjYmUpIHsKICAgICAgICAgICAgICAgICAgICB0b3VjYWxsYmFjayA9IGNiZS0+dG91OwogICAgICAgICAgICAgICAgICAgIHRvdWN0eHQgPSBjYmUtPnRvdWN0eHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKCppdGVyKTsKICAgICAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAidW5rbm93bkNhbGxiYWNrIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWkiLCAqaXRlcikpIHsKICAgICAgICAgICAgdG91Y2FsbGJhY2sgPSBVQ05WX1RPX1VfQ0FMTEJBQ0tfU0tJUDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tY2FsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjYWxsYmFja19lbnQgKmNiZSA9IGZpbmRDYWxsYmFjaygqaXRlcik7CiAgICAgICAgICAgICAgICBpZiAoY2JlKSB7CiAgICAgICAgICAgICAgICAgICAgZnJvbXVjYWxsYmFjayA9IGNiZS0+ZnJvbXU7CiAgICAgICAgICAgICAgICAgICAgZnJvbXVjdHh0ID0gY2JlLT5mcm9tdWN0eHQ7CiAgICAgICAgICAgICAgICAgICAgdG91Y2FsbGJhY2sgPSBjYmUtPnRvdTsKICAgICAgICAgICAgICAgICAgICB0b3VjdHh0ID0gY2JlLT50b3VjdHh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInVua25vd25DYWxsYmFjayIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tc2lsZW50IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHZlcmJvc2UgPSAwOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLXYiLCAqaXRlcikgfHwgIXN0cmNtcCgiLS12ZXJib3NlIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHZlcmJvc2UgPSAxOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLVYiLCAqaXRlcikgfHwgIXN0cmNtcCgiLS12ZXJzaW9uIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHByaW50ZigiJXMgdjIuMFxuIiwgcG5hbWUpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1vIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tb3V0cHV0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgICsraXRlcjsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kICYmICFvdXRmaWxlc3RyKSB7CiAgICAgICAgICAgICAgICBvdXRmaWxlc3RyID0gKml0ZXI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCoqaXRlciA9PSAnLScgJiYgKCppdGVyKVsxXSkgewogICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChwcmludENvbnZzIHx8IHByaW50TmFtZSkgewogICAgICAgIHJldHVybiBwcmludENvbnZlcnRlcnMocG5hbWUsIHByaW50TmFtZSwgcHJpbnRDYW5vbikgPyAyIDogMDsKICAgIH0gZWxzZSBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICByZXR1cm4gcHJpbnRUcmFuc2xpdGVyYXRvcnMocHJpbnRDYW5vbikgPyAzIDogMDsKICAgIH0KCiAgICBpZiAoIWZyb21jcGFnZSB8fCAhdXBydl9zdHJjbXAoZnJvbWNwYWdlLCAiLSIpKSB7CiAgICAgICAgZnJvbWNwYWdlID0gdWNudl9nZXREZWZhdWx0TmFtZSgpOwogICAgfQogICAgaWYgKCF0b2NwYWdlIHx8ICF1cHJ2X3N0cmNtcCh0b2NwYWdlLCAiLSIpKSB7CiAgICAgICAgdG9jcGFnZSA9IHVjbnZfZ2V0RGVmYXVsdE5hbWUoKTsKICAgIH0KCiAgICAvLyBPcGVuIHRoZSBjb3JyZWN0IG91dHB1dCBmaWxlIG9yIGNvbm5lY3QgdG8gc3Rkb3V0IGZvciByZWFkaW5nIGlucHV0CiAgICBpZiAob3V0ZmlsZXN0ciAhPSAwICYmIHN0cmNtcChvdXRmaWxlc3RyLCAiLSIpKSB7CiAgICAgICAgb3V0ZmlsZSA9IGZvcGVuKG91dGZpbGVzdHIsICJ3YiIpOwogICAgICAgIGlmIChvdXRmaWxlID09IDApIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKG91dGZpbGVzdHIsICIiKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIyKHN0cmVycm9yKGVycm5vKSwgIiIpOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRDcmVhdGVPdXRwdXRGIiwKICAgICAgICAgICAgICAgIHN0cjEuZ2V0QnVmZmVyKCksIHN0cjIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIG91dGZpbGVzdHIgPSAiLSI7CiAgICAgICAgb3V0ZmlsZSA9IHN0ZG91dDsKI2lmZGVmIFdJTjMyCiAgICAgICAgaWYgKHNldG1vZGUoZmlsZW5vKG91dGZpbGUpLCBPX0JJTkFSWSkgPT0gLTEpIHsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRTZXRPdXRCaW5Nb2RlIik7CiAgICAgICAgICAgIGV4aXQoLTEpOwogICAgICAgIH0KI2VuZGlmCiAgICB9CgogICAgLyogTG9vcCBhZ2FpbiBvbiB0aGUgYXJndW1lbnRzIHRvIGZpbmQgYWxsIHRoZSBpbnB1dCBmaWxlcywgYW5kCiAgICBjb252ZXJ0IHRoZW0uIFhYWCBDaGVhcCBhbmQgc2xvcHB5LiAqLwoKICAgIGZvciAoaXRlciA9IGFyZ3YgKyAxOyBpdGVyICE9IGVuZDsgaXRlcisrKSB7CiAgICAgICAgaWYgKHN0cmNtcCgiLWYiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWZyb20tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi10IiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS10by1jb2RlIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLXgiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tbm8tZmFsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItYiIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tYmxvY2stc2l6ZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1sIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1saXN0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1kZWZhdWx0LWNvZGUiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi0tbGlzdC1jb2RlIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWNhbm9uIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItTCIsICppdGVyKSA9PSAwCiAgICAgICAgICAgIHx8ICFzdHJjbXAoIi0tbGlzdC10cmFuc2xpdGVyYXRvcnMiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItaCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0/IiwgKml0ZXIpCiAgICAgICAgICAgIHx8ICFzdHJjbXAoIi0taGVscCIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItYyIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLXRvLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tZnJvbS1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItaSIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tc2lsZW50IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi12IiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tdmVyYm9zZSIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItViIsICppdGVyKSB8fCAhc3RyY21wKCItLXZlcnNpb24iLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLW8iLCAqaXRlcikgfHwgIXN0cmNtcCgiLS1vdXRwdXQiLCAqaXRlcikpIHsKICAgICAgICAgICAgKytpdGVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlZW5mID0gMTsKICAgICAgICAgICAgaWYgKCFjb252ZXJ0RmlsZQogICAgICAgICAgICAgICAgKHBuYW1lLCBmcm9tY3BhZ2UsIHRvdWNhbGxiYWNrLCB0b3VjdHh0LCB0b2NwYWdlLAogICAgICAgICAgICAgICAgZnJvbXVjYWxsYmFjaywgZnJvbXVjdHh0LCBmYWxsYmFjaywgYnVmc3osIHRyYW5zbGl0LCAqaXRlciwKICAgICAgICAgICAgICAgIG91dGZpbGUsIHZlcmJvc2UpKSB7CiAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCFzZWVuZikgewogICAgICAgIGlmICghY29udmVydEZpbGUKICAgICAgICAgICAgKHBuYW1lLCBmcm9tY3BhZ2UsIHRvdWNhbGxiYWNrLCB0b3VjdHh0LCB0b2NwYWdlLAogICAgICAgICAgICBmcm9tdWNhbGxiYWNrLCBmcm9tdWN0eHQsIGZhbGxiYWNrLCBidWZzeiwgdHJhbnNsaXQsIDAsIG91dGZpbGUsCiAgICAgICAgICAgIHZlcmJvc2UpKSB7CiAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CiAgICB9CgogICAgZ290byBub3JtYWxfZXhpdDsKZXJyb3JfZXhpdDoKICAgIHJldCA9IDE7Cm5vcm1hbF9leGl0OgoKICAgIGlmIChvdXRmaWxlICE9IHN0ZG91dCkKICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7CgogICAgcmV0dXJuIHJldDsKfQoKCi8qCiAqIEhleSwgRW1hY3MsIHBsZWFzZSBzZXQgdGhlIGZvbGxvd2luZzoKICoKICogTG9jYWwgVmFyaWFibGVzOgogKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKICogRW5kOgogKgogKi8K