Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiNpbmNsdWRlICJpYm1hc20uaCIKI2luY2x1ZGUgImRvdF9jb21tYW5kLmgiCgpzdGF0aWMgaW50IHN1c3BlbmRfaGVhcnRiZWF0cyA9IDA7CgovKgogKiBPbmNlIHRoZSBkcml2ZXIgaW5kaWNhdGVzIHRvIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciB0aGF0IGl0IGlzIHJ1bm5pbmcKICogLSBzZWUgc2VuZF9vc19zdGF0ZSgpIC0gdGhlIHNlcnZpY2UgcHJvY2Vzc29yIHNlbmRzIHBlcmlvZGljIGhlYXJ0YmVhdHMKICogdG8gdGhlIGRyaXZlci4gVGhlIGRyaXZlciBtdXN0IHJlc3BvbmQgdG8gdGhlIGhlYXJ0YmVhdHMgb3IgZWxzZSB0aGUgT1MKICogd2lsbCBiZSByZWJvb3RlZC4KICogSW4gdGhlIGNhc2Ugb2YgYSBwYW5pYyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgY29udGludWVzIHRvIHdvcmsgYW5kIHRodXMKICogY29udGludWVzIHRvIHJlc3BvbmQgdG8gaGVhcnRiZWF0cywgbWFraW5nIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBiZWxpZXZlCiAqIHRoZSBPUyBpcyBzdGlsbCBydW5uaW5nIGFuZCB0aHVzIHByZXZlbnRpbmcgYSByZWJvb3QuCiAqIFRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZyBhIGNhbGxiYWNrIGlzIGFkZGVkIHRoZSBwYW5pY19ub3RpZmllcl9saXN0LgogKiBCZWZvcmUgcmVzcG9uZGluZyB0byBhIGhlYXJ0YmVhdCB0aGUgZHJpdmVyIGNoZWNrcyBpZiBhIHBhbmljIGhhcyBoYXBwZW5lZCwKICogaWYgeWVzIGl0IHN1c3BlbmRzIGhlYXJ0YmVhdCwgY2F1c2luZyB0aGUgc2VydmljZSBwcm9jZXNzb3IgdG8gcmVib290IGFzCiAqIGV4cGVjdGVkLgogKi8Kc3RhdGljIGludCBwYW5pY19oYXBwZW5lZChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQp7CglzdXNwZW5kX2hlYXJ0YmVhdHMgPSAxOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuaWNfbm90aWZpZXIgPSB7IHBhbmljX2hhcHBlbmVkLCBOVUxMLCAxIH07Cgp2b2lkIGlibWFzbV9yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKQp7Cglub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX25vdGlmaWVyKTsKfQoKdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKQp7Cglub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmcGFuaWNfbm90aWZpZXIpOwp9CgoKaW50IGlibWFzbV9oZWFydGJlYXRfaW5pdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7CglzcC0+aGVhcnRiZWF0ID0gaWJtYXNtX25ld19jb21tYW5kKEhFQVJUQkVBVF9CVUZGRVJfU0laRSk7CglpZiAoc3AtPmhlYXJ0YmVhdCA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoKCXJldHVybiAwOwp9Cgp2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7Cgljb21tYW5kX3B1dChzcC0+aGVhcnRiZWF0KTsKfQoKdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKQp7CglzdHJ1Y3QgY29tbWFuZCAqY21kID0gc3AtPmhlYXJ0YmVhdDsKCXN0cnVjdCBkb3RfY29tbWFuZF9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgZG90X2NvbW1hbmRfaGVhZGVyICopY21kLT5idWZmZXI7CgoJaWYgKHN1c3BlbmRfaGVhcnRiZWF0cykKCQlyZXR1cm47CgoJLyogcmV0dXJuIHRoZSByZWNlaXZlZCBkb3QgY29tbWFuZCB0byBzZW5kZXIgKi8KCWNtZC0+c3RhdHVzID0gSUJNQVNNX0NNRF9QRU5ESU5HOwoJc2l6ZSA9IG1pbihzaXplLCBjbWQtPmJ1ZmZlcl9zaXplKTsKCW1lbWNweShjbWQtPmJ1ZmZlciwgbWVzc2FnZSwgc2l6ZSk7CgloZWFkZXItPnR5cGUgPSBzcF93cml0ZTsKCWlibWFzbV9leGVjX2NvbW1hbmQoc3AsIGNtZCk7Cn0K