LyoKICogJFhGcmVlODY6IHhjL2xpYi9GYy94ZnRuYW1lLmMsdiAxLjEwIDIwMDEvMDMvMzAgMTg6NTA6MTgga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKc3RhdGljIGNvbnN0IEZjT2JqZWN0VHlwZSBfRmNCYXNlT2JqZWN0VHlwZXNbXSA9IHsKICAgIHsgRkNfRkFNSUxZLAlGY1R5cGVTdHJpbmcsIH0sCiAgICB7IEZDX1NUWUxFLAkJRmNUeXBlU3RyaW5nLCB9LAogICAgeyBGQ19TTEFOVCwJCUZjVHlwZUludGVnZXIsIH0sCiAgICB7IEZDX1dFSUdIVCwJRmNUeXBlSW50ZWdlciwgfSwKICAgIHsgRkNfU0laRSwJCUZjVHlwZURvdWJsZSwgfSwKICAgIHsgRkNfUElYRUxfU0laRSwJRmNUeXBlRG91YmxlLCB9LAogICAgeyBGQ19TUEFDSU5HLAlGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19GT1VORFJZLAlGY1R5cGVTdHJpbmcsIH0sCi8qICAgIHsgRkNfQ09SRSwJCUZjVHlwZUJvb2wsIH0sICovCiAgICB7IEZDX0FOVElBTElBUywJRmNUeXBlQm9vbCwgfSwKLyogICAgeyBGQ19YTEZELAkJRmNUeXBlU3RyaW5nLCB9LCAqLwogICAgeyBGQ19GSUxFLAkJRmNUeXBlU3RyaW5nLCB9LAogICAgeyBGQ19JTkRFWCwJCUZjVHlwZUludGVnZXIsIH0sCiAgICB7IEZDX1JBU1RFUklaRVIsCUZjVHlwZVN0cmluZywgfSwKICAgIHsgRkNfT1VUTElORSwJRmNUeXBlQm9vbCwgfSwKICAgIHsgRkNfU0NBTEFCTEUsCUZjVHlwZUJvb2wsIH0sCiAgICB7IEZDX1JHQkEsCQlGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19TQ0FMRSwJCUZjVHlwZURvdWJsZSwgfSwKLyogICAgeyBGQ19SRU5ERVIsCUZjVHlwZUJvb2wsIH0sKi8KICAgIHsgRkNfTUlOU1BBQ0UsCUZjVHlwZUJvb2wsIH0sCiAgICB7IEZDX0NIQVJfV0lEVEgsCUZjVHlwZUludGVnZXIgfSwKICAgIHsgRkNfQ0hBUl9IRUlHSFQsCUZjVHlwZUludGVnZXIgfSwKICAgIHsgRkNfTUFUUklYLAlGY1R5cGVNYXRyaXggfSwKICAgIHsgRkNfQ0hBUlNFVCwJRmNUeXBlQ2hhclNldCB9LAogICAgeyBGQ19MQU5HLAkJRmNUeXBlU3RyaW5nIH0sCn07CgojZGVmaW5lIE5VTV9PQkpFQ1RfVFlQRVMgICAgKHNpemVvZiBfRmNCYXNlT2JqZWN0VHlwZXMgLyBzaXplb2YgX0ZjQmFzZU9iamVjdFR5cGVzWzBdKQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjT2JqZWN0VHlwZUxpc3QgICAgRmNPYmplY3RUeXBlTGlzdDsKCnN0cnVjdCBfRmNPYmplY3RUeXBlTGlzdCB7CiAgICBjb25zdCBGY09iamVjdFR5cGVMaXN0ICAqbmV4dDsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZQkgICAgKnR5cGVzOwogICAgaW50CQkJICAgIG50eXBlczsKfTsKCnN0YXRpYyBjb25zdCBGY09iamVjdFR5cGVMaXN0IF9GY0Jhc2VPYmplY3RUeXBlc0xpc3QgPSB7CiAgICAwLAogICAgX0ZjQmFzZU9iamVjdFR5cGVzLAogICAgTlVNX09CSkVDVF9UWVBFUwp9OwoKc3RhdGljIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QJKl9GY09iamVjdFR5cGVzID0gJl9GY0Jhc2VPYmplY3RUeXBlc0xpc3Q7CgpGY0Jvb2wKRmNOYW1lUmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlcykKewogICAgRmNPYmplY3RUeXBlTGlzdAkqbDsKCiAgICBsID0gKEZjT2JqZWN0VHlwZUxpc3QgKikgbWFsbG9jIChzaXplb2YgKEZjT2JqZWN0VHlwZUxpc3QpKTsKICAgIGlmICghbCkKCXJldHVybiBGY0ZhbHNlOwogICAgbC0+dHlwZXMgPSB0eXBlczsKICAgIGwtPm50eXBlcyA9IG50eXBlczsKICAgIGwtPm5leHQgPSBfRmNPYmplY3RUeXBlczsKICAgIF9GY09iamVjdFR5cGVzID0gbDsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY05hbWVVbnJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZXMpCnsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QJKmwsICoqcHJldjsKCiAgICBmb3IgKHByZXYgPSAmX0ZjT2JqZWN0VHlwZXM7IAoJIChsID0gKnByZXYpOyAKCSBwcmV2ID0gKGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QgKiopICYobC0+bmV4dCkpCiAgICB7CglpZiAobC0+dHlwZXMgPT0gdHlwZXMgJiYgbC0+bnR5cGVzID09IG50eXBlcykKCXsKCSAgICAqcHJldiA9IGwtPm5leHQ7CgkgICAgZnJlZSAoKHZvaWQgKikgbCk7CgkgICAgcmV0dXJuIEZjVHJ1ZTsKCX0KICAgIH0KICAgIHJldHVybiBGY0ZhbHNlOwp9Cgpjb25zdCBGY09iamVjdFR5cGUgKgpGY05hbWVHZXRPYmplY3RUeXBlIChjb25zdCBjaGFyICpvYmplY3QpCnsKICAgIGludAkJCSAgICBpOwogICAgY29uc3QgRmNPYmplY3RUeXBlTGlzdCAgKmw7CiAgICBjb25zdCBGY09iamVjdFR5cGUJICAgICp0OwogICAgCiAgICBmb3IgKGwgPSBfRmNPYmplY3RUeXBlczsgbDsgbCA9IGwtPm5leHQpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgbC0+bnR5cGVzOyBpKyspCgl7CgkgICAgdCA9ICZsLT50eXBlc1tpXTsKCSAgICBpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAob2JqZWN0LCB0LT5vYmplY3QpKQoJCXJldHVybiB0OwoJfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBGY0NvbnN0YW50IF9GY0Jhc2VDb25zdGFudHNbXSA9IHsKICAgIHsgImxpZ2h0IiwJCSJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9MSUdIVCwgfSwKICAgIHsgIm1lZGl1bSIsCQkid2VpZ2h0IiwgICBGQ19XRUlHSFRfTUVESVVNLCB9LAogICAgeyAiZGVtaWJvbGQiLAkid2VpZ2h0IiwgICBGQ19XRUlHSFRfREVNSUJPTEQsIH0sCiAgICB7ICJib2xkIiwJCSJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9CT0xELCB9LAogICAgeyAiYmxhY2siLAkJIndlaWdodCIsICAgRkNfV0VJR0hUX0JMQUNLLCB9LAoKICAgIHsgInJvbWFuIiwJCSJzbGFudCIsICAgIEZDX1NMQU5UX1JPTUFOLCB9LAogICAgeyAiaXRhbGljIiwJCSJzbGFudCIsICAgIEZDX1NMQU5UX0lUQUxJQywgfSwKICAgIHsgIm9ibGlxdWUiLAkic2xhbnQiLCAgICBGQ19TTEFOVF9PQkxJUVVFLCB9LAoKICAgIHsgInByb3BvcnRpb25hbCIsCSJzcGFjaW5nIiwgIEZDX1BST1BPUlRJT05BTCwgfSwKICAgIHsgIm1vbm8iLAkJInNwYWNpbmciLCAgRkNfTU9OTywgfSwKICAgIHsgImNoYXJjZWxsIiwJInNwYWNpbmciLCAgRkNfQ0hBUkNFTEwsIH0sCgogICAgeyAicmdiIiwJCSJyZ2JhIiwJICAgIEZDX1JHQkFfUkdCLCB9LAogICAgeyAiYmdyIiwJCSJyZ2JhIiwJICAgIEZDX1JHQkFfQkdSLCB9LAogICAgeyAidnJnYiIsCQkicmdiYSIsCSAgICBGQ19SR0JBX1ZSR0IgfSwKICAgIHsgInZiZ3IiLAkJInJnYmEiLAkgICAgRkNfUkdCQV9WQkdSIH0sCn07CgojZGVmaW5lIE5VTV9GQ19DT05TVEFOVFMgICAoc2l6ZW9mIF9GY0Jhc2VDb25zdGFudHMvc2l6ZW9mIF9GY0Jhc2VDb25zdGFudHNbMF0pCgp0eXBlZGVmIHN0cnVjdCBfRmNDb25zdGFudExpc3QgRmNDb25zdGFudExpc3Q7CgpzdHJ1Y3QgX0ZjQ29uc3RhbnRMaXN0IHsKICAgIGNvbnN0IEZjQ29uc3RhbnRMaXN0ICAgICpuZXh0OwogICAgY29uc3QgRmNDb25zdGFudAkgICAgKmNvbnN0czsKICAgIGludAkJCSAgICBuY29uc3RzOwp9OwoKc3RhdGljIGNvbnN0IEZjQ29uc3RhbnRMaXN0IF9GY0Jhc2VDb25zdGFudExpc3QgPSB7CiAgICAwLAogICAgX0ZjQmFzZUNvbnN0YW50cywKICAgIE5VTV9GQ19DT05TVEFOVFMKfTsKCnN0YXRpYyBjb25zdCBGY0NvbnN0YW50TGlzdAkqX0ZjQ29uc3RhbnRzID0gJl9GY0Jhc2VDb25zdGFudExpc3Q7CgpGY0Jvb2wKRmNOYW1lUmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpCnsKICAgIEZjQ29uc3RhbnRMaXN0CSpsOwoKICAgIGwgPSAoRmNDb25zdGFudExpc3QgKikgbWFsbG9jIChzaXplb2YgKEZjQ29uc3RhbnRMaXN0KSk7CiAgICBpZiAoIWwpCglyZXR1cm4gRmNGYWxzZTsKICAgIGwtPmNvbnN0cyA9IGNvbnN0czsKICAgIGwtPm5jb25zdHMgPSBuY29uc3RzOwogICAgbC0+bmV4dCA9IF9GY0NvbnN0YW50czsKICAgIF9GY0NvbnN0YW50cyA9IGw7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNOYW1lVW5yZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cykKewogICAgY29uc3QgRmNDb25zdGFudExpc3QJKmwsICoqcHJldjsKCiAgICBmb3IgKHByZXYgPSAmX0ZjQ29uc3RhbnRzOyAKCSAobCA9ICpwcmV2KTsgCgkgcHJldiA9IChjb25zdCBGY0NvbnN0YW50TGlzdCAqKikgJihsLT5uZXh0KSkKICAgIHsKCWlmIChsLT5jb25zdHMgPT0gY29uc3RzICYmIGwtPm5jb25zdHMgPT0gbmNvbnN0cykKCXsKCSAgICAqcHJldiA9IGwtPm5leHQ7CgkgICAgZnJlZSAoKHZvaWQgKikgbCk7CgkgICAgcmV0dXJuIEZjVHJ1ZTsKCX0KICAgIH0KICAgIHJldHVybiBGY0ZhbHNlOwp9Cgpjb25zdCBGY0NvbnN0YW50ICoKRmNOYW1lR2V0Q29uc3RhbnQgKGNoYXIgKnN0cmluZykKewogICAgY29uc3QgRmNDb25zdGFudExpc3QgICAgKmw7CiAgICBpbnQJCQkgICAgaTsKICAgIAogICAgZm9yIChsID0gX0ZjQ29uc3RhbnRzOyBsOyBsID0gbC0+bmV4dCkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBsLT5uY29uc3RzOyBpKyspCgkgICAgaWYgKCFGY1N0ckNtcElnbm9yZUNhc2UgKHN0cmluZywgbC0+Y29uc3RzW2ldLm5hbWUpKQoJCXJldHVybiAmbC0+Y29uc3RzW2ldOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCkZjQm9vbApGY05hbWVDb25zdGFudCAoY2hhciAqc3RyaW5nLCBpbnQgKnJlc3VsdCkKewogICAgY29uc3QgRmNDb25zdGFudAkqYzsKCiAgICBpZiAoKGMgPSBGY05hbWVHZXRDb25zdGFudChzdHJpbmcpKSkKICAgIHsKCSpyZXN1bHQgPSBjLT52YWx1ZTsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKRmNCb29sCkZjTmFtZUJvb2wgKGNoYXIgKnYsIEZjQm9vbCAqcmVzdWx0KQp7CiAgICBjaGFyICAgIGMwLCBjMTsKCiAgICBjMCA9ICp2OwogICAgaWYgKGlzdXBwZXIgKGMwKSkKCWMwID0gdG9sb3dlciAoYzApOwogICAgaWYgKGMwID09ICd0JyB8fCBjMCA9PSAneScgfHwgYzAgPT0gJzEnKQogICAgewoJKnJlc3VsdCA9IEZjVHJ1ZTsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICBpZiAoYzAgPT0gJ2YnIHx8IGMwID09ICduJyB8fCBjMCA9PSAnMCcpCiAgICB7CgkqcmVzdWx0ID0gRmNGYWxzZTsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICBpZiAoYzAgPT0gJ28nKQogICAgewoJYzEgPSB2WzFdOwoJaWYgKGlzdXBwZXIgKGMxKSkKCSAgICBjMSA9IHRvbG93ZXIgKGMxKTsKCWlmIChjMSA9PSAnbicpCgl7CgkgICAgKnJlc3VsdCA9IEZjVHJ1ZTsKCSAgICByZXR1cm4gRmNUcnVlOwoJfQoJaWYgKGMxID09ICdmJykKCXsKCSAgICAqcmVzdWx0ID0gRmNGYWxzZTsKCSAgICByZXR1cm4gRmNUcnVlOwoJfQogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY1ZhbHVlCkZjTmFtZUNvbnZlcnQgKEZjVHlwZSB0eXBlLCBjaGFyICpzdHJpbmcsIEZjTWF0cml4ICptKQp7CiAgICBGY1ZhbHVlCXY7CgogICAgdi50eXBlID0gdHlwZTsKICAgIHN3aXRjaCAodi50eXBlKSB7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CglpZiAoIUZjTmFtZUNvbnN0YW50IChzdHJpbmcsICZ2LnUuaSkpCgkgICAgdi51LmkgPSBhdG9pIChzdHJpbmcpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZVN0cmluZzoKCXYudS5zID0gc3RyaW5nOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUJvb2w6CglpZiAoIUZjTmFtZUJvb2wgKHN0cmluZywgJnYudS5iKSkKCSAgICB2LnUuYiA9IEZjRmFsc2U7CglicmVhazsKICAgIGNhc2UgRmNUeXBlRG91YmxlOgoJdi51LmQgPSBzdHJ0b2QgKHN0cmluZywgMCk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlTWF0cml4OgoJdi51Lm0gPSBtOwoJc3NjYW5mIChzdHJpbmcsICIlbGcgJWxnICVsZyAlbGciLCAmbS0+eHgsICZtLT54eSwgJm0tPnl4LCAmbS0+eXkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6Cgl2LnUuYyA9IEZjTmFtZVBhcnNlQ2hhclNldCAoc3RyaW5nKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIHY7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICoKRmNOYW1lRmluZE5leHQgKGNvbnN0IGNoYXIgKmN1ciwgY29uc3QgY2hhciAqZGVsaW0sIGNoYXIgKnNhdmUsIGNoYXIgKmxhc3QpCnsKICAgIGNoYXIgICAgYzsKICAgIAogICAgd2hpbGUgKChjID0gKmN1cikpCiAgICB7CglpZiAoYyA9PSAnXFwnKQoJewoJICAgICsrY3VyOwoJICAgIGlmICghKGMgPSAqY3VyKSkKCQlicmVhazsKCX0KCWVsc2UgaWYgKHN0cmNociAoZGVsaW0sIGMpKQoJICAgIGJyZWFrOwoJKytjdXI7Cgkqc2F2ZSsrID0gYzsKICAgIH0KICAgICpzYXZlID0gMDsKICAgICpsYXN0ID0gKmN1cjsKICAgIGlmICgqY3VyKQoJY3VyKys7CiAgICByZXR1cm4gY3VyOwp9CgpGY1BhdHRlcm4gKgpGY05hbWVQYXJzZSAoY29uc3QgY2hhciAqbmFtZSkKewogICAgY2hhcgkJKnNhdmU7CiAgICBGY1BhdHRlcm4JCSpwYXQ7CiAgICBkb3VibGUJCWQ7CiAgICBjaGFyCQkqZTsKICAgIGNoYXIJCWRlbGltOwogICAgRmNWYWx1ZQkJdjsKICAgIEZjTWF0cml4CQltOwogICAgY29uc3QgRmNPYmplY3RUeXBlCSp0OwogICAgY29uc3QgRmNDb25zdGFudAkqYzsKCiAgICBzYXZlID0gbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7CiAgICBpZiAoIXNhdmUpCglnb3RvIGJhaWwwOwogICAgcGF0ID0gRmNQYXR0ZXJuQ3JlYXRlICgpOwogICAgaWYgKCFwYXQpCglnb3RvIGJhaWwxOwoKICAgIGZvciAoOzspCiAgICB7CgluYW1lID0gRmNOYW1lRmluZE5leHQgKG5hbWUsICItLDoiLCBzYXZlLCAmZGVsaW0pOwoJaWYgKHNhdmVbMF0pCgl7CgkgICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRkFNSUxZLCBzYXZlKSkKCQlnb3RvIGJhaWwyOwoJfQoJaWYgKGRlbGltICE9ICcsJykKCSAgICBicmVhazsKICAgIH0KICAgIGlmIChkZWxpbSA9PSAnLScpCiAgICB7Cglmb3IgKDs7KQoJewoJICAgIG5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIi0sOiIsIHNhdmUsICZkZWxpbSk7CgkgICAgZCA9IHN0cnRvZCAoc2F2ZSwgJmUpOwoJICAgIGlmIChlICE9IHNhdmUpCgkgICAgewoJCWlmICghRmNQYXR0ZXJuQWRkRG91YmxlIChwYXQsIEZDX1NJWkUsIGQpKQoJCSAgICBnb3RvIGJhaWwyOwoJICAgIH0KCSAgICBpZiAoZGVsaW0gIT0gJywnKQoJCWJyZWFrOwoJfQogICAgfQogICAgd2hpbGUgKGRlbGltID09ICc6JykKICAgIHsKCW5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIj1fOiIsIHNhdmUsICZkZWxpbSk7CglpZiAoc2F2ZVswXSkKCXsKCSAgICBpZiAoZGVsaW0gPT0gJz0nIHx8IGRlbGltID09ICdfJykKCSAgICB7CgkJdCA9IEZjTmFtZUdldE9iamVjdFR5cGUgKHNhdmUpOwoJCWZvciAoOzspCgkJewoJCSAgICBuYW1lID0gRmNOYW1lRmluZE5leHQgKG5hbWUsICI6LCIsIHNhdmUsICZkZWxpbSk7CgkJICAgIGlmIChzYXZlWzBdICYmIHQpCgkJICAgIHsKCQkJdiA9IEZjTmFtZUNvbnZlcnQgKHQtPnR5cGUsIHNhdmUsICZtKTsKCQkJaWYgKCFGY1BhdHRlcm5BZGQgKHBhdCwgdC0+b2JqZWN0LCB2LCBGY1RydWUpKQoJCQl7CgkJCSAgICBpZiAodi50eXBlID09IEZjVHlwZUNoYXJTZXQpCgkJCQlGY0NoYXJTZXREZXN0cm95ICgoRmNDaGFyU2V0ICopIHYudS5jKTsKCQkJICAgIGdvdG8gYmFpbDI7CgkJCX0KCQkJaWYgKHYudHlwZSA9PSBGY1R5cGVDaGFyU2V0KQoJCQkgICAgRmNDaGFyU2V0RGVzdHJveSAoKEZjQ2hhclNldCAqKSB2LnUuYyk7CgkJICAgIH0KCQkgICAgaWYgKGRlbGltICE9ICcsJykKCQkJYnJlYWs7CgkJfQoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWlmICgoYyA9IEZjTmFtZUdldENvbnN0YW50IChzYXZlKSkpCgkJewoJCSAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgYy0+b2JqZWN0LCBjLT52YWx1ZSkpCgkJCWdvdG8gYmFpbDI7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICBmcmVlIChzYXZlKTsKICAgIHJldHVybiBwYXQ7CgpiYWlsMjoKICAgIEZjUGF0dGVybkRlc3Ryb3kgKHBhdCk7CmJhaWwxOgogICAgZnJlZSAoc2F2ZSk7CmJhaWwwOgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCkZjTmFtZUJ1ZkluaXQgKEZjTmFtZUJ1ZiAqYnVmLCBGY0NoYXI4ICppbml0LCBpbnQgc2l6ZSkKewogICAgYnVmLT5idWYgPSBpbml0OwogICAgYnVmLT5hbGxvY2F0ZWQgPSBGY0ZhbHNlOwogICAgYnVmLT5mYWlsZWQgPSBGY0ZhbHNlOwogICAgYnVmLT5sZW4gPSAwOwogICAgYnVmLT5zaXplID0gc2l6ZTsKfQoKc3RhdGljIHZvaWQKRmNOYW1lQnVmRGVzdHJveSAoRmNOYW1lQnVmICpidWYpCnsKICAgIGlmIChidWYtPmFsbG9jYXRlZCkKCWZyZWUgKGJ1Zi0+YnVmKTsKfQoKc3RhdGljIEZjQ2hhcjggKgpGY05hbWVCdWZEb25lIChGY05hbWVCdWYgKmJ1ZikKewogICAgRmNDaGFyOCAqcmV0OwoKICAgIHJldCA9IG1hbGxvYyAoYnVmLT5sZW4gKyAxKTsKICAgIGlmIChyZXQpCiAgICB7CgltZW1jcHkgKHJldCwgYnVmLT5idWYsIGJ1Zi0+bGVuKTsKCXJldFtidWYtPmxlbl0gPSAnXDAnOwogICAgfQogICAgRmNOYW1lQnVmRGVzdHJveSAoYnVmKTsKICAgIHJldHVybiByZXQ7Cn0KCkZjQm9vbApGY05hbWVCdWZDaGFyIChGY05hbWVCdWYgKmJ1ZiwgRmNDaGFyOCBjKQp7CiAgICBpZiAoYnVmLT5sZW4gPT0gYnVmLT5zaXplKQogICAgewoJRmNDaGFyOAkgICAgKm5ldzsKCWludAkgICAgc2l6ZTsKCglpZiAoYnVmLT5hbGxvY2F0ZWQpCgl7CgkgICAgc2l6ZSA9IGJ1Zi0+c2l6ZSAqIDI7CgkgICAgbmV3ID0gcmVhbGxvYyAoYnVmLT5idWYsIHNpemUpOwoJfQoJZWxzZQoJewoJICAgIHNpemUgPSBidWYtPnNpemUgKyAxMDI0OwoJICAgIG5ldyA9IG1hbGxvYyAoc2l6ZSk7CgkgICAgaWYgKG5ldykKCSAgICB7CgkJYnVmLT5hbGxvY2F0ZWQgPSBGY1RydWU7CgkJbWVtY3B5IChuZXcsIGJ1Zi0+YnVmLCBidWYtPmxlbik7CgkgICAgfQoJfQoJaWYgKCFuZXcpCgl7CgkgICAgYnVmLT5mYWlsZWQgPSBGY1RydWU7CgkgICAgcmV0dXJuIEZjRmFsc2U7Cgl9CglidWYtPnNpemUgPSBzaXplOwoJYnVmLT5idWYgPSBuZXc7CiAgICB9CiAgICBidWYtPmJ1ZltidWYtPmxlbisrXSA9IGM7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNOYW1lQnVmU3RyaW5nIChGY05hbWVCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyOCAqcykKewogICAgRmNDaGFyOCBjOwogICAgd2hpbGUgKChjID0gKnMrKykpCglpZiAoIUZjTmFtZUJ1ZkNoYXIgKGJ1ZiwgYykpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjTmFtZVVucGFyc2VTdHJpbmcgKEZjTmFtZUJ1ZgkgICAgKmJ1ZiwgCgkJICAgICBjb25zdCBGY0NoYXI4ICAqc3RyaW5nLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmVzY2FwZSkKewogICAgRmNDaGFyOCBjOwogICAgd2hpbGUgKChjID0gKnN0cmluZysrKSkKICAgIHsKCWlmIChlc2NhcGUgJiYgc3RyY2hyICgoY2hhciAqKSBlc2NhcGUsIChjaGFyKSBjKSkKCXsKCSAgICBpZiAoIUZjTmFtZUJ1ZkNoYXIgKGJ1ZiwgZXNjYXBlWzBdKSkKCQlyZXR1cm4gRmNGYWxzZTsKCX0KCWlmICghRmNOYW1lQnVmQ2hhciAoYnVmLCBjKSkKCSAgICByZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNOYW1lVW5wYXJzZVZhbHVlIChGY05hbWVCdWYJKmJ1ZiwKCQkgICAgRmNWYWx1ZQl2LAoJCSAgICBGY0NoYXI4CSplc2NhcGUpCnsKICAgIEZjQ2hhcjgJdGVtcFsxMDI0XTsKICAgIAogICAgc3dpdGNoICh2LnR5cGUpIHsKICAgIGNhc2UgRmNUeXBlVm9pZDoKCXJldHVybiBGY1RydWU7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CglzcHJpbnRmICgoY2hhciAqKSB0ZW1wLCAiJWQiLCB2LnUuaSk7CglyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB0ZW1wLCAwKTsKICAgIGNhc2UgRmNUeXBlRG91YmxlOgoJc3ByaW50ZiAoKGNoYXIgKikgdGVtcCwgIiVnIiwgdi51LmQpOwoJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1ZiwgdGVtcCwgMCk7CiAgICBjYXNlIEZjVHlwZVN0cmluZzoKCXJldHVybiBGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsIHYudS5zLCBlc2NhcGUpOwogICAgY2FzZSBGY1R5cGVCb29sOgoJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1Ziwgdi51LmIgPyAiVHJ1ZSIgOiAiRmFsc2UiLCAwKTsKICAgIGNhc2UgRmNUeXBlTWF0cml4OgoJc3ByaW50ZiAoKGNoYXIgKikgdGVtcCwgIiVnICVnICVnICVnIiwgCgkJIHYudS5tLT54eCwgdi51Lm0tPnh5LCB2LnUubS0+eXgsIHYudS5tLT55eSk7CglyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB0ZW1wLCAwKTsKICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKCXJldHVybiBGY05hbWVVbnBhcnNlQ2hhclNldCAoYnVmLCB2LnUuYyk7CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKc3RhdGljIEZjQm9vbApGY05hbWVVbnBhcnNlVmFsdWVMaXN0IChGY05hbWVCdWYJKmJ1ZiwKCQkJRmNWYWx1ZUxpc3QJKnYsCgkJCWNoYXIJCSplc2NhcGUpCnsKICAgIHdoaWxlICh2KQogICAgewoJaWYgKCFGY05hbWVVbnBhcnNlVmFsdWUgKGJ1Ziwgdi0+dmFsdWUsIGVzY2FwZSkpCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoKHYgPSB2LT5uZXh0KSkKCSAgICBpZiAoIUZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1ZiwgIiwiLCAwKSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCiNkZWZpbmUgRkNfRVNDQVBFX0ZJWEVEICAgICJcXC06LCIKI2RlZmluZSBGQ19FU0NBUEVfVkFSSUFCTEUgIlxcPV86LCIKCkZjQ2hhcjggKgpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCkKewogICAgRmNOYW1lQnVmCQkgICAgYnVmOwogICAgRmNDaGFyOAkJICAgIGJ1Zl9zdGF0aWNbODE5Ml07CiAgICBpbnQJCQkgICAgaTsKICAgIEZjUGF0dGVybkVsdAkgICAgKmU7CiAgICBjb25zdCBGY09iamVjdFR5cGVMaXN0ICAqbDsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZQkgICAgKm87CgogICAgRmNOYW1lQnVmSW5pdCAoJmJ1ZiwgYnVmX3N0YXRpYywgc2l6ZW9mIChidWZfc3RhdGljKSk7CiAgICBlID0gRmNQYXR0ZXJuRmluZCAocGF0LCBGQ19GQU1JTFksIEZjRmFsc2UpOwogICAgaWYgKGUpCiAgICB7CglpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgRkNfRVNDQVBFX0ZJWEVEKSkKCSAgICBnb3RvIGJhaWwwOwogICAgfQogICAgZSA9IEZjUGF0dGVybkZpbmQgKHBhdCwgRkNfU0laRSwgRmNGYWxzZSk7CiAgICBpZiAoZSkKICAgIHsKCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgIi0iLCAwKSkKCSAgICBnb3RvIGJhaWwwOwoJaWYgKCFGY05hbWVVbnBhcnNlVmFsdWVMaXN0ICgmYnVmLCBlLT52YWx1ZXMsIEZDX0VTQ0FQRV9GSVhFRCkpCgkgICAgZ290byBiYWlsMDsKICAgIH0KICAgIGZvciAobCA9IF9GY09iamVjdFR5cGVzOyBsOyBsID0gbC0+bmV4dCkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBsLT5udHlwZXM7IGkrKykKCXsKCSAgICBvID0gJmwtPnR5cGVzW2ldOwoJICAgIGlmICghc3RyY21wIChvLT5vYmplY3QsIEZDX0ZBTUlMWSkgfHwgCgkJIXN0cmNtcCAoby0+b2JqZWN0LCBGQ19TSVpFKSB8fAoJCSFzdHJjbXAgKG8tPm9iamVjdCwgRkNfRklMRSkpCgkJY29udGludWU7CgkgICAgCgkgICAgZSA9IEZjUGF0dGVybkZpbmQgKHBhdCwgby0+b2JqZWN0LCBGY0ZhbHNlKTsKCSAgICBpZiAoZSkKCSAgICB7CgkJaWYgKCFGY05hbWVVbnBhcnNlU3RyaW5nICgmYnVmLCAiOiIsIDApKQoJCSAgICBnb3RvIGJhaWwwOwoJCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1Ziwgby0+b2JqZWN0LCBGQ19FU0NBUEVfVkFSSUFCTEUpKQoJCSAgICBnb3RvIGJhaWwwOwoJCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgIj0iLCAwKSkKCQkgICAgZ290byBiYWlsMDsKCQlpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgCgkJCQkJICAgICBGQ19FU0NBUEVfVkFSSUFCTEUpKQoJCSAgICBnb3RvIGJhaWwwOwoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiBGY05hbWVCdWZEb25lICgmYnVmKTsKYmFpbDA6CiAgICBGY05hbWVCdWZEZXN0cm95ICgmYnVmKTsKICAgIHJldHVybiAwOwp9Cg==