LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovKioNCiAqIFxmaWxlDQogKg0KICogXHNlY3Rpb24gUHVycG9zZQ0KICoNCiAqICAgRGVmaW5pdGlvbnMgYW5kIG1ldGhvZHMgZm9yIFVTQiBjb21wb3NpdGUgZGV2aWNlIGltcGxlbWVudC4NCiAqIA0KICovDQoNCiNpZm5kZWYgRFVBTENEQ0REUklWRVJfSA0KI2RlZmluZSBEVUFMQ0RDRERSSVZFUl9IDQovKiogXGFkZHRvZ3JvdXAgdXNiZF9jb21wb3NpdGVfY2RjY2RjDQogKkB7DQogKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgSGVhZGVycw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojaW5jbHVkZSA8VVNCUmVxdWVzdHMuaD4NCiNpbmNsdWRlIDxDRENEZXNjcmlwdG9ycy5oPg0KDQojaW5jbHVkZSAiVVNCRC5oIg0KI2luY2x1ZGUgPENEQ0RTZXJpYWxQb3J0Lmg+DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICAgRGVmaW5lcw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiogXGFkZHRvZ3JvdXAgdXNiZF9jb21wb3NpdGVfY2RjY2RjX2Rlc2MNCiAqICBUaGUgZHJpdmVyIHVzZXMgdGhlc2UgaW50ZXJmYWNlIG51bWJlcnMgaW4gY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLg0KICogICAgICBAew0KICovDQovKiogTnVtYmVyIG9mIGludGVyZmFjZXMgb2YgdGhlIGRldmljZSAqLw0KI2RlZmluZSBEVUFMQ0RDRERyaXZlckRlc2NyaXB0b3JzX05VTUlOVEVSRkFDRSAgICAgIDQNCi8qKiBOdW1iZXIgb2YgdGhlIENEQzAgaW50ZXJmYWNlLiAqLw0KI2RlZmluZSBEVUFMQ0RDRERyaXZlckRlc2NyaXB0b3JzX0lOVEVSRkFDRU5VTTAgICAgIDANCi8qKiBOdW1iZXIgb2YgdGhlIENEQzEgaW50ZXJmYWNlLiAqLw0KI2RlZmluZSBEVUFMQ0RDRERyaXZlckRlc2NyaXB0b3JzX0lOVEVSRkFDRU5VTTEgICAgIDINCi8qKiAgICAgQH0qLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBUeXBlcw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI3ByYWdtYSBwYWNrKDEpDQojaWYgZGVmaW5lZCAgICggX19DQ19BUk0gICApIC8qIEtlaWwgpsxWaXNpb24gNCAqLw0KI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKSAvKiBJQVIgRXdhcm0gKi8NCiNkZWZpbmUgX19hdHRyaWJ1dGVfXyguLi4pDQojZGVmaW5lIF9fcGFja2VkX18gIHBhY2tlZA0KI2VsaWYgZGVmaW5lZCAoICBfX0dOVUNfXyAgKSAvKiBHQ0MgQ1MzICovDQojZGVmaW5lIF9fcGFja2VkX18gIGFsaWduZWQoMSkNCiNlbmRpZg0KLyoqDQogKiBcdHlwZWRlZiBEdWFsQ2RjRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzDQogKiBcYnJpZWYgQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGxpc3QgZm9yIGEgZGV2aWNlIGltcGxlbWVudGluZyBhDQogKiAgICAgICAgZHVhbCBDREMgc2VyaWFsIGNvbXBvc2l0ZSBkcml2ZXIuDQogKi8NCnR5cGVkZWYgc3RydWN0IF9EdWFsQ2RjRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzIHsNCg0KICAgIC8qKiBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IuICovDQogICAgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgY29uZmlndXJhdGlvbjsNCg0KICAgIC8qIC0tLSBDREMgMCAqLw0KICAgIC8qKiBJQUQgMCAqLw0KICAgIFVTQkludGVyZmFjZUFzc29jaWF0aW9uRGVzY3JpcHRvciBjZGNJQUQwOw0KICAgIC8qKiBDb21tdW5pY2F0aW9uIGludGVyZmFjZSBkZXNjcmlwdG9yICovDQogICAgVVNCSW50ZXJmYWNlRGVzY3JpcHRvciBjZGNDb21tdW5pY2F0aW9uMDsNCiAgICAvKiogQ0RDIGhlYWRlciBmdW5jdGlvbmFsIGRlc2NyaXB0b3IuICovDQogICAgQ0RDSGVhZGVyRGVzY3JpcHRvciBjZGNIZWFkZXIwOw0KICAgIC8qKiBDREMgY2FsbCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWwgZGVzY3JpcHRvci4gKi8NCiAgICBDRENDYWxsTWFuYWdlbWVudERlc2NyaXB0b3IgY2RjQ2FsbE1hbmFnZW1lbnQwOw0KICAgIC8qKiBDREMgYWJzdHJhY3QgY29udHJvbCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWwgZGVzY3JpcHRvci4gKi8NCiAgICBDRENBYnN0cmFjdENvbnRyb2xNYW5hZ2VtZW50RGVzY3JpcHRvciBjZGNBYnN0cmFjdENvbnRyb2xNYW5hZ2VtZW50MDsNCiAgICAvKiogQ0RDIHVuaW9uIGZ1bmN0aW9uYWwgZGVzY3JpcHRvciAod2l0aCBvbmUgc2xhdmUgaW50ZXJmYWNlKS4gKi8NCiAgICBDRENVbmlvbkRlc2NyaXB0b3IgY2RjVW5pb24wOw0KICAgIC8qKiBOb3RpZmljYXRpb24gZW5kcG9pbnQgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgY2RjTm90aWZpY2F0aW9uMDsNCiAgICAvKiogRGF0YSBpbnRlcmZhY2UgZGVzY3JpcHRvci4gKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGNkY0RhdGEwOw0KICAgIC8qKiBEYXRhIE9VVCBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBjZGNEYXRhT3V0MDsNCiAgICAvKiogRGF0YSBJTiBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBjZGNEYXRhSW4wOw0KDQogICAgLyogLS0tIENEQyAxICovDQogICAgLyoqIElBRCAxICovDQogICAgVVNCSW50ZXJmYWNlQXNzb2NpYXRpb25EZXNjcmlwdG9yIGNkY0lBRDE7DQogICAgLyoqIENvbW11bmljYXRpb24gaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8NCiAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yIGNkY0NvbW11bmljYXRpb24xOw0KICAgIC8qKiBDREMgaGVhZGVyIGZ1bmN0aW9uYWwgZGVzY3JpcHRvci4gKi8NCiAgICBDRENIZWFkZXJEZXNjcmlwdG9yIGNkY0hlYWRlcjE7DQogICAgLyoqIENEQyBjYWxsIG1hbmFnZW1lbnQgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0NhbGxNYW5hZ2VtZW50RGVzY3JpcHRvciBjZGNDYWxsTWFuYWdlbWVudDE7DQogICAgLyoqIENEQyBhYnN0cmFjdCBjb250cm9sIG1hbmFnZW1lbnQgZnVuY3Rpb25hbCBkZXNjcmlwdG9yLiAqLw0KICAgIENEQ0Fic3RyYWN0Q29udHJvbE1hbmFnZW1lbnREZXNjcmlwdG9yIGNkY0Fic3RyYWN0Q29udHJvbE1hbmFnZW1lbnQxOw0KICAgIC8qKiBDREMgdW5pb24gZnVuY3Rpb25hbCBkZXNjcmlwdG9yICh3aXRoIG9uZSBzbGF2ZSBpbnRlcmZhY2UpLiAqLw0KICAgIENEQ1VuaW9uRGVzY3JpcHRvciBjZGNVbmlvbjE7DQogICAgLyoqIE5vdGlmaWNhdGlvbiBlbmRwb2ludCBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciBjZGNOb3RpZmljYXRpb24xOw0KICAgIC8qKiBEYXRhIGludGVyZmFjZSBkZXNjcmlwdG9yLiAqLw0KICAgIFVTQkludGVyZmFjZURlc2NyaXB0b3IgY2RjRGF0YTE7DQogICAgLyoqIERhdGEgT1VUIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGNkY0RhdGFPdXQxOw0KICAgIC8qKiBEYXRhIElOIGVuZHBvaW50IGRlc2NyaXB0b3IuICovDQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yIGNkY0RhdGFJbjE7DQoNCn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBEdWFsQ2RjRHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzOw0KDQojcHJhZ21hIHBhY2soKQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBFeHBvcnRlZCBmdW5jdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogLURVQUxDREMgKi8NCmV4dGVybiB2b2lkIERVQUxDRENERHJpdmVyX0luaXRpYWxpemUoDQogICAgY29uc3QgVVNCRERyaXZlckRlc2NyaXB0b3JzKiBwRGVzY3JpcHRvcnMpOw0KDQpleHRlcm4gdm9pZCBEVUFMQ0RDRERyaXZlcl9Db25maWd1cmF0aW9uQ2hhbmdlSGFuZGxlcih1aW50OF90IGNmZ251bSk7DQoNCmV4dGVybiB2b2lkIERVQUxDRENERHJpdmVyX1JlcXVlc3RIYW5kbGVyKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KTsNCg0KZXh0ZXJuIENEQ0RTZXJpYWxQb3J0KiBEVUFMQ0RDRERyaXZlcl9HZXRTZXJpYWxQb3J0KHVpbnQzMl90IHBvcnQpOw0KDQovKipAfSovDQojZW5kaWYgLyogI2lmbmRlZiBEVUFMQ0RDRERSSVZFUl9IICovDQoNCg==