LyoKICogRERLIGluZm9ybWF0aW9uIGZvciBEVkQKICoKICogQ29weXJpZ2h0IChDKSAyMDA0IFV3ZSBCb25uZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2lmbmRlZiBfX05URERDRFZEX0gKI2RlZmluZSBfX05URERDRFZEX0gKCi8qIGRlZmluaXRpb25zIHRha2VuIGZyb20gbGliZHZkY3NzLCBtb2RpZmllZCB0byByZWZsZWN0IFdpbmRvd3MgbmFtZXMgYW5kIGRhdGEgdHlwZXMgaW4gcGxhY2VzICovCgojZGVmaW5lIElPQ1RMX0RWRF9CQVNFICAgICAgICAgICAgICAgICBGSUxFX0RFVklDRV9EVkQKCiNkZWZpbmUgSU9DVExfRFZEX1NUQVJUX1NFU1NJT04gICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDAsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKI2RlZmluZSBJT0NUTF9EVkRfUkVBRF9LRVkgICAgICAgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwMSwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQojZGVmaW5lIElPQ1RMX0RWRF9TRU5EX0tFWSAgICAgICAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDAyLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCiNkZWZpbmUgSU9DVExfRFZEX0VORF9TRVNTSU9OICAgICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDMsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKI2RlZmluZSBJT0NUTF9EVkRfU0VUX1JFQURfQUhFQUQgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwNCwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQojZGVmaW5lIElPQ1RMX0RWRF9HRVRfUkVHSU9OICAgICAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDA1LCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCiNkZWZpbmUgSU9DVExfRFZEX1NFTkRfS0VZMiAgICAgICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDYsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUyB8IEZJTEVfV1JJVEVfQUNDRVNTKQoKI2RlZmluZSBJT0NUTF9EVkRfUkVBRF9TVFJVQ1RVUkUgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQ1MCwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQoKdHlwZWRlZiBlbnVtIHsKICAgIER2ZENoYWxsZW5nZUtleSA9IDB4MDEsCiAgICBEdmRCdXNLZXkxLAogICAgRHZkQnVzS2V5MiwKICAgIER2ZFRpdGxlS2V5LAogICAgRHZkQXNmLAogICAgRHZkU2V0UnBjS2V5ID0gMHg2LAogICAgRHZkR2V0UnBjS2V5ID0gMHg4LAogICAgRHZkRGlza0tleSA9IDB4ODAsCiAgICBEdmRJbnZhbGlkYXRlQUdJRCA9IDB4M2YKfSBEVkRfS0VZX1RZUEU7Cgp0eXBlZGVmIFVMT05HIERWRF9TRVNTSU9OX0lELCAqUERWRF9TRVNTSU9OX0lEOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9DT1BZX1BST1RFQ1RfS0VZIHsKICAgIFVMT05HIEtleUxlbmd0aDsKICAgIERWRF9TRVNTSU9OX0lEIFNlc3Npb25JZDsKICAgIERWRF9LRVlfVFlQRSBLZXlUeXBlOwogICAgVUxPTkcgS2V5RmxhZ3M7CiAgICB1bmlvbiB7CiAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgVUxPTkcgRmlsZUhhbmRsZTsKICAgICAgICAgICAgVUxPTkcgUmVzZXJ2ZWQ7ICAgLyogdXNlZCBmb3IgTlQgYWxpZ25tZW50ICovCiAgICAgICAgfSBzOwogICAgICAgIExBUkdFX0lOVEVHRVIgVGl0bGVPZmZzZXQ7CiAgICB9IFBhcmFtZXRlcnM7CiAgICBVQ0hBUiBLZXlEYXRhWzFdOwp9IERWRF9DT1BZX1BST1RFQ1RfS0VZLCAqUERWRF9DT1BZX1BST1RFQ1RfS0VZOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9SUENfS0VZIHsKICAgIFVDSEFSIFVzZXJSZXNldHNBdmFpbGFibGU6MzsKICAgIFVDSEFSIE1hbnVmYWN0dXJlclJlc2V0c0F2YWlsYWJsZTozOwogICAgVUNIQVIgVHlwZUNvZGU6MjsKICAgIFVDSEFSIFJlZ2lvbk1hc2s7CiAgICBVQ0hBUiBScGNTY2hlbWU7CiAgICBVQ0hBUiBSZXNlcnZlZDJbMV07Cn0gRFZEX1JQQ19LRVksICogUERWRF9SUENfS0VZOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9BU0YgewogICAgVUNIQVIgUmVzZXJ2ZWQwWzNdOwogICAgVUNIQVIgU3VjY2Vzc0ZsYWc6MTsKICAgIFVDSEFSIFJlc2VydmVkMTo3Owp9IERWRF9BU0YsICogUERWRF9BU0Y7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX1JFR0lPTgp7CiAgICAgICAgVUNIQVIgQ29weVN5c3RlbTsKICAgICAgICBVQ0hBUiBSZWdpb25EYXRhOyAgICAgICAgICAgICAgLyogY3VycmVudCBtZWRpYSByZWdpb24gKG5vdCBwbGF5YWJsZSB3aGVuIHNldCkgKi8KICAgICAgICBVQ0hBUiBTeXN0ZW1SZWdpb247ICAgICAgICAgICAgLyogY3VycmVudCBkcml2ZSByZWdpb24gKHBsYXlhYmxlIHdoZW4gc2V0KSAqLwogICAgICAgIFVDSEFSIFJlc2V0Q291bnQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzZXRzIGF2YWlsYWJsZSAqLwp9IERWRF9SRUdJT04sICogUERWRF9SRUdJT047Cgp0eXBlZGVmIGVudW0gX0RWRF9TVFJVQ1RVUkVfRk9STUFUCnsKCUR2ZFBoeXNpY2FsRGVzY3JpcHRvciwKCUR2ZENvcHlyaWdodERlc2NyaXB0b3IsCglEdmREaXNrS2V5RGVzY3JpcHRvciwKCUR2ZEJDQURlc2NyaXB0b3IsCglEdmRNYW51ZmFjdHVyZXJEZXNjcmlwdG9yLAoJRHZkTWF4RGVzY3JpcHRvcgp9IERWRF9TVFJVQ1RVUkVfRk9STUFULCAqUERWRF9TVFJVQ1RVUkVfRk9STUFUOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9SRUFEX1NUUlVDVFVSRSB7CiAgICAgICAgLyogQ29udGFpbnMgYW4gb2Zmc2V0IHRvIHRoZSBsb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgdG8gYmUgcmV0cmlldmVkLiAqLwogICAgICAgIExBUkdFX0lOVEVHRVIgQmxvY2tCeXRlT2Zmc2V0OwoKICAgICAgICAvKiAwOlBoeXNpY2FsIGRlc2NyaXB0b3IsIDE6Q29weXJpZ2h0IGRlc2NyaXB0b3IsIDI6RGlzayBrZXkgZGVzY3JpcHRvcgogICAgICAgICAgIDM6QkNBIGRlc2NyaXB0b3IsIDQ6TWFudWZhY3R1cmVyIGRlc2NyaXB0b3IsIDU6TWF4IGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBEVkRfU1RSVUNUVVJFX0ZPUk1BVCBGb3JtYXQ7CgogICAgICAgIC8qIFNlc3Npb24gSUQsIHRoYXQgaXMgb2J0YWluZWQgYnkgSU9DVExfRFZEX1NUQVJUX1NFU1NJT04gKi8KICAgICAgICBEVkRfU0VTU0lPTl9JRCBTZXNzaW9uSWQ7CgogICAgICAgIC8qIEZyb20gMCB0byA0ICovCiAgICAgICAgVUNIQVIgTGF5ZXJOdW1iZXI7Cn1EVkRfUkVBRF9TVFJVQ1RVUkUsICogUERWRF9SRUFEX1NUUlVDVFVSRTsKCnR5cGVkZWYgc3RydWN0IF9EVkRfTEFZRVJfREVTQ1JJUFRPUgp7CiAgICBVQ0hBUiBCb29rVmVyc2lvbiA6IDQ7CgogICAgLyogMDpEVkQtUk9NLCAxOkRWRC1SQU0sIDI6RFZELVIsIDM6RFZELVJXLCA5OkRWRC1SVyAqLwogICAgVUNIQVIgQm9va1R5cGUgOiA0OwoKICAgIFVDSEFSIE1pbmltdW1SYXRlIDogNDsKCiAgICAvKiBUaGUgcGh5c2ljYWwgc2l6ZSBvZiB0aGUgbWVkaWEuIDA6MTIwIG1tLCAxOjgwIG1tLiAqLwogICAgVUNIQVIgRGlza1NpemUgOiA0OwoKICAgIC8qIDE6UmVhZC1vbmx5IGxheWVyLCAyOlJlY29yZGFibGUgbGF5ZXIsIDQ6UmV3cml0YWJsZSBsYXllciAqLwogICAgVUNIQVIgTGF5ZXJUeXBlIDogNDsKCiAgICAvKiAwOnBhcmFsbGVsIHRyYWNrIHBhdGgsIDE6b3Bwb3NpdGUgdHJhY2sgcGF0aCAqLwogICAgVUNIQVIgVHJhY2tQYXRoIDogMTsKCiAgICAvKiAwOm9uZSBsYXllcnMsIDE6dHdvIGxheWVycywgYW5kIHNvIG9uICovCiAgICBVQ0hBUiBOdW1iZXJPZkxheWVycyA6IDI7CgogICAgVUNIQVIgUmVzZXJ2ZWQxIDogMTsKCiAgICAvKiAwOjAuNzQgtW0vdHJhY2ssIDE6MC44MCC1bS90cmFjaywgMjowLjYxNSC1bS90cmFjayAqLwogICAgVUNIQVIgVHJhY2tEZW5zaXR5IDogNDsKCiAgICAvKiAwOjAuMjY3ILVtL2JpdCwgMTowLjI5MyC1bS9iaXQsIDI6MC40MDkgdG8gMC40MzUgtW0vYml0LCA0OjAuMjgwIHRvIDAuMjkxILVtL2JpdCwgODowLjM1MyC1bS9iaXQgKi8KICAgIFVDSEFSIExpbmVhckRlbnNpdHkgOiA0OwoKICAgIC8qIE11c3QgYmUgZWl0aGVyIDB4MzAwMDA6RFZELVJPTSBvciBEVkQtUi8tUlcgb3IgMHgzMTAwMDpEVkQtUkFNIG9yIERWRCtSVyAqLwogICAgVUxPTkcgU3RhcnRpbmdEYXRhU2VjdG9yOwoKICAgIFVMT05HIEVuZERhdGFTZWN0b3I7CiAgICBVTE9ORyBFbmRMYXllclplcm9TZWN0b3I7CiAgICBVQ0hBUiBSZXNlcnZlZDUgOiA3OwoKICAgIC8qIDAgaW5kaWNhdGVzIG5vIEJDQSBkYXRhICovCiAgICBVQ0hBUiBCQ0FGbGFnIDogMTsKCiAgICBVQ0hBUiBSZXNlcnZlZDY7Cn1EVkRfTEFZRVJfREVTQ1JJUFRPUiwgKiBQRFZEX0xBWUVSX0RFU0NSSVBUT1I7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0NPUFlSSUdIVF9ERVNDUklQVE9SCnsKICAgIFVDSEFSIENvcHlyaWdodFByb3RlY3Rpb25UeXBlOwogICAgVUNIQVIgUmVnaW9uTWFuYWdlbWVudEluZm9ybWF0aW9uOwogICAgVVNIT1JUIFJlc2VydmVkOwp9RFZEX0NPUFlSSUdIVF9ERVNDUklQVE9SLCAqIFBEVkRfQ09QWVJJR0hUX0RFU0NSSVBUT1I7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0RJU0tfS0VZX0RFU0NSSVBUT1IKewogICAgVUNIQVIgRGlza0tleURhdGFbMjA0OF07Cn1EVkRfRElTS19LRVlfREVTQ1JJUFRPUiwgKiBQRFZEX0RJU0tfS0VZX0RFU0NSSVBUT1I7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0JDQV9ERVNDUklQVE9SCnsKICAgIFVDSEFSIEJDQUluZm9ybWF0aW9uWzFdOwp9RFZEX0JDQV9ERVNDUklQVE9SLCAqIFBEVkRfQkNBX0RFU0NSSVBUT1I7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX01BTlVGQUNUVVJFUl9ERVNDUklQVE9SCnsKICAgICAgICBVQ0hBUiBNYW51ZmFjdHVyaW5nSW5mb3JtYXRpb25bMjA0OF07Cn1EVkRfTUFOVUZBQ1RVUkVSX0RFU0NSSVBUT1IsICogUERWRF9NQU5VRkFDVFVSRVJfREVTQ1JJUFRPUjsKCiNkZWZpbmUgRFZEX0NIQUxMRU5HRV9LRVlfTEVOR1RIICAgICgxMiArIHNpemVvZihEVkRfQ09QWV9QUk9URUNUX0tFWSkgLSBzaXplb2YoVUNIQVIpKQoKI2RlZmluZSBEVkRfRElTS19LRVlfTEVOR1RIICAgICAgICAgKDIwNDggKyBzaXplb2YoRFZEX0NPUFlfUFJPVEVDVF9LRVkpIC0gc2l6ZW9mKFVDSEFSKSkKCiNkZWZpbmUgRFZEX0tFWV9TSVpFIDUKI2RlZmluZSBEVkRfQ0hBTExFTkdFX1NJWkUgMTAKI2RlZmluZSBEVkRfRElTQ0tFWV9TSVpFIDIwNDgKI2RlZmluZSBEVkRfU0VDVE9SX1BST1RFQ1RFRCAgICAgICAgICAgIDB4MDAwMDAwMjAKCiNlbmRpZiAvKiBfX05URERDRFZEX0ggKi8K