LyogVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgY2xpZW50IGludGVyZmFjZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwoKI2lmbmRlZiBBRlNfVkxDTElFTlRfSAojZGVmaW5lIEFGU19WTENMSUVOVF9ICgojaW5jbHVkZSAidHlwZXMuaCIKCmVudW0gQUZTVkxfRXJyb3JzIHsKCUFGU1ZMX0lERVhJU1QgCQk9IDM2MzUyMCwJLyogVm9sdW1lIElkIGVudHJ5IGV4aXN0cyBpbiB2bCBkYXRhYmFzZSAqLwoJQUZTVkxfSU8gCQk9IDM2MzUyMSwJLyogSS9PIHJlbGF0ZWQgZXJyb3IgKi8KCUFGU1ZMX05BTUVFWElTVCAJPSAzNjM1MjIsCS8qIFZvbHVtZSBuYW1lIGVudHJ5IGV4aXN0cyBpbiB2bCBkYXRhYmFzZSAqLwoJQUZTVkxfQ1JFQVRFRkFJTCAJPSAzNjM1MjMsCS8qIEludGVybmFsIGNyZWF0aW9uIGZhaWx1cmUgKi8KCUFGU1ZMX05PRU5UIAkJPSAzNjM1MjQsCS8qIE5vIHN1Y2ggZW50cnkgKi8KCUFGU1ZMX0VNUFRZIAkJPSAzNjM1MjUsCS8qIFZsIGRhdGFiYXNlIGlzIGVtcHR5ICovCglBRlNWTF9FTlRERUxFVEVEIAk9IDM2MzUyNiwJLyogRW50cnkgaXMgZGVsZXRlZCAoc29mdCBkZWxldGUpICovCglBRlNWTF9CQUROQU1FIAkJPSAzNjM1MjcsCS8qIFZvbHVtZSBuYW1lIGlzIGlsbGVnYWwgKi8KCUFGU1ZMX0JBRElOREVYIAkJPSAzNjM1MjgsCS8qIEluZGV4IGlzIG91dCBvZiByYW5nZSAqLwoJQUZTVkxfQkFEVk9MVFlQRSAJPSAzNjM1MjksCS8qIEJhZCB2b2x1bWUgdHlwZSAqLwoJQUZTVkxfQkFEU0VSVkVSIAk9IDM2MzUzMCwJLyogSWxsZWdhbCBzZXJ2ZXIgbnVtYmVyIChvdXQgb2YgcmFuZ2UpICovCglBRlNWTF9CQURQQVJUSVRJT04gCT0gMzYzNTMxLAkvKiBCYWQgcGFydGl0aW9uIG51bWJlciAqLwoJQUZTVkxfUkVQU0ZVTEwgCQk9IDM2MzUzMiwJLyogUnVuIG91dCBvZiBzcGFjZSBmb3IgUmVwbGljYXRpb24gc2l0ZXMgKi8KCUFGU1ZMX05PUkVQU0VSVkVSIAk9IDM2MzUzMywJLyogTm8gc3VjaCBSZXBsaWNhdGlvbiBzZXJ2ZXIgc2l0ZSBleGlzdHMgKi8KCUFGU1ZMX0RVUFJFUFNFUlZFUiAJPSAzNjM1MzQsCS8qIFJlcGxpY2F0aW9uIHNpdGUgYWxyZWFkeSBleGlzdHMgKi8KCUFGU1ZMX1JXTk9URk9VTkQgCT0gMzYzNTM1LAkvKiBQYXJlbnQgUi9XIGVudHJ5IG5vdCBmb3VuZCAqLwoJQUZTVkxfQkFEUkVGQ09VTlQgCT0gMzYzNTM2LAkvKiBJbGxlZ2FsIFJlZmVyZW5jZSBDb3VudCBudW1iZXIgKi8KCUFGU1ZMX1NJWkVFWENFRURFRCAJPSAzNjM1MzcsCS8qIFZsIHNpemUgZm9yIGF0dHJpYnV0ZXMgZXhjZWVkZWQgKi8KCUFGU1ZMX0JBREVOVFJZIAkJPSAzNjM1MzgsCS8qIEJhZCBpbmNvbWluZyB2bCBlbnRyeSAqLwoJQUZTVkxfQkFEVk9MSURCVU1QIAk9IDM2MzUzOSwJLyogSWxsZWdhbCBtYXggdm9saWQgaW5jcmVtZW50ICovCglBRlNWTF9JREFMUkVBRFlIQVNIRUQgCT0gMzYzNTQwLAkvKiBSTy9CQUNLIGlkIGFscmVhZHkgaGFzaGVkICovCglBRlNWTF9FTlRSWUxPQ0tFRCAJPSAzNjM1NDEsCS8qIFZsIGVudHJ5IGlzIGFscmVhZHkgbG9ja2VkICovCglBRlNWTF9CQURWT0xPUEVSIAk9IDM2MzU0MiwJLyogQmFkIHZvbHVtZSBvcGVyYXRpb24gY29kZSAqLwoJQUZTVkxfQkFEUkVMTE9DS1RZUEUgCT0gMzYzNTQzLAkvKiBCYWQgcmVsZWFzZSBsb2NrIHR5cGUgKi8KCUFGU1ZMX1JFUkVMRUFTRSAJPSAzNjM1NDQsCS8qIFN0YXR1cyByZXBvcnQ6IGxhc3QgcmVsZWFzZSB3YXMgYWJvcnRlZCAqLwoJQUZTVkxfQkFEU0VSVkVSRkxBRyAJPSAzNjM1NDUsCS8qIEludmFsaWQgcmVwbGljYXRpb24gc2l0ZSBzZXJ2ZXIgsGFnICovCglBRlNWTF9QRVJNIAkJPSAzNjM1NDYsCS8qIE5vIHBlcm1pc3Npb24gYWNjZXNzICovCglBRlNWTF9OT01FTSAJCT0gMzYzNTQ3LAkvKiBtYWxsb2MvcmVhbGxvYyBmYWlsZWQgdG8gYWxsb2MgZW5vdWdoIG1lbW9yeSAqLwp9OwoKLyogbWFwcyB0byAic3RydWN0IHZsZGJlbnRyeSIgaW4gdnZsLXNwZWMucGRmICovCnN0cnVjdCBhZnNfdmxkYmVudHJ5IHsKCWNoYXIJCW5hbWVbNjVdOwkJLyogbmFtZSBvZiB2b2x1bWUgKGluY2x1ZGluZyBOVUwgY2hhcikgKi8KCWFmc192b2x0eXBlX3QJdHlwZTsJCQkvKiB2b2x1bWUgdHlwZSAqLwoJdW5zaWduZWQJbnVtX3NlcnZlcnM7CQkvKiBudW0gc2VydmVycyB0aGF0IGhvbGQgaW5zdGFuY2VzIG9mIHRoaXMgdm9sICovCgl1bnNpZ25lZAljbG9uZV9pZDsJCS8qIGNsb25pbmcgSUQgKi8KCgl1bnNpZ25lZAlmbGFnczsKI2RlZmluZSBBRlNfVkxGX1JXRVhJU1RTCTB4MTAwMAkJLyogUi9XIHZvbHVtZSBleGlzdHMgKi8KI2RlZmluZSBBRlNfVkxGX1JPRVhJU1RTCTB4MjAwMAkJLyogUi9PIHZvbHVtZSBleGlzdHMgKi8KI2RlZmluZSBBRlNfVkxGX0JBQ0tFWElTVFMJMHg0MDAwCQkvKiBiYWNrdXAgdm9sdW1lIGV4aXN0cyAqLwoKCWFmc192b2xpZF90CXZvbHVtZV9pZHNbM107CQkvKiB2b2x1bWUgSURzICovCgoJc3RydWN0IHsKCQlzdHJ1Y3QgaW5fYWRkcglhZGRyOwkJLyogc2VydmVyIGFkZHJlc3MgKi8KCQl1bnNpZ25lZAlwYXJ0aXRpb247CS8qIHBhcnRpdGlvbiBJRCBvbiB0aGlzIHNlcnZlciAqLwoJCXVuc2lnbmVkCWZsYWdzOwkJLyogc2VydmVyIHNwZWNpZmljIGZsYWdzICovCiNkZWZpbmUgQUZTX1ZMU0ZfTkVXUkVQU0lURQkweDAwMDEJLyogdW51c2VkICovCiNkZWZpbmUgQUZTX1ZMU0ZfUk9WT0wJCTB4MDAwMgkvKiB0aGlzIHNlcnZlciBob2xkcyBhIFIvTyBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCiNkZWZpbmUgQUZTX1ZMU0ZfUldWT0wJCTB4MDAwNAkvKiB0aGlzIHNlcnZlciBob2xkcyBhIFIvVyBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCiNkZWZpbmUgQUZTX1ZMU0ZfQkFDS1ZPTAkweDAwMDgJLyogdGhpcyBzZXJ2ZXIgaG9sZHMgYSBiYWNrdXAgaW5zdGFuY2Ugb2YgdGhlIHZvbHVtZSAqLwoJfSBzZXJ2ZXJzWzhdOwp9OwoKZXh0ZXJuIGludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZShzdHJ1Y3QgYWZzX3NlcnZlciAqLCBjb25zdCBjaGFyICosCgkJCQkgICAgICB1bnNpZ25lZCwgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKik7CmV4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkKHN0cnVjdCBhZnNfc2VydmVyICosIGFmc192b2xpZF90LAoJCQkJICAgIGFmc192b2x0eXBlX3QsCgkJCQkgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKik7CgpleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYyhzdHJ1Y3QgYWZzX2FzeW5jX29wICosCgkJCQkJICBhZnNfdm9saWRfdCwgYWZzX3ZvbHR5cGVfdCk7CgpleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqLAoJCQkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICopOwoKI2VuZGlmIC8qIEFGU19WTENMSUVOVF9IICovCg==