LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5BTUUJICAgIDogczNjMjQwMC5oCiAqIFZlcnNpb24gIDogMzEuMy4yMDAzCiAqCiAqIEJhc2VkIG9uIFMzQzI0MDBYIFVzZXIncyBtYW51YWwgUmV2IDEuMQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX1MzQzI0MDBfSF9fCiNkZWZpbmUgX19TM0MyNDAwX0hfXwoKI2RlZmluZSBTM0MyNFgwX1VBUlRfQ0hBTk5FTFMJMgojZGVmaW5lIFMzQzI0WDBfU1BJX0NIQU5ORUxTCTEKI2RlZmluZSBQQUxFVFRFCQkJKDB4MTRBMDA0MDApCS8qIFNKUyAqLwoKZW51bSBzM2MyNHgwX3VhcnRzX25yIHsKCVMzQzI0WDBfVUFSVDAsCglTM0MyNFgwX1VBUlQxLAp9OwoKLypTM0MyNDAwIGRldmljZSBiYXNlIGFkZHJlc3NlcyAqLwojZGVmaW5lIFMzQzI0WDBfTUVNQ1RMX0JBU0UJCTB4MTQwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1VTQl9IT1NUX0JBU0UJCTB4MTQyMDAwMDAKI2RlZmluZSBTM0MyNFgwX0lOVEVSUlVQVF9CQVNFCQkweDE0NDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9ETUFfQkFTRQkJMHgxNDYwMDAwMAojZGVmaW5lIFMzQzI0WDBfQ0xPQ0tfUE9XRVJfQkFTRQkweDE0ODAwMDAwCiNkZWZpbmUgUzNDMjRYMF9MQ0RfQkFTRQkJMHgxNEEwMDAwMAojZGVmaW5lIFMzQzI0WDBfVUFSVF9CQVNFCQkweDE1MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9USU1FUl9CQVNFCQkweDE1MTAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VU0JfREVWSUNFX0JBU0UJCTB4MTUyMDAxNDAKI2RlZmluZSBTM0MyNFgwX1dBVENIRE9HX0JBU0UJCTB4MTUzMDAwMDAKI2RlZmluZSBTM0MyNFgwX0kyQ19CQVNFCQkweDE1NDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9JMlNfQkFTRQkJMHgxNTUwODAwMAojZGVmaW5lIFMzQzI0WDBfR1BJT19CQVNFCQkweDE1NjAwMDAwCiNkZWZpbmUgUzNDMjRYMF9SVENfQkFTRQkJMHgxNTcwMDAwMAojZGVmaW5lIFMzQzI0WDBfQURDX0JBU0UJCTB4MTU4MDAwMDAKI2RlZmluZSBTM0MyNFgwX1NQSV9CQVNFCQkweDE1OTAwMDAwCiNkZWZpbmUgUzNDMjQwMF9NTUNfQkFTRQkJMHgxNUEwMDAwMAoKLyogaW5jbHVkZSBjb21tb24gc3R1ZmYgKi8KI2luY2x1ZGUgPHMzYzI0eDAuaD4KCgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX21lbWN0bCAqczNjMjR4MF9nZXRfYmFzZV9tZW1jdGwodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9tZW1jdGwgKilTM0MyNFgwX01FTUNUTF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfdXNiX2hvc3QgKnMzYzI0eDBfZ2V0X2Jhc2VfdXNiX2hvc3Qodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF91c2JfaG9zdCAqKVMzQzI0WDBfVVNCX0hPU1RfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2ludGVycnVwdCAqczNjMjR4MF9nZXRfYmFzZV9pbnRlcnJ1cHQodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9pbnRlcnJ1cHQgKilTM0MyNFgwX0lOVEVSUlVQVF9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfZG1hcyAqczNjMjR4MF9nZXRfYmFzZV9kbWFzKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfZG1hcyAqKVMzQzI0WDBfRE1BX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9jbG9ja19wb3dlciAqczNjMjR4MF9nZXRfYmFzZV9jbG9ja19wb3dlcih2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2Nsb2NrX3Bvd2VyICopUzNDMjRYMF9DTE9DS19QT1dFUl9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfbGNkICpzM2MyNHgwX2dldF9iYXNlX2xjZCh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2xjZCAqKVMzQzI0WDBfTENEX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF91YXJ0CgkqczNjMjR4MF9nZXRfYmFzZV91YXJ0KGVudW0gczNjMjR4MF91YXJ0c19uciBuKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3VhcnQgKikoUzNDMjRYMF9VQVJUX0JBU0UgKyAobiAqIDB4NDAwMCkpOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfdGltZXJzICpzM2MyNHgwX2dldF9iYXNlX3RpbWVycyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3RpbWVycyAqKVMzQzI0WDBfVElNRVJfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3VzYl9kZXZpY2UgKnMzYzI0eDBfZ2V0X2Jhc2VfdXNiX2RldmljZSh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3VzYl9kZXZpY2UgKilTM0MyNFgwX1VTQl9ERVZJQ0VfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3dhdGNoZG9nICpzM2MyNHgwX2dldF9iYXNlX3dhdGNoZG9nKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfd2F0Y2hkb2cgKilTM0MyNFgwX1dBVENIRE9HX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9pMmMgKnMzYzI0eDBfZ2V0X2Jhc2VfaTJjKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfaTJjICopUzNDMjRYMF9JMkNfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2kycyAqczNjMjR4MF9nZXRfYmFzZV9pMnModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9pMnMgKilTM0MyNFgwX0kyU19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfZ3BpbyAqczNjMjR4MF9nZXRfYmFzZV9ncGlvKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfZ3BpbyAqKVMzQzI0WDBfR1BJT19CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfcnRjICpzM2MyNHgwX2dldF9iYXNlX3J0Yyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3J0YyAqKVMzQzI0WDBfUlRDX0JBU0U7Cn0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQwMF9hZGMgKnMzYzI0MDBfZ2V0X2Jhc2VfYWRjKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0MDBfYWRjICopUzNDMjRYMF9BRENfQkFTRTsKfQpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3NwaSAqczNjMjR4MF9nZXRfYmFzZV9zcGkodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9zcGkgKilTM0MyNFgwX1NQSV9CQVNFOwp9CnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MDBfbW1jICpzM2MyNDAwX2dldF9iYXNlX21tYyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNDAwX21tYyAqKVMzQzI0MDBfTU1DX0JBU0U7Cn0KCiNlbmRpZiAvKl9fUzNDMjQwMF9IX18qLwo=