LyoKICogZW50aXRpZXMuYyA6IGltcGxlbWVudGF0aW9uIGZvciB0aGUgWE1MIGVudGl0aWVzIGhhbmRraW5nCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogZGFuaWVsQHZlaWxsYXJkLmNvbQogKi8KCiNpbmNsdWRlICJsaWJ4bWwuaCIKCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2lmZGVmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2luY2x1ZGUgPGxpYnhtbC94bWxtZW1vcnkuaD4KI2luY2x1ZGUgPGxpYnhtbC9oYXNoLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW50aXRpZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxlcnJvci5oPgojaW5jbHVkZSA8bGlieG1sL2dsb2JhbHMuaD4KCi8qCiAqIFRoZSBYTUwgcHJlZGVmaW5lZCBlbnRpdGllcy4KICovCgpzdHJ1Y3QgeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlIHsKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKfTsKc3RhdGljIHN0cnVjdCB4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWUgeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tdID0gewogICAgeyAibHQiLCAiPCIgfSwKICAgIHsgImd0IiwgIj4iIH0sCiAgICB7ICJhcG9zIiwgIiciIH0sCiAgICB7ICJxdW90IiwgIlwiIiB9LAogICAgeyAiYW1wIiwgIiYiIH0KfTsKCi8qCiAqIFRPRE86IFRoaXMgaXMgR1JPU1MsIGFsbG9jYXRpb24gb2YgYSAyNTYgZW50cnkgaGFzaCBmb3IKICogICAgICAgYSBmaXhlZCBudW1iZXIgb2YgNCBlbGVtZW50cyAhCiAqLwpzdGF0aWMgeG1sSGFzaFRhYmxlUHRyIHhtbFByZWRlZmluZWRFbnRpdGllcyA9IE5VTEw7CgovKgogKiB4bWxGcmVlRW50aXR5IDogY2xlYW4tdXAgYW4gZW50aXR5IHJlY29yZC4KICovCnN0YXRpYyB2b2lkIHhtbEZyZWVFbnRpdHkoeG1sRW50aXR5UHRyIGVudGl0eSkgewogICAgaWYgKGVudGl0eSA9PSBOVUxMKSByZXR1cm47CgogICAgaWYgKChlbnRpdHktPmNoaWxkcmVuKSAmJgoJKGVudGl0eSA9PSAoeG1sRW50aXR5UHRyKSBlbnRpdHktPmNoaWxkcmVuLT5wYXJlbnQpKQoJeG1sRnJlZU5vZGVMaXN0KGVudGl0eS0+Y2hpbGRyZW4pOwogICAgaWYgKGVudGl0eS0+bmFtZSAhPSBOVUxMKQoJeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPm5hbWUpOwogICAgaWYgKGVudGl0eS0+RXh0ZXJuYWxJRCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5FeHRlcm5hbElEKTsKICAgIGlmIChlbnRpdHktPlN5c3RlbUlEICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPlN5c3RlbUlEKTsKICAgIGlmIChlbnRpdHktPlVSSSAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5VUkkpOwogICAgaWYgKGVudGl0eS0+Y29udGVudCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5jb250ZW50KTsKICAgIGlmIChlbnRpdHktPm9yaWcgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+b3JpZyk7CiAgICB4bWxGcmVlKGVudGl0eSk7Cn0KCi8qCiAqIHhtbEFkZEVudGl0eSA6IHJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgYW4gZW50aXRpZXMgdGFibGUuCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCnhtbEFkZEVudGl0eSh4bWxEdGRQdHIgZHRkLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUgPSBOVUxMOwogICAgeG1sRW50aXR5UHRyIHJldDsKCiAgICBpZiAobmFtZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CiAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgogICAgICAgIGNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZOgoJICAgIGlmIChkdGQtPmVudGl0aWVzID09IE5VTEwpCgkJZHRkLT5lbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoMCk7CgkgICAgdGFibGUgPSBkdGQtPmVudGl0aWVzOwoJICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CiAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCSAgICBpZiAoZHRkLT5wZW50aXRpZXMgPT0gTlVMTCkKCQlkdGQtPnBlbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoMCk7CgkgICAgdGFibGUgPSBkdGQtPnBlbnRpdGllczsKCSAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWToKCSAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpCgkJeG1sUHJlZGVmaW5lZEVudGl0aWVzID0geG1sSGFzaENyZWF0ZSg4KTsKCSAgICB0YWJsZSA9IHhtbFByZWRlZmluZWRFbnRpdGllczsKICAgIH0KICAgIGlmICh0YWJsZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgcmV0ID0gKHhtbEVudGl0eVB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxFbnRpdHkpKTsKICAgIGlmIChyZXQgPT0gTlVMTCkgewoJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJInhtbEFkZEVudGl0eTogb3V0IG9mIG1lbW9yeVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoeG1sRW50aXR5KSk7CiAgICByZXQtPnR5cGUgPSBYTUxfRU5USVRZX0RFQ0w7CgogICAgLyoKICAgICAqIGZpbGwgdGhlIHN0cnVjdHVyZS4KICAgICAqLwogICAgcmV0LT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwogICAgcmV0LT5ldHlwZSA9ICh4bWxFbnRpdHlUeXBlKSB0eXBlOwogICAgaWYgKEV4dGVybmFsSUQgIT0gTlVMTCkKCXJldC0+RXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChFeHRlcm5hbElEKTsKICAgIGlmIChTeXN0ZW1JRCAhPSBOVUxMKQoJcmV0LT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChTeXN0ZW1JRCk7CiAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CiAgICAgICAgcmV0LT5sZW5ndGggPSB4bWxTdHJsZW4oY29udGVudCk7CglyZXQtPmNvbnRlbnQgPSB4bWxTdHJuZHVwKGNvbnRlbnQsIHJldC0+bGVuZ3RoKTsKICAgICB9IGVsc2UgewogICAgICAgIHJldC0+bGVuZ3RoID0gMDsKICAgICAgICByZXQtPmNvbnRlbnQgPSBOVUxMOwogICAgfQogICAgcmV0LT5VUkkgPSBOVUxMOyAvKiB0byBiZSBjb21wdXRlZCBieSB0aGUgbGF5ZXIga25vd2luZwoJCQl0aGUgZGVmaW5pbmcgZW50aXR5ICovCiAgICByZXQtPm9yaWcgPSBOVUxMOwoKICAgIGlmICh4bWxIYXNoQWRkRW50cnkodGFibGUsIG5hbWUsIHJldCkpIHsKCS8qCgkgKiBlbnRpdHkgd2FzIGFscmVhZHkgZGVmaW5lZCBhdCBhbm90aGVyIGxldmVsLgoJICovCiAgICAgICAgeG1sRnJlZUVudGl0eShyZXQpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzOgogKgogKiBTZXQgdXAgdGhlIHByZWRlZmluZWQgZW50aXRpZXMuCiAqLwp2b2lkIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXModm9pZCkgewogICAgdW5zaWduZWQgaW50IGk7CiAgICB4bWxDaGFyIG5hbWVbNTBdOwogICAgeG1sQ2hhciB2YWx1ZVs1MF07CiAgICBjb25zdCBjaGFyICppbjsKICAgIHhtbENoYXIgKm91dDsKCiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzICE9IE5VTEwpIHJldHVybjsKCiAgICB4bWxQcmVkZWZpbmVkRW50aXRpZXMgPSB4bWxDcmVhdGVFbnRpdGllc1RhYmxlKCk7CiAgICBmb3IgKGkgPSAwO2kgPCBzaXplb2YoeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlcykgLyAKICAgICAgICAgICAgICAgICAgIHNpemVvZih4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWVzWzBdKTtpKyspIHsKICAgICAgICBpbiA9IHhtbFByZWRlZmluZWRFbnRpdHlWYWx1ZXNbaV0ubmFtZTsKCW91dCA9ICZuYW1lWzBdOwoJZm9yICg7KCpvdXQrKyA9ICh4bWxDaGFyKSAqaW4pOylpbisrOwogICAgICAgIGluID0geG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tpXS52YWx1ZTsKCW91dCA9ICZ2YWx1ZVswXTsKCWZvciAoOygqb3V0KysgPSAoeG1sQ2hhcikgKmluKTspaW4rKzsKCiAgICAgICAgeG1sQWRkRW50aXR5KE5VTEwsIChjb25zdCB4bWxDaGFyICopICZuYW1lWzBdLAoJICAgICAgICAgICAgIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWSwgTlVMTCwgTlVMTCwKCQkgICAgICZ2YWx1ZVswXSk7CiAgICB9Cn0KCi8qKgogKiB4bWxDbGVhbnVwUHJlZGVmaW5lZEVudGl0aWVzOgogKgogKiBDbGVhbnVwIHVwIHRoZSBwcmVkZWZpbmVkIGVudGl0aWVzIHRhYmxlLgogKi8Kdm9pZCB4bWxDbGVhbnVwUHJlZGVmaW5lZEVudGl0aWVzKHZvaWQpIHsKICAgIGlmICh4bWxQcmVkZWZpbmVkRW50aXRpZXMgPT0gTlVMTCkgcmV0dXJuOwoKICAgIHhtbEZyZWVFbnRpdGllc1RhYmxlKHhtbFByZWRlZmluZWRFbnRpdGllcyk7CiAgICB4bWxQcmVkZWZpbmVkRW50aXRpZXMgPSBOVUxMOwp9CgovKioKICogeG1sR2V0UHJlZGVmaW5lZEVudGl0eToKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogQ2hlY2sgd2hldGhlciB0aGlzIG5hbWUgaXMgYW4gcHJlZGVmaW5lZCBlbnRpdHkuCiAqCiAqIFJldHVybnMgTlVMTCBpZiBub3QsIG90aGVydmlzZSB0aGUgZW50aXR5CiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0UHJlZGVmaW5lZEVudGl0eShjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpCiAgICAgICAgeG1sSW5pdGlhbGl6ZVByZWRlZmluZWRFbnRpdGllcygpOwogICAgcmV0dXJuKCh4bWxFbnRpdHlQdHIpIHhtbEhhc2hMb29rdXAoeG1sUHJlZGVmaW5lZEVudGl0aWVzLCBuYW1lKSk7Cn0KCi8qKgogKiB4bWxBZGREdGRFbnRpdHk6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICogQHR5cGU6ICB0aGUgZW50aXR5IHR5cGUgWE1MX3h4eF95eXlfRU5USVRZCiAqIEBFeHRlcm5hbElEOiAgdGhlIGVudGl0eSBleHRlcm5hbCBJRCBpZiBhdmFpbGFibGUKICogQFN5c3RlbUlEOiAgdGhlIGVudGl0eSBzeXN0ZW0gSUQgaWYgYXZhaWxhYmxlCiAqIEBjb250ZW50OiAgdGhlIGVudGl0eSBjb250ZW50CiAqCiAqIFJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgdGhpcyBkb2N1bWVudCBEVEQgZXh0ZXJuYWwgc3Vic2V0LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogKi8KeG1sRW50aXR5UHRyCnhtbEFkZER0ZEVudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkJY29uc3QgeG1sQ2hhciAqY29udGVudCkgewogICAgeG1sRW50aXR5UHRyIHJldDsKICAgIHhtbER0ZFB0ciBkdGQ7CgogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkgICAgICAgICJ4bWxBZGREdGRFbnRpdHk6IGRvYyA9PSBOVUxMICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgaWYgKGRvYy0+ZXh0U3Vic2V0ID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAgICAgInhtbEFkZER0ZEVudGl0eTogZG9jdW1lbnQgd2l0aG91dCBleHRlcm5hbCBzdWJzZXQgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBkdGQgPSBkb2MtPmV4dFN1YnNldDsKICAgIHJldCA9IHhtbEFkZEVudGl0eShkdGQsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEdGQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CiAgICAgICAgZHRkLT5sYXN0LT5uZXh0ID0gKHhtbE5vZGVQdHIpIHJldDsKCXJldC0+cHJldiA9IGR0ZC0+bGFzdDsKCWR0ZC0+bGFzdCA9ICh4bWxOb2RlUHRyKSByZXQ7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKLyoqCiAqIHhtbEFkZERvY0VudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkKICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQogKiBAU3lzdGVtSUQ6ICB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUKICogQGNvbnRlbnQ6ICB0aGUgZW50aXR5IGNvbnRlbnQKICoKICogUmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciB0aGlzIGRvY3VtZW50LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogKi8KeG1sRW50aXR5UHRyCnhtbEFkZERvY0VudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgICAgICAgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0eVB0ciByZXQ7CiAgICB4bWxEdGRQdHIgZHRkOwoKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJICAgICAgICAieG1sQWRkRG9jRW50aXR5OiBkb2N1bWVudCBpcyBOVUxMICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgaWYgKGRvYy0+aW50U3Vic2V0ID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAgICAgInhtbEFkZER0ZEVudGl0eTogZG9jdW1lbnQgd2l0aG91dCBpbnRlcm5hbCBzdWJzZXQgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBkdGQgPSBkb2MtPmludFN1YnNldDsKICAgIHJldCA9IHhtbEFkZEVudGl0eShkdGQsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEdGQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CglkdGQtPmxhc3QtPm5leHQgPSAoeG1sTm9kZVB0cikgcmV0OwoJcmV0LT5wcmV2ID0gZHRkLT5sYXN0OwoJZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgovKioKICogeG1sR2V0RW50aXR5RnJvbVRhYmxlOgogKiBAdGFibGU6ICBhbiBlbnRpdHkgdGFibGUKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICogQHBhcmFtZXRlcjogIGxvb2sgZm9yIHBhcmFtZXRlciBlbnRpdGllcwogKgogKiBEbyBhbiBlbnRpdHkgbG9va3VwIGluIHRoZSB0YWJsZS4KICogcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgZW50aXR5LCBpZiBmb3VuZC4KICogCiAqIFJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKi8Kc3RhdGljIHhtbEVudGl0eVB0cgp4bWxHZXRFbnRpdHlGcm9tVGFibGUoeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSwgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgcmV0dXJuKCh4bWxFbnRpdHlQdHIpIHhtbEhhc2hMb29rdXAodGFibGUsIG5hbWUpKTsKfQoKLyoqCiAqIHhtbEdldFBhcmFtZXRlckVudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudCByZWZlcmVuY2luZyB0aGUgZW50aXR5CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCBzdWJzZXRzIGFuZAogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBlbnRpdHksIGlmIGZvdW5kLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0UGFyYW1ldGVyRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CiAgICB4bWxFbnRpdHlQdHIgcmV0OwoKICAgIGlmICgoZG9jLT5pbnRTdWJzZXQgIT0gTlVMTCkgJiYgKGRvYy0+aW50U3Vic2V0LT5wZW50aXRpZXMgIT0gTlVMTCkpIHsKCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGRvYy0+aW50U3Vic2V0LT5wZW50aXRpZXM7CglyZXQgPSB4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUpOwoJaWYgKHJldCAhPSBOVUxMKQoJICAgIHJldHVybihyZXQpOwogICAgfQogICAgaWYgKChkb2MtPmV4dFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5leHRTdWJzZXQtPnBlbnRpdGllcyAhPSBOVUxMKSkgewoJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5leHRTdWJzZXQtPnBlbnRpdGllczsKCXJldHVybih4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUpKTsKICAgIH0KICAgIHJldHVybihOVUxMKTsKfQoKLyoqCiAqIHhtbEdldER0ZEVudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudCByZWZlcmVuY2luZyB0aGUgZW50aXR5CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIER0ZCBlbnRpdHkgaGFzaCB0YWJsZSBhbmQKICogcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBlbnRpdHksIGlmIGZvdW5kLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0RHRkRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CgogICAgaWYgKChkb2MtPmV4dFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzICE9IE5VTEwpKSB7Cgl0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXM7CglyZXR1cm4oeG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lKSk7CiAgICB9CiAgICByZXR1cm4oTlVMTCk7Cn0KCi8qKgogKiB4bWxHZXREb2NFbnRpdHk6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgcmVmZXJlbmNpbmcgdGhlIGVudGl0eQogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKgogKiBEbyBhbiBlbnRpdHkgbG9va3VwIGluIHRoZSBkb2N1bWVudCBlbnRpdHkgaGFzaCB0YWJsZSBhbmQKICogcmV0dXJucyB0aGUgY29ycnNwb25kaW5nIGVudGl0eSwgb3RoZXJ3aXNlIGEgbG9va3VwIGlzIGRvbmUKICogaW4gdGhlIHByZWRlZmluZWQgZW50aXRpZXMgdG9vLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0RG9jRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgIHhtbEVudGl0eVB0ciBjdXI7CiAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwoKICAgIGlmIChkb2MgIT0gTlVMTCkgewoJaWYgKChkb2MtPmludFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5pbnRTdWJzZXQtPmVudGl0aWVzICE9IE5VTEwpKSB7CgkgICAgdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5pbnRTdWJzZXQtPmVudGl0aWVzOwoJICAgIGN1ciA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSk7CgkgICAgaWYgKGN1ciAhPSBOVUxMKQoJCXJldHVybihjdXIpOwoJfQoJaWYgKChkb2MtPmV4dFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzICE9IE5VTEwpKSB7CgkgICAgdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzOwoJICAgIGN1ciA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSk7CgkgICAgaWYgKGN1ciAhPSBOVUxMKQoJCXJldHVybihjdXIpOwoJfQogICAgfQogICAgaWYgKHhtbFByZWRlZmluZWRFbnRpdGllcyA9PSBOVUxMKQogICAgICAgIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMoKTsKICAgIHRhYmxlID0geG1sUHJlZGVmaW5lZEVudGl0aWVzOwogICAgcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwp9CgovKgogKiBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8IFsjeEUwMDAtI3hGRkZEXQogKiAgICAgICAgICAgICAgICAgIHwgWyN4MTAwMDAtI3gxMEZGRkZdCiAqIGFueSBVbmljb2RlIGNoYXJhY3RlciwgZXhjbHVkaW5nIHRoZSBzdXJyb2dhdGUgYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4KICovCiNkZWZpbmUgSVNfQ0hBUihjKQkJCQkJCQlcCiAgICAoKChjKSA9PSAweDA5KSB8fCAoKGMpID09IDB4MGEpIHx8ICgoYykgPT0gMHgwZCkgfHwJCQlcCiAgICAgKCgoYykgPj0gMHgyMCkgJiYgKChjKSAhPSAweEZGRkUpICYmICgoYykgIT0gMHhGRkZGKSkpCgovKgogKiBBIGJ1ZmZlciB1c2VkIGZvciBjb252ZXJ0aW5nIGVudGl0aWVzIHRvIHRoZWlyIGVxdWl2YWxlbnQgYW5kIGJhY2suCiAqLwpzdGF0aWMgaW50IHN0YXRpY19idWZmZXJfc2l6ZSA9IDA7CnN0YXRpYyB4bWxDaGFyICpzdGF0aWNfYnVmZmVyID0gTlVMTDsKCnN0YXRpYyBpbnQgZ3Jvd0J1ZmZlcih2b2lkKSB7CiAgICBzdGF0aWNfYnVmZmVyX3NpemUgKj0gMjsKICAgIHN0YXRpY19idWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHN0YXRpY19idWZmZXIsIHN0YXRpY19idWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoc3RhdGljX2J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgcGVycm9yKCJyZWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHJldHVybigwKTsKfQoKCi8qKgogKiB4bWxFbmNvZGVFbnRpdGllczoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogYW5kIG5vbiBBU0NJSSB2YWx1ZXMgd2l0aCB0aGVpciBlbnRpdGllcyBhbmQgQ2hhclJlZiBjb3VudGVycGFydHMuCiAqCiAqIFRPRE86IHJlbW92ZSB4bWxFbmNvZGVFbnRpdGllcywgb25jZSB3ZSBhcmUgbm90IGFmcmFpZCBvZiBicmVha2luZyBiaW5hcnkKICogICAgICAgY29tcGF0aWJpbGl0eQogKgogKiBQZW9wbGUgbXVzdCBtaWdyYXRlIHRoZWlyIGNvZGUgdG8geG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQgIQogKiBUaGlzIHJvdXRpbmUgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBlbmNvdW50ZXJlZC4KICogCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KY29uc3QgeG1sQ2hhciAqCnhtbEVuY29kZUVudGl0aWVzKHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKm91dCA9IHN0YXRpY19idWZmZXI7CiAgICBzdGF0aWMgaW50IHdhcm5pbmcgPSAxOwogICAgaW50IGh0bWwgPSAwOwoKCiAgICBpZiAod2FybmluZykgewogICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkgICAgIkRlcHJlY2F0ZWQgQVBJIHhtbEVuY29kZUVudGl0aWVzKCkgdXNlZFxuIik7CiAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAiICAgY2hhbmdlIGNvZGUgdG8gdXNlIHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KClcbiIpOwogICAgd2FybmluZyA9IDA7CiAgICB9CgogICAgaWYgKGlucHV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKICAgIGlmIChkb2MgIT0gTlVMTCkKICAgICAgICBodG1sID0gKGRvYy0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKTsKCiAgICBpZiAoc3RhdGljX2J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgc3RhdGljX2J1ZmZlcl9zaXplID0gMTAwMDsKICAgICAgICBzdGF0aWNfYnVmZmVyID0gKHhtbENoYXIgKikgeG1sTWFsbG9jKHN0YXRpY19idWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CglpZiAoc3RhdGljX2J1ZmZlciA9PSBOVUxMKSB7CgkgICAgcGVycm9yKCJtYWxsb2MgZmFpbGVkIik7CiAgICAgICAgICAgIHJldHVybihOVUxMKTsKCX0KCW91dCA9IHN0YXRpY19idWZmZXI7CiAgICB9CiAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7CiAgICAgICAgaWYgKG91dCAtIHN0YXRpY19idWZmZXIgPiBzdGF0aWNfYnVmZmVyX3NpemUgLSAxMDApIHsKCSAgICBpbnQgaW5keCA9IG91dCAtIHN0YXRpY19idWZmZXI7CgoJICAgIGdyb3dCdWZmZXIoKTsKCSAgICBvdXQgPSAmc3RhdGljX2J1ZmZlcltpbmR4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgoKmN1ciA9PSAnXCcnKSAmJiAoIWh0bWwpKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJ28nOwoJICAgICpvdXQrKyA9ICdzJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCgoKmN1ciA+PSAweDIwKSAmJiAoKmN1ciA8IDB4ODApKSB8fAoJICAgICgqY3VyID09ICdcbicpIHx8ICgqY3VyID09ICdccicpIHx8ICgqY3VyID09ICdcdCcpKSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIGp1c3QgY29weSAhCgkgICAgICovCgkgICAgKm91dCsrID0gKmN1cjsKI2lmbmRlZiBVU0VfVVRGXzgKCX0gZWxzZSBpZiAoKHNpemVvZih4bWxDaGFyKSA9PSAxKSAmJiAoKmN1ciA+PSAweDgwKSkgewoJICAgIGNoYXIgYnVmWzEwXSwgKnB0cjsKCgkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CiAgICAgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKICAgICAgICAgICAgcHRyID0gYnVmOwoJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKI2VuZGlmCgl9IGVsc2UgaWYgKElTX0NIQVIoKmN1cikpIHsKCSAgICBjaGFyIGJ1ZlsxMF0sICpwdHI7CgoJICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImIyVkOyIsICpjdXIpOwogICAgICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CiAgICAgICAgICAgIHB0ciA9IGJ1ZjsKCSAgICB3aGlsZSAoKnB0ciAhPSAwKSAqb3V0KysgPSAqcHRyKys7Cgl9CiNpZiAwCgllbHNlIHsKCSAgICAvKgoJICAgICAqIGRlZmF1bHQgY2FzZSwgdGhpcyBpcyBub3QgYSB2YWxpZCBjaGFyICEKCSAgICAgKiBTa2lwIGl0Li4uCgkgICAgICovCgkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJICAgICJ4bWxFbmNvZGVFbnRpdGllczogaW52YWxpZCBjaGFyICVkXG4iLCAoaW50KSAqY3VyKTsKCX0KI2VuZGlmCgljdXIrKzsKICAgIH0KICAgICpvdXQrKyA9IDA7CiAgICByZXR1cm4oc3RhdGljX2J1ZmZlcik7Cn0KCi8qCiAqIE1hY3JvIHVzZWQgdG8gZ3JvdyB0aGUgY3VycmVudCBidWZmZXIuCiAqLwojZGVmaW5lIGdyb3dCdWZmZXJSZWVudHJhbnQoKSB7CQkJCQkJXAogICAgYnVmZmVyX3NpemUgKj0gMjsJCQkJCQkJXAogICAgYnVmZmVyID0gKHhtbENoYXIgKikJCQkJCQlcCiAgICAJCXhtbFJlYWxsb2MoYnVmZmVyLCBidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CVwKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewkJCQkJCVwKCXBlcnJvcigicmVhbGxvYyBmYWlsZWQiKTsJCQkJCVwKCXJldHVybihOVUxMKTsJCQkJCQkJXAogICAgfQkJCQkJCQkJCVwKfQoKCi8qKgogKiB4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudDoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogYW5kIG5vbiBBU0NJSSB2YWx1ZXMgd2l0aCB0aGVpciBlbnRpdGllcyBhbmQgQ2hhclJlZiBjb3VudGVycGFydHMuCiAqIENvbnRyYXJ5IHRvIHhtbEVuY29kZUVudGl0aWVzLCB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0CiAqIG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICB4bWxDaGFyICpvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGludCBodG1sID0gMDsKCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvYyhidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKCXBlcnJvcigibWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgb3V0ID0gYnVmZmVyOwoKICAgIHdoaWxlICgqY3VyICE9ICdcMCcpIHsKICAgICAgICBpZiAob3V0IC0gYnVmZmVyID4gYnVmZmVyX3NpemUgLSAxMDApIHsKCSAgICBpbnQgaW5keCA9IG91dCAtIGJ1ZmZlcjsKCgkgICAgZ3Jvd0J1ZmZlclJlZW50cmFudCgpOwoJICAgIG91dCA9ICZidWZmZXJbaW5keF07Cgl9CgoJLyoKCSAqIEJ5IGRlZmF1bHQgb25lIGhhdmUgdG8gZW5jb2RlIGF0IGxlYXN0ICc8JywgJz4nLCAnIicgYW5kICcmJyAhCgkgKi8KCWlmICgqY3VyID09ICc8JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnbCc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnPicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2cnOwoJICAgICpvdXQrKyA9ICd0JzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJyYnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAnbSc7CgkgICAgKm91dCsrID0gJ3AnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnIicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ3EnOwoJICAgICpvdXQrKyA9ICd1JzsKCSAgICAqb3V0KysgPSAnbyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKI2lmIDAKCX0gZWxzZSBpZiAoKCpjdXIgPT0gJ1wnJykgJiYgKCFodG1sKSkgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnYSc7CgkgICAgKm91dCsrID0gJ3AnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAncyc7CgkgICAgKm91dCsrID0gJzsnOwojZW5kaWYKCX0gZWxzZSBpZiAoKCgqY3VyID49IDB4MjApICYmICgqY3VyIDwgMHg4MCkpIHx8CgkgICAgKCpjdXIgPT0gJ1xuJykgfHwgKCpjdXIgPT0gJ1xyJykgfHwgKCpjdXIgPT0gJ1x0JykpIHsKCSAgICAvKgoJICAgICAqIGRlZmF1bHQgY2FzZSwganVzdCBjb3B5ICEKCSAgICAgKi8KCSAgICAqb3V0KysgPSAqY3VyOwoJfSBlbHNlIGlmICgqY3VyID49IDB4ODApIHsKCSAgICBpZiAoKChkb2MgIT0gTlVMTCkgJiYgKGRvYy0+ZW5jb2RpbmcgIT0gTlVMTCkpIHx8IChodG1sKSkgewoJCS8qCgkJICogQmr4cm4gUmVlc2UgPGJyQHNzZXVzYS5jb20+IHByb3ZpZGVkIHRoZSBwYXRjaAoJICAgICAgICB4bWxDaGFyIHhjOwoJICAgICAgICB4YyA9ICgqY3VyICYgMHgzRikgPDwgNjsKCSAgICAgICAgaWYgKGN1clsxXSAhPSAwKSB7CgkJICAgIHhjICs9ICooKytjdXIpICYgMHgzRjsKCQkgICAgKm91dCsrID0geGM7CgkgICAgICAgIH0gZWxzZQoJCSAqLwoJCSAgICAqb3V0KysgPSAqY3VyOwoJICAgIH0gZWxzZSB7CgkJLyoKCQkgKiBXZSBhc3N1bWUgd2UgaGF2ZSBVVEYtOCBpbnB1dC4KCQkgKi8KCQljaGFyIGJ1ZlsxMF0sICpwdHI7CgkJaW50IHZhbCA9IDAsIGwgPSAxOwoKCQlpZiAoKmN1ciA8IDB4QzApIHsKCQkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJCSAgICAieG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQgOiBpbnB1dCBub3QgVVRGLThcbiIpOwoJCSAgICBpZiAoZG9jICE9IE5VTEwpCgkJCWRvYy0+ZW5jb2RpbmcgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIklTTy04ODU5LTEiKTsKCQkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CgkJICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKCQkgICAgcHRyID0gYnVmOwoJCSAgICB3aGlsZSAoKnB0ciAhPSAwKSAqb3V0KysgPSAqcHRyKys7CgkJICAgIGN1cisrOwoJCSAgICBjb250aW51ZTsKCQl9IGVsc2UgaWYgKCpjdXIgPCAweEUwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gKGN1clswXSkgJiAweDFGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzFdKSAmIDB4M0Y7CgkJICAgIGwgPSAyOwoJCX0gZWxzZSBpZiAoKmN1ciA8IDB4RjApIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAoY3VyWzBdKSAmIDB4MEY7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMV0pICYgMHgzRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsyXSkgJiAweDNGOwoJCSAgICBsID0gMzsKCQl9IGVsc2UgaWYgKCpjdXIgPCAweEY4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gKGN1clswXSkgJiAweDA3OwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzFdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMl0pICYgMHgzRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clszXSkgJiAweDNGOwoJCSAgICBsID0gNDsKCQl9CgkJaWYgKChsID09IDEpIHx8ICghSVNfQ0hBUih2YWwpKSkgewoJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCQkJInhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50IDogY2hhciBvdXQgb2YgcmFuZ2VcbiIpOwoJCSAgICBpZiAoZG9jICE9IE5VTEwpCgkJCWRvYy0+ZW5jb2RpbmcgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIklTTy04ODU5LTEiKTsKCQkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CgkJICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKCQkgICAgcHRyID0gYnVmOwoJCSAgICB3aGlsZSAoKnB0ciAhPSAwKSAqb3V0KysgPSAqcHRyKys7CgkJICAgIGN1cisrOwoJCSAgICBjb250aW51ZTsKCQl9CgkJLyoKCQkgKiBXZSBjb3VsZCBkbyBtdWx0aXBsZSB0aGluZ3MgaGVyZS4gSnVzdCBzYXZlIGFzIGEgY2hhciByZWYKCQkgKi8KCQlpZiAoaHRtbCkKCQkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgdmFsKTsKCQllbHNlCgkJICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImI3glWDsiLCB2YWwpOwoJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKCQlwdHIgPSBidWY7CgkJd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJCWN1ciArPSBsOwoJCWNvbnRpbnVlOwoJICAgIH0KCX0gZWxzZSBpZiAoSVNfQ0hBUigqY3VyKSkgewoJICAgIGNoYXIgYnVmWzEwXSwgKnB0cjsKCgkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CgkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogICAgICAgICAgICBwdHIgPSBidWY7CgkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJfQojaWYgMAoJZWxzZSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIHRoaXMgaXMgbm90IGEgdmFsaWQgY2hhciAhCgkgICAgICogU2tpcCBpdC4uLgoJICAgICAqLwoJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJCSAgICAieG1sRW5jb2RlRW50aXRpZXM6IGludmFsaWQgY2hhciAlZFxuIiwgKGludCkgKmN1cik7Cgl9CiNlbmRpZgoJY3VyKys7CiAgICB9CiAgICAqb3V0KysgPSAwOwogICAgcmV0dXJuKGJ1ZmZlcik7Cn0KCi8qKgogKiB4bWxFbmNvZGVTcGVjaWFsQ2hhcnM6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQgY29udGFpbmluZyB0aGUgc3RyaW5nCiAqIEBpbnB1dDogIEEgc3RyaW5nIHRvIGNvbnZlcnQgdG8gWE1MLgogKgogKiBEbyBhIGdsb2JhbCBlbmNvZGluZyBvZiBhIHN0cmluZywgcmVwbGFjaW5nIHRoZSBwcmVkZWZpbmVkIGVudGl0aWVzCiAqIHRoaXMgcm91dGluZSBpcyByZWVudHJhbnQsIGFuZCByZXN1bHQgbXVzdCBiZSBkZWFsbG9jYXRlZC4KICoKICogUmV0dXJucyBBIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGRvbmUuCiAqLwp4bWxDaGFyICoKeG1sRW5jb2RlU3BlY2lhbENoYXJzKHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICB4bWxDaGFyICpvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGludCBodG1sID0gMDsKCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvYyhidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKCXBlcnJvcigibWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgb3V0ID0gYnVmZmVyOwoKICAgIHdoaWxlICgqY3VyICE9ICdcMCcpIHsKICAgICAgICBpZiAob3V0IC0gYnVmZmVyID4gYnVmZmVyX3NpemUgLSAxMCkgewoJICAgIGludCBpbmR4ID0gb3V0IC0gYnVmZmVyOwoKCSAgICBncm93QnVmZmVyUmVlbnRyYW50KCk7CgkgICAgb3V0ID0gJmJ1ZmZlcltpbmR4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIHsKCSAgICAvKgoJICAgICAqIFdvcmtzIGJlY2F1c2Ugb24gVVRGLTgsIGFsbCBleHRlbmRlZCBzZXF1ZW5jZXMgY2Fubm90CgkgICAgICogcmVzdWx0IGluIGJ5dGVzIGluIHRoZSBBU0NJSSByYW5nZS4KCSAgICAgKi8KCSAgICAqb3V0KysgPSAqY3VyOwoJfQoJY3VyKys7CiAgICB9CiAgICAqb3V0KysgPSAwOwogICAgcmV0dXJuKGJ1ZmZlcik7Cn0KCi8qKgogKiB4bWxDcmVhdGVFbnRpdGllc1RhYmxlOgogKgogKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gZW1wdHkgZW50aXRpZXMgaGFzaCB0YWJsZS4KICoKICogUmV0dXJucyB0aGUgeG1sRW50aXRpZXNUYWJsZVB0ciBqdXN0IGNyZWF0ZWQgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXRpZXNUYWJsZVB0cgp4bWxDcmVhdGVFbnRpdGllc1RhYmxlKHZvaWQpIHsKICAgIHJldHVybigoeG1sRW50aXRpZXNUYWJsZVB0cikgeG1sSGFzaENyZWF0ZSgwKSk7Cn0KCi8qKgogKiB4bWxGcmVlRW50aXRpZXNUYWJsZToKICogQHRhYmxlOiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IGFuIGVudGl0aWVzIGhhc2ggdGFibGUuCiAqLwp2b2lkCnhtbEZyZWVFbnRpdGllc1RhYmxlKHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpIHsKICAgIHhtbEhhc2hGcmVlKHRhYmxlLCAoeG1sSGFzaERlYWxsb2NhdG9yKSB4bWxGcmVlRW50aXR5KTsKfQoKLyoqCiAqIHhtbENvcHlFbnRpdHk6CiAqIEBlbnQ6ICBBbiBlbnRpdHkKICoKICogQnVpbGQgYSBjb3B5IG9mIGFuIGVudGl0eQogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzUHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnN0YXRpYyB4bWxFbnRpdHlQdHIKeG1sQ29weUVudGl0eSh4bWxFbnRpdHlQdHIgZW50KSB7CiAgICB4bWxFbnRpdHlQdHIgY3VyOwoKICAgIGN1ciA9ICh4bWxFbnRpdHlQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sRW50aXR5KSk7CiAgICBpZiAoY3VyID09IE5VTEwpIHsKCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJCSJ4bWxDb3B5RW50aXR5OiBvdXQgb2YgbWVtb3J5ICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgbWVtc2V0KGN1ciwgMCwgc2l6ZW9mKHhtbEVudGl0eSkpOwogICAgY3VyLT50eXBlID0gWE1MX0VMRU1FTlRfREVDTDsKCiAgICBjdXItPmV0eXBlID0gZW50LT5ldHlwZTsKICAgIGlmIChlbnQtPm5hbWUgIT0gTlVMTCkKCWN1ci0+bmFtZSA9IHhtbFN0cmR1cChlbnQtPm5hbWUpOwogICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKQoJY3VyLT5FeHRlcm5hbElEID0geG1sU3RyZHVwKGVudC0+RXh0ZXJuYWxJRCk7CiAgICBpZiAoZW50LT5TeXN0ZW1JRCAhPSBOVUxMKQoJY3VyLT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChlbnQtPlN5c3RlbUlEKTsKICAgIGlmIChlbnQtPmNvbnRlbnQgIT0gTlVMTCkKCWN1ci0+Y29udGVudCA9IHhtbFN0cmR1cChlbnQtPmNvbnRlbnQpOwogICAgaWYgKGVudC0+b3JpZyAhPSBOVUxMKQoJY3VyLT5vcmlnID0geG1sU3RyZHVwKGVudC0+b3JpZyk7CiAgICByZXR1cm4oY3VyKTsKfQoKLyoqCiAqIHhtbENvcHlFbnRpdGllc1RhYmxlOgogKiBAdGFibGU6ICBBbiBlbnRpdHkgdGFibGUKICoKICogQnVpbGQgYSBjb3B5IG9mIGFuIGVudGl0eSB0YWJsZS4KICogCiAqIFJldHVybnMgdGhlIG5ldyB4bWxFbnRpdGllc1RhYmxlUHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnhtbEVudGl0aWVzVGFibGVQdHIKeG1sQ29weUVudGl0aWVzVGFibGUoeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSkgewogICAgcmV0dXJuKHhtbEhhc2hDb3B5KHRhYmxlLCAoeG1sSGFzaENvcGllcikgeG1sQ29weUVudGl0eSkpOwp9CgovKioKICogeG1sRHVtcEVudGl0eURlY2w6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAZW50OiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIFRoaXMgd2lsbCBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBlbnRpdHkgdGFibGUgYXMgYW4gWE1MIERURCBkZWZpbml0aW9uCiAqLwp2b2lkCnhtbER1bXBFbnRpdHlEZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0eVB0ciBlbnQpIHsKICAgIHN3aXRjaCAoZW50LT5ldHlwZSkgewoJY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCSAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgkJeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPm9yaWcpOwoJICAgIGVsc2UKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+Y29udGVudCk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIj5cbiIpOwoJICAgIGJyZWFrOwoJY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAiKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm5hbWUpOwoJICAgIGlmIChlbnQtPkV4dGVybmFsSUQgIT0gTlVMTCkgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFBVQkxJQyAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPkV4dGVybmFsSUQpOwoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0gZWxzZSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgU1lTVEVNICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0KCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWToKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFFTlRJVFkgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBQVUJMSUMgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5FeHRlcm5hbElEKTsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9IGVsc2UgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFNZU1RFTSAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9CgkgICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKSB7IC8qIFNob3VsZCBiZSB0cnVlICEgKi8KCQl4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIE5EQVRBICIpOwoJCWlmIChlbnQtPm9yaWcgIT0gTlVMTCkKCQkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5vcmlnKTsKCQllbHNlCgkJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+Y29udGVudCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICUgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJICAgIGlmIChlbnQtPm9yaWcgPT0gTlVMTCkKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+Y29udGVudCk7CgkgICAgZWxzZQoJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5vcmlnKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAlICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgUFVCTElDICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+RXh0ZXJuYWxJRCk7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfSBlbHNlIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBTWVNURU0gIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJInhtbER1bXBFbnRpdGllc1RhYmxlOiBpbnRlcm5hbDogdW5rbm93biB0eXBlICVkXG4iLAoJCSAgICBlbnQtPmV0eXBlKTsKICAgIH0KfQoKLyoqCiAqIHhtbER1bXBFbnRpdGllc1RhYmxlOgogKiBAYnVmOiAgQW4gWE1MIGJ1ZmZlci4KICogQHRhYmxlOiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIFRoaXMgd2lsbCBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBlbnRpdHkgdGFibGUgYXMgYW4gWE1MIERURCBkZWZpbml0aW9uCiAqLwp2b2lkCnhtbER1bXBFbnRpdGllc1RhYmxlKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpIHsKICAgIHhtbEhhc2hTY2FuKHRhYmxlLCAoeG1sSGFzaFNjYW5uZXIpeG1sRHVtcEVudGl0eURlY2wsIGJ1Zik7Cn0K