LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiNpbmNsdWRlIDxhc20vaWJtcGMuaD4KCgpzdHJ1Y3QgaWR0X2VudHJ5IHsKCXUxNgliYXNlX2xvdzsKCXUxNglzZWxlY3RvcjsKCXU4CXJlczsKCXU4CWFjY2VzczsKCXUxNgliYXNlX2hpZ2g7Cn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwoKCnN0cnVjdCBpZHRfZW50cnkgaWR0WzI1Nl07CgoKI2RlZmluZSBNQVhfSVJRIDE2Cgp0eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7CglzdHJ1Y3QgaXJxX2hhbmRsZXIgKm5leHQ7CglpbnRlcnJ1cHRfaGFuZGxlcl90KiBpc3JfZnVuYzsKCXZvaWQgKmlzcl9kYXRhOwp9IGlycV9oYW5kbGVyX3Q7CgojZGVmaW5lIElSUV9ESVNBQkxFRCAgIDEKCnR5cGVkZWYgc3RydWN0IHsKCWlycV9oYW5kbGVyX3QgKmhhbmRsZXI7Cgl1bnNpZ25lZCBsb25nIHN0YXR1czsKfSBpcnFfZGVzY190OwoKc3RhdGljIGlycV9kZXNjX3QgaXJxX3RhYmxlW01BWF9JUlFdOwoKYXNtICgiaXJxX3JldHVybjpcbiIKICAgICAiICAgICBhZGRsICAkNCwgJWVzcFxuIgogICAgICIgICAgIHBvcGFcbiIKICAgICAiICAgICBpcmV0XG4iKTsKCmFzbSAoImV4cF9yZXR1cm46XG4iCiAgICAgIiAgICAgYWRkbCAgJDEyLCAlZXNwXG4iCiAgICAgIiAgICAgcG9wICAgJWVzcFxuIgogICAgICIgICAgIHBvcGFcbiIKICAgICAiICAgICBpcmV0XG4iKTsKCmNoYXIgZXhjZXB0aW9uX3N0YWNrWzQwOTZdOwoKI2RlZmluZSBERUNMQVJFX0lOVEVSUlVQVCh4KSBcCglhc20oIi5nbG9ibCBpcnFfIiN4IlxuIiBcCgkJICAgICJpcnFfIiN4IjpcbiIgXAoJCSAgICAicHVzaGEgXG4iIFwKCQkgICAgInB1c2hsICQiI3giXG4iIFwKCQkgICAgInB1c2hsICRpcnFfcmV0dXJuXG4iIFwKCQkgICAgImptcCAgIGRvX2lycVxuIik7IFwKCXZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBpcnFfIyN4KHZvaWQpCgojZGVmaW5lIERFQ0xBUkVfRVhDRVBUSU9OKHgsIGYpIFwKCWFzbSgiLmdsb2JsIGV4cF8iI3giXG4iIFwKCQkgICAgImV4cF8iI3giOlxuIiBcCgkJICAgICJwdXNoYSBcbiIgXAoJCSAgICAibW92bCAgICAgJWVzcCwgJWVieFxuIiBcCgkJICAgICJtb3ZsICAgICAkZXhjZXB0aW9uX3N0YWNrLCAlZWF4XG4iIFwKCQkgICAgIm1vdmwgICAgICVlYXgsICVlc3AgXG4iIFwKCQkgICAgInB1c2hsICAgICVlYnhcbiIgXAoJCSAgICAibW92bCAgICAgMzIoJWVzcCksICVlYnhcbiIgXAoJCSAgICAieG9ybCAgICAgJWVkeCwgJWVkeFxuIiBcCgkJICAgICJtb3Z3ICAgICAzNiglZXNwKSwgJWR4XG4iIFwKCQkgICAgInB1c2hsICAgICVlZHhcbiIgXAoJCSAgICAicHVzaGwgICAgJWVieFxuIiBcCgkJICAgICJwdXNobCAgICAkIiN4IlxuIiBcCgkJICAgICJwdXNobCAgICAkZXhwX3JldHVyblxuIiBcCgkJICAgICJqbXAgICAgICAiI2YiXG4iKTsgXAoJdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGV4cF8jI3godm9pZCkKCkRFQ0xBUkVfRVhDRVBUSU9OKDAsIGRpdmlkZV9leGNlcHRpb25fZW50cnkpOyAgICAgIC8qIERpdmlkZSBleGNlcHRpb24gKi8KREVDTEFSRV9FWENFUFRJT04oMSwgZGVidWdfZXhjZXB0aW9uX2VudHJ5KTsgICAgICAgLyogRGVidWcgZXhjZXB0aW9uICovCkRFQ0xBUkVfRVhDRVBUSU9OKDIsIG5taV9lbnRyeSk7ICAgICAgICAgICAgICAgICAgIC8qIE5NSSAqLwpERUNMQVJFX0VYQ0VQVElPTigzLCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBCcmVha3BvaW50L0NvcHJvY2Vzc29yIEVycm9yICovCkRFQ0xBUkVfRVhDRVBUSU9OKDQsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIE92ZXJmbG93ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDUsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIEJvdW5kcyAqLwpERUNMQVJFX0VYQ0VQVElPTig2LCBpbnZhbGlkX2luc3RydWN0aW9uX2VudHJ5KTsgICAvKiBJbnZhbGlkIGluc3RydWN0aW9uICovCkRFQ0xBUkVfRVhDRVBUSU9OKDcsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIERldmljZSBub3QgcHJlc2VudCAqLwpERUNMQVJFX0VYQ0VQVElPTig4LCBkb3VibGVfZmF1bHRfZW50cnkpOyAgICAgICAgICAvKiBEb3VibGUgZmF1bHQgKi8KREVDTEFSRV9FWENFUFRJT04oOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAgLyogQ28tcHJvY2Vzc29yIHNlZ21lbnQgb3ZlcnJ1biAqLwpERUNMQVJFX0VYQ0VQVElPTigxMCwgaW52YWxpZF90c3NfZXhjZXB0aW9uX2VudHJ5KTsvKiBJbnZhbGlkIFRTUyAqLwpERUNMQVJFX0VYQ0VQVElPTigxMSwgc2VnX2ZhdWx0X2VudHJ5KTsgICAgICAgICAgICAvKiBTZWdtZW50IG5vdCBwcmVzZW50ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDEyLCBzdGFja19mYXVsdF9lbnRyeSk7ICAgICAgICAgIC8qIFN0YWNrIG92ZXJmbG93ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDEzLCBncGZfZW50cnkpOyAgICAgICAgICAgICAgICAgIC8qIEdQRiAqLwpERUNMQVJFX0VYQ0VQVElPTigxNCwgcGFnZV9mYXVsdF9lbnRyeSk7ICAgICAgICAgICAvKiBQRiAqLwpERUNMQVJFX0VYQ0VQVElPTigxNSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigxNiwgZnBfZXhjZXB0aW9uX2VudHJ5KTsgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCAqLwpERUNMQVJFX0VYQ0VQVElPTigxNywgYWxpZ25tZW50X2NoZWNrX2VudHJ5KTsgICAgICAvKiBhbGlnbm1lbnQgY2hlY2sgKi8KREVDTEFSRV9FWENFUFRJT04oMTgsIG1hY2hpbmVfY2hlY2tfZW50cnkpOyAgICAgICAgLyogbWFjaGluZSBjaGVjayAqLwpERUNMQVJFX0VYQ0VQVElPTigxOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMiwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyMywgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNiwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyNywgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyOCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigyOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigzMCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwpERUNMQVJFX0VYQ0VQVElPTigzMSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLwoKREVDTEFSRV9JTlRFUlJVUFQoMCk7CkRFQ0xBUkVfSU5URVJSVVBUKDEpOwpERUNMQVJFX0lOVEVSUlVQVCgzKTsKREVDTEFSRV9JTlRFUlJVUFQoNCk7CkRFQ0xBUkVfSU5URVJSVVBUKDUpOwpERUNMQVJFX0lOVEVSUlVQVCg2KTsKREVDTEFSRV9JTlRFUlJVUFQoNyk7CkRFQ0xBUkVfSU5URVJSVVBUKDgpOwpERUNMQVJFX0lOVEVSUlVQVCg5KTsKREVDTEFSRV9JTlRFUlJVUFQoMTApOwpERUNMQVJFX0lOVEVSUlVQVCgxMSk7CkRFQ0xBUkVfSU5URVJSVVBUKDEyKTsKREVDTEFSRV9JTlRFUlJVUFQoMTMpOwpERUNMQVJFX0lOVEVSUlVQVCgxNCk7CkRFQ0xBUkVfSU5URVJSVVBUKDE1KTsKCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkZWZhdWx0X2lzcih2b2lkKTsKYXNtICgiZGVmYXVsdF9pc3I6IGlyZXRcbiIpOwoKdm9pZCBkaXNhYmxlX2lycShpbnQgaXJxKQp7CglpZiAoaXJxID49IE1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CglpcnFfdGFibGVbaXJxXS5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwoKfQoKdm9pZCBlbmFibGVfaXJxKGludCBpcnEpCnsKCWlmIChpcnEgPj0gTUFYX0lSUSkgewoJCXJldHVybjsKCX0KCWlycV90YWJsZVtpcnFdLnN0YXR1cyAmPSB+SVJRX0RJU0FCTEVEOwp9CgovKiBtYXNrcyBvbmUgc3BlY2lmaWMgSVJRIGluIHRoZSBQSUMgKi8Kc3RhdGljIHZvaWQgdW5tYXNrX2lycShpbnQgaXJxKQp7CglpbnQgaW1yX3BvcnQ7CgoJaWYgKGlycSA+PSBNQVhfSVJRKSB7CgkJcmV0dXJuOwoJfQoJaWYgKGlycSA+IDcpIHsKCQlpbXJfcG9ydCA9IFNMQVZFX1BJQyArIElNUjsKCX0gZWxzZSB7CgkJaW1yX3BvcnQgPSBNQVNURVJfUElDICsgSU1SOwoJfQoKCW91dGIoaW5iKGltcl9wb3J0KSZ+KDE8PChpcnEmNykpLCBpbXJfcG9ydCk7Cn0KCgovKiB1bm1hc2tzIG9uZSBzcGVjaWZpYyBJUlEgaW4gdGhlIFBJQyAqLwpzdGF0aWMgdm9pZCBtYXNrX2lycShpbnQgaXJxKQp7CglpbnQgaW1yX3BvcnQ7CgoJaWYgKGlycSA+PSBNQVhfSVJRKSB7CgkJcmV0dXJuOwoJfQoJaWYgKGlycSA+IDcpIHsKCQlpbXJfcG9ydCA9IFNMQVZFX1BJQyArIElNUjsKCX0gZWxzZSB7CgkJaW1yX3BvcnQgPSBNQVNURVJfUElDICsgSU1SOwoJfQoKCW91dGIoaW5iKGltcl9wb3J0KXwoMTw8KGlycSY3KSksIGltcl9wb3J0KTsKfQoKCi8qIGlzc3VlIGEgU3BlY2lmaWMgRW5kIE9mIEludGVycnVwdCBpbnN0cnVjaXRvbiAqLwpzdGF0aWMgdm9pZCBzcGVjaWZpY19lb2koaW50IGlycSkKewoJLyogSWYgaXQgaXMgb24gdGhlIHNsYXZlIFBJQyB0aGlzIGhhdmUgdG8gYmUgcGVyZm9ybWVkIG9uCgkgKiBib3RoIHRoZSBtYXN0ZXIgYW5kIHRoZSBzbGF2ZSBQSUNzICovCglpZiAoaXJxID4gNykgewoJCW91dGIoT0NXMl9TRU9JfChpcnEmNyksIFNMQVZFX1BJQyArIE9DVzIpOwoJCWlycSA9IFNFT0lfSVIyOyAgICAgICAgICAgICAgIC8qIGFsc28gZG8gSVIyIG9uIG1hc3RlciAqLwoJfQoJb3V0YihPQ1cyX1NFT0l8aXJxLCBNQVNURVJfUElDICsgT0NXMik7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb19pcnEoaW50IGlycSkKewoKCW1hc2tfaXJxKGlycSk7CgoJaWYgKGlycV90YWJsZVtpcnFdLnN0YXR1cyAmIElSUV9ESVNBQkxFRCkgewoJCXVubWFza19pcnEoaXJxKTsKCQlzcGVjaWZpY19lb2koaXJxKTsKCQlyZXR1cm47Cgl9CgoKCWlmIChOVUxMICE9IGlycV90YWJsZVtpcnFdLmhhbmRsZXIpIHsKCQlpcnFfaGFuZGxlcl90ICpoYW5kbGVyOwoJCWZvciAoaGFuZGxlciA9IGlycV90YWJsZVtpcnFdLmhhbmRsZXI7CgkJICAgICBOVUxMIT0gaGFuZGxlcjsgaGFuZGxlciA9IGhhbmRsZXItPm5leHQpIHsKCQkJaGFuZGxlci0+aXNyX2Z1bmMoaGFuZGxlci0+aXNyX2RhdGEpOwoJCX0KCX0gZWxzZSB7CgkJaWYgKChpcnEgJiA3KSAhPSA3KSB7CgkJCXByaW50ZigiU3B1cmlvdXMgaXJxICVkXG4iLCBpcnEpOwoJCX0KCX0KCXVubWFza19pcnEoaXJxKTsKCXNwZWNpZmljX2VvaShpcnEpOwp9CgoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlVua25vd24gRXhjZXB0aW9uICVkIGF0ICUwNHg6JTA4eFxuIiwgY2F1c2UsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZGl2aWRlX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJEaXZpZGUgRXJyb3IgKERpdmlzaW9uIGJ5IHplcm8pIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cgl3aGlsZSgxKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGRlYnVnX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJEZWJ1ZyBJbnRlcnJ1cHQgKFNpbmdsZSBzdGVwKSBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgbm1pX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIk5NSSBJbnRlcnJ1cHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGludmFsaWRfaW5zdHJ1Y3Rpb25fZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiSW52YWxpZCBJbnN0cnVjdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb3VibGVfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRG91YmxlIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cgl3aGlsZSgxKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGludmFsaWRfdHNzX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJJbnZhbGlkIFRTUyBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgc2VnX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlNlZ21lbnRhdGlvbiBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzdGFja19mYXVsdF9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJTdGFjayBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBncGZfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiR2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBwYWdlX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlBhZ2UgZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZnBfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgYWxpZ25tZW50X2NoZWNrX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkFsaWdubWVudCBjaGVjayBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgbWFjaGluZV9jaGVja19lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9CgoKdm9pZCBpcnFfaW5zdGFsbF9oYW5kbGVyKGludCBpbm8sIGludGVycnVwdF9oYW5kbGVyX3QgKmZ1bmMsIHZvaWQgKnBkYXRhKQp7CglpbnQgc3RhdHVzOwoKCWlmIChpbm8+TUFYX0lSUSkgewoJCXJldHVybjsKCX0KCglpZiAoTlVMTCAhPSBpcnFfdGFibGVbaW5vXS5oYW5kbGVyKSB7CgkJcmV0dXJuOwoJfQoKCXN0YXR1cyA9IGRpc2FibGVfaW50ZXJydXB0cygpOwoJaXJxX3RhYmxlW2lub10uaGFuZGxlciA9IG1hbGxvYyhzaXplb2YoaXJxX2hhbmRsZXJfdCkpOwoJaWYgKE5VTEwgPT0gaXJxX3RhYmxlW2lub10uaGFuZGxlcikgewoJCXJldHVybjsKCX0KCgltZW1zZXQoaXJxX3RhYmxlW2lub10uaGFuZGxlciwgMCwgc2l6ZW9mKGlycV9oYW5kbGVyX3QpKTsKCglpcnFfdGFibGVbaW5vXS5oYW5kbGVyLT5pc3JfZnVuYyA9IGZ1bmM7CglpcnFfdGFibGVbaW5vXS5oYW5kbGVyLT5pc3JfZGF0YSA9IHBkYXRhOwoJaWYgKHN0YXR1cykgewoJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7Cgl9CgoJdW5tYXNrX2lycShpbm8pOwoKCXJldHVybjsKfQoKdm9pZCBpcnFfZnJlZV9oYW5kbGVyKGludCBpbm8pCnsKCWludCBzdGF0dXM7CglpZiAoaW5vPk1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CgoJc3RhdHVzID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CgltYXNrX2lycShpbm8pOwoJaWYgKE5VTEwgPT0gaXJxX3RhYmxlW2lub10uaGFuZGxlcikgewoJCXJldHVybjsKCX0KCWZyZWUoaXJxX3RhYmxlW2lub10uaGFuZGxlcik7CglpcnFfdGFibGVbaW5vXS5oYW5kbGVyPU5VTEw7CglpZiAoc3RhdHVzKSB7CgkJZW5hYmxlX2ludGVycnVwdHMoKTsKCX0KCXJldHVybjsKfQoKCmFzbSAoImlkdF9wdHI6XG4iCgkiLndvcmQJMHg4MDBcbiIgLyogc2l6ZSBvZiB0aGUgdGFibGUgOCoyNTYgYnl0ZXMgKi8KCSIubG9uZwlpZHRcbiIJIC8qIG9mZnNldCAqLwoJIi53b3JkCTB4MThcbiIpOy8qIGRhdGEgc2VnbWVudCAqLwoKc3RhdGljIHZvaWQgc2V0X3ZlY3RvcihpbnQgaW50bnVtLCB2b2lkICpyb3V0aW5lKQp7CglpZHRbaW50bnVtXS5iYXNlX2hpZ2ggPSAodTE2KSgodTMyKShyb3V0aW5lKT4+MTYpOwoJaWR0W2ludG51bV0uYmFzZV9sb3cgPSAodTE2KSgodTMyKShyb3V0aW5lKSYweGZmZmYpOwp9CgoKaW50IGludGVycnVwdF9pbml0KHZvaWQpCnsKCWludCBpOwoKCS8qIEp1c3QgaW4gY2FzZS4uLiAqLwoJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CgoJLyogSW5pdGlhbGl6ZSB0aGUgSURUIGFuZCBzdHVmZiAqLwoKCgltZW1zZXQoaXJxX3RhYmxlLCAwLCBzaXplb2YoaXJxX3RhYmxlKSk7CgoJLyogU2V0dXAgdGhlIElEVCAqLwoJZm9yIChpPTA7aTwyNTY7aSsrKSB7CgkJaWR0W2ldLmFjY2VzcyA9IDB4OGU7CgkJaWR0W2ldLnJlcyA9IDA7CgkJaWR0W2ldLnNlbGVjdG9yID0gMHgxMDsKCQlzZXRfdmVjdG9yKGksIGRlZmF1bHRfaXNyKTsKCX0KCglhc20gKCJjcyBsaWR0IGlkdF9wdHJcbiIpOwoKCS8qIFNldHVwIGV4Y2VwdGlvbnMgKi8KCXNldF92ZWN0b3IoMHgwMCwgZXhwXzApOwoJc2V0X3ZlY3RvcigweDAxLCBleHBfMSk7CglzZXRfdmVjdG9yKDB4MDIsIGV4cF8yKTsKCXNldF92ZWN0b3IoMHgwMywgZXhwXzMpOwoJc2V0X3ZlY3RvcigweDA0LCBleHBfNCk7CglzZXRfdmVjdG9yKDB4MDUsIGV4cF81KTsKCXNldF92ZWN0b3IoMHgwNiwgZXhwXzYpOwoJc2V0X3ZlY3RvcigweDA3LCBleHBfNyk7CglzZXRfdmVjdG9yKDB4MDgsIGV4cF84KTsKCXNldF92ZWN0b3IoMHgwOSwgZXhwXzkpOwoJc2V0X3ZlY3RvcigweDBhLCBleHBfMTApOwoJc2V0X3ZlY3RvcigweDBiLCBleHBfMTEpOwoJc2V0X3ZlY3RvcigweDBjLCBleHBfMTIpOwoJc2V0X3ZlY3RvcigweDBkLCBleHBfMTMpOwoJc2V0X3ZlY3RvcigweDBlLCBleHBfMTQpOwoJc2V0X3ZlY3RvcigweDBmLCBleHBfMTUpOwoJc2V0X3ZlY3RvcigweDEwLCBleHBfMTYpOwoJc2V0X3ZlY3RvcigweDExLCBleHBfMTcpOwoJc2V0X3ZlY3RvcigweDEyLCBleHBfMTgpOwoJc2V0X3ZlY3RvcigweDEzLCBleHBfMTkpOwoJc2V0X3ZlY3RvcigweDE0LCBleHBfMjApOwoJc2V0X3ZlY3RvcigweDE1LCBleHBfMjEpOwoJc2V0X3ZlY3RvcigweDE2LCBleHBfMjIpOwoJc2V0X3ZlY3RvcigweDE3LCBleHBfMjMpOwoJc2V0X3ZlY3RvcigweDE4LCBleHBfMjQpOwoJc2V0X3ZlY3RvcigweDE5LCBleHBfMjUpOwoJc2V0X3ZlY3RvcigweDFhLCBleHBfMjYpOwoJc2V0X3ZlY3RvcigweDFiLCBleHBfMjcpOwoJc2V0X3ZlY3RvcigweDFjLCBleHBfMjgpOwoJc2V0X3ZlY3RvcigweDFkLCBleHBfMjkpOwoJc2V0X3ZlY3RvcigweDFlLCBleHBfMzApOwoJc2V0X3ZlY3RvcigweDFmLCBleHBfMzEpOwoKCgkvKiBTZXR1cCBpbnRlcnJ1cHRzICovCglzZXRfdmVjdG9yKDB4MjAsIGlycV8wKTsKCXNldF92ZWN0b3IoMHgyMSwgaXJxXzEpOwoJc2V0X3ZlY3RvcigweDIzLCBpcnFfMyk7CglzZXRfdmVjdG9yKDB4MjQsIGlycV80KTsKCXNldF92ZWN0b3IoMHgyNSwgaXJxXzUpOwoJc2V0X3ZlY3RvcigweDI2LCBpcnFfNik7CglzZXRfdmVjdG9yKDB4MjcsIGlycV83KTsKCXNldF92ZWN0b3IoMHgyOCwgaXJxXzgpOwoJc2V0X3ZlY3RvcigweDI5LCBpcnFfOSk7CglzZXRfdmVjdG9yKDB4MmEsIGlycV8xMCk7CglzZXRfdmVjdG9yKDB4MmIsIGlycV8xMSk7CglzZXRfdmVjdG9yKDB4MmMsIGlycV8xMik7CglzZXRfdmVjdG9yKDB4MmQsIGlycV8xMyk7CglzZXRfdmVjdG9yKDB4MmUsIGlycV8xNCk7CglzZXRfdmVjdG9yKDB4MmYsIGlycV8xNSk7CgkvKiB2ZWN0b3JzIDB4MzAtMHgzZiBhcmUgcmVzZXJ2ZWQgZm9yIGlycSAxNi0zMSAqLwoKCgkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzICovCglvdXRiKDB4ZmYsIE1BU1RFUl9QSUMgKyBJTVIpOwoJb3V0YigweGZmLCBTTEFWRV9QSUMgKyBJTVIpOwoKCS8qIE1hc3RlciBQSUMgKi8KCW91dGIoSUNXMV9TRUx8SUNXMV9FSUNXNCwgTUFTVEVSX1BJQyArIElDVzEpOwoJb3V0YigweDIwLCBNQVNURVJfUElDICsgSUNXMik7ICAgICAgICAgIC8qIFBsYWNlIG1hc3RlciBQSUMgaW50ZXJydXB0cyBhdCBJTlQyMCAqLwoJb3V0YihJUjIsIE1BU1RFUl9QSUMgKyBJQ1czKTsJCS8qIElDVzMsIE9uZSBzbGV2YyBQSUMgaXMgcHJlc2VudCAqLwoJb3V0YihJQ1c0X1BNLCBNQVNURVJfUElDICsgSUNXNCk7CgoJZm9yIChpPTA7aTw4O2krKykgewoJCW91dGIoT0NXMl9TRU9JfGksIE1BU1RFUl9QSUMgKyBPQ1cyKTsKCX0KCgkvKiBTbGF2ZSBQSUMgKi8KCW91dGIoSUNXMV9TRUx8SUNXMV9FSUNXNCwgU0xBVkVfUElDICsgSUNXMSk7CglvdXRiKDB4MjgsIFNMQVZFX1BJQyArIElDVzIpOwkgICAgICAgIC8qIFBsYWNlIHNsYXZlIFBJQyBpbnRlcnJ1cHRzIGF0IElOVDI4ICovCglvdXRiKDB4MDIsIFNMQVZFX1BJQyArIElDVzMpOwkJLyogU2xhdmUgSUQgKi8KCW91dGIoSUNXNF9QTSwgU0xBVkVfUElDICsgSUNXNCk7CgoJZm9yIChpPTA7aTw4O2krKykgewoJCW91dGIoT0NXMl9TRU9JfGksIFNMQVZFX1BJQyArIE9DVzIpOwoJfQoKCgkvKiBlbmFibGUgY2FzY2FkZSBpbnRlcnJlcnVwdCAqLwoJb3V0YigweGZiLCBNQVNURVJfUElDICsgSU1SKTsKCW91dGIoMHhmZiwgU0xBVkVfUElDICsgSU1SKTsKCgkvKiBJdCBpcyBub3cgc2FmZSB0byBlbmFibGUgaW50ZXJydXB0cyAqLwoJZW5hYmxlX2ludGVycnVwdHMoKTsKCglyZXR1cm4gMDsKfQoKdm9pZCBlbmFibGVfaW50ZXJydXB0cyh2b2lkKQp7Cglhc20oInN0aVxuIik7Cn0KCmludCBkaXNhYmxlX2ludGVycnVwdHModm9pZCkKewoJbG9uZyBmbGFnczsKCglhc20gdm9sYXRpbGUgKCJwdXNoZmwgOyBwb3BsICUwIDsgY2xpXG4iIDogIj1nIiAoZmxhZ3MpIDogKTsKCglyZXR1cm4gKGZsYWdzJjB4MjAwKTsgLyogSUUgZmxhZ3MgaXMgYml0IDkgKi8KfQoKCiNpZmRlZiBDRkdfUkVTRVRfR0VORVJJQwoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGdlbmVyYXRlX2dwZih2b2lkKTsKYXNtKCIuZ2xvYmwgZ2VuZXJhdGVfZ3BmXG4iCiAgICAiZ2VuZXJhdGVfZ3BmOlxuIgogICAgImxqbXAgICAkMHg3MCwgJDB4NDcxMTQ3MTFcbiIpOyAvKiBzZWdtZW50IDB4NzAgaXMgYW4gYXJiaXRyYXJ5IHNlZ21lbnQgd2hpY2ggZG9lcyBub3QKCQkJCSAgICAqIGV4aXN0ICovCnZvaWQgcmVzZXRfY3B1KHVsb25nIGFkZHIpCnsKCXNldF92ZWN0b3IoMTMsIGdlbmVyYXRlX2dwZik7ICAvKiBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgaGFuZGxlciAqLwoJc2V0X3ZlY3Rvcig4LCBnZW5lcmF0ZV9ncGYpOyAgIC8qIGRvdWJsZSBmYXVsdCBoYW5kbGVyICovCglnZW5lcmF0ZV9ncGYoKTsgICAgICAgICAgICAgICAgLyogc3RhcnQgdGhlIHNob3cgKi8KfQojZW5kaWYK