LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNSBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpWZXJzaW9uIENvbnRyb2wgSW5mb3JtYXRpb24gKFBlcmZvcmNlKQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQokUmV2aXNpb246ICMxICQgDQokRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJCANCiRBdXRob3I6IHByYW1hbnMgJA0KTGFzdCBDaGFuZ2U6IFJlbmFtZWQgZWNpYV9pbml0IHRvIGludGVycnVwdF9pbml0DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiogQGZpbGUgaW50ZXJydXB0X2FwaS5jDQoqIFxicmllZiBJbnRlcnJ1cHQgQVBJcyBTb3VyY2UgRmlsZQ0KKiBcYXV0aG9yIGp2YXNhbnRoDQoqIA0KKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgSW50ZXJydXB0IFNvdXJjZSBmaWxlICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqIEBkZWZncm91cCBJbnRlcnJ1cHQNCiAqICBAew0KICovDQogDQojaW5jbHVkZSAiY29tbW9uX2xpYi5oIg0KI2luY2x1ZGUgImludGVycnVwdC5oIg0KI2luY2x1ZGUgIi4uXHBjclxwY3IuaCINCg0Kc3RhdGljIHVpbnQ4X3QgaW50ZXJydXB0X2lzX2dpcnFfZGlyZWN0KHVpbnQ4X3QgZ2lycV9udW0pOw0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICAgIE5WSUMsRUNJQSBSb3V0aW5nIFBvbGljeSBmb3IgRGlyZWN0IE1vZGUgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiBJbiBEaXJlY3QgTW9kZSwgc29tZSBpbnRlcnJ1cHRzIGNvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gYmUgdXNlZCBhcyBhZ2dyZWdhdGVkLg0KICogQ29uZmlndXJhdGlvbjoNCiAqICAgICAgMS4gQWx3YXlzIHNldCBFQ1MgSW50ZXJydXB0IERpcmVjdCBlbmFibGUgYml0LiAgICAgICAgIA0KICogICAgICAyLiBJZiBHSVJRbiBhZ2dyZWdhdGVkIHNldCBCbG9jayBFbmFibGUgYml0Lg0KICogICAgICAzLiBJZiBHSVJRbiBkaXJlY3QgdGhlbiBjbGVhciBCbG9jayBFbmFibGUgYml0IGFuZCBlbmFibGUgaW5kaXZpZHVhbCBOVklDIGlucHV0cy4NCiAqICBTd2l0Y2hpbmcgaXNzdWVzOg0KICogIEFnZ3JlZ2F0ZSBlbmFibGUvZGlzYWJsZSByZXF1aXJlcyBzZXQvY2xlYXIgc2luZ2xlIEdJUlFuIGJpdCBpbiBHSVJRIEJsb2NrIEVuL0NsciByZWdpc3RlcnMuDQogKiAgQWxzbyByZXF1aXJlcyBzZXQvY2xlYXIgb2YgaW5kaXZpZHVhbCBOVklDIEVuYWJsZXMuDQogKiAgDQogKiBOb3RlOiBpbnRlcnJ1cHRfaXNfZ2lycV9kaXJlY3QoKSBpbnRlcm5hbCBmdW5jdGlvbiB1c2VzIHRoaXMgcG9saWN5IHRvIGRldGVjdCANCiAqIGlmIGFueSBpbnRlcnJ1cHQgaXMgY29uZmlndXJlZCBhcyBkaXJlY3Qgb3IgYWdncmVnYXRlZA0KKi8NCg0KLyoqIEluaXRpYWxpemUgRUMgSW50ZXJydXB0IEFnZ3JlZ2F0b3INCiAqIEBwYXJhbSBtb2RlIDEgLSBEaXJlY3QgTWFwIG1vZGUsIDAgLSBGdWxseSBBZ2dyZWdhdGVkIE1vZGUgDQogKiBAcGFyYW0gZ2lycV9iaXRtYXNrIC0gQml0TWFzayBvZiBHSVJRIHRvIGJlIGNvbmZpZ3VyZWQgYXMgYWdncmVnYXRlZCANCiAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBhcHBsaWNhYmxlIGluIGRpcmVjdCBtb2RlLg0KICogQG5vdGUgQWxsIEdQSU8ncyBhbmQgd2FrZSBjYXBhYmxlIHNvdXJjZXMgYXJlIGFsd2F5cyANCiAqIGFnZ3JlZ2F0ZWQhIEdQSU8ncyBpbnRlcnJ1cHRzIHdpbGwgc3RpbGwgd29yayBpbiBkaXJlY3QgbW9kZS4NCiAqIEJsb2NrIHdha2VzIGFyZSBub3QgYmUgcm91dGVkIHRvIHRoZSBwcm9jZXNzb3IgaW4gZGlyZWN0IA0KICogbW9kZS4gDQogKiBOb3RlMjogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBhbmQgZW5hYmxlcyBnbG9iYWwgaW50ZXJydXB0IA0KICovDQp2b2lkIGludGVycnVwdF9pbml0KHVpbnQ4X3QgbW9kZSwgdWludDMyX3QgZ2lycV9iaXRtYXNrKQ0Kew0KICAgIHVpbnQzMl90IGlzYXZlOw0KCQ0KICAgIGlzYXZlID0gX19nZXRfUFJJTUFTSygpOw0KICAgIF9fZGlzYWJsZV9pcnEoKTsNCgkJDQogICAgLy9DbGVhciBTbGVlcCBmb3IgSW50ZXJydXB0IGJsb2NrDQogICAgcGNyX3NsZWVwX2VuYWJsZShQQ1JfSU5ULCAwKTsNCg0KICAgIGludGVycnVwdF9tb2RlX3NldChtb2RlKTsNCg0KICAgIHBfaW50ZXJydXB0X2VjaWFfZ2lycXNfZW5hYmxlX3Jlc2V0KCk7ICAgICAgICANCiAgICANCiAgICBwX2ludGVycnVwdF9udmljX2VucGVuZF9jbHIoKTsNCgkNCiAgICBwX2ludGVycnVwdF9udmljX3ByaW9yaXRpZXNfZGVmYXVsdF9zZXQoKTsNCiAgICANCiAgICBpZiAobW9kZSkNCiAgICB7Ly9JZiBkaXJlY3QgbW9kZSwgZW5hYmxlIHNwZWNpZmljIEdJUlFzIHRvIGJlIGFnZ3JlZ2F0ZWQNCiAgICAgICAgcF9pbnRlcnJ1cHRfZWNpYV9ibG9ja19lbmFibGVfYml0bWFza19zZXQoZ2lycV9iaXRtYXNrKTsNCiAgICB9DQogICAgICAgDQogICAgaWYgKCFpc2F2ZSkgew0KICAgICAgICBfX2VuYWJsZV9pcnEoKTsNCiAgICB9DQp9DQoNCi8qKiBTZXQgaW50ZXJydXB0IHJvdXRpbmcgbW9kZSB0byBhZ2dyZWdhdGVkIG9yIGRpcmVjdC4gDQogKiBAcGFyYW0gbW9kZSAxID0gRGlyZWN0IChleGNlcHQgR1BJTyAmIHdha2UpLCAwID0gQWxsIEFnZ3JlZ2F0ZWQgDQogKiBAbm90ZSBJbiBkaXJlY3QgbW9kZSwgb25lIGNvdWxkIGVuYWJsZSBjZXJ0YWluIEdJUlFzIGFzIGFnZ3JlZ2F0ZWQgdXNpbmcgDQogKiBwX2ludGVycnVwdF9lY2lhX2Jsb2NrX2VuYWJsZV9zZXQgZnVuY3Rpb24NCiAqLw0Kdm9pZCBpbnRlcnJ1cHRfbW9kZV9zZXQodWludDhfdCBtb2RlKQ0Kew0KICAgIGlmIChtb2RlKSANCgl7DQoJCXBfaW50ZXJydXB0X2VjaWFfYmxvY2tfZW5hYmxlX2FsbF9jbHIoKTsgICAgICAgIA0KICAgIH0gDQoJZWxzZSANCgl7DQoJCXBfaW50ZXJydXB0X2VjaWFfYmxvY2tfZW5hYmxlX2FsbF9zZXQoKTsgICAgICAgIA0KICAgIH0NCgkJDQogICAgcF9pbnRlcnJ1cHRfY29udHJvbF9zZXQobW9kZSk7DQp9DQoNCi8qKiBDbGVhcnMgYWxsIGluZGl2aWR1YWwgaW50ZXJydXB0cyBFbmFibGVzIGFuZCBTb3VyY2UgaW4gRUNJQSwNCiAqICBhbmQgQ2xlYXJzIGFsbCBOVklDIGV4dGVybmFsIGVuYWJsZXMgYW5kIHBlbmRpbmcgYml0cyAgDQogKi8NCnZvaWQgaW50ZXJydXB0X3Jlc2V0KHZvaWQpDQp7CQ0KICAgIHBfaW50ZXJydXB0X2VjaWFfZ2lycXNfZW5hYmxlX3Jlc2V0KCk7DQogICAgcF9pbnRlcnJ1cHRfZWNpYV9naXJxc19zb3VyY2VfcmVzZXQoKTsJDQoNCiAgICBwX2ludGVycnVwdF9udmljX2VucGVuZF9jbHIoKTsNCn0NCg0KLyoqIEVuYWJsZXMgaW50ZXJydXB0IGZvciBhIGRldmljZSANCiAqIEBwYXJhbSBkZXZfaXJvdXRlIC0gc291cmNlIElST1VUSU5HIGluZm9ybWF0aW9uICANCiAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgYW5kIGVuYWJsZXMgZ2xvYmFsIGludGVycnVwdCANCiAqLw0Kdm9pZCBpbnRlcnJ1cHRfZGV2aWNlX2VuYWJsZSh1aW50MzJfdCBkZXZfaXJvdXRlKQ0Kew0KICAgIHVpbnQzMl90IGlzYXZlOw0KICAgIElSUW5fVHlwZSBudmljX251bTsNCiAgICB1aW50OF90IGdpcnFfbnVtOw0KICAgIHVpbnQ4X3QgaWFfYml0cG9zOw0KICAgIA0KICAgIGdpcnFfbnVtID0gKHVpbnQ4X3QpKGRldl9pcm91dGUgPj4gKEVDSUFfR0lSUV9JRF9CSVRQT1MpKSAmIDB4MUZ1Ow0KICAgIGlhX2JpdHBvcyA9ICh1aW50OF90KShkZXZfaXJvdXRlID4+IChFQ0lBX0dJUlFfQklUX0JJVFBPUykpICYgMHgxRnU7ICAgIA0KICAgIA0KICAgIGlmIChpbnRlcnJ1cHRfaXNfZ2lycV9kaXJlY3QoZ2lycV9udW0pKSANCiAgICB7IC8vIEdJUlEgaXMgaG9va2VkIGRpcmVjdCAgICAgICAgDQogICAgICAgIG52aWNfbnVtID0gKElSUW5fVHlwZSkoKGRldl9pcm91dGUgPj4gKEVDSUFfTlZJQ19JRF9CSVRQT1MpKSAmIDB4RkZ1bCk7DQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgLy8gR0lSUSBpcyBhZ2dyZWdhdGVkICAgICAgICANCiAgICAgICAgbnZpY19udW0gPSAoSVJRbl9UeXBlKSgoZGV2X2lyb3V0ZSA+PiAoRUNJQV9JQV9OVklDX0lEX0JJVFBPUykpICYgMHhGRnVsKTsNCiAgICB9DQogICAgDQogICAgaXNhdmUgPSBfX2dldF9QUklNQVNLKCk7DQogICAgX19kaXNhYmxlX2lycSgpOw0KDQogICAgTlZJQ19FbmFibGVJUlEobnZpY19udW0pOw0KICAgIHBfaW50ZXJydXB0X2VjaWFfZ2lycV9lbmFibGVfc2V0KGdpcnFfbnVtLCBpYV9iaXRwb3MpOyAgICANCiAgICBfX0RTQigpOyAgICAgICAgCQkJCSAgICAgICAgDQoNCiAgICBpZiAoIWlzYXZlKSB7DQogICAgICAgIF9fZW5hYmxlX2lycSgpOw0KICAgIH0NCn0NCg0KDQovKiogRGlzYWJsZXMgaW50ZXJydXB0IGZvciBhIGRldmljZQ0KICogQHBhcmFtIGRldl9pcm91dGUgLSBzb3VyY2UgSVJPVVRJTkcgaW5mb3JtYXRpb24gIA0KICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBhbmQgZW5hYmxlcyBnbG9iYWwgaW50ZXJydXB0IA0KICovDQp2b2lkIGludGVycnVwdF9kZXZpY2VfZGlzYWJsZSh1aW50MzJfdCBkZXZfaXJvdXRlKQ0Kew0KICAgIHVpbnQzMl90IGlzYXZlOw0KICAgIElSUW5fVHlwZSBudmljX251bTsNCiAgICB1aW50OF90IGdpcnFfbnVtOw0KICAgIHVpbnQ4X3QgaWFfYml0cG9zOw0KDQogICAgZ2lycV9udW0gPSAodWludDhfdCkoZGV2X2lyb3V0ZSA+PiAoRUNJQV9HSVJRX0lEX0JJVFBPUykpICYgMHgxRnU7DQogICAgaWFfYml0cG9zID0gKHVpbnQ4X3QpKGRldl9pcm91dGUgPj4gKEVDSUFfR0lSUV9CSVRfQklUUE9TKSkgJiAweDFGdTsgICAgDQogICAgDQogICAgaXNhdmUgPSBfX2dldF9QUklNQVNLKCk7DQogICAgX19kaXNhYmxlX2lycSgpOw0KICAgIA0KICAgIGlmIChpbnRlcnJ1cHRfaXNfZ2lycV9kaXJlY3QoZ2lycV9udW0pKSANCiAgICB7IC8vIEdJUlEgaXMgaG9va2VkIGRpcmVjdCAgICAgICAgDQogICAgICAgIG52aWNfbnVtID0gKElSUW5fVHlwZSkoKGRldl9pcm91dGUgPj4gKEVDSUFfTlZJQ19JRF9CSVRQT1MpKSAmIDB4RkZ1bCk7DQogICAgICAgIE5WSUNfRGlzYWJsZUlSUShudmljX251bSk7DQogICAgfSAgIA0KICAgICAgICANCiAgICBwX2ludGVycnVwdF9lY2lhX2dpcnFfZW5hYmxlX2NscihnaXJxX251bSwgaWFfYml0cG9zKTsgICAgDQogICAgX19EU0IoKTsgICAgICAgIAkJCQkgICAgICAgIA0KDQogICAgaWYgKCFpc2F2ZSkgew0KICAgICAgICBfX2VuYWJsZV9pcnEoKTsNCiAgICB9DQp9DQoNCi8qKiBlY2lhX2lzX2dpcnFfZGlyZWN0IC0gUmV0dXJuIHRydWUgaWYgR0lSUW4gc291cmNlcyBjYW4gYmUgZGlyZWN0bHkgDQogKiBjb25uZWN0ZWQgdG8gdGhlIE5WSUMgLSBiYXNlZCBvbiBFQ1MtPklOVEVSUlVQVF9DT05UUk9MIGFuZCBHSVJRIGJsb2NrIGVuYWJsZQ0KICogQHBhcmFtIGdpcnFfbnVtIC0gZW51bSBNRUNfR0lSUV9JRFMNCiAqIEByZXR1cm4gMSBpZiBHSVJRbiBzb3VyY2VzIGNhbiBiZSBkaXJlY3RseSByb3V0ZWQgdG8gdGhlIE5WSUMsIGVsc2UgMA0KICovDQpzdGF0aWMgdWludDhfdCBpbnRlcnJ1cHRfaXNfZ2lycV9kaXJlY3QodWludDhfdCBnaXJxX251bSkNCnsgICAgDQogICAgdWludDMyX3QgYnBvczsNCiAgICB1aW50OF90IHJldFZhbDsNCiAgICB1aW50OF90IGdpcnFfYmxvY2tfZW5hYmxlZDsNCiAgICANCiAgICByZXRWYWwgPSAwOw0KICAgIA0KICAgIGJwb3MgPSAoZ2lycV9udW0gJiAweDFGdSkgKyA4dTsNCiAgICANCiAgICBpZiAoKEVDSUFfR0lSUV9ESVJFQ1RfQklUTUFQKSAmICgxdWwgPDwgYnBvcykpIA0KICAgIHsgICAgICAgIA0KICAgICAgICBpZiAocF9pbnRlcnJ1cHRfY29udHJvbF9nZXQoKSkgICAgICAgICAgICAgICAgDQogICAgICAgIHsvLyBkaXJlY3QgTlZJQyBlbmFibGVkDQogICAgICAgICAgIA0KICAgICAgICAgICAgZ2lycV9ibG9ja19lbmFibGVkID0gcF9pbnRlcnJ1cHRfZWNpYV9ibG9ja19lbmFibGVfZ2V0KGdpcnFfbnVtKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCFnaXJxX2Jsb2NrX2VuYWJsZWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0VmFsID0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcmV0VmFsOw0KfQ0KDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICAgRUNJQSBBUElzIHVzaW5nIGRldmljZSBJUk9VVEUoKSBhcyBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgKi8gDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBDbGVhciBTb3VyY2UgaW4gdGhlIEVDSUEgZm9yIHRoZSBkZXZpY2UgIA0KICogQHBhcmFtIGRldmkgLSBkZXZpY2UgSVJPVVRJTkcgdmFsdWUgIA0KICovDQp2b2lkIGludGVycnVwdF9kZXZpY2VfZWNpYV9zb3VyY2VfY2xlYXIoY29uc3QgdWludDMyX3QgZGV2X2lyb3V0ZSkNCnsgICAgDQogICAgdWludDhfdCBnaXJxX251bTsNCiAgICB1aW50OF90IGlhX2JpdF9wb3M7DQogICAgDQogICAgZ2lycV9udW0gPSAodWludDhfdCkoZGV2X2lyb3V0ZSA+PiAoRUNJQV9HSVJRX0lEX0JJVFBPUykpICYgMHgxRnU7DQogICAgaWFfYml0X3BvcyA9ICh1aW50OF90KShkZXZfaXJvdXRlID4+IChFQ0lBX0dJUlFfQklUX0JJVFBPUykpICYgMHgxRnU7ICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgIHBfaW50ZXJydXB0X2VjaWFfZ2lycV9zb3VyY2VfY2xyKGdpcnFfbnVtLCBpYV9iaXRfcG9zKTsgICAgICAgIA0KICAgIF9fRFNCKCk7DQp9DQoNCi8qKiBHZXQgdGhlIFNvdXJjZSBiaXQgaW4gdGhlIEVDSUEgZm9yIHRoZSBkZXZpY2UgIA0KICogQHBhcmFtIGRldmkgLSBkZXZpY2UgSVJPVVRJTkcgdmFsdWUgIA0KICogQHJldHVybiAwIGlmIHNvdXJjZSBiaXQgbm90IHNldDsgZWxzZSBub24temVybyB2YWx1ZQ0KICovDQp1aW50MzJfdCBpbnRlcnJ1cHRfZGV2aWNlX2VjaWFfc291cmNlX2dldChjb25zdCB1aW50MzJfdCBkZXZfaXJvdXRlKQ0KeyAgICANCiAgICB1aW50OF90IGdpcnFfbnVtOw0KICAgIHVpbnQ4X3QgaWFfYml0X3BvczsNCiAgICB1aW50OF90IHJldFZhbDsNCiAgICANCiAgICBnaXJxX251bSA9ICh1aW50OF90KShkZXZfaXJvdXRlID4+IChFQ0lBX0dJUlFfSURfQklUUE9TKSkgJiAweDFGdTsNCiAgICBpYV9iaXRfcG9zID0gKHVpbnQ4X3QpKGRldl9pcm91dGUgPj4gKEVDSUFfR0lSUV9CSVRfQklUUE9TKSkgJiAweDFGdTsgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgcmV0VmFsID0gcF9pbnRlcnJ1cHRfZWNpYV9naXJxX3NvdXJjZV9nZXQoZ2lycV9udW0sIGlhX2JpdF9wb3MpOyAgICAgICAgDQogICAgcmV0dXJuIHJldFZhbDsNCn0NCg0KLyoqIEdldCB0aGUgUmVzdWx0IGJpdCBpbiB0aGUgRUNJQSBmb3IgdGhlIGRldmljZSAgDQogKiBAcGFyYW0gZGV2aSAtIGRldmljZSBJUk9VVElORyB2YWx1ZSAgDQogKiBAcmV0dXJuIDAgaWYgcmVzdWx0IGJpdCBub3Qgc2V0OyBlbHNlIG5vbi16ZXJvIHZhbHVlDQogKi8NCnVpbnQzMl90IGludGVycnVwdF9kZXZpY2VfZWNpYV9yZXN1bHRfZ2V0KGNvbnN0IHVpbnQzMl90IGRldl9pcm91dGUpDQp7ICAgIA0KICAgIHVpbnQ4X3QgZ2lycV9udW07DQogICAgdWludDhfdCBpYV9iaXRfcG9zOw0KICAgIHVpbnQ4X3QgcmV0VmFsOw0KICAgIA0KICAgIGdpcnFfbnVtID0gKHVpbnQ4X3QpKGRldl9pcm91dGUgPj4gKEVDSUFfR0lSUV9JRF9CSVRQT1MpKSAmIDB4MUZ1Ow0KICAgIGlhX2JpdF9wb3MgPSAodWludDhfdCkoZGV2X2lyb3V0ZSA+PiAoRUNJQV9HSVJRX0JJVF9CSVRQT1MpKSAmIDB4MUZ1OyAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICByZXRWYWwgPSBwX2ludGVycnVwdF9lY2lhX2dpcnFfcmVzdWx0X2dldChnaXJxX251bSwgaWFfYml0X3Bvcyk7ICAgICAgICANCiAgICByZXR1cm4gcmV0VmFsOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICAgIE5WSUMgQVBJcyB1c2luZyBkZXZpY2UgSVJPVVRFKCkgYXMgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICovIA0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogTm90ZSB0aGF0IGlmIHRoZSBkZXZpY2UgaW50ZXJydXB0IGlzIGFnZ3JlZ2F0ZWQsIHRoZW4gdGhlc2UgQVBJcyB3b3VsZCBhZmZlY3QgdGhlIA0KICogTlZJQyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhZ2dyZWdhdGVkIEdJUlEgDQogKi8NCg0KLyoqICBFbmFibGUvRGlzYWJsZSB0aGUgTlZJQyAoaW4gdGhlIE5WSUMgY29udHJvbGxlcikgZm9yIHRoZSBkZXZpY2UNCiAqIEBwYXJhbSBkZXZfaXJvdXRlIDogc291cmNlIElST1VUSU5HIGluZm9ybWF0aW9uIChlbmNvZGVkIGluIGEgdWludDMyX3QpDQogKiBAcGFyYW0gZW5fZmxhZyA6IDEgPSBFbmFibGUgdGhlIE5WSUMgSVJRLCAwID0gRGlzYWJsZSB0aGUgTlZJQyBJUlEgDQogKiBAbm90ZSAxLiBSZWNvbW1lbmRlZCB0byB1c2UgaW50ZXJydXB0X2RldmljZV9lbmFibGUsIGludGVycnVwdF9kZXZpY2VfZGlzYWJsZQ0KICogdG8gZW5hYmxlL2Rpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhlIGRldmljZSwgc2luY2UgdGhvc2UgQVBJcyBjb25maWd1cmUgRUNJQSBhcyB3ZWxsDQogKiAyLiBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIGFuZCBlbmFibGVzIGdsb2JhbCBpbnRlcnJ1cHQgICAgDQogKi8NCnZvaWQgaW50ZXJydXB0X2RldmljZV9udmljX2VuYWJsZSh1aW50MzJfdCBkZXZfaXJvdXRlLCB1aW50OF90IGVuX2ZsYWcpDQp7DQogICAgdWludDMyX3QgaXNhdmU7DQogICAgSVJRbl9UeXBlIG52aWNfbnVtOw0KCQkNCiAgICBpZiAocF9pbnRlcnJ1cHRfY29udHJvbF9nZXQoKSkgICAgICAgIA0KICAgIHsgLy8gZGlyZWN0CQkJCQ0KICAgICAgICBudmljX251bSA9IChJUlFuX1R5cGUpKChkZXZfaXJvdXRlID4+IChFQ0lBX05WSUNfSURfQklUUE9TKSkgJiAweEZGdWwpOwkJCQkJCQ0KICAgIH0gDQogICAgZWxzZSAvLyBmdWxseSBhZ2dyZWdhdGVkDQogICAgewkJCQkNCiAgICAgICAgbnZpY19udW0gPSAoSVJRbl9UeXBlKSgoZGV2X2lyb3V0ZSA+PiAoRUNJQV9JQV9OVklDX0lEX0JJVFBPUykpICYgMHhGRnVsKTsNCiAgICB9DQogICAgDQogICAgaXNhdmUgPSBfX2dldF9QUklNQVNLKCk7DQogICAgX19kaXNhYmxlX2lycSgpOw0KICAgIA0KICAgIHBfaW50ZXJydXB0X252aWNfZW5hYmxlKG52aWNfbnVtLCBlbl9mbGFnKTsJCQ0KICAgDQogICAgaWYgKCFpc2F2ZSkgew0KICAgICAgICBfX2VuYWJsZV9pcnEoKTsNCiAgICB9DQp9DQoNCg0KLyoqIFNldCBOVklDIHByaW9yaXR5IGZvciBzcGVjaWZpZWQgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgDQogKiBAcGFyYW0gZGV2X2lyb3V0ZSAtIHNvdXJjZSBJUk9VVElORyBpbmZvcm1hdGlvbiAoZW5jb2RlZCBpbiBhIHVpbnQzMl90KQ0KICogQHBhcmFtIG52aWNfcHJpIC0gTlZJQyBQcmlvcml0eQ0KICogQG5vdGUgSWYgRUNJQSBpcyBpbiBhZ2dyZWdhdGVkIG1vZGUsIHRoZSBwcmlvcml0eSBhZmZlY3RzIGFsbCBpbnRlcnJ1cHQgDQogKiBzb3VyY2VzIGluIHRoZSBHSVJRLiANCiAqLw0Kdm9pZCBpbnRlcnJ1cHRfZGV2aWNlX252aWNfcHJpb3JpdHlfc2V0KGNvbnN0IHVpbnQzMl90IGRldl9pcm91dGUsIGNvbnN0IHVpbnQ4X3QgbnZpY19wcmkpDQp7DQogICAgSVJRbl9UeXBlIG52aWNfbnVtOw0KCQ0KICAgIGlmIChwX2ludGVycnVwdF9jb250cm9sX2dldCgpKSAgICAgICAgDQogICAgeyAvLyBkaXJlY3QJCQkJDQogICAgICAgIG52aWNfbnVtID0gKElSUW5fVHlwZSkoKGRldl9pcm91dGUgPj4gKEVDSUFfTlZJQ19JRF9CSVRQT1MpKSAmIDB4RkZ1bCk7CQkJCQkJDQogICAgfSANCiAgICBlbHNlIC8vIGZ1bGx5IGFnZ3JlZ2F0ZWQNCiAgICB7CQkJCQ0KICAgICAgICBudmljX251bSA9IChJUlFuX1R5cGUpKChkZXZfaXJvdXRlID4+IChFQ0lBX0lBX05WSUNfSURfQklUUE9TKSkgJiAweEZGdWwpOw0KICAgIH0NCgkJDQogICAgTlZJQ19TZXRQcmlvcml0eShudmljX251bSwgKHVpbnQzMl90KW52aWNfcHJpKTsNCn0NCg0KLyoqIFJldHVybiBOVklDIHByaW9yaXR5IGZvciB0aGUgZGV2aWNlJ3MgaW50ZXJydXB0DQogKiBAcGFyYW0gZGV2X2lyb3V0ZSAtIHNvdXJjZSBJUk9VVElORyBpbmZvcm1hdGlvbiANCiAqIEByZXR1cm4gdWludDMyX3QgIE5WSUMgcHJpb3JpdHkgDQogKi8NCnVpbnQzMl90IGludGVycnVwdF9kZXZpY2VfbnZpY19wcmlvcml0eV9nZXQoY29uc3QgdWludDMyX3QgZGV2X2lyb3V0ZSkNCnsNCiAgICBJUlFuX1R5cGUgbnZpY19udW07DQoJdWludDMyX3QgbnZpY19wcmlvcml0eTsNCiAgICANCiAgICBpZiAocF9pbnRlcnJ1cHRfY29udHJvbF9nZXQoKSkgICAgICAgIA0KICAgIHsgLy8gZGlyZWN0CQkJCQ0KICAgICAgICBudmljX251bSA9IChJUlFuX1R5cGUpKChkZXZfaXJvdXRlID4+IChFQ0lBX05WSUNfSURfQklUUE9TKSkgJiAweEZGdWwpOwkJCQkJCQ0KICAgIH0gDQogICAgZWxzZSAvLyBmdWxseSBhZ2dyZWdhdGVkDQogICAgewkJCQkNCiAgICAgICAgbnZpY19udW0gPSAoSVJRbl9UeXBlKSgoZGV2X2lyb3V0ZSA+PiAoRUNJQV9JQV9OVklDX0lEX0JJVFBPUykpICYgMHhGRnVsKTsNCiAgICB9DQogICAgDQogICAgbnZpY19wcmlvcml0eSA9IE5WSUNfR2V0UHJpb3JpdHkobnZpY19udW0pOw0KCQkNCiAgICByZXR1cm4gbnZpY19wcmlvcml0eTsNCn0NCg0KDQovKiogUmV0dXJuIE5WSUMgcGVuZGluZyBmb3IgdGhlIGRldmljZQ0KICogQHBhcmFtIGRldl9pcm91dGUgLSBzb3VyY2UgSVJPVVRJTkcgaW5mb3JtYXRpb24gDQogKiBAcmV0dXJuIHVpbnQ4X3QgMChub3QgcGVuZGluZyksIDEgKHBlbmRpbmcgaW4gTlZJQykgDQogKiAgDQogKi8NCnVpbnQ4X3QgaW50ZXJydXB0X2RldmljZV9udmljX3BlbmRpbmdfZ2V0KGNvbnN0IHVpbnQzMl90IGRldl9pcm91dGUpDQp7DQogICAgSVJRbl9UeXBlIG52aWNfbnVtOw0KICAgIHVpbnQ4X3QgbnZpY19wZW5kaW5nOw0KICAgIA0KICAgIGlmIChwX2ludGVycnVwdF9jb250cm9sX2dldCgpKSAgICAgICAgDQogICAgeyAvLyBkaXJlY3QJCQkJDQogICAgICAgIG52aWNfbnVtID0gKElSUW5fVHlwZSkoKGRldl9pcm91dGUgPj4gKEVDSUFfTlZJQ19JRF9CSVRQT1MpKSAmIDB4RkZ1bCk7CQkJCQkJDQogICAgfSANCiAgICBlbHNlIC8vIGZ1bGx5IGFnZ3JlZ2F0ZWQNCiAgICB7CQkJCQ0KICAgICAgICBudmljX251bSA9IChJUlFuX1R5cGUpKChkZXZfaXJvdXRlID4+IChFQ0lBX0lBX05WSUNfSURfQklUUE9TKSkgJiAweEZGdWwpOw0KICAgIH0NCiAgICANCiAgICBudmljX3BlbmRpbmcgPSAodWludDhfdCkoTlZJQ19HZXRQZW5kaW5nSVJRKG52aWNfbnVtKSk7DQoJCQ0KICAgIHJldHVybiBudmljX3BlbmRpbmc7DQp9DQoNCg0KLyoqIFNldCBOVklDIHBlbmRpbmcgZm9yIGludGVycnVwdCBzb3VyY2UNCiAqIEBwYXJhbSBkZXZfaXJvdXRlIC0gc291cmNlIElST1VUSU5HIGluZm9ybWF0aW9uICAgDQogKi8NCnZvaWQgaW50ZXJydXB0X2RldmljZV9udmljX3BlbmRpbmdfc2V0KGNvbnN0IHVpbnQzMl90IGRldl9pcm91dGUpDQp7DQogICAgSVJRbl9UeXBlIG52aWNfbnVtOyAgICANCiAgICANCiAgICBpZiAocF9pbnRlcnJ1cHRfY29udHJvbF9nZXQoKSkgICAgICAgIA0KICAgIHsgLy8gZGlyZWN0CQkJCQ0KICAgICAgICBudmljX251bSA9IChJUlFuX1R5cGUpKChkZXZfaXJvdXRlID4+IChFQ0lBX05WSUNfSURfQklUUE9TKSkgJiAweEZGdWwpOwkJCQkJCQ0KICAgIH0gDQogICAgZWxzZSAvLyBmdWxseSBhZ2dyZWdhdGVkDQogICAgewkJCQkNCiAgICAgICAgbnZpY19udW0gPSAoSVJRbl9UeXBlKSgoZGV2X2lyb3V0ZSA+PiAoRUNJQV9JQV9OVklDX0lEX0JJVFBPUykpICYgMHhGRnVsKTsNCiAgICB9DQogICAgDQogICAgTlZJQ19TZXRQZW5kaW5nSVJRKG52aWNfbnVtKTsgICANCn0NCg0KLyoqIENsZWFycyBOVklDIHBlbmRpbmcgZm9yIGludGVycnVwdCBzb3VyY2UNCiAqIEBwYXJhbSBkZXZfaXJvdXRlIC0gc291cmNlIElST1VUSU5HIGluZm9ybWF0aW9uIA0KICogQHJldHVybiB1aW50OF90IDAobm90IHBlbmRpbmcpLCAxIChwZW5kaW5nIGluIE5WSUMpIC0gYmVmb3JlIGNsZWFyIA0KICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBhbmQgZW5hYmxlcyBnbG9iYWwgaW50ZXJydXB0ICANCiAqLw0KdWludDhfdCBpbnRlcnJ1cHRfZGV2aWNlX252aWNfcGVuZGluZ19jbGVhcihjb25zdCB1aW50MzJfdCBkZXZfaXJvdXRlKQ0Kew0KICAgIHVpbnQzMl90IHdhc19tYXNrZWQ7DQogICAgSVJRbl9UeXBlIG52aWNfbnVtOw0KICAgIHVpbnQ4X3QgcGVuZGluZzsNCiAgICANCiAgICBpZiAocF9pbnRlcnJ1cHRfY29udHJvbF9nZXQoKSkgICAgICAgIA0KICAgIHsgLy8gZGlyZWN0CQkJCQ0KICAgICAgICBudmljX251bSA9IChJUlFuX1R5cGUpKChkZXZfaXJvdXRlID4+IChFQ0lBX05WSUNfSURfQklUUE9TKSkgJiAweEZGdWwpOwkJCQkJCQ0KICAgIH0gDQogICAgZWxzZSAvLyBmdWxseSBhZ2dyZWdhdGVkDQogICAgewkJCQkNCiAgICAgICAgbnZpY19udW0gPSAoSVJRbl9UeXBlKSgoZGV2X2lyb3V0ZSA+PiAoRUNJQV9JQV9OVklDX0lEX0JJVFBPUykpICYgMHhGRnVsKTsNCiAgICB9DQogICAgDQogICAgd2FzX21hc2tlZCA9IF9fZ2V0X1BSSU1BU0soKTsNCiAgICBfX2Rpc2FibGVfaXJxKCk7DQogICAgDQogICAgcGVuZGluZyA9ICh1aW50OF90KShOVklDX0dldFBlbmRpbmdJUlEobnZpY19udW0pKTsNCg0KICAgIE5WSUNfQ2xlYXJQZW5kaW5nSVJRKG52aWNfbnVtKTsNCiAgICBfX0RTQigpOw0KICAgIA0KICAgIGlmICghd2FzX21hc2tlZCkgew0KICAgICAgICBfX2VuYWJsZV9pcnEoKTsNCiAgICB9DQoJCQ0KICAgIHJldHVybiBwZW5kaW5nOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qIGVuZCBpbnRlcnJ1cHRfYXBpLmMgKi8NCi8qKiAgIEB9DQogKi8NCg==