LyoKICogZW50aXRpZXMuYyA6IGltcGxlbWVudGF0aW9uIGZvciB0aGUgWE1MIGVudGl0aWVzIGhhbmRraW5nCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogRGFuaWVsLlZlaWxsYXJkQHczLm9yZwogKi8KCiNpZmRlZiBXSU4zMgojaW5jbHVkZSAid2luMzJjb25maWcuaCIKI2Vsc2UKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZmRlZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaWJ4bWwveG1sbWVtb3J5Lmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW50aXRpZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KCiNkZWZpbmUgREVCVUdfRU5UX1JFRiAvKiBkZWJ1Z2dpbmcgb2YgY3Jvc3MgZW50aXRpZXMgZGVwZW5kYW5jaWVzICovCiNkZWZpbmUgRU5USVRZX0hBU0hfU0laRSAyNTYgLyogbW9kaWZ5IHhtbEVudGl0eUNvbXB1dGVIYXNoIGFjY29yZGluZ2x5ICovCgovKgogKiB4bWxFbnRpdHlDb21wdXRlSGFzaDoKICoKICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoaXMgZ2l2ZW4gZW50aXR5CiAqLwppbnQKeG1sRW50aXR5Q29tcHV0ZUhhc2goY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqY3VyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZTsKICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdmFsID0gMDsKCiAgICBpZiAobmFtZSA9PSBOVUxMKQoJcmV0dXJuKHZhbCk7CiAgICB3aGlsZSAoKmN1cikgdmFsICs9ICpjdXIrKzsKICAgIHJldHVybih2YWwpOwp9CgovKgogKiBUaGUgWE1MIHByZWRlZmluZWQgZW50aXRpZXMuCiAqLwoKc3RydWN0IHhtbFByZWRlZmluZWRFbnRpdHlWYWx1ZSB7CiAgICBjb25zdCBjaGFyICpuYW1lOwogICAgY29uc3QgY2hhciAqdmFsdWU7Cn07CnN0cnVjdCB4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWUgeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tdID0gewogICAgeyAibHQiLCAiPCIgfSwKICAgIHsgImd0IiwgIj4iIH0sCiAgICB7ICJhcG9zIiwgIiciIH0sCiAgICB7ICJxdW90IiwgIlwiIiB9LAogICAgeyAiYW1wIiwgIiYiIH0KfTsKCi8qCiAqIFRPRE86ICEhISEhISEgVGhpcyBpcyBHUk9TUywgYWxsb2NhdGlvbiBvZiBhIDI1NiBlbnRyeSBoYXNoIGZvcgogKiAgICAgICAgICAgICAgIGEgZml4ZWQgbnVtYmVyIG9mIDQgZWxlbWVudHMgIQogKi8KeG1sRW50aXRpZXNUYWJsZVB0ciB4bWxQcmVkZWZpbmVkRW50aXRpZXMgPSBOVUxMOwoKLyoKICogeG1sRnJlZUVudGl0eSA6IGNsZWFuLXVwIGFuIGVudGl0eSByZWNvcmQuCiAqLwp2b2lkIHhtbEZyZWVFbnRpdHkoeG1sRW50aXR5UHRyIGVudGl0eSkgewogICAgaWYgKGVudGl0eSA9PSBOVUxMKSByZXR1cm47CgogICAgaWYgKGVudGl0eS0+Y2hpbGRyZW4pCgl4bWxGcmVlTm9kZUxpc3QoZW50aXR5LT5jaGlsZHJlbik7CiAgICBpZiAoZW50aXR5LT5uYW1lICE9IE5VTEwpCgl4bWxGcmVlKChjaGFyICopIGVudGl0eS0+bmFtZSk7CiAgICBpZiAoZW50aXR5LT5FeHRlcm5hbElEICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPkV4dGVybmFsSUQpOwogICAgaWYgKGVudGl0eS0+U3lzdGVtSUQgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+U3lzdGVtSUQpOwogICAgaWYgKGVudGl0eS0+VVJJICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPlVSSSk7CiAgICBpZiAoZW50aXR5LT5jb250ZW50ICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPmNvbnRlbnQpOwogICAgaWYgKGVudGl0eS0+b3JpZyAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5vcmlnKTsKI2lmZGVmIFdJVEhfRVhUUkFfRU5UX0RFVEVDVAogICAgaWYgKGVudGl0eS0+ZW50VGFiICE9IE5VTEwpIHsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPmVudE5yOyBpKyspCgkgICAgeG1sRnJlZShlbnRpdHktPmVudFRhYltpXSk7Cgl4bWxGcmVlKGVudGl0eS0+ZW50VGFiKTsKICAgIH0KI2VuZGlmCiAgICBtZW1zZXQoZW50aXR5LCAtMSwgc2l6ZW9mKHhtbEVudGl0eSkpOwogICAgeG1sRnJlZShlbnRpdHkpOwp9CgovKgogKiB4bWxBZGRFbnRpdHkgOiByZWdpc3RlciBhIG5ldyBlbnRpdHkgZm9yIGFuIGVudGl0aWVzIHRhYmxlLgogKi8Kc3RhdGljIHhtbEVudGl0eVB0cgp4bWxBZGRFbnRpdHkoeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSwgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IHR5cGUsCgkgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAoJICBjb25zdCB4bWxDaGFyICpjb250ZW50KSB7CiNpZm5kZWYgRU5USVRZX0hBU0hfU0laRQogICAgaW50IGk7CiNlbmRpZgogICAgaW50IGhhc2g7CiAgICB4bWxFbnRpdHlQdHIgcmV0OwoKICAgIGlmIChuYW1lID09IE5VTEwpCglyZXR1cm4oTlVMTCk7CiNpZmRlZiBFTlRJVFlfSEFTSF9TSVpFCiAgICBoYXNoID0geG1sRW50aXR5Q29tcHV0ZUhhc2gobmFtZSk7CiAgICByZXQgPSB0YWJsZS0+dGFibGVbaGFzaF07CiAgICB3aGlsZSAocmV0ICE9IE5VTEwpIHsKCWlmICgheG1sU3RyY21wKHJldC0+bmFtZSwgbmFtZSkpIHsKCSAgICAvKgoJICAgICAqIFRoZSBlbnRpdHkgaXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoaXMgRHRkLCB0aGUgc3BlYyBzYXlzIHRvIE5PVAoJICAgICAqIG92ZXJyaWRlIGl0IC4uLiBJcyBpdCB3b3J0aCBhIFdhcm5pbmcgPz8/ICEhIQoJICAgICAqIE5vdCBoYXZpbmcgYSBjcHJpbnRpbmcgY29udGV4dCB0aGlzIHNlZW1zIGhhcmQgLi4uCgkgICAgICovCgkgICAgaWYgKCgodHlwZSA9PSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWSkgfHwKCSAgICAgICAgICh0eXBlID09IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSkgJiYKCSAgICAgICAgKChyZXQtPmV0eXBlID09IFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSB8fAoJICAgICAgICAgKHJldC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpKSkKCQlyZXR1cm4oTlVMTCk7CgkgICAgZWxzZQoJICAgIGlmICgoKHR5cGUgIT0gWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpICYmCgkgICAgICAgICAodHlwZSAhPSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSkpICYmCgkgICAgICAgICgocmV0LT5ldHlwZSAhPSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWSkgJiYKCSAgICAgICAgIChyZXQtPmV0eXBlICE9IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSkpCgkJcmV0dXJuKE5VTEwpOwoJfQoJcmV0ID0gcmV0LT5uZXh0ZTsKICAgIH0KI2Vsc2UKICAgIGZvciAoaSA9IDA7aSA8IHRhYmxlLT5uYl9lbnRpdGllcztpKyspIHsKICAgICAgICByZXQgPSB0YWJsZS0+dGFibGVbaV07CglpZiAoIXhtbFN0cmNtcChyZXQtPm5hbWUsIG5hbWUpKSB7CgkgICAgLyoKCSAgICAgKiBUaGUgZW50aXR5IGlzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGlzIER0ZCwgdGhlIHNwZWMgc2F5cyB0byBOT1QKCSAgICAgKiBvdmVycmlkZSBpdCAuLi4gSXMgaXQgd29ydGggYSBXYXJuaW5nID8/PyAhISEKCSAgICAgKiBOb3QgaGF2aW5nIGEgY3ByaW50aW5nIGNvbnRleHQgdGhpcyBzZWVtcyBoYXJkIC4uLgoJICAgICAqLwoJICAgIGlmICgoKHR5cGUgPT0gWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpIHx8CgkgICAgICAgICAodHlwZSA9PSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSkpICYmCgkgICAgICAgICgocmV0LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWSkgfHwKCSAgICAgICAgIChyZXQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSkpCgkJcmV0dXJuKE5VTEwpOwoJICAgIGVsc2UKCSAgICBpZiAoKCh0eXBlICE9IFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSAmJgoJICAgICAgICAgKHR5cGUgIT0gWE1MX0VYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpKSAmJgoJICAgICAgICAoKHJldC0+ZXR5cGUgIT0gWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpICYmCgkgICAgICAgICAocmV0LT5ldHlwZSAhPSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSkpKQoJCXJldHVybihOVUxMKTsKCX0KICAgIH0KICAgIGlmICh0YWJsZS0+bmJfZW50aXRpZXMgPj0gdGFibGUtPm1heF9lbnRpdGllcykgewogICAgICAgIC8qCgkgKiBuZWVkIG1vcmUgZWxlbWVudHMuCgkgKi8KCXRhYmxlLT5tYXhfZW50aXRpZXMgKj0gMjsKCXRhYmxlLT50YWJsZSA9ICh4bWxFbnRpdHlQdHIgKikgCgkgICAgeG1sUmVhbGxvYyh0YWJsZS0+dGFibGUsCgkJICAgICAgIHRhYmxlLT5tYXhfZW50aXRpZXMgKiBzaXplb2YoeG1sRW50aXR5UHRyKSk7CglpZiAodGFibGUtPnRhYmxlID09IE5VTEwpIHsKCSAgICBwZXJyb3IoInJlYWxsb2MgZmFpbGVkIik7CgkgICAgcmV0dXJuKE5VTEwpOwoJfQogICAgfQojZW5kaWYKICAgIHJldCA9ICh4bWxFbnRpdHlQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sRW50aXR5KSk7CiAgICBpZiAocmV0ID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAieG1sQWRkRW50aXR5OiBvdXQgb2YgbWVtb3J5XG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG1lbXNldChyZXQsIDAsIHNpemVvZih4bWxFbnRpdHkpKTsKICAgIHJldC0+dHlwZSA9IFhNTF9FTlRJVFlfREVDTDsKI2lmZGVmIEVOVElUWV9IQVNIX1NJWkUKICAgIHJldC0+bmV4dGUgPSB0YWJsZS0+dGFibGVbaGFzaF07CiAgICB0YWJsZS0+dGFibGVbaGFzaF0gPSByZXQ7CiNlbHNlCiAgICB0YWJsZS0+dGFibGVbdGFibGUtPm5iX2VudGl0aWVzXSA9IHJldDsKI2VuZGlmCgogICAgLyoKICAgICAqIGZpbGwgdGhlIHN0cnVjdHVyZS4KICAgICAqLwogICAgcmV0LT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwogICAgcmV0LT5ldHlwZSA9ICh4bWxFbnRpdHlUeXBlKSB0eXBlOwogICAgaWYgKEV4dGVybmFsSUQgIT0gTlVMTCkKCXJldC0+RXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChFeHRlcm5hbElEKTsKICAgIGlmIChTeXN0ZW1JRCAhPSBOVUxMKQoJcmV0LT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChTeXN0ZW1JRCk7CiAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CiAgICAgICAgcmV0LT5sZW5ndGggPSB4bWxTdHJsZW4oY29udGVudCk7CglyZXQtPmNvbnRlbnQgPSB4bWxTdHJuZHVwKGNvbnRlbnQsIHJldC0+bGVuZ3RoKTsKICAgICB9IGVsc2UgewogICAgICAgIHJldC0+bGVuZ3RoID0gMDsKICAgICAgICByZXQtPmNvbnRlbnQgPSBOVUxMOwogICAgfQogICAgcmV0LT5VUkkgPSBOVUxMOyAvKiB0byBiZSBjb21wdXRlZCBieSB0aGUgbGF5ZXIga25vd2luZwoJCQl0aGUgZGVmaW5pbmcgZW50aXR5ICovCiAgICByZXQtPm9yaWcgPSBOVUxMOwogICAgdGFibGUtPm5iX2VudGl0aWVzKys7CgogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzOgogKgogKiBTZXQgdXAgdGhlIHByZWRlZmluZWQgZW50aXRpZXMuCiAqLwp2b2lkIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXModm9pZCkgewogICAgaW50IGk7CiAgICB4bWxDaGFyIG5hbWVbNTBdOwogICAgeG1sQ2hhciB2YWx1ZVs1MF07CiAgICBjb25zdCBjaGFyICppbjsKICAgIHhtbENoYXIgKm91dDsKCiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzICE9IE5VTEwpIHJldHVybjsKCiAgICB4bWxQcmVkZWZpbmVkRW50aXRpZXMgPSB4bWxDcmVhdGVFbnRpdGllc1RhYmxlKCk7CiAgICBmb3IgKGkgPSAwO2kgPCBzaXplb2YoeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlcykgLyAKICAgICAgICAgICAgICAgICAgIHNpemVvZih4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWVzWzBdKTtpKyspIHsKICAgICAgICBpbiA9IHhtbFByZWRlZmluZWRFbnRpdHlWYWx1ZXNbaV0ubmFtZTsKCW91dCA9ICZuYW1lWzBdOwoJZm9yICg7KCpvdXQrKyA9ICh4bWxDaGFyKSAqaW4pOylpbisrOwogICAgICAgIGluID0geG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tpXS52YWx1ZTsKCW91dCA9ICZ2YWx1ZVswXTsKCWZvciAoOygqb3V0KysgPSAoeG1sQ2hhcikgKmluKTspaW4rKzsKICAgICAgICB4bWxBZGRFbnRpdHkoeG1sUHJlZGVmaW5lZEVudGl0aWVzLCAoY29uc3QgeG1sQ2hhciAqKSAmbmFtZVswXSwKCSAgICAgICAgICAgICBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFksIE5VTEwsIE5VTEwsCgkJICAgICAmdmFsdWVbMF0pOwogICAgfQp9CgovKioKICogeG1sQ2xlYW51cFByZWRlZmluZWRFbnRpdGllczoKICoKICogQ2xlYW51cCB1cCB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcyB0YWJsZS4KICovCnZvaWQgeG1sQ2xlYW51cFByZWRlZmluZWRFbnRpdGllcyh2b2lkKSB7CiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpIHJldHVybjsKCiAgICB4bWxGcmVlRW50aXRpZXNUYWJsZSh4bWxQcmVkZWZpbmVkRW50aXRpZXMpOwogICAgeG1sUHJlZGVmaW5lZEVudGl0aWVzID0gTlVMTDsKfQoKLyoqCiAqIHhtbEdldFByZWRlZmluZWRFbnRpdHk6CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqCiAqIENoZWNrIHdoZXRoZXIgdGhpcyBuYW1lIGlzIGFuIHByZWRlZmluZWQgZW50aXR5LgogKgogKiBSZXR1cm5zIE5VTEwgaWYgbm90LCBvdGhlcnZpc2UgdGhlIGVudGl0eQogKi8KeG1sRW50aXR5UHRyCnhtbEdldFByZWRlZmluZWRFbnRpdHkoY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgaW50IGk7CiAgICB4bWxFbnRpdHlQdHIgY3VyOwoKICAgIGlmICh4bWxQcmVkZWZpbmVkRW50aXRpZXMgPT0gTlVMTCkKICAgICAgICB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzKCk7CiNpZmRlZiBFTlRJVFlfSEFTSF9TSVpFCiAgICBpID0geG1sRW50aXR5Q29tcHV0ZUhhc2gobmFtZSk7CiAgICBjdXIgPSB4bWxQcmVkZWZpbmVkRW50aXRpZXMtPnRhYmxlW2ldOwogICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7CglpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIG5hbWUpKQoJICAgIHJldHVybihjdXIpOwoJY3VyID0gY3VyLT5uZXh0ZTsKICAgIH0KI2Vsc2UKICAgIGZvciAoaSA9IDA7aSA8IHhtbFByZWRlZmluZWRFbnRpdGllcy0+bmJfZW50aXRpZXM7aSsrKSB7CgljdXIgPSB4bWxQcmVkZWZpbmVkRW50aXRpZXMtPnRhYmxlW2ldOwoJaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCBuYW1lKSkgcmV0dXJuKGN1cik7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogeG1sQWRkRHRkRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqIEB0eXBlOiAgdGhlIGVudGl0eSB0eXBlIFhNTF94eHhfeXl5X0VOVElUWQogKiBARXh0ZXJuYWxJRDogIHRoZSBlbnRpdHkgZXh0ZXJuYWwgSUQgaWYgYXZhaWxhYmxlCiAqIEBTeXN0ZW1JRDogIHRoZSBlbnRpdHkgc3lzdGVtIElEIGlmIGF2YWlsYWJsZQogKiBAY29udGVudDogIHRoZSBlbnRpdHkgY29udGVudAogKgogKiBSZWdpc3RlciBhIG5ldyBlbnRpdHkgZm9yIHRoaXMgZG9jdW1lbnQgRFREIGV4dGVybmFsIHN1YnNldC4KICoKICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IKICovCnhtbEVudGl0eVB0cgp4bWxBZGREdGRFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IHR5cGUsCgkgICAgICAgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAoJCWNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CiAgICB4bWxFbnRpdHlQdHIgcmV0OwogICAgeG1sRHRkUHRyIGR0ZDsKCiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwKCSAgICAgICAgInhtbEFkZER0ZEVudGl0eTogZG9jID09IE5VTEwgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBpZiAoZG9jLT5leHRTdWJzZXQgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLAoJICAgICAgICAieG1sQWRkRHRkRW50aXR5OiBkb2N1bWVudCB3aXRob3V0IGV4dGVybmFsIHN1YnNldCAhXG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIGR0ZCA9IGRvYy0+ZXh0U3Vic2V0OwogICAgdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZHRkLT5lbnRpdGllczsKICAgIGlmICh0YWJsZSA9PSBOVUxMKSB7CiAgICAgICAgdGFibGUgPSB4bWxDcmVhdGVFbnRpdGllc1RhYmxlKCk7CglkdGQtPmVudGl0aWVzID0gdGFibGU7CiAgICB9CiAgICByZXQgPSB4bWxBZGRFbnRpdHkodGFibGUsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEdGQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CiAgICAgICAgZHRkLT5sYXN0LT5uZXh0ID0gKHhtbE5vZGVQdHIpIHJldDsKCXJldC0+cHJldiA9IGR0ZC0+bGFzdDsKCWR0ZC0+bGFzdCA9ICh4bWxOb2RlUHRyKSByZXQ7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKLyoqCiAqIHhtbEFkZERvY0VudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkKICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQogKiBAU3lzdGVtSUQ6ICB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUKICogQGNvbnRlbnQ6ICB0aGUgZW50aXR5IGNvbnRlbnQKICoKICogUmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciB0aGlzIGRvY3VtZW50LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogKi8KeG1sRW50aXR5UHRyCnhtbEFkZERvY0VudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgICAgICAgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CiAgICB4bWxFbnRpdHlQdHIgcmV0OwogICAgeG1sRHRkUHRyIGR0ZDsKCiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwKCSAgICAgICAgInhtbEFkZERvY0VudGl0eTogZG9jdW1lbnQgaXMgTlVMTCAhXG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIGlmIChkb2MtPmludFN1YnNldCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsCgkgICAgICAgICJ4bWxBZGREdGRFbnRpdHk6IGRvY3VtZW50IHdpdGhvdXQgaW50ZXJuYWwgc3Vic2V0ICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgZHRkID0gZG9jLT5pbnRTdWJzZXQ7CiAgICB0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmludFN1YnNldC0+ZW50aXRpZXM7CiAgICBpZiAodGFibGUgPT0gTlVMTCkgewogICAgICAgIHRhYmxlID0geG1sQ3JlYXRlRW50aXRpZXNUYWJsZSgpOwoJZG9jLT5pbnRTdWJzZXQtPmVudGl0aWVzID0gdGFibGU7CiAgICB9CiAgICByZXQgPSB4bWxBZGRFbnRpdHkodGFibGUsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEdGQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CglkdGQtPmxhc3QtPm5leHQgPSAoeG1sTm9kZVB0cikgcmV0OwoJcmV0LT5wcmV2ID0gZHRkLT5sYXN0OwoJZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgojaWZkZWYgV0lUSF9FWFRSQV9FTlRfREVURUNUCi8qKgogKiB4bWxFbnRpdHlDaGVja1JlZmVyZW5jZToKICogQGVudDogIGFuIGV4aXN0aW5nIGVudGl0eQogKiBAdG86ICB0aGUgZW50aXR5IG5hbWUgaXQncyByZWZlcmVuY2luZwogKgogKiBGdW5jdGlvbiB0byBrZWVwIHRyYWNrIG9mIHJlZmVyZW5jZXMgYW5kIGRldGVjdCBjeWNsZXMgKHdlbGwgZm9ybWVkbmVzcyAKICogZXJyb3JzICEpLgogKgogKiBSZXR1cm5zOiAwIGlmIE9rYXksIC0xIGluIGNhc2Ugb2YgZ2VuZXJhbCBlcnJvciwgMSBpbiBjYXNlIG9mIGxvb3AgCiAqICAgICAgZGV0ZWN0aW9uLgogKi8KaW50CnhtbEVudGl0eUNoZWNrUmVmZXJlbmNlKHhtbEVudGl0eVB0ciBlbnQsIGNvbnN0IHhtbENoYXIgKnRvKSB7CiAgICBpbnQgaTsKICAgIHhtbERvY1B0ciBkb2M7CgogICAgaWYgKGVudCA9PSBOVUxMKSByZXR1cm4oLTEpOwogICAgaWYgKHRvID09IE5VTEwpIHJldHVybigtMSk7CgogICAgZG9jID0gZW50LT5kb2M7CiAgICBpZiAoZG9jID09IE5VTEwpIHJldHVybigtMSk7CgojaWZkZWYgREVCVUdfRU5UX1JFRgogICAgcHJpbnRmKCJ4bWxFbnRpdHlDaGVja1JlZmVyZW5jZSglcyB0byAlcylcbiIsIGVudC0+bmFtZSwgdG8pOwojZW5kaWYKCgogICAgLyoKICAgICAqIERvIGEgcmVjdXJzaXZlIGNoZWNraW5nCiAgICAgKi8KICAgIGZvciAoaSA9IDA7aSA8IGVudC0+ZW50TnI7aSsrKSB7Cgl4bWxFbnRpdHlQdHIgaW5kaXIgPSBOVUxMOwoKCWlmICgheG1sU3RyY21wKHRvLCBlbnQtPmVudFRhYltpXSkpCgkgICAgcmV0dXJuKDEpOwoKCXN3aXRjaCAoZW50LT5ldHlwZSkgewogICAgICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9HRU5FUkFMX0VOVElUWToKICAgICAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgoJCWluZGlyID0geG1sR2V0RG9jRW50aXR5KGRvYywgZW50LT5lbnRUYWJbaV0pOwoJCWJyZWFrOwogICAgICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgogICAgICAgICAgICBjYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJCWluZGlyID0geG1sR2V0RHRkRW50aXR5KGRvYywgZW50LT5lbnRUYWJbaV0pOwoJCWJyZWFrOwogICAgICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWToKICAgICAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9VTlBBUlNFRF9FTlRJVFk6CgkJYnJlYWs7Cgl9CglpZiAoeG1sRW50aXR5Q2hlY2tSZWZlcmVuY2UoaW5kaXIsIHRvKSA9PSAxKQoJICAgIHJldHVybigxKTsKICAgIH0KICAgIHJldHVybigwKTsKfQoKLyoqCiAqIHhtbEVudGl0eUFkZFJlZmVyZW5jZToKICogQGVudDogIGFuIGV4aXN0aW5nIGVudGl0eQogKiBAdG86ICB0aGUgZW50aXR5IG5hbWUgaXQncyByZWZlcmVuY2luZwogKgogKiBGdW5jdGlvbiB0byByZWdpc3RlciByZXVzZSBvZiBhbiBleGlzdGluZyBlbnRpdHkgZnJvbSBhIChuZXcpIG9uZQogKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgcmVmZXJlbmNlcyBhbmQgZGV0ZWN0IGN5Y2xlcyAod2VsbCBmb3JtZWRuZXNzIAogKiBlcnJvcnMgISkuCiAqCiAqIFJldHVybnM6IDAgaWYgT2theSwgLTEgaW4gY2FzZSBvZiBnZW5lcmFsIGVycm9yLCAxIGluIGNhc2Ugb2YgbG9vcCAKICogICAgICBkZXRlY3Rpb24uCiAqLwppbnQKeG1sRW50aXR5QWRkUmVmZXJlbmNlKHhtbEVudGl0eVB0ciBlbnQsIGNvbnN0IHhtbENoYXIgKnRvKSB7CiAgICBpbnQgaTsKICAgIHhtbERvY1B0ciBkb2M7CiAgICB4bWxFbnRpdHlQdHIgaW5kaXIgPSBOVUxMOwoKICAgIGlmIChlbnQgPT0gTlVMTCkgcmV0dXJuKC0xKTsKICAgIGlmICh0byA9PSBOVUxMKSByZXR1cm4oLTEpOwoKICAgIGRvYyA9IGVudC0+ZG9jOwogICAgaWYgKGRvYyA9PSBOVUxMKSByZXR1cm4oLTEpOwoKI2lmZGVmIERFQlVHX0VOVF9SRUYKICAgIHByaW50ZigieG1sRW50aXR5QWRkUmVmZXJlbmNlKCVzIHRvICVzKVxuIiwgZW50LT5uYW1lLCB0byk7CiNlbmRpZgogICAgaWYgKGVudC0+ZW50VGFiID09IE5VTEwpIHsKCWVudC0+ZW50TnIgPSAwOwoJZW50LT5lbnRNYXggPSA1OwoJZW50LT5lbnRUYWIgPSAoeG1sQ2hhciAqKikgeG1sTWFsbG9jKGVudC0+ZW50TWF4ICogc2l6ZW9mKHhtbENoYXIgKikpOwoJaWYgKGVudC0+ZW50VGFiID09IE5VTEwpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgInhtbEVudGl0eUFkZFJlZmVyZW5jZTogb3V0IG9mIG1lbW9yeSAhXG4iKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQoKICAgIGZvciAoaSA9IDA7aSA8IGVudC0+ZW50TnI7aSsrKSB7CglpZiAoIXhtbFN0cmNtcCh0bywgZW50LT5lbnRUYWJbaV0pKQoJICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvKgogICAgICogRG8gYSByZWN1cnNpdmUgY2hlY2tpbmcKICAgICAqLwoKICAgIHN3aXRjaCAoZW50LT5ldHlwZSkgewoJY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CgljYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFk6CgkgICAgaW5kaXIgPSB4bWxHZXREb2NFbnRpdHkoZG9jLCB0byk7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCSAgICBpbmRpciA9IHhtbEdldER0ZEVudGl0eShkb2MsIHRvKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZOgoJY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9VTlBBUlNFRF9FTlRJVFk6CgkgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoKGluZGlyICE9IE5VTEwpICYmCgkoeG1sRW50aXR5Q2hlY2tSZWZlcmVuY2UoaW5kaXIsIGVudC0+bmFtZSkgPT0gMSkpCglyZXR1cm4oMSk7CgogICAgLyoKICAgICAqIEFkZCB0aGlzIHRvIHRoZSBsaXN0CiAgICAgKi8KICAgIGlmIChlbnQtPmVudE1heCA8PSBlbnQtPmVudE5yKSB7CgllbnQtPmVudE1heCAqPSAyOwoJZW50LT5lbnRUYWIgPSAoeG1sQ2hhciAqKikgeG1sUmVhbGxvYyhlbnQtPmVudFRhYiwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnQtPmVudE1heCAqIHNpemVvZih4bWxDaGFyICopKTsKCWlmIChlbnQtPmVudFRhYiA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJ4bWxFbnRpdHlBZGRSZWZlcmVuY2U6IG91dCBvZiBtZW1vcnkgIVxuIik7CgkgICAgcmV0dXJuKC0xKTsKCX0KICAgIH0KICAgIGVudC0+ZW50VGFiW2VudC0+ZW50TnIrK10gPSB4bWxTdHJkdXAodG8pOwogICAgcmV0dXJuKDApOwp9CiNlbmRpZgoKCi8qKgogKiB4bWxHZXRFbnRpdHlGcm9tVGFibGU6CiAqIEB0YWJsZTogIGFuIGVudGl0eSB0YWJsZQogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAcGFyYW1ldGVyOiAgbG9vayBmb3IgcGFyYW1ldGVyIGVudGl0aWVzCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIHRhYmxlLgogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBlbnRpdHksIGlmIGZvdW5kLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0RW50aXR5RnJvbVRhYmxlKHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXIpIHsKICAgIHhtbEVudGl0eVB0ciBjdXI7CiNpZmRlZiBFTlRJVFlfSEFTSF9TSVpFCiAgICBpbnQgaGFzaDsKCiAgICBoYXNoID0geG1sRW50aXR5Q29tcHV0ZUhhc2gobmFtZSk7CiAgICBjdXIgPSB0YWJsZS0+dGFibGVbaGFzaF07CiAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKCXN3aXRjaCAoY3VyLT5ldHlwZSkgewoJICAgIGNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CgkgICAgY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCQlpZiAoKHBhcmFtZXRlcikgJiYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCBuYW1lKSkpCgkJICAgIHJldHVybihjdXIpOwoJICAgIGRlZmF1bHQ6CgkJaWYgKCghcGFyYW1ldGVyKSAmJiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIG5hbWUpKSkKCQkgICAgcmV0dXJuKGN1cik7Cgl9CgljdXIgPSBjdXItPm5leHRlOwogICAgfQojZWxzZQogICAgaW50IGk7CgogICAgZm9yIChpID0gMDtpIDwgdGFibGUtPm5iX2VudGl0aWVzO2krKykgewoJY3VyID0gdGFibGUtPnRhYmxlW2ldOwoJc3dpdGNoIChjdXItPmV0eXBlKSB7CgkgICAgY2FzZSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCSAgICBjYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJCWlmICgocGFyYW1ldGVyKSAmJiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIG5hbWUpKSkKCQkgICAgcmV0dXJuKGN1cik7CgkgICAgZGVmYXVsdDoKCQlpZiAoKCFwYXJhbWV0ZXIpICYmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgbmFtZSkpKQoJCSAgICByZXR1cm4oY3VyKTsKCX0KICAgIH0KI2VuZGlmCiAgICByZXR1cm4oTlVMTCk7Cn0KCi8qKgogKiB4bWxHZXRQYXJhbWV0ZXJFbnRpdHk6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgcmVmZXJlbmNpbmcgdGhlIGVudGl0eQogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKgogKiBEbyBhbiBlbnRpdHkgbG9va3VwIGluIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgc3Vic2V0cyBhbmQKICogcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgZW50aXR5LCBpZiBmb3VuZC4KICogCiAqIFJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKi8KeG1sRW50aXR5UHRyCnhtbEdldFBhcmFtZXRlckVudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwogICAgeG1sRW50aXR5UHRyIHJldDsKCiAgICBpZiAoKGRvYy0+aW50U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmludFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGRvYy0+aW50U3Vic2V0LT5lbnRpdGllczsKCXJldCA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSwgMSk7CglpZiAocmV0ICE9IE5VTEwpCgkgICAgcmV0dXJuKHJldCk7CiAgICB9CiAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllczsKCXJldHVybih4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUsIDEpKTsKICAgIH0KICAgIHJldHVybihOVUxMKTsKfQoKLyoqCiAqIHhtbEdldER0ZEVudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudCByZWZlcmVuY2luZyB0aGUgZW50aXR5CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIER0ZCBlbnRpdHkgaGFzaCB0YWJsZSBhbmQKICogcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBlbnRpdHksIGlmIGZvdW5kLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0RHRkRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CgogICAgaWYgKChkb2MtPmV4dFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzICE9IE5VTEwpKSB7Cgl0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXM7CglyZXR1cm4oeG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lLCAwKSk7CiAgICB9CiAgICByZXR1cm4oTlVMTCk7Cn0KCi8qKgogKiB4bWxHZXREb2NFbnRpdHk6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgcmVmZXJlbmNpbmcgdGhlIGVudGl0eQogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKgogKiBEbyBhbiBlbnRpdHkgbG9va3VwIGluIHRoZSBkb2N1bWVudCBlbnRpdHkgaGFzaCB0YWJsZSBhbmQKICogcmV0dXJucyB0aGUgY29ycnNwb25kaW5nIGVudGl0eSwgb3RoZXJ3aXNlIGEgbG9va3VwIGlzIGRvbmUKICogaW4gdGhlIHByZWRlZmluZWQgZW50aXRpZXMgdG9vLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0RG9jRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgIHhtbEVudGl0eVB0ciBjdXI7CiAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwoKICAgIGlmIChkb2MgIT0gTlVMTCkgewoJaWYgKChkb2MtPmludFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5pbnRTdWJzZXQtPmVudGl0aWVzICE9IE5VTEwpKSB7CgkgICAgdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5pbnRTdWJzZXQtPmVudGl0aWVzOwoJICAgIGN1ciA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSwgMCk7CgkgICAgaWYgKGN1ciAhPSBOVUxMKQoJCXJldHVybihjdXIpOwoJfQoJaWYgKChkb2MtPmV4dFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzICE9IE5VTEwpKSB7CgkgICAgdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzOwoJICAgIGN1ciA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSwgMCk7CgkgICAgaWYgKGN1ciAhPSBOVUxMKQoJCXJldHVybihjdXIpOwoJfQogICAgfQogICAgaWYgKHhtbFByZWRlZmluZWRFbnRpdGllcyA9PSBOVUxMKQogICAgICAgIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMoKTsKICAgIHRhYmxlID0geG1sUHJlZGVmaW5lZEVudGl0aWVzOwogICAgcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSwgMCkpOwp9CgovKgogKiBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8IFsjeEUwMDAtI3hGRkZEXQogKiAgICAgICAgICAgICAgICAgIHwgWyN4MTAwMDAtI3gxMEZGRkZdCiAqIGFueSBVbmljb2RlIGNoYXJhY3RlciwgZXhjbHVkaW5nIHRoZSBzdXJyb2dhdGUgYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4KICovCiNkZWZpbmUgSVNfQ0hBUihjKQkJCQkJCQlcCiAgICAoKChjKSA9PSAweDA5KSB8fCAoKGMpID09IDB4MGEpIHx8ICgoYykgPT0gMHgwZCkgfHwJCQlcCiAgICAgKCgoYykgPj0gMHgyMCkgJiYgKChjKSAhPSAweEZGRkUpICYmICgoYykgIT0gMHhGRkZGKSkpCgovKgogKiBBIGJ1ZmZlciB1c2VkIGZvciBjb252ZXJ0aW5nIGVudGl0aWVzIHRvIHRoZWlyIGVxdWl2YWxlbnQgYW5kIGJhY2suCiAqLwpzdGF0aWMgaW50IGJ1ZmZlcl9zaXplID0gMDsKc3RhdGljIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CgppbnQgZ3Jvd0J1ZmZlcih2b2lkKSB7CiAgICBidWZmZXJfc2l6ZSAqPSAyOwogICAgYnVmZmVyID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhidWZmZXIsIGJ1ZmZlcl9zaXplICogc2l6ZW9mKHhtbENoYXIpKTsKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewogICAgICAgIHBlcnJvcigicmVhbGxvYyBmYWlsZWQiKTsKCXJldHVybigtMSk7CiAgICB9CiAgICByZXR1cm4oMCk7Cn0KCgovKioKICogeG1sRW5jb2RlRW50aXRpZXM6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgY29udGFpbmluZyB0aGUgc3RyaW5nCiAqIEBpbnB1dDogIEEgc3RyaW5nIHRvIGNvbnZlcnQgdG8gWE1MLgogKgogKiBEbyBhIGdsb2JhbCBlbmNvZGluZyBvZiBhIHN0cmluZywgcmVwbGFjaW5nIHRoZSBwcmVkZWZpbmVkIGVudGl0aWVzCiAqIGFuZCBub24gQVNDSUkgdmFsdWVzIHdpdGggdGhlaXIgZW50aXRpZXMgYW5kIENoYXJSZWYgY291bnRlcnBhcnRzLgogKgogKiBUT0RPOiByZW1vdmUgeG1sRW5jb2RlRW50aXRpZXMsIG9uY2Ugd2UgYXJlIG5vdCBhZnJhaWQgb2YgYnJlYWtpbmcgYmluYXJ5CiAqICAgICAgIGNvbXBhdGliaWxpdHkKICoKICogUGVvcGxlIG11c3QgbWlncmF0ZSB0aGVpciBjb2RlIHRvIHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50ICEKICogVGhpcyByb3V0aW5lIHdpbGwgaXNzdWUgYSB3YXJuaW5nIHdoZW4gZW5jb3VudGVyZWQuCiAqIAogKiBSZXR1cm5zIEEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZyB3aXRoIHRoZSBzdWJzdGl0dXRpb24gZG9uZS4KICovCmNvbnN0IHhtbENoYXIgKgp4bWxFbmNvZGVFbnRpdGllcyh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICppbnB1dCkgewogICAgY29uc3QgeG1sQ2hhciAqY3VyID0gaW5wdXQ7CiAgICB4bWxDaGFyICpvdXQgPSBidWZmZXI7CiAgICBzdGF0aWMgaW50IHdhcm5pbmcgPSAxOwogICAgaW50IGh0bWwgPSAwOwoKCiAgICBpZiAod2FybmluZykgewogICAgZnByaW50ZihzdGRlcnIsICJEZXByZWNhdGVkIEFQSSB4bWxFbmNvZGVFbnRpdGllcygpIHVzZWRcbiIpOwogICAgZnByaW50ZihzdGRlcnIsICIgICBjaGFuZ2UgY29kZSB0byB1c2UgeG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoKVxuIik7CiAgICB3YXJuaW5nID0gMDsKICAgIH0KCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewogICAgICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgICAgICBidWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxNYWxsb2MoYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwoJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CgkgICAgcGVycm9yKCJtYWxsb2MgZmFpbGVkIik7CiAgICAgICAgICAgIHJldHVybihOVUxMKTsKCX0KCW91dCA9IGJ1ZmZlcjsKICAgIH0KICAgIHdoaWxlICgqY3VyICE9ICdcMCcpIHsKICAgICAgICBpZiAob3V0IC0gYnVmZmVyID4gYnVmZmVyX3NpemUgLSAxMDApIHsKCSAgICBpbnQgaW5kZXggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXIoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZGV4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgoKmN1ciA9PSAnXCcnKSAmJiAoIWh0bWwpKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJ28nOwoJICAgICpvdXQrKyA9ICdzJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCgoKmN1ciA+PSAweDIwKSAmJiAoKmN1ciA8IDB4ODApKSB8fAoJICAgICgqY3VyID09ICdcbicpIHx8ICgqY3VyID09ICdccicpIHx8ICgqY3VyID09ICdcdCcpKSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIGp1c3QgY29weSAhCgkgICAgICovCgkgICAgKm91dCsrID0gKmN1cjsKI2lmbmRlZiBVU0VfVVRGXzgKCX0gZWxzZSBpZiAoKHNpemVvZih4bWxDaGFyKSA9PSAxKSAmJiAoKmN1ciA+PSAweDgwKSkgewoJICAgIGNoYXIgYnVmWzEwXSwgKnB0cjsKCiNpZmRlZiBIQVZFX1NOUFJJTlRGCgkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CiNlbHNlCgkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKICAgICAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogICAgICAgICAgICBwdHIgPSBidWY7CgkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwojZW5kaWYKCX0gZWxzZSBpZiAoSVNfQ0hBUigqY3VyKSkgewoJICAgIGNoYXIgYnVmWzEwXSwgKnB0cjsKCiNpZmRlZiBIQVZFX1NOUFJJTlRGCgkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CiNlbHNlCgkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKICAgICAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogICAgICAgICAgICBwdHIgPSBidWY7CgkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJfQojaWYgMAoJZWxzZSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIHRoaXMgaXMgbm90IGEgdmFsaWQgY2hhciAhCgkgICAgICogU2tpcCBpdC4uLgoJICAgICAqLwoJICAgIGZwcmludGYoc3RkZXJyLCAieG1sRW5jb2RlRW50aXRpZXM6IGludmFsaWQgY2hhciAlZFxuIiwgKGludCkgKmN1cik7Cgl9CiNlbmRpZgoJY3VyKys7CiAgICB9CiAgICAqb3V0KysgPSAwOwogICAgcmV0dXJuKGJ1ZmZlcik7Cn0KCi8qCiAqIE1hY3JvIHVzZWQgdG8gZ3JvdyB0aGUgY3VycmVudCBidWZmZXIuCiAqLwojZGVmaW5lIGdyb3dCdWZmZXJSZWVudHJhbnQoKSB7CQkJCQkJXAogICAgYnVmZmVyX3NpemUgKj0gMjsJCQkJCQkJXAogICAgYnVmZmVyID0gKHhtbENoYXIgKikJCQkJCQlcCiAgICAJCXhtbFJlYWxsb2MoYnVmZmVyLCBidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CVwKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewkJCQkJCVwKCXBlcnJvcigicmVhbGxvYyBmYWlsZWQiKTsJCQkJCVwKCXJldHVybihOVUxMKTsJCQkJCQkJXAogICAgfQkJCQkJCQkJCVwKfQoKCi8qKgogKiB4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudDoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogYW5kIG5vbiBBU0NJSSB2YWx1ZXMgd2l0aCB0aGVpciBlbnRpdGllcyBhbmQgQ2hhclJlZiBjb3VudGVycGFydHMuCiAqIENvbnRyYXJ5IHRvIHhtbEVuY29kZUVudGl0aWVzLCB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0CiAqIG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICB4bWxDaGFyICpvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGludCBodG1sID0gMDsKCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvYyhidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKCXBlcnJvcigibWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgb3V0ID0gYnVmZmVyOwoKICAgIHdoaWxlICgqY3VyICE9ICdcMCcpIHsKICAgICAgICBpZiAob3V0IC0gYnVmZmVyID4gYnVmZmVyX3NpemUgLSAxMDApIHsKCSAgICBpbnQgaW5kZXggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZGV4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwojaWYgMAoJfSBlbHNlIGlmICgoKmN1ciA9PSAnXCcnKSAmJiAoIWh0bWwpKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJ28nOwoJICAgICpvdXQrKyA9ICdzJzsKCSAgICAqb3V0KysgPSAnOyc7CiNlbmRpZgoJfSBlbHNlIGlmICgoKCpjdXIgPj0gMHgyMCkgJiYgKCpjdXIgPCAweDgwKSkgfHwKCSAgICAoKmN1ciA9PSAnXG4nKSB8fCAoKmN1ciA9PSAnXHInKSB8fCAoKmN1ciA9PSAnXHQnKSkgewoJICAgIC8qCgkgICAgICogZGVmYXVsdCBjYXNlLCBqdXN0IGNvcHkgIQoJICAgICAqLwoJICAgICpvdXQrKyA9ICpjdXI7Cgl9IGVsc2UgaWYgKCpjdXIgPj0gMHg4MCkgewoJICAgIGlmICgoZG9jLT5lbmNvZGluZyAhPSBOVUxMKSB8fCAoaHRtbCkpIHsKCQkvKgoJCSAqIEJq+HJuIFJlZXNlIDxickBzc2V1c2EuY29tPiBwcm92aWRlZCB0aGUgcGF0Y2gKCSAgICAgICAgeG1sQ2hhciB4YzsKCSAgICAgICAgeGMgPSAoKmN1ciAmIDB4M0YpIDw8IDY7CgkgICAgICAgIGlmIChjdXJbMV0gIT0gMCkgewoJCSAgICB4YyArPSAqKCsrY3VyKSAmIDB4M0Y7CgkJICAgICpvdXQrKyA9IHhjOwoJICAgICAgICB9IGVsc2UKCQkgKi8KCQkgICAgKm91dCsrID0gKmN1cjsKCSAgICB9IGVsc2UgewoJCS8qCgkJICogV2UgYXNzdW1lIHdlIGhhdmUgVVRGLTggaW5wdXQuCgkJICovCgkJY2hhciBidWZbMTBdLCAqcHRyOwoJCWludCB2YWwgPSAwLCBsID0gMTsKCgkJaWYgKCpjdXIgPCAweEMwKSB7CgkJICAgIGZwcmludGYoc3RkZXJyLAoJCQkgICAgInhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50IDogaW5wdXQgbm90IFVURi04XG4iKTsKCQkgICAgZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwojaWZkZWYgSEFWRV9TTlBSSU5URgoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKI2Vsc2UKCQkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKCQkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCSAgICBwdHIgPSBidWY7CgkJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQkgICAgY29udGludWU7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhFMCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgxRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICBsID0gMjsKCQl9IGVsc2UgaWYgKCpjdXIgPCAweEYwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gKGN1clswXSkgJiAweDBGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzFdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMl0pICYgMHgzRjsKCQkgICAgbCA9IDM7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhGOCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgwNzsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzJdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbM10pICYgMHgzRjsKCQkgICAgbCA9IDQ7CgkJfQoJCWlmICgobCA9PSAxKSB8fCAoIUlTX0NIQVIodmFsKSkpIHsKCQkgICAgZnByaW50ZihzdGRlcnIsCgkJCSJ4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudCA6IGNoYXIgb3V0IG9mIHJhbmdlXG4iKTsKCQkgICAgZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwojaWZkZWYgSEFWRV9TTlBSSU5URgoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKI2Vsc2UKCQkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKCQkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCSAgICBwdHIgPSBidWY7CgkJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQkgICAgY3VyKys7CgkJICAgIGNvbnRpbnVlOwoJCX0KCQkvKgoJCSAqIFdlIGNvdWxkIGRvIG11bHRpcGxlIHRoaW5ncyBoZXJlLiBKdXN0IHNhdmUgYXMgYSBjaGFyIHJlZgoJCSAqLwojaWZkZWYgSEFWRV9TTlBSSU5URgoJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImI3glWDsiLCB2YWwpOwojZWxzZQoJCXNwcmludGYoYnVmLCAiJiN4JVg7IiwgdmFsKTsKI2VuZGlmCgkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCXB0ciA9IGJ1ZjsKCQl3aGlsZSAoKnB0ciAhPSAwKSAqb3V0KysgPSAqcHRyKys7CgkJY3VyICs9IGw7CgkJY29udGludWU7CgkgICAgfQoJfSBlbHNlIGlmIChJU19DSEFSKCpjdXIpKSB7CgkgICAgY2hhciBidWZbMTBdLCAqcHRyOwoKI2lmZGVmIEhBVkVfU05QUklOVEYKCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKI2Vsc2UKCSAgICBzcHJpbnRmKGJ1ZiwgIiYjJWQ7IiwgKmN1cik7CiNlbmRpZgoJICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKICAgICAgICAgICAgcHRyID0gYnVmOwoJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCX0KI2lmIDAKCWVsc2UgewoJICAgIC8qCgkgICAgICogZGVmYXVsdCBjYXNlLCB0aGlzIGlzIG5vdCBhIHZhbGlkIGNoYXIgIQoJICAgICAqIFNraXAgaXQuLi4KCSAgICAgKi8KCSAgICBmcHJpbnRmKHN0ZGVyciwgInhtbEVuY29kZUVudGl0aWVzOiBpbnZhbGlkIGNoYXIgJWRcbiIsIChpbnQpICpjdXIpOwoJfQojZW5kaWYKCWN1cisrOwogICAgfQogICAgKm91dCsrID0gMDsKICAgIHJldHVybihidWZmZXIpOwp9CgovKioKICogeG1sRW5jb2RlU3BlY2lhbENoYXJzOgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIHN0cmluZwogKiBAaW5wdXQ6ICBBIHN0cmluZyB0byBjb252ZXJ0IHRvIFhNTC4KICoKICogRG8gYSBnbG9iYWwgZW5jb2Rpbmcgb2YgYSBzdHJpbmcsIHJlcGxhY2luZyB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcwogKiB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0IG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZVNwZWNpYWxDaGFycyh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICppbnB1dCkgewogICAgY29uc3QgeG1sQ2hhciAqY3VyID0gaW5wdXQ7CiAgICB4bWxDaGFyICpidWZmZXIgPSBOVUxMOwogICAgeG1sQ2hhciAqb3V0ID0gTlVMTDsKICAgIGludCBidWZmZXJfc2l6ZSA9IDA7CiAgICBpbnQgaHRtbCA9IDA7CgogICAgaWYgKGlucHV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKICAgIGlmIChkb2MgIT0gTlVMTCkKICAgICAgICBodG1sID0gKGRvYy0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKTsKCiAgICAvKgogICAgICogYWxsb2NhdGUgYW4gdHJhbnNsYXRpb24gYnVmZmVyLgogICAgICovCiAgICBidWZmZXJfc2l6ZSA9IDEwMDA7CiAgICBidWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxNYWxsb2MoYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwogICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CglwZXJyb3IoIm1hbGxvYyBmYWlsZWQiKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG91dCA9IGJ1ZmZlcjsKCiAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7CiAgICAgICAgaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTApIHsKCSAgICBpbnQgaW5kZXggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZGV4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIHsKCSAgICAvKgoJICAgICAqIFdvcmtzIGJlY2F1c2Ugb24gVVRGLTgsIGFsbCBleHRlbmRlZCBzZXF1ZW5jZXMgY2Fubm90CgkgICAgICogcmVzdWx0IGluIGJ5dGVzIGluIHRoZSBBU0NJSSByYW5nZS4KCSAgICAgKi8KCSAgICAqb3V0KysgPSAqY3VyOwoJfQoJY3VyKys7CiAgICB9CiAgICAqb3V0KysgPSAwOwogICAgcmV0dXJuKGJ1ZmZlcik7Cn0KCi8qKgogKiB4bWxDcmVhdGVFbnRpdGllc1RhYmxlOgogKgogKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gZW1wdHkgZW50aXRpZXMgaGFzaCB0YWJsZS4KICoKICogUmV0dXJucyB0aGUgeG1sRW50aXRpZXNUYWJsZVB0ciBqdXN0IGNyZWF0ZWQgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXRpZXNUYWJsZVB0cgp4bWxDcmVhdGVFbnRpdGllc1RhYmxlKHZvaWQpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgcmV0OwoKICAgIHJldCA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSAKICAgICAgICAgeG1sTWFsbG9jKHNpemVvZih4bWxFbnRpdGllc1RhYmxlKSk7CiAgICBpZiAocmV0ID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInhtbENyZWF0ZUVudGl0aWVzVGFibGUgOiB4bWxNYWxsb2MoJWxkKSBmYWlsZWRcbiIsCgkgICAgICAgIChsb25nKXNpemVvZih4bWxFbnRpdGllc1RhYmxlKSk7CiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgfQogICAgcmV0LT5uYl9lbnRpdGllcyA9IDA7CiNpZmRlZiBFTlRJVFlfSEFTSF9TSVpFCiAgICByZXQtPm1heF9lbnRpdGllcyA9IEVOVElUWV9IQVNIX1NJWkU7CiAgICByZXQtPnRhYmxlID0gKHhtbEVudGl0eVB0ciAqKSAKICAgICAgICAgeG1sTWFsbG9jKHJldC0+bWF4X2VudGl0aWVzICogc2l6ZW9mKHhtbEVudGl0eVB0cikpOwogICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJ4bWxDcmVhdGVFbnRpdGllc1RhYmxlIDogeG1sTWFsbG9jKCVsZCkgZmFpbGVkXG4iLAoJICAgICAgICByZXQtPm1heF9lbnRpdGllcyAqIChsb25nKXNpemVvZih4bWxFbnRpdHlQdHIpKTsKCXhtbEZyZWUocmV0KTsKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9CiAgICBtZW1zZXQocmV0LT50YWJsZSwgMCwgcmV0LT5tYXhfZW50aXRpZXMgKiBzaXplb2YoeG1sRW50aXR5UHRyKSk7CiNlbHNlCiAgICByZXQtPm1heF9lbnRpdGllcyA9IFhNTF9NSU5fRU5USVRJRVNfVEFCTEU7CiAgICByZXQtPnRhYmxlID0gKHhtbEVudGl0eVB0ciAqKSAKICAgICAgICAgeG1sTWFsbG9jKHJldC0+bWF4X2VudGl0aWVzICogc2l6ZW9mKHhtbEVudGl0eVB0cikpOwogICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJ4bWxDcmVhdGVFbnRpdGllc1RhYmxlIDogeG1sTWFsbG9jKCVsZCkgZmFpbGVkXG4iLAoJICAgICAgICByZXQtPm1heF9lbnRpdGllcyAqIChsb25nKXNpemVvZih4bWxFbnRpdHlQdHIpKTsKCXhtbEZyZWUocmV0KTsKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4bWxGcmVlRW50aXRpZXNUYWJsZToKICogQHRhYmxlOiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IGFuIGVudGl0aWVzIGhhc2ggdGFibGUuCiAqLwp2b2lkCnhtbEZyZWVFbnRpdGllc1RhYmxlKHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpIHsKICAgIGludCBpOwojaWZkZWYgRU5USVRZX0hBU0hfU0laRQogICAgeG1sRW50aXR5UHRyIGN1ciwgbmV4dDsKI2VuZGlmCgogICAgaWYgKHRhYmxlID09IE5VTEwpIHJldHVybjsKCiNpZmRlZiBFTlRJVFlfSEFTSF9TSVpFCiAgICBmb3IgKGkgPSAwO2kgPCBFTlRJVFlfSEFTSF9TSVpFO2krKykgewoJY3VyID0gdGFibGUtPnRhYmxlW2ldOwoJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CgkgICAgbmV4dCA9IGN1ci0+bmV4dGU7CgkgICAgeG1sRnJlZUVudGl0eShjdXIpOwoJICAgIGN1ciA9IG5leHQ7Cgl9CiAgICB9CiNlbHNlCiAgICBmb3IgKGkgPSAwO2kgPCB0YWJsZS0+bmJfZW50aXRpZXM7aSsrKSB7CiAgICAgICAgeG1sRnJlZUVudGl0eSh0YWJsZS0+dGFibGVbaV0pOwogICAgfQojZW5kaWYKICAgIHhtbEZyZWUodGFibGUtPnRhYmxlKTsKICAgIHhtbEZyZWUodGFibGUpOwp9CgovKioKICogeG1sQ29weUVudGl0eToKICogQGVudDogIEFuIGVudGl0eQogKgogKiBCdWlsZCBhIGNvcHkgb2YgYW4gZW50aXR5CiAqIAogKiBSZXR1cm5zIHRoZSBuZXcgeG1sRW50aXRpZXNQdHIgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXR5UHRyCnhtbENvcHlFbnRpdHkoeG1sRW50aXR5UHRyIGVudCkgewogICAgeG1sRW50aXR5UHRyIGN1cjsKCiAgICBjdXIgPSAoeG1sRW50aXR5UHRyKSB4bWxNYWxsb2Moc2l6ZW9mKHhtbEVudGl0eSkpOwogICAgaWYgKGN1ciA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgInhtbENvcHlFbnRpdHk6IG91dCBvZiBtZW1vcnkgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBtZW1zZXQoY3VyLCAwLCBzaXplb2YoeG1sRW50aXR5KSk7CiAgICBjdXItPnR5cGUgPSBYTUxfRUxFTUVOVF9ERUNMOwoKICAgIGN1ci0+ZXR5cGUgPSBlbnQtPmV0eXBlOwogICAgaWYgKGVudC0+bmFtZSAhPSBOVUxMKQoJY3VyLT5uYW1lID0geG1sU3RyZHVwKGVudC0+bmFtZSk7CiAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpCgljdXItPkV4dGVybmFsSUQgPSB4bWxTdHJkdXAoZW50LT5FeHRlcm5hbElEKTsKICAgIGlmIChlbnQtPlN5c3RlbUlEICE9IE5VTEwpCgljdXItPlN5c3RlbUlEID0geG1sU3RyZHVwKGVudC0+U3lzdGVtSUQpOwogICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKQoJY3VyLT5jb250ZW50ID0geG1sU3RyZHVwKGVudC0+Y29udGVudCk7CiAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgljdXItPm9yaWcgPSB4bWxTdHJkdXAoZW50LT5vcmlnKTsKICAgIHJldHVybihjdXIpOwp9CgovKioKICogeG1sQ29weUVudGl0aWVzVGFibGU6CiAqIEB0YWJsZTogIEFuIGVudGl0eSB0YWJsZQogKgogKiBCdWlsZCBhIGNvcHkgb2YgYW4gZW50aXR5IHRhYmxlLgogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzVGFibGVQdHIgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXRpZXNUYWJsZVB0cgp4bWxDb3B5RW50aXRpZXNUYWJsZSh4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlKSB7CiAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHJldDsKICAgIHhtbEVudGl0eVB0ciBjdXIsIGVudDsKICAgIGludCBpOwoKICAgIHJldCA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSB4bWxNYWxsb2Moc2l6ZW9mKHhtbEVudGl0aWVzVGFibGUpKTsKICAgIGlmIChyZXQgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAieG1sQ29weUVudGl0aWVzVGFibGU6IG91dCBvZiBtZW1vcnkgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiNpZmRlZiBFTlRJVFlfSEFTSF9TSVpFCiAgICByZXQtPnRhYmxlID0gKHhtbEVudGl0eVB0ciAqKSB4bWxNYWxsb2MoRU5USVRZX0hBU0hfU0laRSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhtbEVudGl0eVB0cikpOwogICAgaWYgKHJldC0+dGFibGUgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAieG1sQ29weUVudGl0aWVzVGFibGU6IG91dCBvZiBtZW1vcnkgIVxuIik7Cgl4bWxGcmVlKHJldCk7CglyZXR1cm4oTlVMTCk7CiAgICB9CiNlbHNlCiAgICByZXQtPnRhYmxlID0gKHhtbEVudGl0eVB0ciAqKSB4bWxNYWxsb2ModGFibGUtPm1heF9lbnRpdGllcyAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhtbEVudGl0eVB0cikpOwogICAgaWYgKHJldC0+dGFibGUgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAieG1sQ29weUVudGl0aWVzVGFibGU6IG91dCBvZiBtZW1vcnkgIVxuIik7Cgl4bWxGcmVlKHJldCk7CglyZXR1cm4oTlVMTCk7CiAgICB9CiNlbmRpZgogICAgcmV0LT5tYXhfZW50aXRpZXMgPSB0YWJsZS0+bWF4X2VudGl0aWVzOwogICAgcmV0LT5uYl9lbnRpdGllcyA9IHRhYmxlLT5uYl9lbnRpdGllczsKICAgIGZvciAoaSA9IDA7aSA8IHJldC0+bmJfZW50aXRpZXM7aSsrKSB7CgllbnQgPSB0YWJsZS0+dGFibGVbaV07CglpZiAoZW50ID09IE5VTEwpCgkgICAgY3VyID0gTlVMTDsKCWVsc2UKCSAgICBjdXIgPSB4bWxDb3B5RW50aXR5KGVudCk7CglyZXQtPnRhYmxlW2ldID0gY3VyOwojaWZkZWYgRU5USVRZX0hBU0hfU0laRQoJZW50ID0gZW50LT5uZXh0ZTsKCXdoaWxlICgoZW50ICE9IE5VTEwpICYmIChjdXIgIT0gTlVMTCkpIHsKICAgICAgICAgICAgY3VyLT5uZXh0ZSA9IHhtbENvcHlFbnRpdHkoZW50KTsKCSAgICBjdXIgPSBjdXItPm5leHRlOwoJfQojZW5kaWYKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgovKioKICogeG1sRHVtcEVudGl0eURlY2w6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAZW50OiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIFRoaXMgd2lsbCBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBlbnRpdHkgdGFibGUgYXMgYW4gWE1MIERURCBkZWZpbml0aW9uCiAqLwp2b2lkCnhtbER1bXBFbnRpdHlEZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0eVB0ciBlbnQpIHsKICAgIHN3aXRjaCAoZW50LT5ldHlwZSkgewoJY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCSAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgkJeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPm9yaWcpOwoJICAgIGVsc2UKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+Y29udGVudCk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIj5cbiIpOwoJICAgIGJyZWFrOwoJY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAiKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm5hbWUpOwoJICAgIGlmIChlbnQtPkV4dGVybmFsSUQgIT0gTlVMTCkgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFBVQkxJQyAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPkV4dGVybmFsSUQpOwoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0gZWxzZSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgU1lTVEVNICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0KCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWToKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFFTlRJVFkgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBQVUJMSUMgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5FeHRlcm5hbElEKTsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9IGVsc2UgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFNZU1RFTSAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9CgkgICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKSB7IC8qIFNob3VsZCBiZSB0cnVlICEgKi8KCQl4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIE5EQVRBICIpOwoJCWlmIChlbnQtPm9yaWcgIT0gTlVMTCkKCQkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5vcmlnKTsKCQllbHNlCgkJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+Y29udGVudCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICUgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJICAgIGlmIChlbnQtPm9yaWcgPT0gTlVMTCkKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+Y29udGVudCk7CgkgICAgZWxzZQoJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5vcmlnKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAlICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgUFVCTElDICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+RXh0ZXJuYWxJRCk7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfSBlbHNlIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBTWVNURU0gIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgZnByaW50ZihzdGRlcnIsCgkJInhtbER1bXBFbnRpdGllc1RhYmxlOiBpbnRlcm5hbDogdW5rbm93biB0eXBlICVkXG4iLAoJCSAgICBlbnQtPmV0eXBlKTsKICAgIH0KfQoKLyoqCiAqIHhtbER1bXBFbnRpdGllc1RhYmxlOgogKiBAYnVmOiAgQW4gWE1MIGJ1ZmZlci4KICogQHRhYmxlOiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIFRoaXMgd2lsbCBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBlbnRpdHkgdGFibGUgYXMgYW4gWE1MIERURCBkZWZpbml0aW9uCiAqLwp2b2lkCnhtbER1bXBFbnRpdGllc1RhYmxlKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpIHsKICAgIGludCBpOwogICAgeG1sRW50aXR5UHRyIGN1cjsKCiAgICBpZiAodGFibGUgPT0gTlVMTCkgcmV0dXJuOwoKI2lmZGVmIEVOVElUWV9IQVNIX1NJWkUKICAgIGZvciAoaSA9IDA7aSA8IEVOVElUWV9IQVNIX1NJWkU7aSsrKSB7CiAgICAgICAgY3VyID0gdGFibGUtPnRhYmxlW2ldOwoJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CgkgICAgeG1sRHVtcEVudGl0eURlY2woYnVmLCBjdXIpOwoJICAgIGN1ciA9IGN1ci0+bmV4dGU7Cgl9CiAgICB9CiNlbHNlCiAgICBmb3IgKGkgPSAwO2kgPCB0YWJsZS0+bmJfZW50aXRpZXM7aSsrKSB7CiAgICAgICAgY3VyID0gdGFibGUtPnRhYmxlW2ldOwoJeG1sRHVtcEVudGl0eURlY2woYnVmLCBjdXIpOwogICAgfQojZW5kaWYKfQo=