LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEF0bWVsIENvcnBvcmF0aW9uDQogKg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICoNCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93Lg0KICoNCiAqIEF0bWVsJ3MgbmFtZSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBESVNDTEFJTUVSOiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQ0KICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLA0KICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCg0KLyoqIFxhZGR0b2dyb3VwIGRkcmRfbW9kdWxlIA0KICoNCiAqIFRoZSBERFIvU0RSIFNEUkFNIENvbnRyb2xsZXIgKEREUlNEUkMpIGlzIGEgbXVsdGlwb3J0IG1lbW9yeSBjb250cm9sbGVyLiBJdCBjb21wcmlzZXMNCiAqIGZvdXIgc2xhdmUgQUhCIGludGVyZmFjZXMuIEFsbCBzaW11bHRhbmVvdXMgYWNjZXNzZXMgKGZvdXIgaW5kZXBlbmRlbnQgQUhCIHBvcnRzKSBhcmUgaW50ZXJsZWF2ZWQNCiAqIHRvIG1heGltaXplIG1lbW9yeSBiYW5kd2lkdGggYW5kIG1pbmltaXplIHRyYW5zYWN0aW9uIGxhdGVuY3kgZHVlIHRvIFNEUkFNIHByb3RvY29sLg0KICogDQogKiBcc2VjdGlvbiBkZHIyIENvbmZpZ3VyZXMgRERSMg0KICoNCiAqIFRoZSBERFIyLVNEUkFNIGRldmljZXMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6DQogKiA8dWw+DQogKiA8bGk+IEVCSSBDaGlwIFNlbGVjdCAxIGlzIGFzc2lnbmVkIHRvIHRoZSBERFIyU0RSIENvbnRyb2xsZXIsIEVuYWJsZSBERFIyIGNsb2NrIHgyIGluIFBNQy48L2xpPg0KICogPGxpPiBTdGVwIDE6IFByb2dyYW0gdGhlIG1lbW9yeSBkZXZpY2UgdHlwZTwvbGk+DQogKiA8bGk+IFN0ZXAgMjoNCiAqICAtIyBQcm9ncmFtIHRoZSBmZWF0dXJlcyBvZiBERFIyLVNEUkFNIGRldmljZSBpbnRvIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLg0KICogIC0jIFByb2dyYW0gdGhlIGZlYXR1cmVzIG9mIEREUjItU0RSQU0gZGV2aWNlIGludG8gdGhlIFRpbWluZyBSZWdpc3RlciBIRERSU0RSQzJfVDBQUi4NCiAqICAtIyBQcm9ncmFtIHRoZSBmZWF0dXJlcyBvZiBERFIyLVNEUkFNIGRldmljZSBpbnRvIHRoZSBUaW1pbmcgUmVnaXN0ZXIgSEREUlNEUkMyX1QxUFIuDQogKiAgLSMgUHJvZ3JhbSB0aGUgZmVhdHVyZXMgb2YgRERSMi1TRFJBTSBkZXZpY2UgaW50byB0aGUgVGltaW5nIFJlZ2lzdGVyIEhERFJTRFJDMl9UMlBSLiA8L2xpPg0KICogPGxpPiBTdGVwIDM6IEFuIE5PUCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgRERSMi1TRFJBTSB0byBlbmFibGUgY2xvY2suIDwvbGk+DQogKiA8bGk+IFN0ZXAgNDogIEFuIE5PUCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgRERSMi1TRFJBTSA8L2xpPg0KICogPGxpPiBTdGVwIDU6IEFuIGFsbCBiYW5rcyBwcmVjaGFyZ2UgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIEREUjItU0RSQU0uIDwvbGk+DQogKiA8bGk+IFN0ZXAgNjogQW4gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBzZXQgKEVNUlMyKSBjeWNsZSBpcyAgaXNzdWVkIHRvIGNob3NlIGJldHdlZW4gY29tbWVyY2lhbG9yIGhpZ2ggIHRlbXBlcmF0dXJlIG9wZXJhdGlvbnMuPC9saT4NCiAqIDxsaT4gU3RlcCA3OiBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzMpIGN5Y2xlIGlzIGlzc3VlZCB0byBzZXQgYWxsIHJlZ2lzdGVycyB0byAwLiA8L2xpPg0KICogPGxpPiBTdGVwIDg6ICBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzEpIGN5Y2xlIGlzIGlzc3VlZCB0byBlbmFibGUgRExMLjwvbGk+DQogKiA8bGk+IFN0ZXAgOTogIFByb2dyYW0gRExMIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuPC9saT4NCiAqIDxsaT4gU3RlcCAxMDogQSBNb2RlIFJlZ2lzdGVyIHNldCAoTVJTKSBjeWNsZSBpcyBpc3N1ZWQgdG8gcmVzZXQgRExMLjwvbGk+DQogKiA8bGk+IFN0ZXAgMTE6IEFuIGFsbCBiYW5rcyBwcmVjaGFyZ2UgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIEREUjItU0RSQU0uPC9saT4NCiAqIDxsaT4gU3RlcCAxMjogVHdvIGF1dG8tcmVmcmVzaCAoQ0JSKSBjeWNsZXMgYXJlIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBhdXRvIHJlZnJlc2ggY29tbWFuZCAoQ0JSKSBpbnRvIHRoZSBNb2RlIFJlZ2lzdGVyLjwvbGk+DQogKiA8bGk+IFN0ZXAgMTM6IFByb2dyYW0gRExMIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgdG8gbG93KERpc2FibGUgRExMIHJlc2V0KS48L2xpPg0KICogPGxpPiBTdGVwIDE0OiBBIE1vZGUgUmVnaXN0ZXIgc2V0IChNUlMpIGN5Y2xlIGlzIGlzc3VlZCB0byBwcm9ncmFtIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBERFIyLVNEUkFNIGRldmljZXMuPC9saT4NCiAqIDxsaT4gU3RlcCAxNTogUHJvZ3JhbSBPQ0QgZmllbGQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciB0byBoaWdoIChPQ0QgY2FsaWJyYXRpb24gZGVmYXVsdCkuIDwvbGk+DQogKiA8bGk+IFN0ZXAgMTY6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMSkgY3ljbGUgaXMgaXNzdWVkIHRvIE9DRCBkZWZhdWx0IHZhbHVlLjwvbGk+DQogKiA8bGk+IFN0ZXAgMTc6IFByb2dyYW0gT0NEIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgdG8gbG93IChPQ0QgY2FsaWJyYXRpb24gbW9kZSBleGl0KS48L2xpPg0KICogPGxpPiBTdGVwIDE4OiBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzEpIGN5Y2xlIGlzIGlzc3VlZCB0byBlbmFibGUgT0NEIGV4aXQuPC9saT4NCiAqIDxsaT4gU3RlcCAxOSwyMDogQSBtb2RlIE5vcm1hbCBjb21tYW5kIGlzIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBOb3JtYWwgbW9kZSBpbnRvIE1vZGUgUmVnaXN0ZXIuPC9saT4NCiAqIDxsaT4gU3RlcCAyMTogV3JpdGUgdGhlIHJlZnJlc2ggcmF0ZSBpbnRvIHRoZSBjb3VudCBmaWVsZCBpbiB0aGUgUmVmcmVzaCBUaW1lciByZWdpc3Rlci4gVGhlIEREUjItU0RSQU0gZGV2aWNlIHJlcXVpcmVzIGEgcmVmcmVzaCBldmVyeSAxNS42MjUgb3IgNy44MS4gPC9saT4NCiAqIDwvdWw+DQoqLw0KLypAeyovDQovKkB9Ki8NCg0KLyoqIFxhZGR0b2dyb3VwIHNkcmFtX21vZHVsZQ0KICoNCiAqIFxzZWN0aW9uIHNkcmFtIENvbmZpZ3VyZXMgU0RSQU0NCiAqDQogKiBUaGUgU0RSLVNEUkFNIGRldmljZXMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6DQogKiA8dWw+DQogKiA8bGk+IEVCSSBDaGlwIFNlbGVjdCAxIGlzIGFzc2lnbmVkIHRvIHRoZSBERFIyU0RSIENvbnRyb2xsZXIsIEVuYWJsZSBERFIyIGNsb2NrIHgyIGluIFBNQy48L2xpPg0KICogPGxpPiBTdGVwIDEuIFByb2dyYW0gdGhlIG1lbW9yeSBkZXZpY2UgdHlwZSBpbnRvIHRoZSBNZW1vcnkgRGV2aWNlIFJlZ2lzdGVyPC9saT4NCiAqIDxsaT4gU3RlcCAyLiBQcm9ncmFtIHRoZSBmZWF0dXJlcyBvZiB0aGUgU0RSLVNEUkFNIGRldmljZSBpbnRvIHRoZSBUaW1pbmcgUmVnaXN0ZXIgYW5kIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuPC9saT4NCiAqIDxsaT4gU3RlcCAzLiBGb3IgbG93LXBvd2VyIFNEUkFNLCB0ZW1wZXJhdHVyZS1jb21wZW5zYXRlZCBzZWxmIHJlZnJlc2ggKFRDU1IpLCBkcml2ZSBzdHJlbmd0aCAoRFMpIGFuZCBwYXJ0aWFsIGFycmF5IHNlbGYgcmVmcmVzaCAoUEFTUikgbXVzdCBiZSBzZXQgaW4gdGhlIExvdy1wb3dlciBSZWdpc3Rlci48L2xpPg0KICogPGxpPiBTdGVwIDQuIEEgTk9QIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBTRFItU0RSQU0uIFByb2dyYW0gTk9QIGNvbW1hbmQgaW50byBNb2RlIFJlZ2lzdGVyLCB0aGUgYXBwbGljYXRpb24gbXVzdCANCiAqIHNldCBNb2RlIHRvIDEgaW4gdGhlIE1vZGUgUmVnaXN0ZXIuIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IFNEUi1TRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlIHRoaXMgY29tbWFuZC4gDQogKiBOb3cgdGhlIGNsb2NrIHdoaWNoIGRyaXZlcyBTRFItU0RSQU0gZGV2aWNlIGlzIGVuYWJsZWQuPC9saT4NCiAqIDxsaT4gU3RlcCA1LiBBbiBhbGwgYmFua3MgcHJlY2hhcmdlIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBTRFItU0RSQU0uIFByb2dyYW0gYWxsIGJhbmtzIHByZWNoYXJnZSBjb21tYW5kIGludG8gTW9kZSBSZWdpc3RlciwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1vZGUgdG8gMiBpbiB0aGUNCiAqIE1vZGUgUmVnaXN0ZXIgLiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBTRFJTRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlIHRoaXMgY29tbWFuZC48L2xpPg0KICogPGxpPiBTdGVwIDYuIEVpZ2h0IGF1dG8tcmVmcmVzaCAoQ0JSKSBjeWNsZXMgYXJlIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBhdXRvIHJlZnJlc2ggY29tbWFuZCAoQ0JSKSBpbnRvIE1vZGUgUmVnaXN0ZXIsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCBNb2RlIHRvIDQgaW4gdGhlIE1vZGUgUmVnaXN0ZXIuDQogKiBPbmNlIGluIHRoZSBpZGxlIHN0YXRlLCB0d28gQVVUTyBSRUZSRVNIIGN5Y2xlcyBtdXN0IGJlIHBlcmZvcm1lZC48L2xpPg0KICogPGxpPiBTdGVwIDcuIEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIFNEUlNEUkFNDQogKiBkZXZpY2VzLCBpbiBwYXJ0aWN1bGFyIENBUyBsYXRlbmN5IGFuZCBidXJzdCBsZW5ndGguIDwvbGk+DQogKiA8bGk+IFN0ZXAgOC4gRm9yIGxvdy1wb3dlciBTRFItU0RSQU0gaW5pdGlhbGl6YXRpb24sIGFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTKSBjeWNsZSBpcyBpc3N1ZWQgdG8gcHJvZ3JhbSB0aGUgU0RSLVNEUkFNIHBhcmFtZXRlcnMgKFRDU1IsIFBBU1IsIERTKS4gVGhlIHdyaXRlDQogKiBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDEgYW5kIEJBWzBdIGlzIHNldCB0byAwIDwvbGk+DQogKiA8bGk+IFN0ZXAgOS4gVGhlIGFwcGxpY2F0aW9uIG11c3QgZ28gaW50byBOb3JtYWwgTW9kZSwgc2V0dGluZyBNb2RlIHRvIDAgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgYXQgYW55IGxvY2F0aW9uIGluIHRoZSBTRFJBTSB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuPC9saT4NCiAqIDxsaT4gU3RlcCAxMC4gV3JpdGUgdGhlIHJlZnJlc2ggcmF0ZSBpbnRvIHRoZSBjb3VudCBmaWVsZCBpbiB0aGUgRERSU0RSQyBSZWZyZXNoIFRpbWVyIHJlZ2lzdGVyIDwvbGk+DQoqIDwvdWw+DQoqLw0KLypAeyovDQovKkB9Ki8NCg0KIA0KIA0KLyoqDQogKiBcZmlsZQ0KICoNCiAqIEltcGxlbWVudGF0aW9uIG9mIG1lbW9yaWVzIGNvbmZpZ3VyYXRpb24gb24gYm9hcmQuDQogKg0KICovDQoNCiANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiYm9hcmQuaCINCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRGVmaW5pYXRpb24NCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogDQoNCiNkZWZpbmUgRERSQzJfTU9ERV9OT1JNQUxfQ01EICAgICAgICgweDApIC8vIChIRERSU0RSQzIpIE5vcm1hbCBNb2RlDQojZGVmaW5lIEREUkMyX01PREVfTk9QX0NNRCAgICAgICAgICAoMHgxKSAvLyAoSEREUlNEUkMyKSBJc3N1ZSBhIE5PUCBDb21tYW5kIGF0IGV2ZXJ5IGFjY2Vzcw0KI2RlZmluZSBERFJDMl9NT0RFX1BSQ0dBTExfQ01EICAgICAgKDB4MikgLy8gKEhERFJTRFJDMikgSXNzdWUgYSBBbGwgQmFua3MgUHJlY2hhcmdlIENvbW1hbmQgYXQgZXZlcnkgYWNjZXNzDQojZGVmaW5lIEREUkMyX01PREVfTE1SX0NNRCAgICAgICAgICAoMHgzKSAvLyAoSEREUlNEUkMyKSBJc3N1ZSBhIExvYWQgTW9kZSBSZWdpc3RlciBhdCBldmVyeSBhY2Nlc3MNCiNkZWZpbmUgRERSQzJfTU9ERV9SRlNIX0NNRCAgICAgICAgICgweDQpIC8vIChIRERSU0RSQzIpIElzc3VlIGEgUmVmcmVzaA0KI2RlZmluZSBERFJDMl9NT0RFX0VYVF9MTVJfQ01EICAgICAgKDB4NSkgLy8gKEhERFJTRFJDMikgSXNzdWUgYW4gRXh0ZW5kZWQgTG9hZCBNb2RlIFJlZ2lzdGVyDQojZGVmaW5lIEREUkMyX01PREVfREVFUF9DTUQgICAgICAgICAoMHg2KSAvLyAoSEREUlNEUkMyKSBFbnRlciBEZWVwIFBvd2VyIE1vZGUNCiNkZWZpbmUgRERSQzJfTU9ERV9SZXNlcnZlZCAgICAgICAgICgweDcpIC8vIChIRERSU0RSQzIpIFJlc2VydmVkIHZhbHVlDQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIFxicmllZiBDaGFuZ2VzIHRoZSBtYXBwaW5nIG9mIHRoZSBjaGlwIHNvIHRoYXQgdGhlIHJlbWFwIGFyZWEgbWlycm9ycyB0aGUNCiAqIGludGVybmFsIFJPTSBvciB0aGUgRUJJIENTMC4NCiAqLw0Kdm9pZCBCT0FSRF9SZW1hcFJvbSggdm9pZCApDQp7DQogICAgTUFUUklYLT5NQVRSSVhfTVJDUiA9IE1BVFJJWF9NUkNSX1JDQjA7DQogICAgQVhJTVgtPkFYSU1YX1JFTUFQID0gMDsNCn0NCg0KLyoqDQogKiBcYnJpZWYgQ2hhbmdlcyB0aGUgbWFwcGluZyBvZiB0aGUgY2hpcCBzbyB0aGF0IHRoZSByZW1hcCBhcmVhIG1pcnJvcnMgdGhlDQogKiBpbnRlcm5hbCBSQU0uDQogKi8NCg0Kdm9pZCBCT0FSRF9SZW1hcFJhbSggdm9pZCApDQp7DQogICAgTUFUUklYLT5NQVRSSVhfTVJDUiA9IE1BVFJJWF9NUkNSX1JDQjA7DQogICAgQVhJTVgtPkFYSU1YX1JFTUFQID0gQVhJTVhfUkVNQVBfUkVNQVAwOw0KfQ0KDQovKioNCiAqIFxicmllZiBJbml0aWFsaXplIFZkZCBFQkkgZHJpdmUNCiAqIFxwYXJhbSAwOiAxLjhWIDE6IDMuM1YNCiAqLw0Kdm9pZCBCT0FSRF9Db25maWd1cmVWZGRNZW1TZWwoIHVpbnQ4X3QgVmRkTWVtU2VsICkNCnsNCiAgICAoIHZvaWQgKSBWZGRNZW1TZWw7DQp9DQogDQojZGVmaW5lIEREUjJfQkEwKHIpICgxIDw8ICgyNSArIHIpKQ0KI2RlZmluZSBERFIyX0JBMShyKSAoMSA8PCAoMjYgKyByKSkNCg0KLyogLS0tLS0tLS0gTVBERFJDX0RMTF9TT1IgOiAoTVBERFJDIE9mZnNldDogMHg3NCkgTVBERFJDIERMTCBTbGF2ZSBPZmZzZXQgUmVnaXN0ZXIgLS0tLS0tLS0gKi8NCi8vIFN4T0ZGOiBETEwgU2xhdmUgeCBEZWxheSBMaW5lIE9mZnNldCAoW3g9MC4uMV1beD0wLi4zXSkNCiNkZWZpbmUgTVBERFJDX0RMTF9TT1JfUzBfT0ZGX1BvcyAwDQojZGVmaW5lIE1QRERSQ19ETExfU09SX1MwX09GRl9Nc2sgKDB4MWZ1IDw8IE1QRERSQ19ETExfU09SX1MwX09GRl9Qb3MpIC8qKjwgXGJyaWVmIChNUEREUkNfRExMX1NPUikgRExMIFNsYXZlIDAgRGVsYXkgTGluZSBPZmZzZXQgKi8NCiNkZWZpbmUgTVBERFJDX0RMTF9TT1JfUzBfT0ZGKHZhbHVlKSAoKE1QRERSQ19ETExfU09SX1MwX09GRl9Nc2sgJiAoKHZhbHVlKSA8PCBNUEREUkNfRExMX1NPUl9TMF9PRkZfUG9zKSkpDQojZGVmaW5lIE1QRERSQ19ETExfU09SX1MxX09GRl9Qb3MgOA0KI2RlZmluZSBNUEREUkNfRExMX1NPUl9TMV9PRkZfTXNrICgweDFmdSA8PCBNUEREUkNfRExMX1NPUl9TMV9PRkZfUG9zKSAvKio8IFxicmllZiAoTVBERFJDX0RMTF9TT1IpIERMTCBTbGF2ZSAxIERlbGF5IExpbmUgT2Zmc2V0ICovDQojZGVmaW5lIE1QRERSQ19ETExfU09SX1MxX09GRih2YWx1ZSkgKChNUEREUkNfRExMX1NPUl9TMV9PRkZfTXNrICYgKCh2YWx1ZSkgPDwgTVBERFJDX0RMTF9TT1JfUzFfT0ZGX1BvcykpKQ0KI2RlZmluZSBNUEREUkNfRExMX1NPUl9TMl9PRkZfUG9zIDE2DQojZGVmaW5lIE1QRERSQ19ETExfU09SX1MyX09GRl9Nc2sgKDB4MWZ1IDw8IE1QRERSQ19ETExfU09SX1MyX09GRl9Qb3MpIC8qKjwgXGJyaWVmIChNUEREUkNfRExMX1NPUikgRExMIFNsYXZlIDIgRGVsYXkgTGluZSBPZmZzZXQgKi8NCiNkZWZpbmUgTVBERFJDX0RMTF9TT1JfUzJfT0ZGKHZhbHVlKSAoKE1QRERSQ19ETExfU09SX1MyX09GRl9Nc2sgJiAoKHZhbHVlKSA8PCBNUEREUkNfRExMX1NPUl9TMl9PRkZfUG9zKSkpDQojZGVmaW5lIE1QRERSQ19ETExfU09SX1MzX09GRl9Qb3MgMjQNCiNkZWZpbmUgTVBERFJDX0RMTF9TT1JfUzNfT0ZGX01zayAoMHgxZnUgPDwgTVBERFJDX0RMTF9TT1JfUzNfT0ZGX1BvcykgLyoqPCBcYnJpZWYgKE1QRERSQ19ETExfU09SKSBETEwgU2xhdmUgMyBEZWxheSBMaW5lIE9mZnNldCAqLw0KI2RlZmluZSBNUEREUkNfRExMX1NPUl9TM19PRkYodmFsdWUpICgoTVBERFJDX0RMTF9TT1JfUzNfT0ZGX01zayAmICgodmFsdWUpIDw8IE1QRERSQ19ETExfU09SX1MzX09GRl9Qb3MpKSkNCg0KDQovKioNCiAqIFxicmllZiBDb25maWd1cmVzIEREUjIgKE1UNDdIMTI4TTE2UlQgMTI4TUIvIE1UNDdINjRNMTZIUikNCiBNVDQ3SDY0TTE2SFIgOiA4IE1lZyB4IDE2IHggOCBiYW5rcw0KIFJlZnJlc2ggY291bnQ6IDhLDQogUm93IGFkZHJlc3M6IEFbMTI6MF0gKDhLKQ0KIENvbHVtbiBhZGRyZXNzIEFbOTowXSAoMUspDQogQmFuayBhZGRyZXNzIEJBWzI6MF0gYSgyNCwyNSkgKDgpIA0KICovDQoNCnZvaWQgQk9BUkRfQ29uZmlndXJlRGRyYW0oIHVpbnQ4X3QgZGV2aWNlICkNCnsNCiAgICB2b2xhdGlsZSB1aW50OF90ICpwRGRyID0gKHVpbnQ4X3QgKikgRERSX0NTX0FERFI7DQogICAgdm9sYXRpbGUgdWludDMyX3QgaTsNCiAgICB2b2xhdGlsZSB1aW50MzJfdCBjciA9IDA7DQogICAgdm9sYXRpbGUgdWludDMyX3QgZHVtbXlfdmFsdWU7DQoNCiAgICBkdW1teV92YWx1ZSA9IDB4MDAwMDAwMDA7DQogICANCiAgICAvKiBFbmFibGUgRERSMiBjbG9jayB4MiBpbiBQTUMgKi8NCiAgICBQTUMtPlBNQ19QQ0VSMSA9ICgxIDw8IChJRF9NUEREUkMtMzIpKTsNCiAgICBQTUMtPlBNQ19TQ0VSICB8PSBQTUNfU0NFUl9ERFJDSzsNCiAgICBNUEREUkMtPk1QRERSQ19MUFIgPSAwOw0KDQogICAgTVBERFJDLT5NUEREUkNfRExMX1NPUiA9IDB4MTAxIHwgTVBERFJDX0RMTF9TT1JfUzFfT0ZGKDB4MCkgfCBNUEREUkNfRExMX1NPUl9TMl9PRkYoMHgxKSB8IE1QRERSQ19ETExfU09SX1MzX09GRigweDEpOw0KICAgIE1QRERSQy0+TVBERFJDX0RMTF9NT1IgPSAoMHhDNTAwMDAwMCkgfCBNUEREUkNfRExMX01PUl9NT0ZGKDcpIHwgTVBERFJDX0RMTF9NT1JfQ0xLOTBPRkYoMHgxRikgIHwgTVBERFJDX0RMTF9NT1JfU0VMT0ZGOyAgLy8gS2V5ID0gMHhjNTAwMDAwMCANCiAgICBkdW1teV92YWx1ZSAgPSAgTVBERFJDLT5NUEREUkNfSU9fQ0FMSUJSOw0KICAgIGR1bW15X3ZhbHVlICY9IH5NUEREUkNfSU9fQ0FMSUJSX1JESVZfTXNrOw0KICAgIGR1bW15X3ZhbHVlICY9IH5NUEREUkNfSU9fQ0FMSUJSX1RaUUlPX01zazsNCiAgICBkdW1teV92YWx1ZSB8PSBNUEREUkNfSU9fQ0FMSUJSX1JESVZfUlpRXzQ4Ow0KICAgIGR1bW15X3ZhbHVlIHw9IE1QRERSQ19JT19DQUxJQlJfVFpRSU8oMyk7DQogICAgTVBERFJDLT5NUEREUkNfSU9fQ0FMSUJSID0gZHVtbXlfdmFsdWU7DQogICAgKih1aW50MzJfdCAqKTB4RkZGRkVBODAgPSAweDExMDA7DQogICAgKih1aW50MzJfdCAqKTB4RkZGRkVBODQgPSAweDExMDA7DQogICAgKih1aW50MzJfdCAqKTB4RkZGRkVBODggPSAweDExMDA7DQogICAgKih1aW50MzJfdCAqKTB4RkZGRkVBOEMgPSAweDExMDA7DQoNCi8qIFN0ZXAgMTogUHJvZ3JhbSB0aGUgbWVtb3J5IGRldmljZSB0eXBlICovDQogICAgLyogREJXID0gMCAoMzIgYml0cyBidXMgd2lkZSk7IE1lbW9yeSBEZXZpY2UgPSA2ID0gRERSMi1TRFJBTSA9IDB4MDAwMDAwMDYqLw0KICAgIE1QRERSQy0+TVBERFJDX01EID0gTVBERFJDX01EX01EX0REUjJfU0RSQU07DQogDQovKiBTdGVwIDI6IFByb2dyYW0gdGhlIGZlYXR1cmVzIG9mIEREUjItU0RSQU0gZGV2aWNlIGludG8gdGhlIFRpbWluZyBSZWdpc3Rlci4qLw0KICAgIGlmIChkZXZpY2UgPT0gRERSQU1fTVQ0N0gxMjhNMTZSVCkNCiAgICB7DQogICAgICAgIE1QRERSQy0+TVBERFJDX0NSID0gTVBERFJDX0NSX05SXzE0ICB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9OQ18xMCAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfQ0FTXzRfRERSMiB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9OQl84IHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfRExMX1JFU0VUX0RJU0FCTEVEIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfRFFNU19OT1RfU0hBUkVEIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfRU5SRE1fT0ZGIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfVU5BTF9TVVBQT1JURUQgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9ORFFTX0RJU0FCTEVEIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfT0NEKDB4MCk7DQogICAgfQ0KICAgIGlmIChkZXZpY2UgPT0gRERSQU1fTVQ0N0g2NE0xNkhSKQ0KICAgIHsNCiAgICAgICAgTVBERFJDLT5NUEREUkNfQ1IgPSBNUEREUkNfQ1JfTlJfMTMgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfTkNfMTAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfQ0FTXzNfRERSMnwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX05CXzggfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9ETExfUkVTRVRfRElTQUJMRUQgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9EUU1TX05PVF9TSEFSRUQgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9FTlJETV9PRkYgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9VTkFMX1NVUFBPUlRFRCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX05EUVNfRElTQUJMRUQgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9PQ0QoMHgwKTsNCiAgICB9DQoNCiAgICBNUEREUkMtPk1QRERSQ19UUFIwID0gTVBERFJDX1RQUjBfVFJBUyg2KSAgICAvLyAgNiAqIDcuNSA9IDQ1IG5zDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RSQ0QoMikgICAgLy8gIDIgKiA3LjUgPSAxNSBucw0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMF9UV1IoMykgICAgIC8vICAzICogNy41ID0gMjIuNSBucw0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMF9UUkMoOCkgICAgIC8vICA4ICogNy41ID0gNjAgbnMNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjBfVFJQKDIpICAgICAvLyAgMiAqIDcuNSA9IDE1IG5zDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RSUkQoMikgICAgLy8gIDIgKiA3LjUgPSAxNSBucw0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMF9UV1RSKDIpICAgIC8vICAyIGNsb2NrIGN5Y2xlDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RNUkQoMik7ICAgLy8gIDIgY2xvY2sgY3ljbGVzDQoNCiAgICBNUEREUkMtPk1QRERSQ19UUFIxID0gTVBERFJDX1RQUjFfVFJGQygweDFBKSAgIC8vIDE4ICogNy41ID0gMTM1IG5zIChtaW4gMTI3LjUgbnMgZm9yIDFHYiBERFIpDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIxX1RYU05SKDB4MUMpICAvLyAyMCAqIDcuNSA+IDE0Mi41bnMgVFhTTlI6IEV4aXQgc2VsZiByZWZyZXNoIGRlbGF5IHRvIG5vbiByZWFkIGNvbW1hbmQNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjFfVFhTUkQoMHhDOCkgLy8gbWluIDIwMCBjbG9jayBjeWNsZXMsIFRYU1JEOiBFeGl0IHNlbGYgcmVmcmVzaCBkZWxheSB0byBSZWFkIGNvbW1hbmQNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjFfVFhQKDB4Mik7ICAgIC8vICAyICogNy41ID0gMTUgbnMNCg0KICAgIE1QRERSQy0+TVBERFJDX1RQUjIgPSBNUEREUkNfVFBSMl9UWEFSRCg4KSAgIC8vICBtaW4gMiBjbG9jayBjeWNsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMl9UWEFSRFMoNykvLyAgbWluIDcgY2xvY2sgY3ljbGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjJfVFJQQSgyKSAgLy8gIG1pbiAxOG5zDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjJfVFJUUCgyKSAgLy8gIDIgKiA3LjUgPSAxNSBucyAobWluIDcuNW5zKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIyX1RGQVcoNykgOw0KDQogICAgLyogRERSU0RSQyBMb3ctcG93ZXIgUmVnaXN0ZXIgKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTMzMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0gDQogICAgTVBERFJDLT5NUEREUkNfTFBSID0gTVBERFJDX0xQUl9MUENCX0RJU0FCTEVEIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0xQUl9DTEtfRlJfRElTQUJMRUQgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfTFBSX1RJTUVPVVRfMCB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19MUFJfQVBERV9TTE9XIDsNCg0KLyogU3RlcCAzOiBBbiBOT1AgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIEREUjItU0RSQU0uIFByb2dyYW0gdGhlIE5PUCBjb21tYW5kIGludG8NCiAgICB0aGUgTW9kZSBSZWdpc3RlciwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1PREUgdG8gMSBpbiB0aGUgTW9kZSBSZWdpc3Rlci4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX05PUF9DTUQ7DQogICAgLyogUGVyZm9ybSBhIHdyaXRlIGFjY2VzcyB0byBhbnkgRERSMi1TRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlIHRoaXMgY29tbWFuZCAqLw0KICAgICpwRGRyID0gMDsgIC8qIE5vdyBjbG9ja3Mgd2hpY2ggZHJpdmUgRERSMi1TRFJBTSBkZXZpY2UgYXJlIGVuYWJsZWQuKi8NCiAgIA0KICAgIC8qIEEgbWluaW11bSBwYXVzZSBvZiAyMDAgpsxzIGlzIHByb3ZpZGVkIHRvIHByZWNlZGUgYW55IHNpZ25hbCB0b2dnbGUuICg2IGNvcmUgY3ljbGVzIHBlciBpdGVyYXRpb24sIGNvcmUgaXMgYXQgMzk2TUh6OiBtaW4gMTMyMDAgbG9vcHMpICovDQogICAgZm9yIChpID0gMDsgaSA8IDEzMzAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9IA0KIA0KLyogU3RlcCA0OiAgQW4gTk9QIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBERFIyLVNEUkFNICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9OT1BfQ01EOw0KICAgIC8qIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuKi8NCiAgICAqcERkciA9IDA7IC8qIE5vdyBDS0UgaXMgZHJpdmVuIGhpZ2guKi8NCiAgICAvKiB3YWl0IDQwMCBucyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQogDQovKiBTdGVwIDU6IEFuIGFsbCBiYW5rcyBwcmVjaGFyZ2UgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIEREUjItU0RSQU0uICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9QUkNHQUxMX0NNRDsNCiAgICAvKiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kLiovDQogICAgKnBEZHIgPSAwOw0KICAgIC8qIHdhaXQgNDAwIG5zIG1pbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KLyogU3RlcCA2OiBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzIpIGN5Y2xlIGlzICBpc3N1ZWQgdG8gY2hvc2UgYmV0d2VlbiBjb21tZXJjaWFsb3IgaGlnaCAgdGVtcGVyYXR1cmUgb3BlcmF0aW9ucy4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX0VYVF9MTVJfQ01EOw0KICAgICooKHVpbnQ4X3QgKikocERkciArIEREUjJfQkExKGRldmljZSkpKSA9IDA7IC8qIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDEgYW5kIEJBWzBdIGlzIHNldCB0byAwLiAqLw0KICAgIC8qIHdhaXQgMiBjeWNsZXMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDc6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMykgY3ljbGUgaXMgaXNzdWVkIHRvIHNldCBhbGwgcmVnaXN0ZXJzIHRvIDAuICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9FWFRfTE1SX0NNRDsNCiAgICAqKCh1aW50OF90ICopKHBEZHIgKyBERFIyX0JBMShkZXZpY2UpICsgRERSMl9CQTAoZGV2aWNlKSkpID0gMDsgIC8qIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDEgYW5kIEJBWzBdIGlzIHNldCB0byAxLiovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCiAvKiBTdGVwIDg6ICBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzEpIGN5Y2xlIGlzIGlzc3VlZCB0byBlbmFibGUgRExMLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfRVhUX0xNUl9DTUQ7DQogICAgKigodWludDhfdCAqKShwRGRyICsgRERSMl9CQTAoZGV2aWNlKSkpID0gMDsgIC8qIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDAgYW5kIEJBWzBdIGlzIHNldCB0byAxLiAqLw0KICAgIC8qIEFuIGFkZGl0aW9uYWwgMjAwIGN5Y2xlcyBvZiBjbG9jayBhcmUgcmVxdWlyZWQgZm9yIGxvY2tpbmcgRExMICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgOTogIFByb2dyYW0gRExMIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuKi8NCiAgICBjciA9IE1QRERSQy0+TVBERFJDX0NSOw0KICAgIE1QRERSQy0+TVBERFJDX0NSID0gY3IgfCBNUEREUkNfQ1JfRExMX1JFU0VUX0VOQUJMRUQ7DQoNCi8qIFN0ZXAgMTA6IEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHJlc2V0IERMTC4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX0xNUl9DTUQ7DQogICAgKihwRGRyKSA9IDA7ICAvKiBUaGUgd3JpdGUgYWRkcmVzcyBtdXN0IGJlIGNob3NlbiBzbyB0aGF0IEJBWzE6MF0gYml0cyBhcmUgc2V0IHRvIDAuICovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQogDQovKiBTdGVwIDExOiBBbiBhbGwgYmFua3MgcHJlY2hhcmdlIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBERFIyLVNEUkFNLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfUFJDR0FMTF9DTUQ7DQogICAgKihwRGRyKSA9IDA7ICAvKiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kICovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgMTI6IFR3byBhdXRvLXJlZnJlc2ggKENCUikgY3ljbGVzIGFyZSBwcm92aWRlZC4gUHJvZ3JhbSB0aGUgYXV0byByZWZyZXNoIGNvbW1hbmQgKENCUikgaW50byB0aGUgTW9kZSBSZWdpc3Rlci4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX1JGU0hfQ01EOw0KICAgICoocERkcikgPSAwOyAgLyogUGVyZm9ybSBhIHdyaXRlIGFjY2VzcyB0byBhbnkgRERSMi1TRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlIHRoaXMgY29tbWFuZCAqLw0KICAgIC8qIHdhaXQgMiBjeWNsZXMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KICAgIC8qIENvbmZpZ3VyZSAybmQgQ0JSLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfUkZTSF9DTUQ7DQogICAgKihwRGRyKSA9IDA7ICAvKiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kICovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgMTM6IFByb2dyYW0gRExMIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgdG8gbG93KERpc2FibGUgRExMIHJlc2V0KS4gKi8NCiAgICBjciA9IE1QRERSQy0+TVBERFJDX0NSOw0KICAgIE1QRERSQy0+TVBERFJDX0NSID0gY3IgJiAofk1QRERSQ19DUl9ETExfUkVTRVRfRU5BQkxFRCk7DQoNCi8qIFN0ZXAgMTQ6IEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIEREUjItU0RSQU0gZGV2aWNlcy4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX0xNUl9DTUQ7DQogICAgKihwRGRyKSA9IDA7ICAvKiBUaGUgd3JpdGUgYWRkcmVzcyBtdXN0IGJlIGNob3NlbiBzbyB0aGF0IEJBWzE6MF0gYXJlIHNldCB0byAwLiAqLw0KICAgIC8qIHdhaXQgMiBjeWNsZXMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDE1OiBQcm9ncmFtIE9DRCBmaWVsZCBpbnRvIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIHRvIGhpZ2ggKE9DRCBjYWxpYnJhdGlvbiBkZWZhdWx0KS4gKi8NCiAgICBjciA9IE1QRERSQy0+TVBERFJDX0NSOw0KICAgIE1QRERSQy0+TVBERFJDX0NSID0gY3IgfCBNUEREUkNfQ1JfT0NEKDB4MDcpOw0KDQovKiBTdGVwIDE2OiBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzEpIGN5Y2xlIGlzIGlzc3VlZCB0byBPQ0QgZGVmYXVsdCB2YWx1ZS4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX0VYVF9MTVJfQ01EOw0KICAgICooKHVpbnQ4X3QgKikocERkciArIEREUjJfQkEwKGRldmljZSkpKSA9IDA7ICAvKiBUaGUgd3JpdGUgYWRkcmVzcyBtdXN0IGJlIGNob3NlbiBzbyB0aGF0IEJBWzFdIGlzIHNldCB0byAwIGFuZCBCQVswXSBpcyBzZXQgdG8gMS4qLw0KICAgIC8qIHdhaXQgMiBjeWNsZXMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDE3OiBQcm9ncmFtIE9DRCBmaWVsZCBpbnRvIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIHRvIGxvdyAoT0NEIGNhbGlicmF0aW9uIG1vZGUgZXhpdCkuICovDQogICAvLyBjciA9IE1QRERSQy0+TVBERFJDX0NSOw0KICAgLy8gTVBERFJDLT5NUEREUkNfQ1IgPSBjciAgJiAofiBNUEREUkNfQ1JfT0NEKDB4MDcpKTsNCg0KLyogU3RlcCAxODogQW4gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBzZXQgKEVNUlMxKSBjeWNsZSBpcyBpc3N1ZWQgdG8gZW5hYmxlIE9DRCBleGl0LiovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9FWFRfTE1SX0NNRDsNCiAgICAqKCh1aW50OF90ICopKHBEZHIgKyBERFIyX0JBMChkZXZpY2UpKSkgPSAwOyAgLyogVGhlIHdyaXRlIGFkZHJlc3MgbXVzdCBiZSBjaG9zZW4gc28gdGhhdCBCQVsxXSBpcyBzZXQgdG8gMCBhbmQgQkFbMF0gaXMgc2V0IHRvIDEuKi8NCiAgICAvKiB3YWl0IDIgY3ljbGVzIG1pbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KLyogU3RlcCAxOSwyMDogQSBtb2RlIE5vcm1hbCBjb21tYW5kIGlzIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBOb3JtYWwgbW9kZSBpbnRvIE1vZGUgUmVnaXN0ZXIuICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9OT1JNQUxfQ01EOw0KICAgICoocERkcikgPSAwOw0KDQovKiBTdGVwIDIxOiBXcml0ZSB0aGUgcmVmcmVzaCByYXRlIGludG8gdGhlIGNvdW50IGZpZWxkIGluIHRoZSBSZWZyZXNoIFRpbWVyIHJlZ2lzdGVyLiBUaGUgRERSMi1TRFJBTSBkZXZpY2UgcmVxdWlyZXMgYSByZWZyZXNoIGV2ZXJ5IDE1LjYyNSCmzHMgb3IgNy44MSCmzHMuIA0KICAgV2l0aCBhIDEwME1IeiBmcmVxdWVuY3ksIHRoZSByZWZyZXNoIHRpbWVyIGNvdW50IHJlZ2lzdGVyIG11c3QgdG8gYmUgc2V0IHdpdGggKDE1LjYyNSAvMTAwIE1IeikgPSAxNTYyIGkuZS4gMHgwNjFBIG9yICg3LjgxIC8xMDBNSHopID0gNzgxIGkuZS4gMHgwMzBkLiAqLw0KICAgIC8qIEZvciBNVDQ3SDY0TTE2SFIsIFRoZSByZWZyZXNoIHBlcmlvZCBpcyA2NG1zIChjb21tZXJjaWFsKSwgVGhpcyBlcXVhdGVzIHRvIGFuIGF2ZXJhZ2UNCiAgICAgICByZWZyZXNoIHJhdGUgb2YgNy44MTI1psxzIChjb21tZXJjaWFsKSwgVG8gZW5zdXJlIGFsbCByb3dzIG9mIGFsbCBiYW5rcyBhcmUgcHJvcGVybHkgDQogICAgICAgcmVmcmVzaGVkLCA4MTkyIFJFRlJFU0ggY29tbWFuZHMgbXVzdCBiZSBpc3N1ZWQgZXZlcnkgNjRtcyAoY29tbWVyY2lhbCkgKi8NCiAgICAvKiAoKDY0IHggMTAoXi0zKSkvODE5MikgeDEzMyB4ICgxMF42KSAqLw0KICAgIC8vTVBERFJDLT5NUEREUkNfUlRSID0gTVBERFJDX1JUUl9DT1VOVCgzMDApOyAvKiBTZXQgUmVmcmVzaCB0aW1lciA3LjgxMjUgdXMqLw0KICAgIE1QRERSQy0+TVBERFJDX1JUUiA9IDB4MDAzMDA0MDg7DQogICAgLyogT0sgbm93IHdlIGFyZSByZWFkeSB0byB3b3JrIG9uIHRoZSBERFJTRFIgKi8NCiAgICAvKiB3YWl0IGZvciBlbmQgb2YgY2FsaWJyYXRpb24gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCIgICAgbm9wIik7DQogICAgfQ0KfQ0KDQoNCi8qKg0KICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIEVCSSBmb3IgU2RyYW0gKExQU0RSIE1pY3JvbiBNVDQ4SDhNMTYpIGFjY2Vzcy4NCiAqLw0Kdm9pZCBCT0FSRF9Db25maWd1cmVTZHJhbSggdm9pZCApDQp7DQp9DQoNCi8qKiBcYnJpZWYgQ29uZmlndXJlcyB0aGUgRUJJIGZvciBOYW5kRmxhc2ggYWNjZXNzIGF0IDEzM01oei4NCiAqLw0Kdm9pZCBCT0FSRF9Db25maWd1cmVOYW5kRmxhc2goIHVpbnQ4X3QgYnVzV2lkdGggKQ0Kew0KICAgIFBNQ19FbmFibGVQZXJpcGhlcmFsKElEX1NNQyk7DQogICAgU01DLT5TTUNfQ1NfTlVNQkVSWzNdLlNNQ19TRVRVUCA9IDANCiAgICAgICAgICAgICAgICAgICAgfCBTTUNfU0VUVVBfTldFX1NFVFVQKDEpDQogICAgICAgICAgICAgICAgICAgIHwgU01DX1NFVFVQX05DU19XUl9TRVRVUCgxKQ0KICAgICAgICAgICAgICAgICAgICB8IFNNQ19TRVRVUF9OUkRfU0VUVVAoMikNCiAgICAgICAgICAgICAgICAgICAgfCBTTUNfU0VUVVBfTkNTX1JEX1NFVFVQKDEpOw0KDQogICAgU01DLT5TTUNfQ1NfTlVNQkVSWzNdLlNNQ19QVUxTRSA9IDANCiAgICAgICAgICAgICAgICAgICAgfCBTTUNfUFVMU0VfTldFX1BVTFNFKDUpDQogICAgICAgICAgICAgICAgICAgIHwgU01DX1BVTFNFX05DU19XUl9QVUxTRSg3KQ0KICAgICAgICAgICAgICAgICAgICB8IFNNQ19QVUxTRV9OUkRfUFVMU0UoNSkNCiAgICAgICAgICAgICAgICAgICAgfCBTTUNfUFVMU0VfTkNTX1JEX1BVTFNFKDcpOw0KDQogICAgU01DLT5TTUNfQ1NfTlVNQkVSWzNdLlNNQ19DWUNMRSA9IDANCiAgICAgICAgICAgICAgICAgICAgfCBTTUNfQ1lDTEVfTldFX0NZQ0xFKDgpDQogICAgICAgICAgICAgICAgICAgIHwgU01DX0NZQ0xFX05SRF9DWUNMRSg5KTsNCg0KICAgIFNNQy0+U01DX0NTX05VTUJFUlszXS5TTUNfVElNSU5HUyA9IFNNQ19USU1JTkdTX1RDTFIoMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU01DX1RJTUlOR1NfVEFETCgxMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU01DX1RJTUlOR1NfVEFSKDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNNQ19USU1JTkdTX1RSUig0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTTUNfVElNSU5HU19UV0IoNSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU01DX1RJTUlOR1NfUkJOU0VMKDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KFNNQ19USU1JTkdTX05GU0VMKTsNCiAgICBTTUMtPlNNQ19DU19OVU1CRVJbM10uU01DX01PREUgPSBTTUNfTU9ERV9SRUFEX01PREUgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUNfTU9ERV9XUklURV9NT0RFIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChidXNXaWR0aCA9PSA4ICk/IFNNQ19NT0RFX0RCV19CSVRfOCA6U01DX01PREVfREJXX0JJVF8xNikgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUNfTU9ERV9UREZfQ1lDTEVTKDEpOw0KfQ0KDQp2b2lkIEJPQVJEX0NvbmZpZ3VyZU5vckZsYXNoKCB1aW50OF90IGJ1c1dpZHRoICkNCnsNCiAgICB1aW50MzJfdCBkYnc7DQogICAgUE1DX0VuYWJsZVBlcmlwaGVyYWwoSURfU01DKTsNCiAgICBpZiAoYnVzV2lkdGggPT0gOCkgDQogICAgew0KICAgICAgICBkYncgPSBTTUNfTU9ERV9EQldfQklUXzg7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBkYncgPSBTTUNfTU9ERV9EQldfQklUXzE2Ow0KICAgIH0NCiAgICAvKiBDb25maWd1cmUgU01DLCBOQ1MwIGlzIGFzc2lnbmVkIHRvIGEgbm9yZmxhc2ggKi8NCiAgICBTTUMtPlNNQ19DU19OVU1CRVJbMF0uU01DX1NFVFVQID0gMHgwMDAyMDAwMTsNCiAgICBTTUMtPlNNQ19DU19OVU1CRVJbMF0uU01DX1BVTFNFID0gMHgwQjBCMEEwQTsNCiAgICBTTUMtPlNNQ19DU19OVU1CRVJbMF0uU01DX0NZQ0xFID0gMHgwMDBFMDAwQjsNCiAgICBTTUMtPlNNQ19DU19OVU1CRVJbMF0uU01DX1RJTUlOR1MgPSAweDAwMDAwMDAwOw0KICAgIFNNQy0+U01DX0NTX05VTUJFUlswXS5TTUNfTU9ERSAgPSBTTUNfTU9ERV9XUklURV9NT0RFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNNQ19NT0RFX1JFQURfTU9ERQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYncNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU01DX01PREVfRVhOV19NT0RFX0RJU0FCTEVEDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNNQ19NT0RFX1RERl9DWUNMRVMoMSk7DQoNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vICBGdW5jdGlvbiBOYW1lICAgICAgIDogTFBERFIyX0luaXRpYWxpemUNCi8vICBPYmplY3QgICAgICAgICAgICAgIDogDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQp2b2lkIEJPQVJEX0NvbmZpZ3VyZUxwRGRyYW0oIHZvaWQpICANCnsNCiAgICB2b2xhdGlsZSB1aW50MzJfdCBpOw0KICAgIHZvbGF0aWxlIHVpbnQzMl90IGR1bW15X3ZhbHVlOw0KICAgIFBNQy0+UE1DX1BDRVIxID0gKDEgPDwgKElEX01QRERSQy0zMikpOw0KICAgIFBNQy0+UE1DX1NDRVIgIHw9IFBNQ19TQ0VSX0REUkNLOw0KICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEFkZGl0aW9uYWwgRERSMiBzZXR0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQogICAgTVBERFJDLT5NUEREUkNfRExMX1NPUiA9IE1QRERSQ19ETExfU09SX1MwX09GRigweDQpIHwgTVBERFJDX0RMTF9TT1JfUzFfT0ZGKDB4MykgfCBNUEREUkNfRExMX1NPUl9TMl9PRkYoMHg0KSB8IE1QRERSQ19ETExfU09SX1MzX09GRigweDQpOyAgLy8gZGVzaWduIHJlY29tbWVuZGF0aW9uDQogICAgTVBERFJDLT5NUEREUkNfRExMX01PUiA9ICgweEM1MDAwMDAwKSB8IE1QRERSQ19ETExfTU9SX01PRkYoNykgfCBNUEREUkNfRExMX01PUl9DTEs5ME9GRigweDFGKSAgfCBNUEREUkNfRExMX01PUl9TRUxPRkY7ICAvLyBLZXkgPSAweGM1MDAwMDAwIA0KDQogICAgZHVtbXlfdmFsdWUgID0gIE1QRERSQy0+TVBERFJDX0lPX0NBTElCUjsNCiAgICBkdW1teV92YWx1ZSAmPSB+TVBERFJDX0lPX0NBTElCUl9SRElWX01zazsNCiAgICBkdW1teV92YWx1ZSAmPSB+TVBERFJDX0lPX0NBTElCUl9UWlFJT19Nc2s7DQogICAgZHVtbXlfdmFsdWUgfD0gKDB4NCA8PCAwKTsNCiAgICBkdW1teV92YWx1ZSB8PSBNUEREUkNfSU9fQ0FMSUJSX1RaUUlPKDMpOw0KDQogICAgTVBERFJDLT5NUEREUkNfSU9fQ0FMSUJSID0gZHVtbXlfdmFsdWU7DQogICAgLyogRERSU0RSQyBIaWdoIFNwZWVkIFJlZ2lzdGVyIChNUEREUkNfSFMpICA6IGhpZGRlbiBvcHRpb24gLT4gY2FsaWJyYXRpb24gZHVyaW5nIGF1dG9yZWZyZXNoICovDQogICAgKih1aW50MzJfdCAqKTB4RkZGRkVBMjQgfD0gKDEgPDwgNSk7DQogICAgDQogICAgLyogU0ZSX0REUkNGRyAgRERSIENvbmZpZ3VyYXRpb24gIEZvcmNlIEREUl9EUSBhbmQgRERSX0RRUyBpbnB1dCBidWZmZXIgYWx3YXlzIG9uICovICAgDQogICAgKih1aW50MzJfdCAqKTB4RjAwMzgwMDQgfD0gKDB4MyA8PCAxNik7DQogICANCiAgICAvKiAgICAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBTVEVQIDENCiAgICAgIFByb2dyYW0gdGhlIG1lbW9yeSBkZXZpY2UgdHlwZSBpbnRvIHRoZSBNZW1vcnkgRGV2aWNlIFJlZ2lzdGVyICovDQoNCiAgICAvKiAgIE1lbW9yeSBkZXZpY2UgPSBMUEREUjIgPT4gTVBERFJDX01EX01EX0xQRERSMl9TRFJBTQ0KICAgICAgRGF0YSBidXMgd2lkdGggPSAzMiBiaXRzID0+IDB4MCAoVGhlIHN5c3RlbSBpcyBpbiA2NCBiaXRzLCB0aHVzIG1lbW9yeSBkYXRhIGJ1cyB3aWR0aCBzaG91bGQgYmUgMzIgYml0cykgKi8NCiAgICBNUEREUkMtPk1QRERSQ19NRCA9IE1QRERSQ19NRF9NRF9MUEREUjJfU0RSQU07DQoNCg0KLyogICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgU1RFUCAyDQogICAgUHJvZ3JhbSB0aGUgZmVhdHVyZXMgb2YgTG93LXBvd2VyIEREUjItU0RSQU0gZGV2aWNlIGludG8gdGhlIFRpbWluZyBSZWdpc3RlciANCiAgICAoYXN5bmNocm9ub3VzIHRpbWluZywgdHJjLCB0cmFzLCBldGMuKSBhbmQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAobnVtYmVyIG9mDQogICAgY29sdW1ucywgcm93cywgYmFua3MsIENBUyBsYXRlbmN5IGFuZCBvdXRwdXQgZHJpdmUgc3RyZW5ndGgpIChzZWUgU2VjdGlvbiA4LjMgb24NCiAgICBwYWdlIDM1LCBTZWN0aW9uIDguNCBvbiBwYWdlIDM5IGFuZCBTZWN0aW9uIDgwLjUgb24gcGFnZSA0MSkuICovIA0KICAgIE1QRERSQy0+TVBERFJDX0NSID0gIE1QRERSQ19DUl9OQ18xMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX05SXzE0IHwNCiAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfQ0FTXzVfTFBERFIyICAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9OQl84ICAgICAgICAgICB8DQogICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX1VOQUxfU1VQUE9SVEVEIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfRU5SRE1fT047DQogICAgTVBERFJDLT5NUEREUkNfTFBERFIyX0xQUiB8PSBNUEREUkNfTFBERFIyX0xQUl9EUygweDMpOw0KDQogICAgTVBERFJDLT5NUEREUkNfVFBSMCA9IE1QRERSQ19UUFIwX1RSQVMgKDYpICAgIHwgLy8gMDMgLSBUUkFTIHRSQVMgUm93IGFjdGl2ZSB0aW1lDQogICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19UUFIwX1RSQ0QgKDIpICAgIHwgLy8gMDQgLSBUUkMgdFJDRCBSQVMtdG8tQ0FTIGRlbGF5DQogICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19UUFIwX1RXUiAgKDMpICAgIHwgLy8gMDUgLSBUV1IgdFdSIFdSSVRFIHJlY292ZXJ5IHRpbWUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX1RQUjBfVFJDICAoOCkgICAgfCAvLyAwNiAtIFRSQyB0UkMgQUNUSS10by1BQ1RJVlQgY29tbWFuZCBwZXJpb2QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX1RQUjBfVFJQICAoMykgICAgfCAvLyAwNyAtIFRSUCB0UlBwYiAgUm93IHByZWNoYXJnZSB0aW1lDQogICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19UUFIwX1RSUkQgKDIpICAgIHwgLy8gMDggLSBUUlJEIHRSUkQgQWN0aXZlIGJhbmsgYSB0byBhY3RpdmUgYmFuayBiDQogICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19UUFIwX1RXVFIgKDIpICAgIHwgLy8gMDkgLSBUV1RSLXRXVFIgSW50ZXJuYWwgV1JJVEUtdG8tUkVBRGNvbW1hbmQgZGVsYXkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX1RQUjBfVE1SRCAoMyk7ICAgIC8vIDEwIC0gVE1SRC10TVJEDQoNCiAgICBNUEREUkMtPk1QRERSQ19UUFIxID0gTVBERFJDX1RQUjFfVFJGQyAgKDE3KSAgfCAvLyAxMSAtIFRSRkMgdFJGQ2FiIFJlZnJlc2ggY3ljbGUgdGltZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfVFBSMV9UWFNOUiAoMTgpICB8IC8vIDEyIC0gVFhTTlIgICBTRUxGIFJFRlJFU0ggZXhpdCB0byBuZXh0IHZhbGlkIGRlbGF5DQogICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19UUFIxX1RYU1JEICgxNCkgIHwgLy8gMTMgLSBUWFNSRCBFeGl0IFNlbGYgUmVmcmVzaA0KICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfVFBSMV9UWFAgICAoMik7ICAgIC8vIDE0IC0gVFhQLXRYUCBFeGl0IHBvd2VyLWRvd24NCg0KICAgIE1QRERSQy0+TVBERFJDX1RQUjIgPSBNUEREUkNfVFBSMl9UWEFSRCAgKDEpICB8IC8vIDE1IC0gVFhBUkQtdHhBUkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX1RQUjJfVFhBUkRTICgxKSAgfCAvLyAxNiAtIFRYQVJEUy10eEFSRHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX1RQUjJfVFJQQSAgICgzKSAgfCAvLyAxNyAtIFRSUEEtdFJQcGFiIFJvdyBwcmVjaGFyZ2UgdGltZSAoYWxsIGJhbmtzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfVFBSMl9UUlRQICAgKDIpICB8IC8vIDE4IC0gVFJUUC10UlRQDQogICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19UUFIyX1RGQVcgICAoOCk7ICAgLy8gMTkgLSBURkFXLXRGQVcNCg0KLyogIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlIFNURVAgMw0KICAgIEFuIE5PUCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgTG93LXBvd2VyIEREUjItU0RSQU0uIFByb2dyYW0gdGhlIE5PUA0KICAgIGNvbW1hbmQgaW50byB0aGUgTW9kZSBSZWdpc3RlciwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IHRoZSBNT0RFIChNRERSQyBDb21tYW5kDQogICAgTW9kZSkgZmllbGQgdG8gMSBpbiB0aGUgTW9kZSBSZWdpc3RlciAoc2VlIFNlY3Rpb24gOC4xIG9uIHBhZ2UgMzIpLiBQZXJmb3JtIGENCiAgICB3cml0ZSBhY2Nlc3MgdG8gYW55IExvdy1wb3dlciBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kLg0KICAgIE5vdywgY2xvY2tzIHdoaWNoIGRyaXZlIExvdy1wb3dlciBERFIyLVNEUkFNIGRldmljZXMgYXJlIGVuYWJsZWQuDQogICAgQSBtaW5pbXVtIHBhdXNlIG9mIDEwMCBucyBtdXN0IGJlIG9ic2VydmVkIHRvIHByZWNlZGUgYW55IHNpZ25hbCB0b2dnbGUuICovDQoNCiAgICBNUEREUkMtPk1QRERSQ19NUiAgICAgICAgICAgICA9IE1QRERSQ19NUl9NT0RFX05PUF9DTUQ7ICAgLy8gTk9QIHRvIEVOQUJMRSBDTE9DSyBvdXRwdXQNCiAgICAqKHVuc2lnbmVkIGludCAqKUREUl9DU19BRERSICA9IDB4MDAwMDAwMDA7ICAgICAgICAgICAgICAgLy8gQWNjZXNzIHRvIG1lbW9yeQ0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIiAgICBub3AiKTsNCiAgICB9IC8vIERlbGF5IGxvb3AgKGF0IGxlYXN0IDEwMCBucykNCg0KLyogIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlIFNURVAgNA0KICAgIEFuIE5PUCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgTG93LXBvd2VyIEREUjItU0RSQU0uIFByb2dyYW0gdGhlIE5PUA0KICAgIGNvbW1hbmQgaW50byB0aGUgTW9kZSBSZWdpc3RlciwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1PREUgdG8gMSBpbiB0aGUgTW9kZQ0KICAgIFJlZ2lzdGVyIChzZWUgU2VjdGlvbiA4LjEgb24gcGFnZSAzMikuIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IExvdy1wb3dlcg0KICAgIEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuIE5vdywgQ0tFIGlzIGRyaXZlbiBoaWdoLg0KICAgIEEgbWluaW11bSBwYXVzZSBvZiAyMDAgdXMgbXVzdCBiZSBzYXRpc2ZpZWQgYmVmb3JlIFJlc2V0IENvbW1hbmQuDQoqLw0KDQogICAgTVBERFJDLT5NUEREUkNfTVIgICAgICAgICAgICAgPSBNUEREUkNfTVJfTU9ERV9OT1BfQ01EOyAgIC8vIE5PUCB0byBkcml2ZSBDS0UgaGlnaA0KICAgICoodW5zaWduZWQgaW50ICopRERSX0NTX0FERFIgID0gMHgwMDAwMDAwMDsgICAgICAgICAgICAgICAvLyBBY2Nlc3MgdG8gbWVtb3J5DQogICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsNCiAgICAgICAgYXNtKCIgICAgbm9wIik7DQogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXkgbG9vcCAoYXQgbGVhc3QgMjAwIHVzKQ0KDQovKiAgSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgU1RFUCA1DQogICAgQSByZXNldCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgTG93LXBvd2VyIEREUjItU0RSQU0uIFByb2dyYW0NCiAgICBMUEREUjJfQ01EIGluIHRoZSBNT0RFIChNRERSQyBDb21tYW5kIE1vZGUpIGFuZCBNUlMgKE1vZGUgUmVnaXN0ZXINCiAgICBTZWxlY3QgTFBERFIyKSBmaWVsZCBvZiB0aGUgTW9kZSBSZWdpc3RlciwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1PREUgdG8gNyBhbmQNCiAgICBNUlMgdG8gNjMuIChzZWUgU2VjdGlvbiA4LjEgb24gcGFnZSAzMikuIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IExvdy1wb3dlcg0KICAgIEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuIE5vdywgdGhlIHJlc2V0IGNvbW1hbmQgaXMgaXNzdWVkLg0KICAgIEEgbWluaW11bSBwYXVzZSBvZiAxdXMgbXVzdCBiZSBzYXRpc2ZpZWQgYmVmb3JlIGFueSBjb21tYW5kcy4gKi8NCg0KICAgIE1QRERSQy0+TVBERFJDX01SICAgICAgICAgICAgID0gTVBERFJDX01SX01SUygweDNGKSB8IE1QRERSQ19NUl9NT0RFX0xQRERSMl9DTUQ7ICANCiAgICAqKHVuc2lnbmVkIGludCAqKUREUl9DU19BRERSICA9IDB4MDAwMDAwMDA7IA0KICAgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgeyBhc20oIiAgICBub3AiKTsgfSANCg0KLyogIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlIFNURVAgNg0KICAgIEEgTW9kZSBSZWdpc3RlciBSZWFkIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBMb3ctcG93ZXIgRERSMi1TRFJBTS4gUHJvZ3JhbQ0KICAgIExQUERSMl9DTUQgaW4gdGhlIE1PREUgYW5kIE1SUyBmaWVsZCBvZiB0aGUgTW9kZSBSZWdpc3RlciwgdGhlDQogICAgYXBwbGljYXRpb24gbXVzdCBzZXQgTU9ERSB0byA3IGFuZCBtdXN0IHNldCBNUlMgZmllbGQgdG8gMC4gKHNlZSBTZWN0aW9uIDguMSBvbg0KICAgIHBhZ2UgMzIpLiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBMb3ctcG93ZXIgRERSMi1TRFJBTSBhZGRyZXNzIHRvDQogICAgYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kLiBOb3csIHRoZSBNb2RlIFJlZ2lzdGVyIFJlYWQgY29tbWFuZCBpcyBpc3N1ZWQuDQogICAgQSBtaW5pbXVtIHBhdXNlIG9mIDEwIHVzIG11c3QgYmUgc2F0aXNmaWVkIGJlZm9yZSBhbnkgY29tbWFuZHMuICovDQoNCiAgICBNUEREUkMtPk1QRERSQ19NUiAgICAgICAgICAgICA9IE1QRERSQ19NUl9NT0RFX0xQRERSMl9DTUQgfCBNUEREUkNfTVJfTVJTKDB4MDApOw0KICAgICoodW5zaWduZWQgaW50ICopRERSX0NTX0FERFIgID0gMHgwMDAwMDAwMDsgICAgICAgICAgICAgICAvLyBBY2Nlc3MgdG8gbWVtb3J5DQogICAgZm9yIChpID0gMDsgaSA8IDUwMDA7IGkrKykge2FzbSgiICAgIG5vcCIpOyB9IA0KDQovKiAgSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgU1RFUCA3DQogICAgQSBjYWxpYnJhdGlvbiBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgTG93LXBvd2VyIEREUjItU0RSQU0uIFByb2dyYW0gdGhlIHR5cGUNCiAgICBvZiBjYWxpYnJhdGlvbiBpbnRvIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLCBaUSBmaWVsZCwgUkVTRVQgdmFsdWUgKHNlZSBTZWN0aW9uIDguMw0KICAgIJRNUEREUkMgQ29uZmlndXJhdGlvbiBSZWdpc3Rlcj9vbiBwYWdlIDM3KS4gSW4gdGhlIE1vZGUgUmVnaXN0ZXIsIHByb2dyYW0gdGhlDQogICAgTU9ERSBmaWVsZCB0byBMUEREUjJfQ01EIHZhbHVlLCBhbmQgdGhlIE1SUyBmaWVsZDsgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0DQogICAgTU9ERSB0byA3IGFuZCBNUlMgdG8gMTAgKHNlZSBTZWN0aW9uIDguMSBMUEREUkMgTW9kZSBSZWdpc3Rlcj9vbiBwYWdlIDM0KS4NCiAgICBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBMb3ctcG93ZXIgRERSMi1TRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlDQogICAgdGhpcyBjb21tYW5kLiBOb3csIHRoZSBaUSBDYWxpYnJhdGlvbiBjb21tYW5kIGlzIGlzc3VlZC4gUHJvZ3JhbSB0aGUgdHlwZSBvZiBjYWxpYnJhdGlvbg0KICAgIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIsIFpRIGZpZWxkICovDQoNCiAgICBNUEREUkMtPk1QRERSQ19DUiAgICAgICAgICAgICY9IH5NUEREUkNfQ1JfWlFfTXNrOw0KICAgIE1QRERSQy0+TVBERFJDX0NSICAgICAgICAgICAgfD0gIE1QRERSQ19DUl9aUV9SRVNFVDsNCiAgICBNUEREUkMtPk1QRERSQ19NUiAgICAgICAgICAgICA9ICBNUEREUkNfTVJfTU9ERV9MUEREUjJfQ01EIHwgTVBERFJDX01SX01SUygweDBBKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2RlIFJlZ2lzdGVyIFJlYWQgIGNvbW1hbmQuIE1PREUgPSAweDcgYW5kIE1SUyA9IDB4MEENCiAgICAqKHVuc2lnbmVkIGludCAqKUREUl9DU19BRERSID0gMHgwMDAwMDAwMDsgICAgICAgICAgICAgICAgLy8gQWNjZXNzIHRvIG1lbW9yeQ0KICAgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykge2FzbSgiICAgIG5vcCIpOyB9DQogICAgTVBERFJDLT5NUEREUkNfQ1IgICAgICAgICAgICAmPSB+TVBERFJDX0NSX1pRX01zazsNCiAgICBNUEREUkMtPk1QRERSQ19DUiAgICAgICAgICAgIHw9ICBNUEREUkNfQ1JfWlFfU0hPUlQ7DQoNCi8qICBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBTVEVQIDgNCiAgICBBIE1vZGUgUmVnaXN0ZXIgV3JpdGUgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIExvdy1wb3dlciBERFIyLVNEUkFNLiBQcm9ncmFtDQogICAgTFBQRFIyX0NNRCBpbiB0aGUgTU9ERSBhbmQgTVJTIGZpZWxkIGluIHRoZSBNb2RlIFJlZ2lzdGVyLCB0aGUNCiAgICBhcHBsaWNhdGlvbiBtdXN0IHNldCBNT0RFIHRvIDcgYW5kIG11c3Qgc2V0IE1SUyBmaWVsZCB0byAwLjUgKHNlZSBTZWN0aW9uIDguMSBvbg0KICAgIHBhZ2UgMzIpLiBUaGUgTW9kZSBSZWdpc3RlciBXcml0ZSBjb21tYW5kIGN5Y2xlIGlzIGlzc3VlZCB0byBwcm9ncmFtIHRoZSBwYXJhbWV0ZXJzDQogICAgb2YgdGhlIExvdy1wb3dlciBERFIyLVNEUkFNIGRldmljZXMsIGluIHBhcnRpY3VsYXIgYnVyc3QgbGVuZ3RoLiBQZXJmb3JtIGENCiAgICB3cml0ZSBhY2Nlc3MgdG8gYW55IExvdy1wb3dlciBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kLg0KICAgIE5vdywgdGhlIE1vZGUgUmVnaXN0ZXIgV3JpdGUgY29tbWFuZCBpcyBpc3N1ZWQuICovDQoNCiAgICBNUEREUkMtPk1QRERSQ19NUiAgICAgICAgICAgICA9IE1QRERSQ19NUl9NT0RFX0xQRERSMl9DTUQgfCBNUEREUkNfTVJfTVJTKDB4MDEpOw0KICAgICoodW5zaWduZWQgaW50ICopRERSX0NTX0FERFIgID0gMHgwMDAwMDAwMDsgICAgICAgICAgICAgICAvLyBBY2Nlc3MgdG8gbWVtb3J5DQogICAgZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7DQogICAgICAgIGFzbSgiICAgIG5vcCIpOw0KICAgIH0NCg0KLyogIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlIFNURVAgOQ0KICAgIE1vZGUgUmVnaXN0ZXIgV3JpdGUgQ29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIExvdy1wb3dlciBERFIyLVNEUkFNLiBQcm9ncmFtDQogICAgTFBQRFIyX0NNRCBpbiB0aGUgTU9ERSBhbmQgTVJTIGZpZWxkIGluIHRoZSBNb2RlIFJlZ2lzdGVyLCB0aGUNCiAgICBhcHBsaWNhdGlvbiBtdXN0IHNldCBNT0RFIHRvIDcgYW5kIG11c3Qgc2V0IE1SUyBmaWVsZCB0byAyLiAoc2VlIFNlY3Rpb24gOC4xIG9uDQogICAgcGFnZSAzMikuIFRoZSBNb2RlIFJlZ2lzdGVyIFdyaXRlIGNvbW1hbmQgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIHBhcmFtZXRlcnMNCiAgICBvZiB0aGUgTG93LXBvd2VyIEREUjItU0RSQU0gZGV2aWNlcywgaW4gcGFydGljdWxhciBDQVMgbGF0ZW5jeS4gUGVyZm9ybSBhDQogICAgd3JpdGUgYWNjZXNzIHRvIGFueSBMb3ctcG93ZXIgRERSMi1TRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlIHRoaXMgY29tbWFuZC4NCiAgICBOb3csIHRoZSBNb2RlIFJlZ2lzdGVyIFdyaXRlIGNvbW1hbmQgaXMgaXNzdWVkLiAqLw0KDQogICAgTVBERFJDLT5NUEREUkNfTVIgICAgICAgICAgICAgPSBNUEREUkNfTVJfTU9ERV9MUEREUjJfQ01EIHwgTVBERFJDX01SX01SUygweDAyKTsNCiAgICAqKHVuc2lnbmVkIGludCAqKUREUl9DU19BRERSICA9IDB4MDAwMDAwMDA7ICAgICAgICAgICAgICAgLy8gQWNjZXNzIHRvIG1lbW9yeQ0KICAgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgew0KICAgICAgICBhc20oIiAgICBub3AiKTsNCiAgICB9DQoNCi8qICBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBTVEVQIDEwDQogICAgQSBNb2RlIFJlZ2lzdGVyIFdyaXRlIENvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBMb3ctcG93ZXIgRERSMi1TRFJBTS4gUHJvZ3JhbQ0KICAgIExQUERSMl9DTUQgaW4gdGhlIE1PREUgYW5kIE1SUyBmaWVsZCBvZiB0aGUgTW9kZSBSZWdpc3RlciwgdGhlDQogICAgYXBwbGljYXRpb24gbXVzdCBzZXQgTU9ERSB0byA3IGFuZCBtdXN0IHNldCBNUlMgZmllbGQgdG8gMy4gKHNlZSBTZWN0aW9uIDguMSBvbg0KICAgIHBhZ2UgMzIpLiBUaGUgTW9kZSBSZWdpc3RlciBXcml0ZSBjb21tYW5kIGN5Y2xlIGlzIGlzc3VlZCB0byBwcm9ncmFtIHRoZSBwYXJhbWV0ZXJzDQogICAgb2YgdGhlIExvdy1wb3dlciBERFIyLVNEUkFNIGRldmljZXMsIGluIHBhcnRpY3VsYXIgRHJpdmUgU3RyZW5ndGggYW5kIFNsZXcNCiAgICBSYXRlLiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBMb3ctcG93ZXIgRERSMi1TRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlDQogICAgdGhpcyBjb21tYW5kLiBOb3csIHRoZSBNb2RlIFJlZ2lzdGVyIFdyaXRlIGNvbW1hbmQgaXMgaXNzdWVkLiAqLw0KDQogICAgTVBERFJDLT5NUEREUkNfTVIgICAgICAgICAgICAgPSBNUEREUkNfTVJfTU9ERV9MUEREUjJfQ01EIHwgTVBERFJDX01SX01SUygweDAzKTsgLy8weDAwMDAwMzA3Ow0KICAgICoodW5zaWduZWQgaW50ICopRERSX0NTX0FERFIgID0gMHgwMDAwMDAwMDsgICAgICAgICAgICAgICAvLyBBY2Nlc3MgdG8gbWVtb3J5DQogICAgZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7DQogICAgICAgIGFzbSgiICAgIG5vcCIpOw0KICAgIH0NCg0KLyogICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgU1RFUCAxMQ0KICAgIEEgTW9kZSBSZWdpc3RlciBXcml0ZSBDb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgTG93LXBvd2VyIEREUjItU0RSQU0uIFByb2dyYW0NCiAgICBMUFBEUjJfQ01EIGluIHRoZSBNT0RFIGFuZCBNUlMgZmllbGQgb2YgdGhlIE1vZGUgUmVnaXN0ZXIsIHRoZQ0KICAgIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1PREUgdG8gNyBhbmQgbXVzdCBzZXQgTVJTIGZpZWxkIHRvIDE2LiAoc2VlIFNlY3Rpb24gOC4xIG9uDQogICAgcGFnZSAzMikuIE1vZGUgUmVnaXN0ZXIgV3JpdGUgY29tbWFuZCBjeWNsZSBpcyBpc3N1ZWQgdG8gcHJvZ3JhbSB0aGUgcGFyYW1ldGVycw0KICAgIG9mIHRoZSBMb3ctcG93ZXIgRERSMi1TRFJBTSBkZXZpY2VzLCBpbiBwYXJ0aWN1bGFyIFBhcnRpYWwgQXJyYXkgU2VsZiBSZWZyZXNoDQogICAoUEFTUikuIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IExvdy1wb3dlciBERFIyLVNEUkFNIGFkZHJlc3MgdG8NCiAgICBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuIE5vdywgdGhlIE1vZGUgUmVnaXN0ZXIgV3JpdGUgY29tbWFuZCBpcyBpc3N1ZWQuKi8NCg0KICAgIE1QRERSQy0+TVBERFJDX01SICAgICAgICAgICAgID0gTVBERFJDX01SX01PREVfTFBERFIyX0NNRCB8IE1QRERSQ19NUl9NUlMoMHgxMCk7Ly8gMHgwMDAwMTAwNzsNCiAgICAqKHVuc2lnbmVkIGludCAqKUREUl9DU19BRERSICA9IDB4MDAwMDAwMDA7ICAgICAgICAgICAgICAgLy8gQWNjZXNzIHRvIG1lbW9yeQ0KICAgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgew0KICAgICAgICBhc20oIiAgICBub3AiKTsNCiAgICB9DQoNCi8qICBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBTVEVQIDEyDQogICAgV3JpdGUgdGhlIHJlZnJlc2ggcmF0ZSBpbnRvIHRoZSBDT1VOVCBmaWVsZCBpbiB0aGUgUmVmcmVzaCBUaW1lciByZWdpc3RlciAoc2VlIHBhZ2UNCiAgICAzMykuIChSZWZyZXNoIHJhdGUgPSBkZWxheSBiZXR3ZWVuIHJlZnJlc2ggY3ljbGVzKS4gVGhlIExvdy1wb3dlciBERFIyLVNEUkFNDQogICAgZGV2aWNlIHJlcXVpcmVzIGEgcmVmcmVzaCBldmVyeSA3LjgxIOxzLiBXaXRoIGEgMTAwIE1IeiBmcmVxdWVuY3ksIHRoZSByZWZyZXNoIHRpbWVyDQogICAgY291bnQgcmVnaXN0ZXIgbXVzdCB0byBiZSBzZXQgd2l0aCAoNy44MS8xMDAgTUh6KSA9IDc4MSBpLmUuIDB4MDMwZC4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19SVFIgICAgICAgICAgICY9IH5NUEREUkNfUlRSX0NPVU5UX01zazsNCiAgICBNUEREUkMtPk1QRERSQ19SVFIgICAgICAgICAgIHw9ICBNUEREUkNfUlRSX0NPVU5UKDEwMzApOw0KICAgIE1QRERSQy0+TVBERFJDX01SICAgICAgICAgICAgID0gIDB4MDAwMDAwMDA7ICAgICAgICAgICAgICAvLyBTZXQgTm9ybWFsIG1vZGUNCiAgICAqKHVuc2lnbmVkIGludCAqKUREUl9DU19BRERSICA9ICAweDAwMDAwMDAwOyAgICAgICAgICAgICAgLy8gUGVyZm9ybSANCiAgICAgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgew0KICAgICAgICBhc20oIiAgICBub3AiKTsNCiAgICB9DQogICAgLyogTGF1bmNoIHNob3J0IFpRIGNhbGlicmF0aW9uICovDQogICAgTVBERFJDLT5NUEREUkNfQ1IgICAgICAgICAgICAmPSB+TVBERFJDX0NSX1pRX01zazsgICAgICAgICAgICAgICAgICAgLy8gRW5hYmxlIHNob3J0IGNhbGlicmF0aW9uIGluIHRoZSBDUg0KICAgIE1QRERSQy0+TVBERFJDX0NSICAgICAgICAgICAgfD0gIE1QRERSQ19DUl9aUV9TSE9SVDsNCiAgICBNUEREUkMtPk1QRERSQ19DUiAgICAgICAgICAgIHw9ICBNUEREUkNfQ1JfRExMX1JFU0VUX0VOQUJMRUQ7DQogICAgKih1bnNpZ25lZCBpbnQgKilERFJfQ1NfQUREUiAgPSAgMHgwMDAwMDAwMDsgICAgICAgICAgICAgIC8vIFBlcmZvcm0NCg0KICAgIC8qIENhbGN1bGF0ZSBaUVM6IHNlYXJjaCBmb3IgdFpRQ1MgaW4gdGhlIG1lbW9yeSBkYXRhc2hlZXQgPT4gdFpRQ1MgPSAxODAgbnMqLw0KICAgTVBERFJDLT5NUEREUkNfTFBERFIyX1RJTV9DQUwgPSAgTVBERFJDX0xQRERSMl9USU1fQ0FMX1pRQ1MoMTIpOw0KfQ0K