ZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvTWFrZWZpbGUgYi9saWJ1cGdyYWRlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1cGdyYWRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjggQEAKKyMgQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQXV0aG9yOiBkZ2VudHJ5QGdvb2dsZS5jb20gKERlbnRvbiBHZW50cnkpCisKK0NST1NTX1BSRUZJWDo9JChUQVJHRVQpCitDQzo9JChDUk9TU19QUkVGSVgpZ2NjCitDUFA6PSQoQ1JPU1NfUFJFRklYKWcrKworTEQ6PSQoQ1JPU1NfUFJFRklYKWxkCitBUjo9JChDUk9TU19QUkVGSVgpYXIKK1JBTkxJQjo9JChDUk9TU19QUkVGSVgpcmFubGliCitTVFJJUDo9JChDUk9TU19QUkVGSVgpc3RyaXAKKworQ0ZMQUdTID0gLWcgLU9zCisKKyMgdXRpbC5jIGluY2x1ZGVzIGh0eXBlLmgsIHdoaWNoIHdlIGRvbid0IGhhdmUuIFNraXAgaXQsIHdlIGRvbid0IG5lZWQgaXQgcmlnaHQgbm93LgorU1JDUyA9IGhteF91cGdyYWRlLmMgaG14X3VwZ3JhZGVfZmxhc2guYyBobXhfdXBncmFkZV9udnJhbS5jIGhteF91cGdyYWRlX3N5c3RlbS5jIGxpYl9xdWV1ZS5jCitJTkNTID0gaG14X3VwZ3JhZGUuaCBobXhfdXBncmFkZV9mbGFzaC5oIGhteF91cGdyYWRlX252cmFtLmggaG14X3VwZ3JhZGVfc3lzdGVtLmggbGliX3F1ZXVlLmggdXRpbC5oCitPQkpTID0gJChTUkNTOi5jPS5vKQorCithbGw6IGxpYnVwZ3JhZGUuYQorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAorCitsaWJ1cGdyYWRlLmE6ICQoT0JKUykgJChJTkNTKQorCSQoQVIpIHJjcyAkQCAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mIGxpYnVwZ3JhZGUuYSAqLm8KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGUuYyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmVlNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS9obXhfdXBncmFkZS5jCkBAIC0wLDAgKzEsMzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZS5jICAkDQorICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQorICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQNCisgKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KKyAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCisgKiBGaWxlIERlc2NyaXB0aW9uOglIVFRQIExpdmUgU3RyZWFtaW5nDQorICogTW9kdWxlOg0KKyAqIFJlbWFya3M6DQorICovDQorDQorLyoqDQorICoNCisgKiBAZGVmZ3JvdXAgVVBHUkFERSBVcGdyYWRlIEFQSXMNCisgKg0KKyAqLw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQorICogQGRhdGUgMzAgU2VwdCAyMDExDQorICovDQorDQorLyoqDQorICogQG5vdGUNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCisgKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQorICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQorICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KKyAqLw0KKw0KKyAvKkB7Ki8NCisNCisvKioNCisgKiBAZmlsZSBobXhfdXBncmFkZS5jDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlICJobXhfdXBncmFkZS5oIg0KKyNpbmNsdWRlICJ1dGlsLmgiDQorLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2RlZmluZSAgCUhNWF9VUEdSQURFX05VTUJFUl9PRl9RVUVVRQk2NA0KKyNkZWZpbmUJSE1YX1VQR1JBREVfVEFTS19QUklPUklUWQkJCQkxMA0KKyNkZWZpbmUJSE1YX1VQR1JBREVfVEFTS19TVEFDS19TSVpFCQkJCSgxMDI0KjEyOCkNCisNCisvKiBFbmQgI2RlZmluZSAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IHR5cGVkZWYgKi8NCisvKiBFbmQgdHlwZWRlZiAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLw0KKw0KKy8qKg0KKyAqIFVwZ3JhZGUgU3RhdHVzIENhbGxiYWNrIG5vdGlmaWVzIHN0YXR1cyB0byBBUFANCisgKi8NCitITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrID0gTlVMTDsNCitITVhfVVBHUkFERV9DT01NQU5EX3QgZ190VXBncmFkZUNvbW1hbmQ7DQorLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KK3N0YXRpYyB1bnNpZ25lZCBsb25nCQlzX3VsVXBncmFkZVRhc2tJZCA9IDA7DQorc3RhdGljIHVuc2lnbmVkIGxvbmcgCQlzX3VsVXBncmFkZU1lc3Nnc2VJZD0wOw0KKy8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8NCisNCitzdGF0aWMgdm9pZCBQX0hNWF9VcGdyYWRlX1Rhc2sodm9pZCogcGFyYW0pOw0KKw0KKw0KKy8qKg0KKyAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4NCisgKiBTdGFydCBIdW1heCBVcGdyYWRlIE1vZHVsZS4gaXQgY3JlYXRlcyBhIHRocmVhZCBmb3IgVXBncmFkaW5nLiA8YnI+DQorICoNCisgKiBAcGFyYW1baW5dIGNhbGxiYWNrIDogc3BlY2lmeSBhIGNhbGxiYWNrIHRvIGdldCBVcGdyYWRlIFN0YXR1cy4gaWYgTlVMTCwgVXBncmFkZSBNb2R1bGUgY2FuJ3QgYmUgc3RhcnRlZC4NCisgKiBAcGFyYW1baW5dIGZpbGUgOiBzcGVjaWZ5IGEgZmlsZSBwYXRoLiBhbHNvIGh0dHAgYWRkcmVzcyB3aWxsIGJlIHBvc3NpYmxlLiBpZiBOVUxMLCBVcGdyYWRlIE1vZHVsZSBjYW4ndCBiZSBzdGFydGVkLg0KKyAqDQorICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPg0KKyAqICAgICAgICAgICMgIDEgOiBmYWlsZWQgPGJyPg0KKyAqDQorICovDQoraW50IEhNWF9VUEdSQURFX1N0YXJ0KCBITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgY2FsbGJhY2ssICB1bnNpZ25lZCBjaGFyICogZmlsZSkNCit7DQorCWludCBlcnI7DQorCUhNWF9VUEdSQURFX0NPTU1BTkRfdCB1cGdyYWRlX21zZzsNCisNCisJLyogQWRkIENhbGxiYWNrICovDQorCWlmKCBjYWxsYmFjayA9PSBOVUxMICkNCisJew0KKwkJcHJpbnRmKCJbJXNdIEVSUk9SIGNhbGxiYWNrIHBvcmludGVyIGlzIE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOw0KKwkJcmV0dXJuIDE7DQorCX0NCisJZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7DQorDQorCWlmICggZmlsZSA9PSBOVUxMICkNCisJew0KKwkJcHJpbnRmKCJbJXNdIEVSUk9SIGZpbGUgcGF0aCBpcyBuVUxMXG4iLCBfX0ZVTkNUSU9OX18pOw0KKwkJcmV0dXJuIDE7DQorCX0NCisNCisJZXJyID0gSE1YX01TR19DcmVhdGUoSE1YX1VQR1JBREVfTlVNQkVSX09GX1FVRVVFLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwJICJVcGdyYWRlTXNnUSIsICZzX3VsVXBncmFkZU1lc3Nnc2VJZCwgSE1YX1NVU1BFTkRUWVBFX0ZJRk8pOw0KKwlpZihlcnIgIT0gSE1YX09LKQ0KKwl7DQorCQlwcmludGYoIlslc10gWyVkXSBFcnJvcigweCV4KSBcblxyIixfX0ZVTkNUSU9OX18sX19MSU5FX18sIGVycik7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCWVyciA9IEhNWF9UQVNLX0NyZWF0ZSggUF9ITVhfVXBncmFkZV9UYXNrLCBITVhfVVBHUkFERV9UQVNLX1BSSU9SSVRZLCBITVhfVVBHUkFERV9UQVNLX1NUQUNLX1NJWkUsICJVcGdyYWRlVGFzayIsIE5VTEwsICZzX3VsVXBncmFkZVRhc2tJZCwgMCk7DQorCWlmKCBlcnIgIT0gSE1YX09LICkNCisJew0KKwkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOw0KKwkJcmV0dXJuIEhNWF9FUlJPUjsNCisJfQ0KKw0KKwlITVhfVEFTS19TdGFydChzX3VsVXBncmFkZVRhc2tJZCk7DQorDQorCXVwZ3JhZGVfbXNnLmNvbW1hbmQgPSBITVhfVVBHUkFERV9GRVRDSDsNCisJLyogdGhpcyBzaG91bGQgYmUgZnJlZWQgYXQgUmVjaWV2ZXIgKi8NCisJdXBncmFkZV9tc2cuZmlsZV9wYXRoID0gc3RyZHVwKGZpbGUpOw0KKw0KKwllcnIgPSBITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZ1cGdyYWRlX21zZywgc2l6ZW9mKEhNWF9VUEdSQURFX0NPTU1BTkRfdCksMCk7DQorCWlmKGVyciAhPSBITVhfT0spDQorCXsNCisJCXByaW50ZiggIltITVhfVVBHUkFERV9TdGFydF0gSE1YX01TR19TZW5kIGVycm9yIDogZXJyIGlzIDB4JXhcbiIsIGVycik7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KKy8qKg0KKyAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4NCisgKiBTdG9wIEh1bWF4IFVwZ3JhZGUgTW9kdWxlLiBldmVuIGl0IGNhbiBiZSBzdG9wZWQgd2hpbGUgaXQgaXMgUmVhZGluZyBvciBGbGFzaGluZy4gPGJyPg0KKyAqDQorICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPg0KKyAqICAgICAgICAgICMgIDEgOiBmYWlsZWQgPGJyPg0KKyAqDQorICovDQoraW50IEhNWF9VUEdSQURFX1N0b3Aodm9pZCkNCit7DQorCWludCBlcnI7DQorCUhNWF9VUEdSQURFX0NPTU1BTkRfdCB1cGdyYWRlX21zZzsNCisJdXBncmFkZV9tc2cuY29tbWFuZCA9IEhNWF9VUEdSQURFX1NUT1A7DQorDQorCWVyciA9IEhNWF9NU0dfU2VuZFVyZ2VudChzX3VsVXBncmFkZU1lc3Nnc2VJZCwgJnVwZ3JhZGVfbXNnLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwwKTsNCisJaWYoZXJyICE9IEhNWF9PSykNCisJew0KKwkJcHJpbnRmKCAiW0hNWF9VUEdSQURFX1N0b3BdIEhNWF9NU0dfU2VuZCBlcnJvciA6IGVyciBpcyAweCV4XG4iLCBlcnIpOw0KKwkJcmV0dXJuIEhNWF9FUlJPUjsNCisJfQ0KKw0KKwlITVhfVEFTS19TdG9wKHNfdWxVcGdyYWRlVGFza0lkKTsNCisNCisJZXJyID0gSE1YX1RBU0tfRGVzdHJveShzX3VsVXBncmFkZVRhc2tJZCk7DQorCWlmKCBlcnIgIT0gSE1YX09LICkNCisJew0KKwkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOw0KKwkJcmV0dXJuIEhNWF9FUlJPUjsNCisJfQ0KKw0KKwllcnIgPSBITVhfTVNHX0Rlc3Ryb3koc191bFVwZ3JhZGVNZXNzZ3NlSWQpOw0KKwlpZihlcnIgIT0gSE1YX09LKQ0KKwl7DQorCQlwcmludGYoIlslc10gWyVkXSBFcnJvcigweCV4KSBcblxyIixfX0ZVTkNUSU9OX18sX19MSU5FX18sIGVycik7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KKyNpZiAwDQorLyoqDQorICogQGIgRnVuY3Rpb24gQGIgRGVzY3JpcHRpb24gPGJyPg0KKyAqIFNwZWNpZnkgYSBmaWxlIHRvIHVwZ3JhZGUgPGJyPg0KKyAqDQorICogQHBhcmFtW2luXSBmaWxlIDogc3BlY2lmeSBmdWxsIGZpbGUgcGF0aC4NCisgKg0KKyAqIEByZXR1cm4gICMgIDAgOiBzdWNjZXNzIDxicj4NCisgKiAgICAgICAgICAjICAxIDogZmFpbGVkIDxicj4NCisgKg0KKyAqLw0KK2ludCBITVhfVVBHUkFERV9GZXRjaEZpbGVUb1VwZ3JhZGUodW5zaWduZWQgY2hhciAqIGZpbGUpDQorew0KKwlpbnQgbkVycjsNCisJSE1YX1VQR1JBREVfQ09NTUFORF90IHVwZ3JhZGVfbXNnOw0KKw0KKwlpZiAoIGZpbGUgPT0gTlVMTCApDQorCXsNCisJCXByaW50ZigiWyVzXSBmaWxlIHBhdGggaXMgblVMTFxuIiwgX19GVU5DVElPTl9fKTsNCisJfQ0KKw0KKwl1cGdyYWRlX21zZy5jb21tYW5kID0gSE1YX1VQR1JBREVfRkVUQ0g7DQorCS8qIHRoaXMgc2hvdWxkIGJlIGZyZWVkIGF0IFJlY2lldmVyICovDQorCXVwZ3JhZGVfbXNnLmZpbGVfcGF0aCA9IHN0cmR1cChmaWxlKTsNCisNCisJcHJpbnRmKCJbJXNdIGZpbGUgcGF0aCBpcyAlc1xuIiwgX19GVU5DVElPTl9fLCB1cGdyYWRlX21zZy5maWxlX3BhdGgpOw0KKw0KKw0KKwluRXJyID0gSE1YX01TR19TZW5kVGltZW91dChzX3VsVXBncmFkZU1lc3Nnc2VJZCwgJnVwZ3JhZGVfbXNnLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwwKTsNCisJaWYobkVyciAhPSBITVhfT0spDQorCXsNCisJCXByaW50ZiggIltITVhfVVBHUkFERV9GZXRjaEZpbGVUb1VwZ3JhZGVdIEhNWF9NU0dfU2VuZCBlcnJvciA6IGVyciBpcyAweCV4XG4iLCBuRXJyKTsNCisJCXJldHVybiBITVhfRVJSOw0KKwl9DQorDQorCXJldHVybiBITVhfT0s7DQorfQ0KKyNlbmRpZg0KKw0KK3ZvaWQgSE1YX1VQR1JBREVfQ2FsbF9DYWxsYmFjayhITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QgKiB1cGdyYWRlX3N0YXR1c19tc2cgKQ0KK3sNCisJaWYgKCBnX2ZVcGdyYWRlU3RhdHVzQ2FsbGJhY2sgIT0gTlVMTCApDQorCXsNCisJCWdfZlVwZ3JhZGVTdGF0dXNDYWxsYmFjayh1cGdyYWRlX3N0YXR1c19tc2cpOw0KKwl9DQorDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBITVhfVVBHUkFERV9FVkVOVF9lIFBfSE1YX1VQR1JBREVfRklMRSh1bnNpZ25lZCBjaGFyICogcGF0aCkNCit7DQorCUhNWF9VUEdSQURFX1NUQVRVU19Nc2dfdCAqIHVwZ3JhZGVfc3RhdHVzX21zZzsNCisJaW50IHJldDsNCisJdXBncmFkZV9zdGF0dXNfbXNnID0gbWFsbG9jKHNpemVvZihITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QpKTsNCisNCisJcHJpbnRmICgiWyVzXSBcbiIsIF9fRlVOQ1RJT05fXyApOw0KKw0KKw0KKwlyZXQgPSBITVhfVVBHUkFERV9IREZfRG9fRmxhc2goIHBhdGggKTsNCisJaWYgKCByZXQgIT0gSE1YX09LICkNCisJew0KKwkJcHJpbnRmICgiWyVzXSBITVhfVVBHUkFERV9IREZfRG9fRmxhc2ggcmV0ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCApOw0KKwkJdXBncmFkZV9zdGF0dXNfbXNnLT5ldmVudCA9IHJldDsNCisJCUhNWF9VUEdSQURFX0NhbGxfQ2FsbGJhY2sodXBncmFkZV9zdGF0dXNfbXNnKTsNCisJCXJldHVybiBITVhfVVBHUkFERV9GSUxFX05PVF9FWElTVDsNCisJfQ0KKw0KKwlmcmVlKHVwZ3JhZGVfc3RhdHVzX21zZyk7DQorCXJldHVybiBITVhfVVBHUkFERV9ET05FOw0KK30NCisNCitzdGF0aWMgdm9pZCBQX0hNWF9VcGdyYWRlX1Rhc2sodm9pZCogcGFyYW0pDQorew0KKwlITVhfVVBHUkFERV9FVkVOVF9lIG5FcnI7DQorCWludCB1cGdyYWRlX2lzX2RvbmUgPSAwOw0KKwlITVhfVVBHUkFERV9DT01NQU5EX3QgcmVjaWV2ZWRfY29tbWFuZDsNCisJdW5zaWduZWQgY2hhciAqIGZpbGVfcGF0aD1OVUxMOw0KKwlITVhfVVBHUkFERV9DT01NQU5EX3Qgc2VuZF9jb21tYW5kOw0KKw0KKwlITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QgKiB1cGdyYWRlX3N0YXR1c19tc2c7DQorCXVwZ3JhZGVfc3RhdHVzX21zZyA9IG1hbGxvYyhzaXplb2YodXBncmFkZV9zdGF0dXNfbXNnKSk7DQorDQorCXdoaWxlKDEpDQorCXsNCisJCW5FcnIgPSBITVhfTVNHX1JlY2VpdmUoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZyZWNpZXZlZF9jb21tYW5kLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSk7DQorCQlpZihuRXJyICE9IEhNWF9PSykNCisJCXsNCisJCQlwcmludGYgKCIlcyAoJWQpIEVycm9yPiAgRXJyb3IgVktfTVNHX1JlY2VpdmVUaW1lb3V0XG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJc3dpdGNoKCByZWNpZXZlZF9jb21tYW5kLmNvbW1hbmQpDQorCQkJew0KKwkJCQljYXNlIEhNWF9VUEdSQURFX1NUQVJUOg0KKwkJCQkJew0KKwkJCQkJCXByaW50ZigiWyVzXSBSZWNlaXZlIEhNWF9VUEdSQURFX1NUQVJUIGNvbW1hbmQgXG4iLF9fRlVOQ1RJT05fXyk7DQorDQorCQkJCQkJLyogRE8gVXBncmFkZSAuLi4uLi4uLiBoZXJlICovDQorCQkJCQkJbkVyciA9IFBfSE1YX1VQR1JBREVfRklMRShmaWxlX3BhdGgpOw0KKw0KKwkJCQkJCXNlbmRfY29tbWFuZC5jb21tYW5kID0gSE1YX1VQR1JBREVfU1RPUDsNCisJCQkJCQkodm9pZClITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZzZW5kX2NvbW1hbmQsIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQljYXNlIEhNWF9VUEdSQURFX1NUT1A6DQorCQkJCQl7DQorCQkJCQkJcHJpbnRmKCJbJXNdIEhNWF9VUEdSQURFX1NUT1AgXHJcbiIsX19GVU5DVElPTl9fKTsNCisNCisJCQkJCQlmcmVlKHVwZ3JhZGVfc3RhdHVzX21zZyk7DQorCQkJCQkJZnJlZShmaWxlX3BhdGgpOw0KKw0KKwkJCQkJCS8qIE5vdGlmeSB0byBhcHAsIFVQZ3JlYWRlIGlzIGRvbmUuICovDQorCQkJCQkJdXBncmFkZV9zdGF0dXNfbXNnLT5ldmVudCA9IEhNWF9VUEdSQURFX0RPTkU7DQorCQkJCQkJSE1YX1VQR1JBREVfQ2FsbF9DYWxsYmFjayh1cGdyYWRlX3N0YXR1c19tc2cpOw0KKw0KKwkJCQkJCS8qIFRBU0sga2lsbHMgaXRzZWxmLiAqLw0KKwkJCQkJCXJldHVybiAwOw0KKwkJCQkJfQ0KKwkJCQljYXNlIEhNWF9VUEdSQURFX0ZFVENIOg0KKwkJCQkJew0KKwkJCQkJCXByaW50ZigiWyVzXSBITVhfVVBHUkFERV9GRVRDSCBcclxuIixfX0ZVTkNUSU9OX18pOw0KKwkJCQkJCWZpbGVfcGF0aCA9IHN0cmR1cChyZWNpZXZlZF9jb21tYW5kLmZpbGVfcGF0aCk7DQorDQorCQkJCQkJcHJpbnRmKCJbJXNdIGZpbGUgcGF0aCA9ICVzIFxyXG4iLF9fRlVOQ1RJT05fXywgZmlsZV9wYXRoKTsNCisNCisJCQkJCQkvKiBjb21tYW5kIGZpbGVfcGF0aCBmcmVlICovDQorCQkJCQkJZnJlZShyZWNpZXZlZF9jb21tYW5kLmZpbGVfcGF0aCk7DQorDQorCQkJCQkJc2VuZF9jb21tYW5kLmNvbW1hbmQgPSBITVhfVVBHUkFERV9TVEFSVDsNCisJCQkJCQkodm9pZClITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZzZW5kX2NvbW1hbmQsIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKw0KKwkJCQlkZWZhdWx0Og0KKwkJCQkJcHJpbnRmKCJbJXNdIFJlY2VpdmUgVW5rbm93biBDb21tYW5kIFxyXG4iLF9fRlVOQ1RJT05fXyk7DQorCQkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCit9DQorDQorLypAfSovDQpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZS5oIGIvbGlidXBncmFkZS9obXhfdXBncmFkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjZjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlLmggICQNCisgKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQNCisgKiBPcmlnaW5hbCBBdXRob3I6IFlhbmcgSHl1biBVayAkDQorICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQNCisgKiBEYXRlOgkJCSREYXRlOiAyMDExLjA5LjMwDQorICogRmlsZSBEZXNjcmlwdGlvbjoJVXBncmFkZSBBUElzDQorICogTW9kdWxlOg0KKyAqIFJlbWFya3M6DQorICovDQorDQorLyoqDQorICogQGRlZmdyb3VwIFVQR1JBREUgVXBncmFkZSBBUElzDQorICovDQorDQorLyoqDQorICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkNCisgKiBAZGF0ZSAzMCBTZXB0IDIwMTENCisgKi8NCisNCisvKioNCisgKiBAbm90ZQ0KKyAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPg0KKyAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24NCisgKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQ0KKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UNCisgKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuDQorICovDQorDQorIC8qQHsqLw0KKw0KKy8qKg0KKyAqIEBmaWxlIGhteF91cGdyYWRlLmgNCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8cHRocmVhZC5oPg0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNpbmNsdWRlIDxhc3NlcnQuaD4NCisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+DQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNpbmNsdWRlICJobXhfdXBncmFkZV9zeXN0ZW0uaCINCisjaW5jbHVkZSAiaG14X3VwZ3JhZGVfZmxhc2guaCINCisvKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0ZXJuIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IEV4dGVybiB2YXJpYWJsZWUgKi8NCisNCisvKiBFbmQgRXh0ZXJuIHZhcmlhYmxlICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KKy8qIEVuZCBNYWNybyBkZWZpbml0aW9uICovDQorDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgdHlwZWRlZiAqLw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJSE1YX1VQR1JBREVfU1RBUlQsIAkJLyoqPCAqLw0KKwlITVhfVVBHUkFERV9TVE9QLCAJCS8qKjwgICovDQorCUhNWF9VUEdSQURFX0ZFVENILCAJCS8qKjwgICovDQorfUhNWF9VUEdSQURFX0NPTU1BTkRfZTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisJSE1YX1VQR1JBREVfQ09NTUFORF9lIGNvbW1hbmQ7DQorCXVuc2lnbmVkIGNoYXIgKiBmaWxlX3BhdGg7DQorfUhNWF9VUEdSQURFX0NPTU1BTkRfdDsNCisNCisvKioNCisgKiBITVhfVVBHUkFERSBTdGF0dXMgY2FzZXMuDQorICovDQordHlwZWRlZiBlbnVtDQorew0KKwlITVhfVVBHUkFERV9TVEFSVEVELCAJCQkJCQkvKio8IFVwZ3JhZGUgTW9kdWxlIGlzIGp1c3Qgc3RhcnRlZCAqLw0KKwlITVhfVVBHUkFERV9HRVRfVkVSU0lPTiwgCQkJCS8qKjwgdGhpcyBjb21lcyB3aXRoIHZlcnNpb24gaW5mb3JtYXRpb24gKi8NCisJSE1YX1VQR1JBREVfUkVBRElORywgCQkJCQkJLyoqPCByZWFkaW5nIGZpbGUuIFVwZ3JhZGUgaXMgaW4gcHJvZ3Jlc3MuICovDQorCUhNWF9VUEdSQURFX0ZMQVNISU5HLCAJCQkJCS8qKjwgRmxhc2hpbmcuIFVwZ3JhZGUgaXMgaW4gcHJvZ3Jlc3MuICAqLw0KKwlITVhfVVBHUkFERV9ET05FLCAJCQkJCQkvKio8IFVwZ3JhZGUgaXMgZG9uZSB3aXRob3V0IGFueSBlcnJvciwgQWZ0ZXIgdGhpcyBtZXNzYWdlLCBVcGdyYWRlIG1vZHVsZSB3aWxsIGJlIGRlc3Ryb3kgaXRzZWxmLiAqLw0KKwlITVhfVVBHUkFERV9TVE9QRURfQllfVVNFUiwgCQkJCS8qKjwgVXBncmFkZSBpcyBzdG9wcGVkIGJ5IHVzZXIuIEFmdGVyIHRoaXMgbWVzc2FnZSwgVXBncmFkZSBtb2R1bGUgd2lsbCBiZSBkZXN0cm95IGl0c2VsZi4gKi8NCisJSE1YX1VQR1JBREVfRkFJTEVELCAJCQkJCQkvKio8IFVwZ3JhZGUgaXMgZmFpbGVkLCBpdCBzaG91bGRuJ3QgaGFwcGVuLiBBZnRlciB0aGlzIG1lc3NhZ2UsIFVwZ3JhZGUgbW9kdWxlIHdpbGwgYmUgZGVzdHJveSBpdHNlbGYuKi8NCisJSE1YX1VQR1JBREVfVkVSU0lPTl9GQUlMRUQsIAkJCQkvKio8IFVwZ3JhZGUgaXMgZmFpbGVkLCB2ZXJzaW9uIHByb2JsZW0uICovDQorCUhNWF9VUEdSQURFX0ZJTEVfTk9UX0VYSVNULCAJCQkJLyoqPCBVcGdyYWRlIGlzIGZhaWxlZCwgdGhlcmUgaXMgbm8gZmlsZSBleGlzdCAgKi8NCisJSE1YX1VQR1JBREVfRklMRV9GT1JNQVRfRVJST1IsIAkJCS8qKjwgVXBncmFkZSBpcyBmYWlsZWQsIGZpbGUgaXMgbm90IEhERiBGb3JtYXQgICAqLw0KKw0KK31ITVhfVVBHUkFERV9FVkVOVF9lOw0KKw0KKw0KKy8qKg0KKyAqIEhNWF9VUEdSQURFX1N0YXR1c19NZXNzYWdlcw0KKyAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKwlITVhfVVBHUkFERV9FVkVOVF9lIGV2ZW50OwkJLyoqPCBldmVudCBmcm9tIFVwZ3JhZGUgbW9kdWxlICovDQorCXVuc2lnbmVkIGludCBwZXJjZW50YWdlOwkJLyoqPCBwZXJjZW50YWdlIHByb2dyZXNzICovDQorCXVuc2lnbmVkIGludCBjdXJyZW50X3ZlcnNpb247CQkvKio8IHZlcnNpb24gY3VycmVudCAqLw0KKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl90b191cGdyYWRlOwkJLyoqPCB2ZXJzaW9uIHRvIHVwZ3JhZGUgKi8NCit9IEhNWF9VUEdSQURFX1NUQVRVU19Nc2dfdDsNCisNCisvKioNCisgKiAgUHJvdG90eXBlIG9mIHVwZ3JhZGUgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gPGJyPg0KKyAqICBDYWxsYmFjayBjYW4gYmUgYWRkZWQgYnkgSE1YX1VQR1JBREVfU3RhcnQgPGJyPjxicj4NCisgKiAgSE1YX1VQR1JBREVfUkVBRElORywgSE1YX1VQR1JBREVfRkxBU0hJTkcgZXZlbnRzIGFsd2F5cyBjb21lcyB3aXRoIHZhbHVlIG9mIHBlcmNlbnRhZ2UuDQorICovDQordHlwZWRlZiB2b2lkICgqSE1YX1VwZ3JhZGVFdmVudENhbGxiYWNrKSAoSE1YX1VQR1JBREVfU1RBVFVTX01zZ190ICogVXBncmFkZVN0YXR1c01lc3NhZ2VzKTsNCisNCisvKiBFbmQgdHlwZWRlZiAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQorZXh0ZXJuIEhNWF9VcGdyYWRlRXZlbnRDYWxsYmFjayBnX2ZVcGdyYWRlU3RhdHVzQ2FsbGJhY2s7DQorLyogRW5kIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQorDQoraW50IEhNWF9VUEdSQURFX1N0YXJ0KCBITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgY2FsbGJhY2ssICB1bnNpZ25lZCBjaGFyICogZmlsZSk7DQoraW50IEhNWF9VUEdSQURFX1N0b3AoIHZvaWQpOw0KKw0KKy8qQH0qLw0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfZmxhc2guYyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZhOTExCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5jCkBAIC0wLDAgKzEsNDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9mbGFzaC5jICAkDQorICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQorICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQNCisgKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KKyAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCisgKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMNCisgKiBNb2R1bGU6DQorICogUmVtYXJrczoNCisgKi8NCisNCisvKioNCisgKiBAZGVmZ3JvdXAgVVBHUkFERV9GTEFTSCBGbGFzaGluZyBBUElzIGZvciBVcGdyYWRlIE1vZHVsZQ0KKyAqIEBpbmdyb3VwIFVQR1JBREUNCisgKg0KKyAqLw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQorICogQGRhdGUgMzAgU2VwdCAyMDExDQorICovDQorDQorLyoqDQorICogQG5vdGUNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCisgKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQorICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQorICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KKyAqLw0KKw0KKyAvKkB7Ki8NCisNCisvKioNCisgKiBAZmlsZSBobXhfdXBncmFkZV9mbGFzaC5jDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4NCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+DQorI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPg0KKyNpbmNsdWRlICJobXhfdXBncmFkZV9mbGFzaC5oIg0KKy8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIEVuZCAjZGVmaW5lICovDQorLyogdGhpcyBpcyBmb3IgdGVzdCAqLw0KKyNkZWZpbmUgVEFSR0VUX0JPT1RfTE9BREVSX01URAkiL2Rldi9tdGRibG9jazAiDQorDQorI2RlZmluZSBUQVJHRVRfTlZSQU1fTVRECSIvZGV2L210ZGJsb2NrMSINCisNCisvKiB0aGlzIGlzIGZvciB0ZXN0ICovDQorI2RlZmluZSBUQVJHRVRfS0VSTkVMX01URAkiL2Rldi9tdGRibG9jazEwIg0KKw0KKy8qIHRoaXMgaXMgZm9yIHRlc3QgdWJpIG1hcHBlZCAqLw0KKyNkZWZpbmUgVEFSR0VUX1JPT1RGU19VQklfTVRECSIvZGV2L210ZGJsb2NrMTEiDQorDQorDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgdHlwZWRlZiAqLw0KKy8qIEVuZCB0eXBlZGVmICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgZ2xvYmFsIHZhcmlhYmxlICovDQorDQorLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KK2ludCBmZF9rZXJuZWwgPSAwOw0KK2ludCBmZF9yb290ZnMgPSAwOw0KK2ludCBmZF9ib29ybG9hZGVyID0gMDsNCitpbnQgZmRfbnZyYW0gPSAwOw0KKw0KK3N0YXRpYyB1bnNpZ25lZCBsb25nCXNfRmxhc2hUb3RhbFNpemU7DQorc3RhdGljIHVuc2lnbmVkIGxvbmcJc19GbGFzaEJsb2NrU2l6ZTsNCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc19CbG9ja0J1ZmY7DQorDQorLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLw0KK2ludCBITVhfVVBHUkFERV9GbGFzaF9LZXJuZWwodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOw0KK2ludCBITVhfVVBHUkFERV9GbGFzaF9Sb290ZnModW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOw0KK2ludCBITVhfVVBHUkFERV9GbGFzaF9Cb290TG9hZGVyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsNCisNCisNCisNCit1bnNpZ25lZCBjaGFyICogSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX0tlcm5lbF9NVEQodm9pZCkNCit7DQorCXJldHVybiBUQVJHRVRfS0VSTkVMX01URDsNCit9DQorDQordW5zaWduZWQgY2hhciAqIEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9Sb290ZnNfTVREKHZvaWQpDQorew0KKwlyZXR1cm4gVEFSR0VUX1JPT1RGU19VQklfTVREOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApDQorew0KKwlpbnQgcmV0Ow0KKwlzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOw0KKwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7DQorCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7DQorDQorCXByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsNCisNCisJLyogKi8NCisJaWYgKCBmZF9udnJhbSA9PSAwICkNCisJew0KKwkJZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7DQorCQlpZiggZmRfbnZyYW0gPCAwICkNCisJCXsNCisJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCX0NCisNCisJcmV0ID0gaW9jdGwoZmRfbnZyYW0sIE1FTUdFVElORk8sKHZvaWQgKikmaW5mbyk7DQorCWlmKHJldCA8IDApDQorCXsNCisJCXByaW50ZigiY2FuJ3QgZ2V0IGluZm8gZGF0YSEgKCVkKVxuIiwgcmV0KTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlyZW1haW5fc2l6ZSA9IHNpemU7DQorCW1vdl9vZmZzZXQgPSBvZmZzZXQ7DQorDQorCXdoaWxlKHJlbWFpbl9zaXplID4gMCkNCisJew0KKwkJLyogb2Zmc2V0wMwgYmxvY2sgs9G+7rytuOkgvsi1yLTZLi4gKi8NCisJCXdyaXRlX3NpemUgPSBpbmZvLmVyYXNlc2l6ZTsNCisJCXdyaXRlX3NpemUgLT0gKChtb3Zfb2Zmc2V0ICsgaW5mby5lcmFzZXNpemUpJWluZm8uZXJhc2VzaXplKTsNCisNCisJCS8qILi2wfa4t8C6ILOquNPB9iC4uMWtLi4gKi8NCisJCWlmKCByZW1haW5fc2l6ZSA8IHdyaXRlX3NpemUpDQorCQl7DQorCQkJd3JpdGVfc2l6ZSA9IHJlbWFpbl9zaXplOw0KKwkJfQ0KKw0KKwkJcHJpbnRmKCIgd3JpdGUgOiBvZmZzZXQgLSAweCV4LCBzaXplICVkXG4iLCBtb3Zfb2Zmc2V0LCB3cml0ZV9zaXplKTsNCisNCisJCXJldCA9IGxzZWVrKGZkX252cmFtLCBtb3Zfb2Zmc2V0LCBTRUVLX1NFVCk7DQorCQlpZihyZXQgPCAwKQ0KKwkJew0KKwkJCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorDQorCQlyZXQgPSB3cml0ZShmZF9udnJhbSwgZGF0YSsobW92X29mZnNldC1vZmZzZXQpLCB3cml0ZV9zaXplKTsNCisJCWlmKHJldCA8IDApDQorCQl7DQorCQkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOw0KKwkJCXJldHVybiAtMTsNCisJCX0NCisNCisJCW1vdl9vZmZzZXQgKz0gd3JpdGVfc2l6ZTsNCisJCXJlbWFpbl9zaXplIC09IHdyaXRlX3NpemU7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwgdW5zaWduZWQgaW50IHNpemUgKQ0KK3sNCisJaW50IHJldDsNCisJc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsNCisJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOw0KKwl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOw0KKw0KKwlwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQorDQorCS8qICovDQorCWlmICggZmRfbnZyYW0gPT0gMCApDQorCXsNCisJCWZkX252cmFtID0gb3BlbihUQVJHRVRfTlZSQU1fTVRELCAoT19SRFdSIHwgT19TWU5DKSApOw0KKwkJaWYoIGZkX252cmFtIDwgMCApDQorCQl7DQorCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKwl9DQorDQorDQorCXJldCA9IGxzZWVrKGZkX252cmFtLCBvZmZzZXQsIFNFRUtfU0VUKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXJldCA9IHJlYWQoZmRfbnZyYW0sIGRhdGEsIHNpemUpOw0KKwlpZihyZXQgPCAwKQ0KKwl7DQorCQlwcmludGYoImNhbid0IHJlYWQgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCisJCXJldHVybiByZXQ7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKw0KKw0KK2ludCBITVhfVVBHUkFERV9GbGFzaF9LZXJuZWwodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApDQorew0KKwlpbnQgcmV0Ow0KKwl1bnNpZ25lZCBjaGFyICogY29tX2J1ZjsNCisNCisJcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KKwkvKiAqLw0KKwlpZiAoIGZkX2tlcm5lbCA9PSAwICkNCisJew0KKwkJZmRfa2VybmVsID0gb3BlbihITVhfVVBHUkFERV9HZXRfRGVhY3RpdmF0ZWRfS2VybmVsX01URCgpLCAoT19SRFdSIHwgT19TWU5DKSApOw0KKwkJaWYoIGZkX2tlcm5lbCA8IDAgKQ0KKwkJew0KKwkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIGZkX2tlcm5lbCFcbiIgKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCX0NCisNCisJcmV0ID0gbHNlZWsoZmRfa2VybmVsLCBvZmZzZXQsIFNFRUtfU0VUKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCisJCXJldHVybiByZXQ7DQorCX0NCisNCisJcmV0ID0gd3JpdGUoZmRfa2VybmVsLCBkYXRhLCBzaXplKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOw0KKwkJcmV0dXJuIHJldDsNCisJfQ0KKw0KKwkvKiBSZWFkIGFuZCBDb21wYXJlICovDQorCXJldCA9IGxzZWVrKGZkX2tlcm5lbCwgb2Zmc2V0LCBTRUVLX1NFVCk7DQorCWlmKHJldCA8IDApDQorCXsNCisJCXByaW50ZigiZmFpbGVkIHNlZWtpbmcgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorDQorCWNvbV9idWYgPSBtYWxsb2Moc2l6ZSk7DQorCWlmIChjb21fYnVmID09IE5VTEwgKQ0KKwl7DQorCQlwcmludGYoIm1hbGxvYyBmYWllZCEhISBcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXJldCA9IHJlYWQoZmRfa2VybmVsLCBjb21fYnVmLCBzaXplKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorDQorCWlmICggbWVtY21wKGRhdGEsIGNvbV9idWYsIHNpemUpICE9IDAgKQ0KKwl7DQorCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCWZyZWUoY29tX2J1Zik7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgSE1YX1VQR1JBREVfRmxhc2hfQm9vdExvYWRlcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkNCit7DQorCWludCByZXQ7DQorCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87DQorCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgd3JpdGVfc2l6ZTsNCisJdW5zaWduZWQgbG9uZyBtb3Zfb2Zmc2V0LCByZW1haW5fc2l6ZTsNCisNCisJcHJpbnRmICggIlNLSVAgQk9PVCBMT0FERVIuLi4gXG4iKTsNCisJcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KKw0KKwlyZXR1cm4gMDsNCisNCisJLyogKi8NCisJaWYgKCBmZF9ib29ybG9hZGVyID09IDAgKQ0KKwl7DQorCQlmZF9ib29ybG9hZGVyID0gb3BlbihUQVJHRVRfQk9PVF9MT0FERVJfTVRELCAoT19SRFdSIHwgT19TWU5DKSApOw0KKwkJaWYoIGZkX2Jvb3Jsb2FkZXIgPCAwICkNCisJCXsNCisJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCX0NCisNCisJcmV0ID0gaW9jdGwoZmRfYm9vcmxvYWRlciwgTUVNR0VUSU5GTywodm9pZCAqKSZpbmZvKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJjYW4ndCBnZXQgaW5mbyBkYXRhISAoJWQpXG4iLCByZXQpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXJlbWFpbl9zaXplID0gc2l6ZTsNCisJbW92X29mZnNldCA9IG9mZnNldDsNCisNCisJd2hpbGUocmVtYWluX3NpemUgPiAwKQ0KKwl7DQorCQkvKiBvZmZzZXTAzCBibG9jayCz0b7uvK246SC+yLXItNkuLiAqLw0KKwkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOw0KKwkJd3JpdGVfc2l6ZSAtPSAoKG1vdl9vZmZzZXQgKyBpbmZvLmVyYXNlc2l6ZSklaW5mby5lcmFzZXNpemUpOw0KKw0KKwkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLw0KKwkJaWYoIHJlbWFpbl9zaXplIDwgd3JpdGVfc2l6ZSkNCisJCXsNCisJCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7DQorCQl9DQorDQorCQlwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOw0KKw0KKwkJcmV0ID0gbHNlZWsoZmRfYm9vcmxvYWRlciwgbW92X29mZnNldCwgU0VFS19TRVQpOw0KKwkJaWYocmV0IDwgMCkNCisJCXsNCisJCQlwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKw0KKwkJcmV0ID0gd3JpdGUoZmRfYm9vcmxvYWRlciwgZGF0YSsobW92X29mZnNldC1vZmZzZXQpLCB3cml0ZV9zaXplKTsNCisJCWlmKHJldCA8IDApDQorCQl7DQorCQkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOw0KKwkJCXJldHVybiAtMTsNCisJCX0NCisNCisJCW1vdl9vZmZzZXQgKz0gd3JpdGVfc2l6ZTsNCisJCXJlbWFpbl9zaXplIC09IHdyaXRlX3NpemU7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBITVhfVVBHUkFERV9GbGFzaF9Sb290ZnModW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApDQorew0KKwlpbnQgcmV0Ow0KKwl1bnNpZ25lZCBjaGFyICogY29tX2J1ZjsNCisJcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KKw0KKwkvKiAqLw0KKwlpZiAoIGZkX3Jvb3RmcyA9PSAwICkNCisJew0KKwkJZmRfcm9vdGZzID0gb3BlbihITVhfVVBHUkFERV9HZXRfRGVhY3RpdmF0ZWRfUm9vdGZzX01URCgpLCAoT19SRFdSIHwgT19TWU5DKSApOw0KKwkJaWYoIGZkX3Jvb3RmcyA8IDAgKQ0KKwkJew0KKwkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIGZkX2tlcm5lbCFcbiIgKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCX0NCisNCisJcmV0ID0gbHNlZWsoZmRfcm9vdGZzLCBvZmZzZXQsIFNFRUtfU0VUKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCisJCXJldHVybiByZXQ7DQorCX0NCisNCisJcmV0ID0gd3JpdGUoZmRfcm9vdGZzLCBkYXRhLCBzaXplKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOw0KKwkJcmV0dXJuIHJldDsNCisJfQ0KKw0KKwkvKiBSZWFkIGFuZCBDb21wYXJlICovDQorCXJldCA9IGxzZWVrKGZkX3Jvb3Rmcywgb2Zmc2V0LCBTRUVLX1NFVCk7DQorCWlmKHJldCA8IDApDQorCXsNCisJCXByaW50ZigiZmFpbGVkIHNlZWtpbmcgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorDQorCWNvbV9idWYgPSBtYWxsb2Moc2l6ZSk7DQorCWlmIChjb21fYnVmID09IE5VTEwgKQ0KKwl7DQorCQlwcmludGYoIm1hbGxvYyBmYWllZCEhISBcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXJldCA9IHJlYWQoZmRfcm9vdGZzLCBjb21fYnVmLCBzaXplKTsNCisJaWYocmV0IDwgMCkNCisJew0KKwkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorDQorCWlmICggbWVtY21wKGRhdGEsIGNvbV9idWYsIHNpemUpICE9IDAgKQ0KKwl7DQorCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCWZyZWUoY29tX2J1Zik7DQorDQorCXJldHVybiAwOw0KKw0KKw0KK30NCisNCisNCisNCisvKkB9Ki8NCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmggYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0ZjA1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfZmxhc2guaApAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9mbGFzaC5oICAkDQorICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQorICogT3JpZ2luYWwgQXV0aG9yOiBZYW5nIEh5dW4gVWsgJA0KKyAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkDQorICogRGF0ZToJCQkkRGF0ZTogMjAxMS4wOS4zMA0KKyAqIEZpbGUgRGVzY3JpcHRpb246CUh1bWF4IFVwZ3JhZGUgQVBJcw0KKyAqIE1vZHVsZToNCisgKiBSZW1hcmtzOg0KKyAqLw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQorICogQGRhdGUgMzAgU2VwdCAyMDExDQorICovDQorDQorLyoqDQorICogQG5vdGUNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCisgKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQorICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQorICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KKyAqLw0KKw0KKyAvKkB7Ki8NCisNCisvKioNCisgKiBAZmlsZSBobXhfdXBncmFkZV9mbGFzaC5oDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KKw0KKy8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiBFeHRlcm4gdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgRXh0ZXJuIHZhcmlhYmxlZSAqLw0KKw0KKy8qIEVuZCBFeHRlcm4gdmFyaWFibGUgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBNYWNybyBkZWZpbml0aW9uICovDQorDQorLyogRW5kIE1hY3JvIGRlZmluaXRpb24gKi8NCisNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCB0eXBlZGVmICovDQorDQorDQorLyogRW5kIHR5cGVkZWYgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZSAqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLw0KKw0KKy8qIEVuZCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLw0KKw0KKy8qQH0qLw0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uYyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JjYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5jCkBAIC0wLDAgKzEsMTA5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfbnZyYW0uYyAgJA0KKyAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJA0KKyAqIE9yaWdpbmFsIEF1dGhvcjoJCVlhbmcgSHl1biBVayAkDQorICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQNCisgKiBEYXRlOgkJCSREYXRlOiAyMDExLjExLjA3DQorICogRmlsZSBEZXNjcmlwdGlvbjoJSHVtYXggVXBncmFkZSBBUElzDQorICogTW9kdWxlOg0KKyAqIFJlbWFya3M6DQorICovDQorDQorLyoqDQorICogQGRlZmdyb3VwIE5WUkFNIEFQSXMgZm9yIFVwZ3JhZGUgTW9kdWxlDQorICogQGluZ3JvdXAgVVBHUkFERQ0KKyAqLw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQorICogQGRhdGUgMDcgTm92IDIwMTENCisgKi8NCisNCisvKioNCisgKiBAbm90ZQ0KKyAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPg0KKyAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24NCisgKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQ0KKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UNCisgKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuDQorICovDQorDQorIC8qQHsqLw0KKw0KKy8qKg0KKyAqIEBmaWxlIGhteF91cGdyYWRlX252cmFtLmMNCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisNCisjaW5jbHVkZSAibGliX3F1ZXVlLmgiDQorI2luY2x1ZGUgImhteF91cGdyYWRlX252cmFtLmgiDQorLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBOVlJBTV9UWVBFX0xFTgkJCTENCisjZGVmaW5lIE5WUkFNX1JFQ09SRF9MRU5HX0xFTgk0DQorI2RlZmluZSBOVlJBTV9OQU1FX0xFTkdfTEVOCQkxDQorI2RlZmluZSBOVlJBTV9EQVRBX0xFTkdfTEVOCQk0DQorDQorI2RlZmluZSBNQVhfTkFNRV9MRU4JCSgyNTYpDQorI2RlZmluZSBNQVhfREFUQV9MRU4JCSgyNTYqMTAyNCkNCisjZGVmaW5lIE1BWF9GSUVMRF9MRU4JCShNQVhfREFUQV9MRU4rTUFYX05BTUVfTEVOKjIpDQorDQorI2RlZmluZSBOVlJBTV9UTFZfVFlQRV9FTkQJMHgwMA0KKyNkZWZpbmUgTlZSQU1fVExWX1RZUEVfRU5WCTB4MDENCisNCisjZGVmaW5lIGdldDhiaXQocSkgKHVuc2lnbmVkIGNoYXIpKChxKVswXSkNCisjZGVmaW5lIGdldDMyYml0KHEpICh1bnNpZ25lZCBpbnQpKCgoKih1bnNpZ25lZCBjaGFyICopKHEpKSA8PCAyNCkgfCAoKigodW5zaWduZWQgY2hhciAqKShxKSsxKSA8PCAxNikgfCAoKigodW5zaWduZWQgY2hhciAqKShxKSsyKSA8PCA4KSB8ICgqKCh1bnNpZ25lZCBjaGFyICopKHEpKzMpKSApDQorDQorI2RlZmluZSBERUJVR19FUlIgcHJpbnRmDQorI2RlZmluZSBERUJVR19JTkZPIHByaW50Zg0KKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQ0KKw0KKyNkZWZpbmUgTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSAkzMg0KKw0KKyNkZWZpbmUgU0VNX0dldCh4KQkodm9pZCkoeCkNCisjZGVmaW5lIFNFTV9SZWxlYXNlKHgpCSh2b2lkKSh4KQ0KKw0KKyNkZWZpbmUgTlZSQU1fUk9fT0ZGU0VUCTB4MA0KKyNkZWZpbmUgTlZSQU1fUk9fU0laRQkJMHgwMDA4MDAwMA0KKyNkZWZpbmUgTlZSQU1fUldfT0ZGU0VUCSggTlZSQU1fUk9fT0ZGU0VUICsgTlZSQU1fUk9fU0laRSApDQorI2RlZmluZSBOVlJBTV9SV19TSVpFCQkweDAwMDIwMDAwDQorI2RlZmluZSBOVlJBTV9SV0JfT0ZGU0VUCSggTlZSQU1fUldfT0ZGU0VUICsgTlZSQU1fUldfU0laRSkNCisjZGVmaW5lIE5WUkFNX1JXQl9TSVpFCQkweDAwMDIwMDAwDQorI2RlZmluZSBSQVdfRlNfT0ZGU0VUCQkoIE5WUkFNX1JXQl9PRkZTRVQgKyBOVlJBTV9SV0JfU0laRSkNCisjZGVmaW5lIFJBV19GU19TSVpFCQkweDAwMDIwMDAwDQorDQorLyogRW5kICNkZWZpbmUgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCB0eXBlZGVmICovDQorDQordHlwZWRlZiBzdHJ1Y3QgTlZSQU1fRVZOVkFSX3R7DQorICAgIHF1ZXVlX3QgcWI7DQorCXVuc2lnbmVkIGludCByZWNMZW47DQorCXVuc2lnbmVkIGNoYXIgKm5hbWU7DQorCXVuc2lnbmVkIGNoYXIgbmFtZUxlbjsNCisJdW5zaWduZWQgY2hhciAqdmFsdWU7DQorCXVuc2lnbmVkIGludCB2YWx1ZUxlbjsNCit9IE5WUkFNX0VWTlZBUl9UOw0KKw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IEhNWF9OVlJBTV9NQVBfdA0KK3sNCisJTlZSQU1fRklFTERfVAkJdHlwZTsNCisJdW5zaWduZWQgY2hhcgkJCQkJc3pGaWxlTmFtZVtNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RIXTsNCisJSE1YX05WUkFNX1BBUlRJVElPTl9FCXN0b3JlUGFydGl0aW9uOw0KKwl1bnNpZ25lZCBpbnQJCQkJCWRlZmF1bHRTaXplOw0KK30gSE1YX05WUkFNX0ZJRUxEX0lORk9fVDsNCisNCitITVhfTlZSQU1fRklFTERfSU5GT19UIHNfbnZyYW1GaWVsZEluZm9bXSA9DQorew0KKwl7TlZSQU1fRklFTERfU1lTVEVNX0lECQkJICwgIlNZU1RFTV9JRCIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwNCisJe05WUkFNX0ZJRUxEX1NGTEFTSAkJCQkgLCAiU0ZMQVNIIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfU0VSSUFMX05PICAgICAgICAgICAgLCAiU0VSSUFMX05PIiAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfRFRDUF9LRVkgICAgICAgICAgICAgLCAiRFRDUF9LRVkiICAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfQ0lfUExVU19LRVkgICAgICAgICAgLCAiQ0lfUExVU19LRVkiICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfTUFDX0FERFIgICAgICAgICAgICAgLCAiTUFDX0FERFIiICAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfSERDUF9LRVkgICAgICAgICAgICAgLCAiSERDUF9LRVkiICAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfUEFSSU5HX0RBVEEgICAgICAgICAgLCAiUEFSSU5HX0RBVEEiICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfQ01fU0VSSUFMX05PICAgICAgICAgLCAiQ01fU0VSSUFMX05PIiAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfQ01fTUFDX0FERFIgICAgICAgICAgLCAiQ01fTUFDX0FERFIiICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfQ01fTUFDX0FERFJfQU5PVEhFUiAgLCAiQ01fTUFDX0FERFJfQU5PVEhFUiIgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfSVJERVRPX0JCQ0IgICAgICAgICAgLCAiSVJERVRPX0JCQ0IiICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfSVJERVRPX0NQQ0IgCQkgLCAiSVJERVRPX0NQQ0IiCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfSVJERVRPX0NQQ0JfRU5DUllQVEVELCAiSVJERVRPX0NQQ0JfRU5DUllQVEVEIiAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfUFJJVkFURSAgICAgICAgICAgICAgLCAiUFJBVkFURSIgICAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfQ1NDX0tFWSAgICAgICAgICAgICAgLCAiQ1NDX0tFWSIgICAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KKwl7TlZSQU1fRklFTERfTE9BREVSX1ZFUgkJCSAsICJMT0FERVJfVkVSIiAJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9BUFBfVkVSIAkJCSAsICJBUFBfVkVSIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9MQU5HVUFHRQkJCSAsICJMQU5HVUFHRSIgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9UVl9TVEFOREFSRAkJCSAsICJUVl9TVEFOREFSRCIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9TQ0FSVF9SR0IJCQkgLCAiU0NBUlRfUkdCIiAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfSERfUkVTT1VMVElPTgkJICwgIkhEX1JFU09VTFRJT04iCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfRklFTERfUkFURQkJICAgICAsICJGSUVMRF9SQVRFIgkJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9PVEFfRkxBRzEJCQkgLCAiT1RBX0ZMQUcxIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfT1RBX0ZMQUcyCQkJICwgIk9UQV9GTEFHMiIgCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX09UQV9GTEFHMwkJCSAsICJPVEFfRkxBRzMiIAkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9PVEFfVFlQRTEJCQkgLCAiT1RBX1RZUEUxIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9PVEFfVFlQRTIJCQkgLCAiT1RBX1RZUEUyIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9PVEFfVFlQRTMJCQkgLCAiT1RBX1RZUEUzIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9DSF9UWVBFMSAJCQkgLCAiQ0hfVFlQRTEiCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX0NIX1RZUEUyIAkJCSAsICJDSF9UWVBFMiIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfQ0hfVFlQRTMgCQkJICwgIkNIX1RZUEUzIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9UVU5FUl9JRDEJCQkgLCAiVFVORVJfSUQxIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9UVU5FUl9JRDIJCQkgLCAiVFVORVJfSUQyIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9UVU5FUl9JRDMJCQkgLCAiVFVORVJfSUQzIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIxCQkgLCAiQU5URU5BX1BPV0VSMSIJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIyCQkgLCAiQU5URU5BX1BPV0VSMiIJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIzCQkgLCAiQU5URU5BX1BPV0VSMyIJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9FU19QSUQxCQkJCSAsICJFU19QSUQxIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfRVNfUElEMgkJCQkgLCAiRVNfUElEMiIgCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX0VTX1BJRDMJCQkJICwgIkVTX1BJRDMiIAkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDEJCSAsICJUUkFOU0FDVElPTl9JRDEiIAkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfVFJBTlNBQ1RJT05fSUQyCQkgLCAiVFJBTlNBQ1RJT05fSUQyIiAJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMwkJICwgIlRSQU5TQUNUSU9OX0lEMyIgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX0FQUF9WRVJTSU9OCQkJICwgIkFQUF9WRVJTSU9OIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX09UQUxEUl9WRVJTSU9OCQkgLCAiT1RBTERSX1ZFUlNJT04iCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfQ1VSX09UQUlNQUdFX1ZFUlNJT04gLCAiQ1VSX09UQUlNQUdFX1ZFUlNJT04iICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfT0FEX1ZFUlNJT04JCQkgLCAiT0FEX1ZFUlNJT04iCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfTkVUX0lQX0NPTkZJRyAJCSAsICJORVRfSVBfQ09ORklHIiAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9ORVRfSVBfU0VUVElORwkJICwgIk5FVF9JUF9TRVRUSU5HIiAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX1JDVV9DVVNUT01fQ09ERQkJICwgIlJDVV9DVVNUT01fQ09ERSIgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX1JDVV9DVVNUT01fQ09ERTIJICwgIlJDVV9DVVNUT01fQ09ERTIiICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX1BBTkVMX0RJU1BMQVkJCSAsICJQQU5FTF9ESVNQTEFZIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX1BBTkVMX0RJTU1JTkcgCQkgLCAiUEFORUxfRElNTUlORyIgCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfQVNQRUNUX1JBVElPIAkJICwgIkFTUEVDVF9SQVRJTyIgCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfQ09VTlRSWV9DT0RFCQkgLCAiQ09VTlRSWV9DT0RFIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX1VTQUdFX0lECQkJICwgIlVTQUdFX0lEIiAgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX0NIX0lORk9fUwkJCSAsICJDSF9JTkZPX1MiICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9DSF9JTkZPX1QJCQkgLCAiQ0hfSU5GT19UIiAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfQ0hfSU5GT19DCQkJICwgIkNIX0lORk9fQyIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX09UQV9GVFBfSU5GTwkJICwgIkZUUF9PVEFfSU5GTyIJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9ORVRfUE9SVEFMX0lQCQkgLCAiTkVUX1BPUlRBTF9JUCIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9ORVRfRE9XTl9QQVRIIAkJICwgIk5FVF9ET1dOX1BBVEgiIAkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX0xPQURFUl9WRVJTSU9OCQkgLCAiTE9BREVSX1ZFUlNJT04iCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfT1NEX0RJU1BMQVkJCQkgLCAiT1NEX0RJU1BMQVkiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfQUNUSVZBVEVEX0tFUk5FTF9OVU0sICJBQ1RJVkFURURfS0VSTkVMX05VTSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9BQ1RJVkFURURfUk9PVEZTX05VTQkJCSAsICJBQ1RJVkFURURfUk9PVEZTX05VTSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9NVERfVFlQRV9GT1JfS0VSTkVMCQkJICwgIk1URF9UWVBFX0ZPUl9LRVJORUwiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfVFlQRV9PRl9GSUxFU1lTVEVNCQkJICwgIlRZUEVfT0ZfRklMRVNZU1RFTSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQorCXtOVlJBTV9GSUVMRF9OQU1FX09GX0JPQVJECQkJICwgIk5BTUVfT0ZfQk9BUkQiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKwl7TlZSQU1fRklFTERfTF9UWVBFX09GX0ZJTEVTWVNURU0JCSwgIkxfVFlQRV9PRl9GSUxFU1lTVEVNIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCisJe05WUkFNX0ZJRUxEX0xfTkFNRV9PRl9CT0FSRAkJCSAsICJMX05BTUVfT0ZfQk9BUkQiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KKw0KKwl7TlZSQU1fRklFTERfQklOOEsJCQkJICwgIkJJTjhLIgkJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB4MjAwMH0sDQorCXtOVlJBTV9GSUVMRF9SQVdGUwkJCQkgLCAiUkFXRlMiIAkJCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGUywgUkFXX0ZTX1NJWkV9LA0KKwl7TlZSQU1fRklFTERfRFVNTVkgCQkJCSAsICJEVU1NWSIgCQkJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0NCit9Ow0KKw0KKy8qIEVuZCB0eXBlZGVmICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgZ2xvYmFsIHZhcmlhYmxlICovDQorc3RhdGljIHF1ZXVlX3Qgc19udnJhbV9lbnZ2YXJzW0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsNCisJCQkJCQkJeyZzX252cmFtX2VudnZhcnNbMF0sJnNfbnZyYW1fZW52dmFyc1swXX0sDQorCQkJCQkJCXsmc19udnJhbV9lbnZ2YXJzWzFdLCZzX252cmFtX2VudnZhcnNbMV19LA0KKwkJCQkJCQl7JnNfbnZyYW1fZW52dmFyc1syXSwmc19udnJhbV9lbnZ2YXJzWzJdfSwNCisJCQkJCQkJfTsNCisNCitzdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fb2Zmc2V0W0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsNCisJCQkJCQkJTlZSQU1fUk9fT0ZGU0VULA0KKwkJCQkJCQlOVlJBTV9SV19PRkZTRVQsDQorCQkJCQkJCVJBV19GU19PRkZTRVQNCisJCQkJCQkJfTsNCisNCitzdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fYmFja3VwX29mZnNldFtITVhfTlZSQU1fUEFSVElUSU9OX01BWF0gPSB7DQorCQkJCQkJCTAsDQorCQkJCQkJCU5WUkFNX1JXQl9PRkZTRVQsDQorCQkJCQkJCTANCisJCQkJCQkJfTsNCisNCitzdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fc2l6ZVtITVhfTlZSQU1fUEFSVElUSU9OX01BWF0gPSB7DQorCQkJCQkJCU5WUkFNX1JPX1NJWkUsDQorCQkJCQkJCU5WUkFNX1JXX1NJWkUsDQorCQkJCQkJCVJBV19GU19TSVpFDQorCQkJCQkJCX07DQorDQorLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNfbnZyYW1TZW1hOw0KKw0KKw0KKy8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqMA0KKyAgICAqICBITVhfTlZSQU1fUmVhZChidWZmZXIsb2Zmc2V0LGxlbmd0aCkwDQorICAgICogIDANCisgICAgKiAgUmVhZCBkYXRhIGZyb20gdGhlIE5WUkFNIGRldmljZTANCisgICAgKg0KKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOg0KKyAgICAqICAJICAgYnVmZmVyIC0gZGVzdGluYXRpb24gYnVmZmVyDQorICAgICogIAkgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byByZWFkDQorICAgICogIAkgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZA0KKyAgICAqDQorICAgICogIFJldHVybiB2YWx1ZToNCisgICAgKiAgCSAgIG51bWJlciBvZiBieXRlcyByZWFkLCBvciA8MCBpZiBlcnJvciBvY2N1cmVkDQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KK3N0YXRpYyBpbnQgZHJ2X05WUkFNX1JlYWQodW5zaWduZWQgY2hhciAqYnVmZmVyLHVuc2lnbmVkIGludCBvZmZzZXQsdW5zaWduZWQgaW50IGxlbmd0aCkNCit7DQorCURSVl9FcnJvcglkcnZfZXJyb3I7DQorDQorCWRydl9lcnJvciA9IEhNWF9VUEdSQURFX05WUkFNX1JlYWQob2Zmc2V0LCBidWZmZXIsIGxlbmd0aCk7DQorCWlmIChkcnZfZXJyb3IgIT0gMCkNCisJew0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXJldHVybiBsZW5ndGg7DQorfQ0KKw0KKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgICAgKiAgSE1YX05WUkFNX1dyaXRlKGJ1ZmZlcixvZmZzZXQsbGVuZ3RoKQ0KKyAgICAqDQorICAgICogIFdyaXRlIGRhdGEgdG8gdGhlIE5WUkFNIGRldmljZQ0KKyAgICAqDQorICAgICogIElucHV0IHBhcmFtZXRlcnM6DQorICAgICogIAkgICBidWZmZXIgLSBzb3VyY2UgYnVmZmVyDQorICAgICogIAkgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byB3cml0ZQ0KKyAgICAqICAJICAgbGVuZ3RoIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlDQorICAgICoNCisgICAgKiAgUmV0dXJuIHZhbHVlOg0KKyAgICAqICAJICAgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIC0xIGlmIGVycm9yIG9jY3VyZWQNCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQorc3RhdGljIGludCBkcnZfTlZSQU1fV3JpdGUodW5zaWduZWQgY2hhciAqYnVmZmVyLHVuc2lnbmVkIGludCBvZmZzZXQsdW5zaWduZWQgaW50IGxlbmd0aCkNCit7DQorCURSVl9FcnJvcglkcnZfZXJyb3I7DQorDQorCWRydl9lcnJvciA9IEhNWF9VUEdSQURFX05WUkFNX1dyaXRlKG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpOw0KKwlpZiAoZHJ2X2Vycm9yICE9IDApDQorCXsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlyZXR1cm4gbGVuZ3RoOw0KK30NCisNCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICogIEhNWF9OVlJBTV9GaW5kRW52KG5hbWUpDQorICAgICoNCisgICAgKiAgTG9jYXRlIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBpbi1tZW1vcnkgbGlzdA0KKyAgICAqDQorICAgICogIElucHV0IHBhcmFtZXRlcnM6DQorICAgICogIAkgICBuYW1lIC0gbmFtZSBvZiBlbnYgdmFyIHRvIGZpbmQNCisgICAgKg0KKyAgICAqICBSZXR1cm4gdmFsdWU6DQorICAgICogIAkgICBOVlJBTV9FVk5WQVJfVCBwb2ludGVyLCBvciBOVUxMIGlmIG5vdCBmb3VuZA0KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCisNCitzdGF0aWMgTlZSQU1fRVZOVkFSX1QgKmRydl9OVlJBTV9GaW5kRW52KEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpDQorew0KKyAgICBxdWV1ZV90ICpxYjsNCisgICAgTlZSQU1fRVZOVkFSX1QgKmVudjsNCisNCisgICAgZm9yIChxYiA9IHNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLnFfbmV4dDsgcWIgIT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dOyBxYiA9IHFiLT5xX25leHQpDQorICAgIHsNCisJCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsNCisJCWlmIChzdHJjbXAoKGNoYXIqKWVudi0+bmFtZSwgKGNoYXIqKW5hbWUpID09IDApDQorCQkJYnJlYWs7DQorCX0NCisNCisgICAgaWYgKHFiID09ICZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXSkNCisgICAgCXJldHVybiBOVUxMOw0KKw0KKyAgICByZXR1cm4gKE5WUkFNX0VWTlZBUl9UICopIHFiOw0KKw0KK30NCisNCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICogIEhNWF9OVlJBTV9TY2FuRGlyKGlkeCxuYW1lLG5hbWVsZW4sdmFsLHZhbGxlbikNCisgICAgKg0KKyAgICAqICBFbnVtZXJhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgVGhpcyByb3V0aW5lIGxvY2F0ZXMNCisgICAgKiAgdGhlIG50aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgY29waWVzIGl0cyBuYW1lIGFuZCB2YWx1ZQ0KKyAgICAqICB0byB1c2VyIGJ1ZmZlcnMuDQorICAgICoNCisgICAgKiAgVGhlIG5hbWVsZW4gYW5kIHZhbGxlbiB2YXJpYWJsZXMgbXVzdCBiZSBwcmVpbml0aWFsaXplZCB0bw0KKyAgICAqICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLg0KKyAgICAqDQorICAgICogIElucHV0IHBhcmFtZXRlcnM6DQorICAgICogIAkgICBpZHggLSB2YXJpYWJsZSBpbmRleCB0byBmaW5kIChzdGFydGluZyB3aXRoIHplcm8pDQorICAgICogIAkgICBuYW1lLG5hbWVsZW4gLSBuYW1lIGJ1ZmZlciBhbmQgbGVuZ3RoDQorICAgICogIAkgICB2YWwsdmFsbGVuIC0gdmFsdWUgYnVmZmVyIGFuZCBsZW5ndGgNCisgICAgKg0KKyAgICAqICBSZXR1cm4gdmFsdWU6DQorICAgICogIAkgICAwIGlmIG9rDQorICAgICogIAkgICBlbHNlIGVycm9yIGNvZGUNCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQorDQorc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2NhbkRpcihITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgKm5hbWVsZW4sIHVuc2lnbmVkIGNoYXIgKnZhbCwgdW5zaWduZWQgaW50ICp2YWxsZW4pDQorew0KKwlxdWV1ZV90ICpxYjsNCisJTlZSQU1fRVZOVkFSX1QgKmVudjsNCisNCisJZm9yIChxYiA9IHNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLnFfbmV4dDsgcWIgIT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dOyBxYiA9IHFiLT5xX25leHQpIHsNCisJCWlmIChpZHggPT0gMCkNCisJCQlicmVhazsNCisJCWlkeC0tOw0KKwl9DQorDQorCWlmIChxYiA9PSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0pDQorCXsNCisJCXJldHVybiBEUlZfRVJSOw0KKwl9DQorCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsNCisNCisJaWYgKG5hbWUgIT0gTlVMTCkNCisJew0KKwkJc3RybmNweSgoY2hhciopbmFtZSwgKGNoYXIqKWVudi0+bmFtZSwgZW52LT5uYW1lTGVuKTsNCisJCW5hbWVbZW52LT5uYW1lTGVuXSA9IDA7DQorCX0NCisJKm5hbWVsZW4gPSBlbnYtPm5hbWVMZW47DQorCWlmICh2YWwgIT0gTlVMTCkNCisJew0KKwkJbWVtY3B5KHZhbCwgZW52LT52YWx1ZSwgZW52LT52YWx1ZUxlbik7DQorCX0NCisJKnZhbGxlbiAgPSBlbnYtPnZhbHVlTGVuOw0KKw0KKwlyZXR1cm4gRFJWX09LOw0KK30NCisNCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICogIEhNWF9OVlJBTV9EZWxldGUobmFtZSkNCisgICAgKg0KKyAgICAqICBEZWxldGUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUNCisgICAgKg0KKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOg0KKyAgICAqICAJICAgbmFtZSAtIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRlbGV0ZQ0KKyAgICAqDQorICAgICogIFJldHVybiB2YWx1ZToNCisgICAgKiAgCSAgIDAgaWYgb2sNCisgICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQ0KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCisNCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9EZWxldGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkNCit7DQorICAgIE5WUkFNX0VWTlZBUl9UICplbnY7DQorDQorICAgIGVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7DQorICAgIGlmIChlbnYgPT0gTlVMTCkNCisgICAgew0KKyAgICAJcmV0dXJuIERSVl9FUlI7DQorICAgIH0NCisNCisJcV9kZXF1ZXVlKChxdWV1ZV90ICopIGVudik7DQorCWZyZWUoZW52KTsNCisJcmV0dXJuIERSVl9PSzsNCit9DQorDQorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAqICBITVhfTlZSQU1fR2V0RW52KG5hbWUpDQorICAgICoNCisgICAgKiAgUmV0cmlldmUgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlDQorICAgICoNCisgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCisgICAgKiAgCSAgIG5hbWUgLSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQNCisgICAgKg0KKyAgICAqICBSZXR1cm4gdmFsdWU6DQorICAgICogIAkgICB2YWx1ZSwgb3IgTlVMTCBpZiB2YXJpYWJsZSBpcyBub3QgZm91bmQNCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQorDQorc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0RW52KEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgcmVhZExlbikNCit7DQorCU5WUkFNX0VWTlZBUl9UCSplbnY7DQorCXVuc2lnbmVkIGludAlsZW47DQorDQorCW1lbXNldCh2YWx1ZSwgMCwgcmVhZExlbik7DQorCWVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7DQorCWlmIChlbnYgIT0gTlVMTCkNCisJew0KKwkJaWYgKHJlYWRMZW4gPiBlbnYtPnZhbHVlTGVuIC0gb2Zmc2V0KQ0KKwkJCWxlbiA9IGVudi0+dmFsdWVMZW4gLSBvZmZzZXQ7DQorCQllbHNlDQorCQkJbGVuID0gcmVhZExlbjsNCisNCisJCW1lbWNweSh2YWx1ZSwgZW52LT52YWx1ZStvZmZzZXQsIGxlbik7DQorCX0NCisNCisJcmV0dXJuIERSVl9PSzsNCit9DQorDQorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAqICBITVhfTlZSQU1fR2V0TGVuZ3RoKG5hbWUpDQorICAgICoNCisgICAgKiAgUmV0cmlldmUgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlDQorICAgICoNCisgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCisgICAgKiAgCSAgIG5hbWUgLSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQNCisgICAgKg0KKyAgICAqICBSZXR1cm4gdmFsdWU6DQorICAgICogIAkgICB2YWx1ZSwgb3IgTlVMTCBpZiB2YXJpYWJsZSBpcyBub3QgZm91bmQNCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQorDQorc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0TGVuZ3RoKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCAqcExlbikNCit7DQorCU5WUkFNX0VWTlZBUl9UCSplbnY7DQorDQorCWVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7DQorCWlmIChlbnYgIT0gTlVMTCkNCisJew0KKwkJKnBMZW4gPSBlbnYtPnZhbHVlTGVuOw0KKwkJcmV0dXJuIERSVl9PSzsNCisJfQ0KKw0KKwlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsNCit9DQorDQorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAqICBITVhfTlZSQU1fU2V0RW52KG5hbWUsdmFsdWUsZmxhZ3MpDQorICAgICoNCisgICAgKiAgU2V0IHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KKyAgICAqDQorICAgICogIElucHV0IHBhcmFtZXRlcnM6DQorICAgICogIAkgICBuYW1lIC0gbmFtZSBvZiB2YXJpYWJsZQ0KKyAgICAqICAJICAgdmFsdWUgLSB2YWx1ZSBvZiB2YXJpYWJsZQ0KKyAgICAqICAJICAgZmxhZ3MgLSBmbGFncyBmb3IgdmFyaWFibGUgKEVOVl9GTEdfeHh4KQ0KKyAgICAqDQorICAgICogIFJldHVybiB2YWx1ZToNCisgICAgKiAgCSAgIDAgaWYgb2sNCisgICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQ0KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCisNCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9TZXRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGludCB2YWx1ZUxlbikNCit7DQorCU5WUkFNX0VWTlZBUl9UICplbnY7DQorCXVuc2lnbmVkIGludCBuYW1lbGVuOw0KKw0KKwllbnYgPSBkcnZfTlZSQU1fRmluZEVudihwYXJ0aXRpb24sIG5hbWUpOw0KKwlpZiAoZW52KQ0KKwl7DQorCQlxX2RlcXVldWUoKHF1ZXVlX3QgKikgZW52KTsNCisJCWZyZWUoZW52KTsNCisJfQ0KKw0KKwluYW1lbGVuID0gc3RybGVuKChjaGFyKiluYW1lKTsNCisJZW52ID0gbWFsbG9jKHNpemVvZihOVlJBTV9FVk5WQVJfVCkgKyBuYW1lbGVuICsgMSArIHZhbHVlTGVuKTsNCisJaWYgKCFlbnYpDQorCXsNCisJCXJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOw0KKwl9DQorCWVudi0+bmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIChlbnYrMSk7DQorCWVudi0+dmFsdWUgPSBlbnYtPm5hbWUgKyBuYW1lbGVuICsgMTsNCisJZW52LT5uYW1lTGVuID0gbmFtZWxlbjsNCisJZW52LT52YWx1ZUxlbiA9IHZhbHVlTGVuOw0KKwllbnYtPnJlY0xlbiA9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZWxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKyB2YWx1ZUxlbik7DQorDQorCXN0cm5jcHkoKGNoYXIqKWVudi0+bmFtZSwgKGNoYXIqKW5hbWUsIG5hbWVsZW4pOw0KKwllbnYtPm5hbWVbbmFtZWxlbl0gPSAwOw0KKwltZW1jcHkoZW52LT52YWx1ZSwgdmFsdWUsIHZhbHVlTGVuKTsNCisNCisJcV9lbnF1ZXVlKCZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXSwocXVldWVfdCAqKSBlbnYpOw0KKw0KKwlyZXR1cm4gRFJWX09LOw0KK30NCisNCisNCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICogIEhNWF9OVlJBTV9Mb2FkKCkNCisgICAgKg0KKyAgICAqICBMb2FkIHRoZSBlbnZpcm9ubWVudCBmcm9tIHRoZSBOVlJBTSBkZXZpY2UuDQorICAgICoNCisgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCisgICAgKiAgCSAgIG5vdGhpbmcNCisgICAgKg0KKyAgICAqICBSZXR1cm4gdmFsdWU6DQorICAgICogIAkgICAwIGlmIG9rDQorICAgICogIAkgICBlbHNlIGVycm9yIGNvZGUNCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQorDQorDQorc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywgdW5zaWduZWQgaW50IHNpemUpDQorew0KKwl1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsNCisJdW5zaWduZWQgY2hhciAqYnVmZmVyOw0KKwl1bnNpZ25lZCBjaGFyICpwdHI7DQorCXVuc2lnbmVkIGludCByZWNMZW47DQorCXVuc2lnbmVkIGludCByZWNUeXBlOw0KKwl1bnNpZ25lZCBpbnQgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBpbnQgcmV0dmFsOw0KKwl1bnNpZ25lZCBjaGFyIGZpbGVOYW1lW01BWF9OQU1FX0xFTl07DQorCXVuc2lnbmVkIGNoYXIgbmFtZUxlbjsNCisJdW5zaWduZWQgaW50IGRhdGFMZW47DQorDQorICAgIG52cmFtX3NpemUgPSBzaXplOw0KKyAgICBidWZmZXIgPSBtYWxsb2MoTUFYX0ZJRUxEX0xFTik7DQorICAgIGlmIChidWZmZXIgPT0gTlVMTCkNCisgICAgew0KKyAgICAJcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7DQorICAgIH0NCisNCisgICAgcHRyID0gYnVmZmVyOw0KKyAgICBvZmZzZXQgPSAwOw0KKw0KKyAgICByZXR2YWwgPSBEUlZfT0s7DQorICAgIC8qIFJlYWQgdGhlIHJlY29yZCB0eXBlIGFuZCBsZW5ndGggKi8NCisgICAgaWYgKGRydl9OVlJBTV9SZWFkKHB0cixvZmZzZXQrYWRkcmVzcyxOVlJBTV9UWVBFX0xFTikgIT0gTlZSQU1fVFlQRV9MRU4pDQorICAgIHsNCisJCXJldHZhbCA9IERSVl9FUlJfRVhURVJOQUxfRVJST1I7DQorCQlnb3RvIGVycm9yOw0KKwl9DQorDQorICAgIHdoaWxlICgoKnB0ciAhPSBOVlJBTV9UTFZfVFlQRV9FTkQpICAmJiAobnZyYW1fc2l6ZSA+IE5WUkFNX1RZUEVfTEVOKSkNCisgICAgew0KKwkJLyogQWRqdXN0IHBvaW50ZXIgZm9yIFRMViB0eXBlICovDQorCQlyZWNUeXBlID0gZ2V0OGJpdChwdHIpOw0KKwkJbnZyYW1fc2l6ZSAtPSBOVlJBTV9UWVBFX0xFTjsNCisJCW9mZnNldCArPSBOVlJBTV9UWVBFX0xFTjsNCisNCisJCWlmIChyZWNUeXBlICE9IE5WUkFNX1RMVl9UWVBFX0VOVikNCisJCXsNCisJCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOw0KKwkJCWdvdG8gZXJyb3I7DQorCQl9DQorDQorCQkvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSBhbmQgbGVuZ3RoIC0gMTYgYml0cywgTVNCIGZpcnN0ICovDQorCQlpZiAoZHJ2X05WUkFNX1JlYWQocHRyLCBvZmZzZXQrYWRkcmVzcywgTlZSQU1fUkVDT1JEX0xFTkdfTEVOKSAhPSBOVlJBTV9SRUNPUkRfTEVOR19MRU4pDQorCQl7DQorCQkJcmV0dmFsID0gRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsNCisJCQlnb3RvIGVycm9yOw0KKwkJfQ0KKwkJcmVjTGVuID0gZ2V0MzJiaXQocHRyKTsNCisJCW52cmFtX3NpemUgLT0gTlZSQU1fUkVDT1JEX0xFTkdfTEVOOw0KKwkJb2Zmc2V0ICs9IE5WUkFNX1JFQ09SRF9MRU5HX0xFTjsNCisNCisJCWlmIChyZWNMZW4gPiBNQVhfRklFTERfTEVOKQ0KKwkJew0KKwkJCXJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047DQorCQkJZ290byBlcnJvcjsNCisJCX0NCisJCWlmIChyZWNMZW4gPiBudnJhbV9zaXplKQ0KKwkJew0KKwkJCXJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047DQorCQkJZ290byBlcnJvcjsgLyogc2hvdWxkIG5vdCBoYXBwZW4sIGJhZCBOVlJBTSAqLw0KKwkJfQ0KKw0KKwkJLyogUmVhZCB0aGUgVExWIGRhdGEgKi8NCisJCWlmIChkcnZfTlZSQU1fUmVhZChwdHIsb2Zmc2V0K2FkZHJlc3MscmVjTGVuKSAhPSAoaW50KXJlY0xlbikNCisJCXsNCisJCQlyZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOw0KKwkJCWdvdG8gZXJyb3I7DQorCQl9DQorDQorCQluYW1lTGVuID0gZ2V0OGJpdChwdHIpOw0KKwkJcHRyICs9IE5WUkFNX05BTUVfTEVOR19MRU47DQorCQlpZiAobmFtZUxlbikNCisJCXsNCisJCSAgICBtZW1jcHkoZmlsZU5hbWUsIHB0ciwgbmFtZUxlbik7DQorCQl9DQorCQlmaWxlTmFtZVtuYW1lTGVuXSA9IDA7DQorCQlwdHIgKz0gbmFtZUxlbjsNCisNCisJCWRhdGFMZW4gPSBnZXQzMmJpdChwdHIpOw0KKwkJcHRyICs9IE5WUkFNX0RBVEFfTEVOR19MRU47DQorCQlpZiAoZGF0YUxlbiA+IE1BWF9EQVRBX0xFTikNCisJCXsNCisJCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOw0KKwkJCWdvdG8gZXJyb3I7DQorCQl9DQorDQorCQlpZiAocmVjTGVuICE9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZUxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKyBkYXRhTGVuKSkNCisJCXsNCisJCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOw0KKwkJCWdvdG8gZXJyb3I7DQorCQl9DQorDQorCQlkcnZfTlZSQU1fU2V0RW52KHBhcnRpdGlvbiwgZmlsZU5hbWUsIHB0ciwgZGF0YUxlbik7DQorDQorCQludnJhbV9zaXplIC09ICh1bnNpZ25lZCBpbnQpcmVjTGVuOw0KKwkJb2Zmc2V0ICs9IHJlY0xlbjsNCisNCisJCS8qIFJlYWQgdGhlIG5leHQgcmVjb3JkIHR5cGUgKi8NCisJCXB0ciA9IGJ1ZmZlcjsNCisJCWlmIChkcnZfTlZSQU1fUmVhZChwdHIsb2Zmc2V0K2FkZHJlc3MsIE5WUkFNX1RZUEVfTEVOKSAhPSBOVlJBTV9UWVBFX0xFTikNCisJCXsNCisJCQlyZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOw0KKwkJCWdvdG8gZXJyb3I7DQorCQl9DQorCX0NCisNCitlcnJvcjoNCisgICAgZnJlZShidWZmZXIpOw0KKw0KKyAgICByZXR1cm4gcmV0dmFsOw0KKw0KK30NCisNCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9Mb2FkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24pDQorew0KKwlEUlZfRXJyb3IJZHJ2X2Vycm9yOw0KKw0KKwlkcnZfZXJyb3IgID0gZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MocGFydGl0aW9uLCBzX252cmFtX29mZnNldFtwYXJ0aXRpb25dLCBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7DQorCWlmIChkcnZfZXJyb3IgIT0gRFJWX09LKQ0KKwl7DQorCQlwcmludGYoIltITVhfTlZSQU1fTG9hZF0gZXJyb3IoJWQpIGxvYWRpbmcgcGFydGl0aW9uICglZClcbiIsIGRydl9lcnJvciwgcGFydGl0aW9uKTsNCisJCWlmIChzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSAhPSAwKQ0KKwkJew0KKwkJCWRydl9lcnJvciAgPSBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhwYXJ0aXRpb24sIHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dLCBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7DQorCQkJaWYgKGRydl9lcnJvciAhPSBEUlZfT0spDQorCQkJew0KKwkJCQlwcmludGYoIltITVhfTlZSQU1fTG9hZF0gZXJyb3IoJWQpIGxvYWRpbmcgYmFja3VwIHBhcnRpdGlvbiAoJWQpXG4iLCBkcnZfZXJyb3IsIHBhcnRpdGlvbik7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXByaW50ZigiW0hNWF9OVlJBTV9Mb2FkXSBsb2FkIE9LIGxvYWRpbmcgYmFja3VwIHBhcnRpdGlvbiAoJWQpXG4iLCBwYXJ0aXRpb24pOw0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm4gZHJ2X2Vycm9yOw0KK30NCisNCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICogIEhNWF9OVlJBTV9TYXZlKCkNCisgICAgKg0KKyAgICAqICBXcml0ZSB0aGUgZW52aXJvbm1lbnQgdG8gdGhlIE5WUkFNIGRldmljZS4NCisgICAgKg0KKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOg0KKyAgICAqICAJICAgbm90aGluZw0KKyAgICAqDQorICAgICogIFJldHVybiB2YWx1ZToNCisgICAgKiAgCSAgIDAgaWYgb2ssIGVsc2UgZXJyb3IgY29kZQ0KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCisNCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9TYXZlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24pDQorew0KKyAgICB1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsNCisgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOw0KKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfZW5kOw0KKyAgICB1bnNpZ25lZCBjaGFyICpwdHI7DQorICAgIHF1ZXVlX3QgKnFiOw0KKyAgICBOVlJBTV9FVk5WQVJfVCAqZW52Ow0KKyAgICB1bnNpZ25lZCBjaGFyIG5hbWVsZW47DQorICAgIHVuc2lnbmVkIGludCB2YWx1ZWxlbjsNCisgICAgdW5zaWduZWQgaW50IHJlY0xlbjsNCisNCisgICAgbnZyYW1fc2l6ZSA9IHNfbnZyYW1fc2l6ZVtwYXJ0aXRpb25dOw0KKyAgICBidWZmZXIgPSBtYWxsb2MobnZyYW1fc2l6ZSk7DQorICAgIGlmIChidWZmZXIgPT0gTlVMTCkNCisgICAgew0KKyAgICAJcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7DQorCX0NCisgICAgYnVmZmVyX2VuZCA9IGJ1ZmZlciArIG52cmFtX3NpemUgLSAxOw0KKw0KKyAgICBwdHIgPSBidWZmZXI7DQorDQorICAgIGZvciAocWIgPSBzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXS5xX25leHQ7IHFiICE9ICZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXTsgcWIgPSBxYi0+cV9uZXh0KQ0KKyAgICB7DQorCQllbnYgPSAoTlZSQU1fRVZOVkFSX1QgKikgcWI7DQorDQorCQluYW1lbGVuID0gZW52LT5uYW1lTGVuOw0KKwkJdmFsdWVsZW4gPSBlbnYtPnZhbHVlTGVuOw0KKwkJcmVjTGVuID0gZW52LT5yZWNMZW47DQorDQorCQlpZiAoKHB0ciArIE5WUkFNX1RZUEVfTEVOICsgTlZSQU1fUkVDT1JEX0xFTkdfTEVOICsgcmVjTGVuKSA+IGJ1ZmZlcl9lbmQpDQorCQl7DQorCQkJYnJlYWs7DQorCQl9DQorDQorCQkqcHRyKysgPSBOVlJBTV9UTFZfVFlQRV9FTlY7CQkvKiBUTFYgcmVjb3JkIHR5cGUgKi8NCisNCisJCSpwdHIrKyA9IChyZWNMZW4+PjI0KSAmIDB4RkY7CQkJLyogVExWIHJlY29yZCBsZW5ndGggKi8NCisJCSpwdHIrKyA9IChyZWNMZW4+PjE2KSAmIDB4RkY7CQkJLyogVExWIHJlY29yZCBsZW5ndGggKi8NCisJCSpwdHIrKyA9IChyZWNMZW4+PjgpICYgMHhGRjsJCQkvKiBUTFYgcmVjb3JkIGxlbmd0aCAqLw0KKwkJKnB0cisrID0gKHJlY0xlbj4+MCkgJiAweEZGOwkJCS8qIFRMViByZWNvcmQgbGVuZ3RoICovDQorDQorCQkqcHRyKysgPSAobmFtZWxlbj4+MCkgJiAweEZGOwkJCS8qIE5BTUUgcmVjb3JkIGxlbmd0aCAqLw0KKw0KKwkJbWVtY3B5KHB0ciwgZW52LT5uYW1lLCBuYW1lbGVuKTsJCS8qIE5BTUUgcmVjb3JkIGRhdGEgKi8NCisJCXB0ciArPSBuYW1lbGVuOw0KKw0KKwkJKnB0cisrID0gKHZhbHVlbGVuPj4yNCkgJiAweEZGOwkJCS8qIFZBTFVFIHJlY29yZCBsZW5ndGggKi8NCisJCSpwdHIrKyA9ICh2YWx1ZWxlbj4+MTYpICYgMHhGRjsJCQkvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovDQorCQkqcHRyKysgPSAodmFsdWVsZW4+PjgpICYgMHhGRjsJCQkvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovDQorCQkqcHRyKysgPSAodmFsdWVsZW4+PjApICYgMHhGRjsJCQkvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovDQorDQorCQltZW1jcHkocHRyLGVudi0+dmFsdWUsIHZhbHVlbGVuKTsNCisJCXB0ciArPSB2YWx1ZWxlbjsNCisNCisJfQ0KKw0KKyAgICAqcHRyKysgPSBOVlJBTV9UTFZfVFlQRV9FTkQ7DQorDQorICAgIG52cmFtX3NpemUgPSBkcnZfTlZSQU1fV3JpdGUoYnVmZmVyLDArc19udnJhbV9vZmZzZXRbcGFydGl0aW9uXSxwdHItYnVmZmVyKTsNCisJaWYgKHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dICE9IDApDQorCXsNCisJCWRydl9OVlJBTV9Xcml0ZShidWZmZXIsMCtzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSxwdHItYnVmZmVyKTsNCisJfQ0KKw0KKyAgICBmcmVlKGJ1ZmZlcik7DQorDQorICAgIHJldHVybiAobnZyYW1fc2l6ZSA9PSAodW5zaWduZWQgaW50KShwdHItYnVmZmVyKSkgPyBEUlZfT0sgOiBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgaW50IE5WUkFNX1NXQVAzMih1bnNpZ25lZCBpbnQgQSkNCit7DQorCXJldHVybiAoKEEgPDwgMjQpIHwgKChBIDw8IDgpICYgIDB4RkYwMDAwKSB8ICgoQSA+PiA4KSAmICAweEZGMDApIHwoQSA+PiAyNCkpOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzX252cmFtU2VtYTsNCisNCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9HZXRGaWVsZEluZm8oY29uc3QgTlZSQU1fRklFTERfVCB0eXBlLCBITVhfTlZSQU1fUEFSVElUSU9OX0UgKnBQYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBzekZpbGVOYW1lLCB1bnNpZ25lZCBpbnQgKmRlZmF1bHRTaXplKQ0KK3sNCisJaW50CWk7DQorDQorCVNFTV9HZXQoc19udnJhbVNlbWEpOw0KKwlmb3IgKGk9MDs7aSsrKQ0KKwl7DQorCQlpZiAoTlZSQU1fRklFTERfRFVNTVkgPT0gc19udnJhbUZpZWxkSW5mb1tpXS50eXBlKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKHR5cGUgIT0gc19udnJhbUZpZWxkSW5mb1tpXS50eXBlKQ0KKwkJCWNvbnRpbnVlOw0KKwkJc3RybmNweSgoY2hhciopcHN6RmlsZU5hbWUsIChjaGFyKikoc19udnJhbUZpZWxkSW5mb1tpXS5zekZpbGVOYW1lKSwgTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSCk7DQorCQkqcFBhcnRpdGlvbiA9IHNfbnZyYW1GaWVsZEluZm9baV0uc3RvcmVQYXJ0aXRpb247DQorCQkqZGVmYXVsdFNpemUgPSBzX252cmFtRmllbGRJbmZvW2ldLmRlZmF1bHRTaXplOw0KKwkJU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOw0KKwkJcmV0dXJuIERSVl9PSzsNCisJfQ0KKwlTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7DQorCXJldHVybiAxOw0KK30NCisNCisNCitEUlZfRXJyb3IJSE1YX05WUkFNX0luaXQodm9pZCkNCit7DQorCWRydl9OVlJBTV9Mb2FkKEhNWF9OVlJBTV9QQVJUSVRJT05fUk8pOw0KKwlkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX1JXKTsNCisJcmV0dXJuIERSVl9PSzsNCit9DQorDQorRFJWX0Vycm9yCUhNWF9OVlJBTV9Xcml0ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBjaGFyICpwTmFtZSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqcFZhbHVlLCB1bnNpZ25lZCBpbnQgdWxTaXplKQ0KK3sNCisJRFJWX0Vycm9yCWRydl9lcnJvcjsNCisNCisJVU5VU0VEKG9mZnNldCk7DQorDQorCVNFTV9HZXQoc19udnJhbVNlbWEpOw0KKwlkcnZfZXJyb3IgPSBkcnZfTlZSQU1fU2V0RW52KHBhcnRpdGlvbiwgcE5hbWUsIHBWYWx1ZSwgdWxTaXplKTsNCisJZHJ2X2Vycm9yID0gZHJ2X05WUkFNX1NhdmUocGFydGl0aW9uKTsNCisJU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOw0KKwlyZXR1cm4gZHJ2X2Vycm9yOw0KK30NCisNCitEUlZfRXJyb3IJSE1YX05WUkFNX1JlYWQoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSkNCit7DQorCURSVl9FcnJvcglkcnZfZXJyb3I7DQorDQorCVNFTV9HZXQoc19udnJhbVNlbWEpOw0KKwltZW1zZXQocFZhbHVlLCAwLCB1bFNpemUpOw0KKwlkcnZfZXJyb3IgPSBkcnZfTlZSQU1fR2V0RW52KHBhcnRpdGlvbiwgcE5hbWUsIG9mZnNldCwgcFZhbHVlLCB1bFNpemUpOw0KKwlTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7DQorCXJldHVybiBkcnZfZXJyb3I7DQorfQ0KKw0KK0RSVl9FcnJvciBITVhfTlZSQU1fR2V0RmllbGQoTlZSQU1fRklFTERfVCBmaWVsZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqZGF0YSwgaW50IG5EYXRhU2l6ZSkNCit7DQorCURSVl9FcnJvciBlcnJDb2RlID0gRFJWX0VSUjsNCisJdW5zaWduZWQgY2hhcgkJc3pGaWxlTmFtZVtNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RIXTsNCisJSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbjsNCisJaW50CQkJCQludnJhbUhhbmRsZTsNCisJdW5zaWduZWQgaW50CQkJCWRlZmF1bHRTaXplOw0KKw0KKwlpZiggZGF0YSA9PSBOVUxMIHx8IGZpZWxkID09IE5WUkFNX0ZJRUxEX0RVTU1ZICkNCisJew0KKwkJcmV0dXJuIDI7DQorCX0NCisNCisJZXJyQ29kZSA9IGRydl9OVlJBTV9HZXRGaWVsZEluZm8oZmllbGQsICZwYXJ0aXRpb24sIHN6RmlsZU5hbWUsICZkZWZhdWx0U2l6ZSk7DQorCWlmIChlcnJDb2RlICE9IERSVl9PSykNCisJew0KKwkJREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBmaWVsZCglZCkgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fR2V0RmllbGRJbmZvXG4iLCBmaWVsZCwgZXJyQ29kZSk7DQorCQlyZXR1cm4gZXJyQ29kZTsNCisJfQ0KKw0KKwlzd2l0Y2ggKHBhcnRpdGlvbikNCisJew0KKwljYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGUyA6DQorCQlicmVhazsNCisJY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1JPIDoNCisJY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1JXIDoNCisJCWlmIChkZWZhdWx0U2l6ZSA9PSAwKQ0KKwkJew0KKwkJCWVyckNvZGUgPSBITVhfTlZSQU1fUmVhZChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIG9mZnNldCwgZGF0YSwgbkRhdGFTaXplKTsNCisJCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spDQorCQkJew0KKwkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIGZpZWxkKCVkKS0lcyBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9SZWFkXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7DQorCQkJCXJldHVybiBlcnJDb2RlOw0KKwkJCX0NCisJCQlpZiAoZmllbGQgPT0gTlZSQU1fRklFTERfU1lTVEVNX0lEICYmIGVyckNvZGUgPT0gMCkNCisJCQl7DQorCQkJCSooKHVuc2lnbmVkIGludCopZGF0YSkgPSBOVlJBTV9TV0FQMzIoKHVuc2lnbmVkIGludCkqKHVuc2lnbmVkIGludCopZGF0YSk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXVuc2lnbmVkIGNoYXIgKnBCdWY7DQorDQorCQkJcEJ1ZiA9IG1hbGxvYyhkZWZhdWx0U2l6ZSk7DQorCQkJaWYgKHBCdWYgPT0gTlVMTCkNCisJCQl7DQorCQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRGaWVsZF0gbWFsbG9jXG4iKTsNCisJCQkJcmV0dXJuIDM7DQorCQkJfQ0KKwkJCWVyckNvZGUgPSBITVhfTlZSQU1fUmVhZChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIHBCdWYsIGRlZmF1bHRTaXplKTsNCisJCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spDQorCQkJew0KKwkJCQltZW1zZXQocEJ1ZiwgMCwgZGVmYXVsdFNpemUpOw0KKwkJCX0NCisJCQltZW1jcHkoZGF0YSwgcEJ1ZiArIG9mZnNldCwgbkRhdGFTaXplKTsNCisJCQlmcmVlKHBCdWYpOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWRlZmF1bHQgOg0KKwkJREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBESV9FUlJfSU5WQUxJRF9QQVJBTSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsNCisJCXJldHVybiAyOw0KKwl9DQorDQorCXJldHVybiBlcnJDb2RlOw0KK30NCisNCitEUlZfRXJyb3IgSE1YX05WUkFNX1NldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpDQorew0KKwlEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7DQorCXVuc2lnbmVkIGNoYXIJCXN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07DQorCUhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb247DQorCWludAkJCQkJbnZyYW1IYW5kbGU7DQorCXVuc2lnbmVkIGludAkJCQlkZWZhdWx0U2l6ZTsNCisJdW5zaWduZWQgY2hhcgkJCQkqcEJ1ZjsNCisJdW5zaWduZWQgaW50CQkJCXN5c3RlbUlkOw0KKw0KKwlpZiggZGF0YSA9PSBOVUxMIHx8IGZpZWxkID09IE5WUkFNX0ZJRUxEX0RVTU1ZICkNCisJew0KKwkJcmV0dXJuIDI7DQorCX0NCisNCisJcEJ1ZiA9IG1hbGxvYyhuRGF0YVNpemUpOw0KKwlpZiAocEJ1ZiA9PSBOVUxMKQ0KKwl7DQorCQlyZXR1cm4gNTsNCisJfQ0KKw0KKwllcnJDb2RlID0gSE1YX05WUkFNX0dldEZpZWxkKGZpZWxkLCBvZmZzZXQsIHBCdWYsIG5EYXRhU2l6ZSk7DQorCWlmIChlcnJDb2RlID09IERSVl9PSykNCisJew0KKwkJaWYgKG1lbWNtcChwQnVmLCBkYXRhLCBuRGF0YVNpemUpID09IDApDQorCQl7DQorCQkJZnJlZShwQnVmKTsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisJfQ0KKwlmcmVlKHBCdWYpOw0KKw0KKwllcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsNCisJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KKwl7DQorCQlERUJVR19FUlIoIltITVhfTlZSQU1fU2V0RmllbGRdIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX0dldEZpZWxkSW5mbywgZmllbGQgKCVkKVxuIiwgZXJyQ29kZSwgZmllbGQpOw0KKwkJcmV0dXJuIGVyckNvZGU7DQorCX0NCisNCisJc3dpdGNoIChwYXJ0aXRpb24pDQorCXsNCisJY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMgOg0KKwkJZXJyQ29kZSA9IERSVl9OQU5ERkxBU0hfR2V0TnZyYW1IYW5kbGUoJm52cmFtSGFuZGxlKTsNCisJCWlmIChlcnJDb2RlICE9IERSVl9PSykNCisJCXsNCisJCQlyZXR1cm4gZXJyQ29kZTsNCisJCX0NCisNCisJCWVyckNvZGUgPSBEUlZfRkxBU0hfV3JpdGUoc19udnJhbV9vZmZzZXRbSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTXSArIG9mZnNldCwgZGF0YSwgbkRhdGFTaXplKTsNCisJCWlmIChlcnJDb2RlICE9IERSVl9PSykNCisJCXsNCisJCQlERUJVR19FUlIoIltITVhfTlZSQU1fU2V0RmllbGRdIGZpZWxkKCVkKS0lcyBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9Xcml0ZVxuIiwgZmllbGQsIHN6RmlsZU5hbWUsIGVyckNvZGUpOw0KKwkJCXJldHVybiBlcnJDb2RlOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9STyA6DQorCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9SVyA6DQorCQlpZiAoZGVmYXVsdFNpemUgPT0gMCkNCisJCXsNCisJCQlpZiAoZmllbGQgPT0gTlZSQU1fRklFTERfU1lTVEVNX0lEICYmIGVyckNvZGUgPT0gMCkNCisJCQl7DQorCQkJCXN5c3RlbUlkID0gTlZSQU1fU1dBUDMyKCh1bnNpZ25lZCBpbnQpKih1bnNpZ25lZCBpbnQqKWRhdGEpOw0KKwkJCQlkYXRhID0gKHZvaWQqKSZzeXN0ZW1JZDsNCisJCQl9DQorCQkJZXJyQ29kZSA9IEhNWF9OVlJBTV9Xcml0ZShwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIGRhdGEsIG5EYXRhU2l6ZSk7DQorCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KKwkJCXsNCisJCQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsNCisJCQkJcmV0dXJuIGVyckNvZGU7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXVuc2lnbmVkIGNoYXIgKnBCdWY7DQorDQorCQkJcEJ1ZiA9IG1hbGxvYyhkZWZhdWx0U2l6ZSk7DQorCQkJaWYgKHBCdWYgPT0gTlVMTCkNCisJCQl7DQorCQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gbWFsbG9jXG4iKTsNCisJCQkJcmV0dXJuIDM7DQorCQkJfQ0KKwkJCWVyckNvZGUgPSBITVhfTlZSQU1fUmVhZChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIHBCdWYsIGRlZmF1bHRTaXplKTsNCisJCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spDQorCQkJew0KKwkJCQltZW1zZXQocEJ1ZiwgMCwgZGVmYXVsdFNpemUpOw0KKwkJCX0NCisJCQltZW1jcHkocEJ1ZiArIG9mZnNldCwgZGF0YSwgbkRhdGFTaXplKTsNCisNCisJCQllcnJDb2RlID0gSE1YX05WUkFNX1dyaXRlKHBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgMCwgcEJ1ZiwgZGVmYXVsdFNpemUpOw0KKwkJCWZyZWUocEJ1Zik7DQorCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KKwkJCXsNCisJCQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsNCisJCQkJcmV0dXJuIGVyckNvZGU7DQorCQkJfQ0KKwkJfQ0KKwkJYnJlYWs7DQorCWRlZmF1bHQgOg0KKwkJREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBESV9FUlJfSU5WQUxJRF9QQVJBTSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsNCisJCXJldHVybiAxOw0KKwl9DQorDQorCXJldHVybiBlcnJDb2RlOw0KK30NCisNCitEUlZfRXJyb3IgSE1YX05WUkFNX0dldExlbmd0aChOVlJBTV9GSUVMRF9UIGZpZWxkLCBpbnQgKnBMZW4pDQorew0KKwlEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7DQorCXVuc2lnbmVkIGNoYXIJCXN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07DQorCUhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb247DQorCWludAkJCQkJbnZyYW1IYW5kbGU7DQorCXVuc2lnbmVkIGludAkJCQlkZWZhdWx0U2l6ZTsNCisJdW5zaWduZWQgY2hhcgkJCQkqcEJ1ZjsNCisNCisJaWYoIHBMZW4gPT0gTlVMTCkNCisJew0KKwkJcmV0dXJuIDI7DQorCX0NCisNCisJKnBMZW4gPSAwOw0KKw0KKwllcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsNCisJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KKwl7DQorCQlERUJVR19FUlIoIltITVhfTlZSQU1fR2V0TGVuZ3RoXSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm8sIGZpZWxkICglZClcbiIsIGVyckNvZGUsIGZpZWxkKTsNCisJCXJldHVybiBlcnJDb2RlOw0KKwl9DQorDQorCWVyckNvZGUgPSBkcnZfTlZSQU1fR2V0TGVuZ3RoKHBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgcExlbik7DQorDQorCXJldHVybiBEUlZfT0s7DQorfQ0KKw0KK0RSVl9FcnJvcglITVhfTlZSQU1fUmVtb3ZlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lKQ0KK3sNCisJaW50CXJlc3VsdDsNCisNCisJU0VNX0dldChzX252cmFtU2VtYSk7DQorCXJlc3VsdCA9IGRydl9OVlJBTV9EZWxldGUocGFydGl0aW9uLCBwTmFtZSk7DQorCWlmIChyZXN1bHQgPT0gMCkNCisJew0KKwkJcmVzdWx0ID0gZHJ2X05WUkFNX1NhdmUocGFydGl0aW9uKTsNCisJfQ0KKwlTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7DQorCXJldHVybiByZXN1bHQ7DQorfQ0KKw0KK0RSVl9FcnJvciBITVhfTlZSQU1fRHVtcCh1bnNpZ25lZCBjaGFyKiBwdWNCdWZmZXIsIHVuc2lnbmVkIGludCB1aUxlbiwgdW5zaWduZWQgaW50IHVpQWxpZ24pDQorew0KKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsNCisJdW5zaWduZWQgaW50IHNraXA7DQorDQorCXNraXAgPSAxOw0KKwlmb3IgKHVpSW5kZXg9MCA7IHVpSW5kZXg8dWlMZW4gOyB1aUluZGV4KyspDQorCXsNCisJCWlmICh1aUFsaWduIT0wICYmICh1aUluZGV4JXVpQWxpZ24pPT0wKQ0KKwkJew0KKwkJCWlmIChza2lwID09IDApDQorCQkJew0KKwkJCQlwcmludGYoIlxuIik7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJc2tpcCA9IDA7DQorCQl9DQorCQlwcmludGYoIiUwMlggIiwgKihwdWNCdWZmZXIrdWlJbmRleCkpOw0KKwl9DQorCXByaW50ZigiXG4iKTsNCisJcmV0dXJuIERSVl9PSzsNCit9DQorDQorRFJWX0Vycm9yIEhNWF9OVlJBTV9EaXIodm9pZCkNCit7DQorICAgIGNoYXIgbmFtZVs4MF07DQorICAgIGNoYXIgKnZhbHVlOw0KKyAgICBpbnQgbmFtZUxlbiwgdmFsdWVMZW47DQorICAgIGludCBpZHg7DQorDQorCXZhbHVlID0gbWFsbG9jKE1BWF9EQVRBX0xFTik7DQorCWlmICh2YWx1ZSA9PSBOVUxMKQ0KKwl7DQorCQlyZXR1cm4gRFJWX0VSUl9PVVRPRk1FTU9SWTsNCisJfQ0KKw0KKwlTRU1fR2V0KHNfbnZyYW1TZW1hKTsNCisNCisgICAgcHJpbnRmKCJST00gTmFtZSAgICAgICAgVmFsdWVcbiIpOw0KKyAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsNCisNCisgICAgZm9yIChpZHg9MDs7aWR4KyspDQorCXsNCisJCWlmIChkcnZfTlZSQU1fU2NhbkRpcihITVhfTlZSQU1fUEFSVElUSU9OX1JPLCBpZHgsICh1bnNpZ25lZCBjaGFyKiluYW1lLCAodW5zaWduZWQgaW50KikmbmFtZUxlbiwgKHVuc2lnbmVkIGNoYXIqKXZhbHVlLCAodW5zaWduZWQgaW50KikmdmFsdWVMZW4pICE9IERSVl9PSykNCisJCQlicmVhazsNCisJCXByaW50ZigiJTIwcyAiLCBuYW1lKTsNCisJCSh2b2lkKUhNWF9OVlJBTV9EdW1wKCh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgdmFsdWVMZW4sIDE2KTsNCisJfQ0KKyAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsNCisNCisgICAgcHJpbnRmKCJcbiIpOw0KKw0KKyAgICBwcmludGYoIlZhcmlhYmxlIE5hbWUgICAgICAgIFZhbHVlXG4iKTsNCisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7DQorDQorICAgIGZvciAoaWR4PTA7O2lkeCsrKQ0KKwl7DQorCQlpZiAoZHJ2X05WUkFNX1NjYW5EaXIoSE1YX05WUkFNX1BBUlRJVElPTl9SVywgaWR4LCAodW5zaWduZWQgY2hhciopbmFtZSwgKHVuc2lnbmVkIGludCopJm5hbWVMZW4sICh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgKHVuc2lnbmVkIGludCopJnZhbHVlTGVuKSAhPSBEUlZfT0spDQorCQkJYnJlYWs7DQorCQlwcmludGYoIiUyMHMgIiwgbmFtZSk7DQorCQkodm9pZClITVhfTlZSQU1fRHVtcCgodW5zaWduZWQgY2hhciopdmFsdWUsIHZhbHVlTGVuLCAxNik7DQorCX0NCisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7DQorDQorCWZyZWUodmFsdWUpOw0KKw0KKwlTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7DQorICAgIHJldHVybiBEUlZfT0s7DQorfQ0KKw0KKy8qQH0qLw0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uaCBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDJhY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5oCkBAIC0wLDAgKzEsMzM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9udnJhbS5oICAkDQorICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQorICogT3JpZ2luYWwgQXV0aG9yOiBZYW5nIEh5dW4gVWsgJA0KKyAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkDQorICogRGF0ZToJCQkkRGF0ZTogMjAxMS4xMS4wNw0KKyAqIEZpbGUgRGVzY3JpcHRpb246CVVwZ3JhZGUgQVBJcw0KKyAqIE1vZHVsZToNCisgKiBSZW1hcmtzOg0KKyAqLw0KKw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQorICogQGRhdGUgMDcgTm92IDIwMTENCisgKi8NCisNCisvKioNCisgKiBAbm90ZQ0KKyAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPg0KKyAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24NCisgKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQ0KKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UNCisgKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuDQorICovDQorDQorIC8qQHsqLw0KKw0KKy8qKg0KKyAqIEBmaWxlIGhteF91cGdyYWRlX252cmFtLmgNCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQorLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqIEV4dGVybiB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBFeHRlcm4gdmFyaWFibGVlICovDQorDQorLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogTWFjcm8gRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8NCisNCisvKiBFbmQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IHR5cGVkZWYgKi8NCisNCit0eXBlZGVmIGVudW0NCit7DQorCU5WUkFNX09TRF9PTiA9IDAsDQorCU5WUkFNX09TRF9PRkYNCit9TlZSQU1fT1NEX0RJU1BMQVlfRTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorCU5WUkFNX0ZST05UUEFORUxfRElTUExBWV9PTiA9IDAsDQorCU5WUkFNX0ZST05UUEFORUxfRElTUExBWV9PRkYNCit9TlZSQU1fRlJPTlRQQU5FTF9ESVNQTEFZX0U7DQorDQordHlwZWRlZiBlbnVtDQorew0KKwlOVlJBTV9BU1BFQ1RfUkFUSU9fNF8zID0gMCwNCisJTlZSQU1fQVNQRUNUX1JBVElPXzE2XzkNCit9TlZSQU1fQVNQRUNUX1JBVElPX0U7DQorDQordHlwZWRlZiBlbnVtDQorew0KKwlOVlJBTV9PVEFfU1NVID0gMSwNCisJTlZSQU1fT1RBX0RURyA9IDIsDQorCU5WUkFNX09UQV9IVU1BWCA9IDMsDQorCU5WUkFNX09UQV9OT1JESUcgPSA0LA0KKwlOVlJBTV9PVEFfRklMRSA9IDUsDQorCU5WUkFNX09UQV9TS1lEID0gNiwNCisJTlZSQU1fT1RBX01BWA0KK31OVlJBTV9PVEFfVFlQRV9FOw0KKw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJTlZSQU1fT1RBX0NIQU5ORUxfU0FUCQk9IDEsDQorCU5WUkFNX09UQV9DSEFOTkVMX0NBQgkJPSAyLA0KKwlOVlJBTV9PVEFfQ0hBTk5FTF9URVIJCT0gMywNCisJTlZSQU1fT1RBX0NIQU5ORUxfRkxBU0gJCT0gNCwNCisJTlZSQU1fT1RBX0NIQU5ORUxfRlRQCQk9IDUNCit9TlZSQU1fT1RBX0NIQU5ORUxfRTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorCU5WUkFNX1JFU09MVVRJT05fVW5rbm93bgkJCT0weDAwMDAwMDAwLA0KKwlOVlJBTV9SRVNPTFVUSU9OXzcyMHgyNDBQCQk9MHgwMDAwMDAwMSwNCisJTlZSQU1fUkVTT0xVVElPTl8yODgweDI0MFAJCT0weDAwMDAwMDAyLA0KKwlOVlJBTV9SRVNPTFVUSU9OXzY0MHg0ODBQCQk9MHgwMDAwMDAwNCwNCisJTlZSQU1fUkVTT0xVVElPTl83MjB4NDgwSQkJPTB4MDAwMDAwMDgsDQorCU5WUkFNX1JFU09MVVRJT05fNzIweDQ4MFAJCT0weDAwMDAwMDEwLA0KKwlOVlJBTV9SRVNPTFVUSU9OXzE0NDB4NDgwUAkJPTB4MDAwMDAwMjAsDQorCU5WUkFNX1JFU09MVVRJT05fMjg4MHg0ODBJCQk9MHgwMDAwMDA0MCwNCisJTlZSQU1fUkVTT0xVVElPTl8yODgweDQ4MFAJCT0weDAwMDAwMDgwLA0KKwlOVlJBTV9SRVNPTFVUSU9OXzcyMHgyODhQCQk9MHgwMDAwMDEwMCwNCisJTlZSQU1fUkVTT0xVVElPTl8yODgweDI4OFAgCQk9MHgwMDAwMDIwMCwNCisJTlZSQU1fUkVTT0xVVElPTl83MjB4NTc2SQkJPTB4MDAwMDA0MDAsDQorCU5WUkFNX1JFU09MVVRJT05fNzIweDU3NlAJCT0weDAwMDAwODAwLA0KKwlOVlJBTV9SRVNPTFVUSU9OXzE0NDB4NTc2UAkJPTB4MDAwMDEwMDAsDQorCU5WUkFNX1JFU09MVVRJT05fMjg4MHg1NzZJIAkJPTB4MDAwMDIwMDAsDQorCU5WUkFNX1JFU09MVVRJT05fMjg4MHg1NzZQCQk9MHgwMDAwNDAwMCwNCisJTlZSQU1fUkVTT0xVVElPTl8xMDgweDcyMFAJCT0weDAwMDA4MDAwLA0KKwlOVlJBTV9SRVNPTFVUSU9OXzEyODB4NzIwUAkJPTB4MDAwMTAwMDAsDQorCU5WUkFNX1JFU09MVVRJT05fMTkyMHgxMDgwSQkJPTB4MDAwMjAwMDAsDQorCU5WUkFNX1JFU09MVVRJT05fMTkyMHgxMDgwUAkJPTB4MDAwNDAwMDAsDQorCU5WUkFNX1JFU09MVVRJT05fRFVNTVkJCQk9MHgwMDBGRkZGRg0KK30gTlZSQU1fVklERU9fUkVTT0xVVElPTl9FOw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJTlZSQU1fSERNSV9GSUVMRF9SQVRFX1Vua25vd24JPTB4MDAwMCwNCisJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzI0SFoJCT0weDAwMDEsDQorCU5WUkFNX0hETUlfRklFTERfUkFURV8yNUhaIAkJPTB4MDAwMiwNCisJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzMwSFogCQk9MHgwMDA0LA0KKwlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfNTBIWiAJCT0weDAwMDgsDQorCU5WUkFNX0hETUlfRklFTERfUkFURV82MEhaIAkJPTB4MDAxMCwNCisJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEwMEhaIAkJPTB4MDAyMCwNCisJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEyMEhaIAkJPTB4MDA0MCwNCisJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzIwMEhaCQk9MHgwMDgwLA0KKwlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjQwSFoJCT0weDAxMDAsDQorCU5WUkFNX0hETUlfRklFTERfUkFURV9EVU1NWQkJPTB4RkZGRg0KK30gTlZSQU1fSERNSV9WSURFT19GSUVMRF9SQVRFX0U7DQorDQorDQordHlwZWRlZiBlbnVtDQorew0KKwlOVlJBTV9IRE1JX1ZJREVPX0FSX2VOb0RhdGEgPSAwLA0KKwlOVlJBTV9IRE1JX1ZJREVPX0FSX2U0XzMsDQorCU5WUkFNX0hETUlfVklERU9fQVJfZTE2XzkNCit9TlZSQU1fSERNSV9WSURFT19BUl9FOw0KKw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJTlZSQU1fU0NBUlRfT1VUUFVUX0NWQlM9MywNCisJTlZSQU1fU0NBUlRfT1VUUFVUX1JHQiwNCisJTlZSQU1fU0NBUlRfT1VUUFVUX1NWSURFTywNCisNCisJTlZSQU1fU0NBUlRfTUFYDQorfSBOVlJBTV9TQ0FSVF9TRVRUSU5HX1ZBTFVFOw0KKw0KK3R5cGVkZWYgZW51bSB0YWdOVlJBTV9GSUVMRA0KK3sNCisJTlZSQU1fRklFTERfU1lTVEVNX0lEID0gMCwJCQkJCS8vIHVuc2lnbmVkIGludAkJCQkvLyA0CQkJCS8vIFN5c3RlbSBJZA0KKwlOVlJBTV9GSUVMRF9TRkxBU0gsDQorCU5WUkFNX0ZJRUxEX1NFUklBTF9OTywNCisJTlZSQU1fRklFTERfTUFDX0FERFIsDQorCU5WUkFNX0ZJRUxEX0hEQ1BfS0VZLA0KKwlOVlJBTV9GSUVMRF9EVENQX0tFWSwNCisJTlZSQU1fRklFTERfQ0lfUExVU19LRVksDQorCU5WUkFNX0ZJRUxEX1BBUklOR19EQVRBLA0KKwlOVlJBTV9GSUVMRF9QUklWQVRFLA0KKwlOVlJBTV9GSUVMRF9DU0NfS0VZLA0KKwlOVlJBTV9GSUVMRF9DTV9TRVJJQUxfTk8sDQorCU5WUkFNX0ZJRUxEX0NNX01BQ19BRERSLA0KKwlOVlJBTV9GSUVMRF9DTV9NQUNfQUREUl9BTk9USEVSLA0KKwlOVlJBTV9GSUVMRF9JUkRFVE9fQkJDQiwNCisNCisJTlZSQU1fRklFTERfT1RBX1RZUEUxID0gMHgxMDAsCQkJCS8vIE5WUkFNX09UQV9UWVBFX0UNCisJTlZSQU1fRklFTERfT1RBX1RZUEUyLCAJCQkJCQkvLyBOVlJBTV9PVEFfVFlQRV9FDQorCU5WUkFNX0ZJRUxEX09UQV9UWVBFMywJCQkJCQkvLyBOVlJBTV9PVEFfVFlQRV9FDQorCU5WUkFNX0ZJRUxEX0NIX1RZUEUxLAkJCQkJCS8vIE5WUkFNX09UQV9DSEFOTkVMX0UNCisJTlZSQU1fRklFTERfQ0hfVFlQRTIsCQkJCQkJLy8gTlZSQU1fT1RBX0NIQU5ORUxfRQ0KKwlOVlJBTV9GSUVMRF9DSF9UWVBFMywJCQkJCQkvLyBOVlJBTV9PVEFfQ0hBTk5FTF9FDQorCU5WUkFNX0ZJRUxEX09UQV9GTEFHMSwJCQkJCQkvLyBOVlJBTV9PVEFfRkxBR19FDQorCU5WUkFNX0ZJRUxEX09UQV9GTEFHMiwJCQkJCQkvLyBOVlJBTV9PVEFfRkxBR19FDQorCU5WUkFNX0ZJRUxEX09UQV9GTEFHMywJCQkJCQkvLyBOVlJBTV9PVEFfRkxBR19FDQorCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMSwJCQkJCQkvLyBUdW5lciBJZA0KKwlOVlJBTV9GSUVMRF9UVU5FUl9JRDIsCQkJCQkJLy8gVHVuZXIgSWQNCisJTlZSQU1fRklFTERfVFVORVJfSUQzLAkJCQkJCS8vIFR1bmVyIElkDQorCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjEsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbg0KKwlOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIyLAkJCQkJLy8gRXh0ZXJuYWwgQW50ZW5hIFBvd2VyIGZvciBUZXIsIDA6T2ZmLzE6T24NCisJTlZSQU1fRklFTERfQU5URU5BX1BPV0VSMywJCQkJCS8vIEV4dGVybmFsIEFudGVuYSBQb3dlciBmb3IgVGVyLCAwOk9mZi8xOk9uDQorCU5WUkFNX0ZJRUxEX0VTX1BJRDEsCQkJCQkJCS8vIEVsZW1lbnQgU3RyZWFtIFBJRCBmb3IgT1RBDQorCU5WUkFNX0ZJRUxEX0VTX1BJRDIsCQkJCQkJCS8vIEVsZW1lbnQgU3RyZWFtIFBJRCBmb3IgT1RBDQorCU5WUkFNX0ZJRUxEX0VTX1BJRDMsCQkJCQkJCS8vIEVsZW1lbnQgU3RyZWFtIFBJRCBmb3IgT1RBDQorCU5WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMSwJCQkJCS8vIFRyYW5zYWN0aW9uIElkIGZvciBOb3JkaWMgT1RBDQorCU5WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMiwJCQkJCS8vIFRyYW5zYWN0aW9uIElkIGZvciBOb3JkaWMgT1RBDQorCU5WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMywJCQkJCS8vIFRyYW5zYWN0aW9uIElkIGZvciBOb3JkaWMgT1RBDQorCU5WUkFNX0ZJRUxEX0NIX0lORk9fUywJCQkJCQkvLyBESV9DSEFOTkVMX1BBUkFNDQorCU5WUkFNX0ZJRUxEX0NIX0lORk9fVCwJCQkJCQkvLyBESV9DSEFOTkVMX1BBUkFNDQorCU5WUkFNX0ZJRUxEX0NIX0lORk9fQywJCQkJCQkvLyBESV9DSEFOTkVMX1BBUkFNDQorCU5WUkFNX0ZJRUxEX05FVF9QT1JUQUxfSVAsCQkJCQkvLyBwb3J0YWwgaXAgYWRkcmVzcw0KKwlOVlJBTV9GSUVMRF9ORVRfRE9XTl9QQVRILAkJCQkJLy8gTmV0d29yayBEb3dubG9hZCBQYXRoDQorCU5WUkFNX0ZJRUxEX05FVF9ERVZJQ0VfSUQsCQkJCQkvLyBldGhlcm5ldCBkZXZpY2UgaWQgMCA9IGV0aDANCisJTlZSQU1fRklFTERfTkVUX0lQX0NPTkZJRywJCQkJCS8vIERIQ1AvTWFudWFsDQorCU5WUkFNX0ZJRUxEX05FVF9JUF9TRVRUSU5HLAkJCQkJLy8gTWFudWFsIElQIHNldHRpbmcNCisJTlZSQU1fRklFTERfT1RBX0ZUUF9JTkZPLAkJCQkJLy8gTlZSQU1fRlRQX09UQV9TRVRUSU5HX1QNCisJTlZSQU1fRklFTERfRklMRV9TSVpFLAkJCQkJCS8vIGZpbGUgc2l6ZSBvZiBiYWNrZ3JvdWxkIG90YQ0KKw0KKwlOVlJBTV9GSUVMRF9MT0FERVJfVkVSU0lPTiwJCQkJCS8vIFZlcnNpb24gb2YgYm9vdCBMb2FkZXINCisJTlZSQU1fRklFTERfQVBQX1ZFUlNJT04sCQkJCQkJLy8gVmVyc2lvbiBudW1iZXIgb2YgQXBwbGljYXRpb24NCisJTlZSQU1fRklFTERfT1RBTERSX1ZFUlNJT04sCQkJCQkvLyBWZXJzaW9uIG9mIE9UQSBMb2FkZXINCisJTlZSQU1fRklFTERfQ1VSX09UQUlNQUdFX1ZFUlNJT04sCQkJLy8gVmVyc2lvbiBudW1iZXIgb2YgT1RBIGltYWdlDQorCU5WUkFNX0ZJRUxEX0xPQURFUl9WRVIsDQorCU5WUkFNX0ZJRUxEX0FQUF9WRVIsDQorDQorCU5WUkFNX0ZJRUxEX0xBTkdVQUdFLAkJCQkJCS8vIE9TRCBsYW5ndWFnZSBjb2RlIGluIElTTyA2MzkgY29kZQ0KKwlOVlJBTV9GSUVMRF9DT1VOVFJZX0NPREUsCQkJCQkvLyB1bnNpZ25lZCBjaGFyIGFbM10NCisJTlZSQU1fRklFTERfVFZfU1RBTkRBUkQsCQkJCQkJLy8gRElfVklERU9fU0RfU1RBTkRBUkQNCisJTlZSQU1fRklFTERfU0NBUlRfUkdCLAkJCQkJCS8vIE5WUkFNX1NDQVJUX1NFVFRJTkdfVkFMVUUNCisJTlZSQU1fRklFTERfSERfUkVTT1VMVElPTiwJCQkJCS8vIE5WUkFNX1ZJREVPX1JFU09MVVRJT05fRQ0KKwlOVlJBTV9GSUVMRF9GSUVMRF9SQVRFLAkJCQkJCS8vIE5WUkFNX0hETUlfVklERU9fRklFTERfUkFURV9FDQorCU5WUkFNX0ZJRUxEX09BRF9WRVJTSU9OLAkJCQkJCS8vIGZvciBNSEVHID8/Pw0KKwlOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUsCQkJCQkvLyBmb3IgUkNVIGN1c3RvbSBjb2RlDQorCU5WUkFNX0ZJRUxEX1JDVV9DVVNUT01fQ09ERTIsCQkJCS8vIGZvciBhbHRlcm5hdGl2ZSBSQ1UgY3VzdG9tIGNvZGUNCisJTlZSQU1fRklFTERfUEFORUxfRElTUExBWSwJCQkJCS8vIERJX09UQV9QQU5FTERJU1BMQVlfdA0KKwlOVlJBTV9GSUVMRF9QQU5FTF9ESU1NSU5HLAkJCQkJLy8gdW5zaWduZWQgY2hhcg0KKwlOVlJBTV9GSUVMRF9PU0RfRElTUExBWSwJCQkJCQkvLyBOVlJBTV9PU0RfRElTUExBWV9FDQorCU5WUkFNX0ZJRUxEX1NUQVJUX0JBTktfRkxBRywJCQkJCS8vILXOILCzwMcgYmFua8HfIL7utfC3ziC6zsbDIMfSIMH2ILDhwaQNCisJTlZSQU1fRklFTERfQ0hFQ0tfVVNCLAkJCQkJCS8vILrOxsMgvcMgVVNCILi2v+7GrsfYvK0gaGRmuKYgsMu758fSwfYguLvB9iCw4cGkDQorCU5WUkFNX0ZJRUxEX0NIRUNLX1VTQl9DT1VOVCwJCQkJCS8vIMCnILW/wNsgvcfG0CC9wyC47iC5+CDA5yC9w7W1IMfSwfYgY291bnS4piDA+sDlDQorCU5WUkFNX0ZJRUxEX0FTUEVDVF9SQVRJTywJCQkJCS8vIE5WUkFNX0FTUEVDVF9SQVRJT19FDQorCU5WUkFNX0ZJRUxEX1VTQUdFX0lELAkJCQkJCS8vIGZvciBVUEMgT1RBDQorCU5WUkFNX0ZJRUxEX0JJTjhLLAkJCQkJCQkvLyBmb3IgZWVwcm9tIGVtdWxhdGlvbg0KKwlOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQiwJCQkJCQkvLyBmb3IgSVJERVRPIENQQ0INCisJTlZSQU1fRklFTERfSVJERVRPX0NQQ0JfRU5DUllQVEVELCAJCQkvLyBmb3IgSVJERVRPIENQQ0IgKGVuY3J5cHRlZCkNCisNCisJTlZSQU1fRklFTERfQUNUSVZBVEVEX0tFUk5FTF9OVU0sIAkJCS8vIEFDVElWQVRFRF9LRVJORUxfTlVNDQorCU5WUkFNX0ZJRUxEX0FDVElWQVRFRF9ST09URlNfTlVNLCAJCQkvLyBBQ1RJVkFURURfUk9PVEZTX05VTQ0KKwlOVlJBTV9GSUVMRF9NVERfVFlQRV9GT1JfS0VSTkVMLCAJCQkvLyBNVERfVFlQRV9GT1JfS0VSTkVMDQorCU5WUkFNX0ZJRUxEX1RZUEVfT0ZfRklMRVNZU1RFTSwgCQkJCS8vIFRZUEVfT0ZfRklMRVNZU1RFTQ0KKwlOVlJBTV9GSUVMRF9MX1RZUEVfT0ZfRklMRVNZU1RFTSwJCQkJLy8gTGVuZ3RoIFRZUEVfT0ZfRklMRVNZU1RFTQ0KKwlOVlJBTV9GSUVMRF9OQU1FX09GX0JPQVJELCAJCQkJCS8vIE5BTUVfT0ZfQk9BUkQNCisJTlZSQU1fRklFTERfTF9OQU1FX09GX0JPQVJELCAJCQkJCS8vIExlbmd0aCBOQU1FX09GX0JPQVJEDQorDQorDQorCU5WUkFNX0ZJRUxEX1JBV0ZTID0gMHgxMDAwLA0KKwlOVlJBTV9GSUVMRF9EVU1NWSA9IDB4RkZGRg0KK30gTlZSQU1fRklFTERfVDsNCisNCit0eXBlZGVmIGVudW0NCit7DQorCU5WUkFNX09UQV9GTEFHX05PX09UQQkJCT0gMHgwMCwNCisJTlZSQU1fT1RBX0ZMQUdfREVURUNURUQJCQk9IDB4MDEsDQorCU5WUkFNX09UQV9GTEFHX0NPTVBMRVRFRAkJCT0gMHgwMiwNCisJTlZSQU1fT1RBX0ZMQUdfRk9SQ0VfVVBHUkFERQkJPSAweDA0LA0KKwlOVlJBTV9PVEFfRkxBR19OQUdSQV9SRUNPVkVSWQk9IDB4MDgsDQorCU5WUkFNX09UQV9GTEFHX0RPV05MT0FESU5HCQk9IDB4MTAsDQorCU5WUkFNX09UQV9GTEFHX1dSSVRJTkcJCQk9IDB4MjAsDQorCU5WUkFNX09UQV9GTEFHX0VSUk9SCQkJCT0gMHg4MA0KK30gTlZSQU1fT1RBX0ZMQUdfRTsNCisNCit0eXBlZGVmIHN0cnVjdCBOVlJBTV9ORVRfSVBfU0VUVElOR19UYWcNCit7DQorI2RlZmluZSBORVRfQUREUl9MRU5HVEggNA0KKwl1bnNpZ25lZCBjaGFyCQlpcFtORVRfQUREUl9MRU5HVEhdOw0KKwl1bnNpZ25lZCBjaGFyCQltYXNrW05FVF9BRERSX0xFTkdUSF07DQorCXVuc2lnbmVkIGNoYXIgCQlnYXRld2F5W05FVF9BRERSX0xFTkdUSF07DQorCXVuc2lnbmVkIGNoYXIJCWRuc1tORVRfQUREUl9MRU5HVEhdOw0KK30gTlZSQU1fTkVUX0lQX1NFVFRJTkdfVDsNCisNCit0eXBlZGVmIHN0cnVjdCBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVGFnDQorew0KKyNkZWZpbmUgTlZSQU1fRlRQX1VTRVJfTEVOR1RIIAkJMjANCisjZGVmaW5lIE5WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIIAkJMjANCisjZGVmaW5lIE5WUkFNX0ZUUF9ESVJfUEFUSF9MRU5HVEggCTIwMA0KKyNkZWZpbmUgTlZSQU1fRlRQX0ZJTEVfTkFNRV9MRU5HVEggCTUwDQorCXVuc2lnbmVkIGNoYXIJCWFTZXJ2ZXJJcFtORVRfQUREUl9MRU5HVEhdOw0KKwl1bnNpZ25lZCBjaGFyIAkJYVVzZXJOYW1lW05WUkFNX0ZUUF9VU0VSX0xFTkdUSF07DQorCXVuc2lnbmVkIGNoYXIgCQlhUGFzc3dkW05WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIXTsNCisJdW5zaWduZWQgY2hhciAJCWFEaXJQYXRoW05WUkFNX0ZUUF9ESVJfUEFUSF9MRU5HVEhdOw0KKwl1bnNpZ25lZCBjaGFyIAkJYUZpbGVOYW1lW05WUkFNX0ZUUF9GSUxFX05BTUVfTEVOR1RIXTsNCit9IE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UOw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisJTlZSQU1fSVBfREhDUCA9IDAsDQorCU5WUkFNX0lQX01BTlVBTA0KK30gTlZSQU1fTkVUX0lQX0NPTkZJR19FOw0KKw0KKy8qIFN0YXJ0IGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQordHlwZWRlZiBlbnVtIEhNWF9OVlJBTV9QQVJUSVRJT05fZQ0KK3sNCisJSE1YX05WUkFNX1BBUlRJVElPTl9STywNCisJSE1YX05WUkFNX1BBUlRJVElPTl9SVywNCisJSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTLA0KKwlITVhfTlZSQU1fUEFSVElUSU9OX01BWA0KK31ITVhfTlZSQU1fUEFSVElUSU9OX0U7DQorDQorDQordHlwZWRlZiBlbnVtDQorew0KKwlEUlZfT0sJCQk9CTAsDQorIAlEUlZfRVJSLA0KKw0KKwlEUlZfRVJSX0lOVkFMSURfUEFSQU1FVEVSLA0KKwlEUlZfRVJSX0lOSVRJQUxJWkFUSU9OLA0KKwlEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OLA0KKwlEUlZfRVJSX09VVE9GTUVNT1JZLA0KKwlEUlZfRVJSX0VYVEVSTkFMX0VSUk9SDQorDQorfURSVl9FcnJvcjsNCisNCisvKiBFbmQgdHlwZWRlZiAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2V4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApOw0KK2V4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICk7DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorRFJWX0Vycm9yCUhNWF9OVlJBTV9Jbml0KHZvaWQpOw0KK0RSVl9FcnJvcglITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSk7DQorRFJWX0Vycm9yCUhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpOw0KK0RSVl9FcnJvcglITVhfTlZSQU1fR2V0RmllbGQoTlZSQU1fRklFTERfVCBmaWVsZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqZGF0YSwgaW50IG5EYXRhU2l6ZSk7DQorRFJWX0Vycm9yCUhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsNCitEUlZfRXJyb3IJSE1YX05WUkFNX0dldExlbmd0aChOVlJBTV9GSUVMRF9UIGZpZWxkLCBpbnQgKnBMZW4pOw0KK0RSVl9FcnJvcglITVhfTlZSQU1fUmVtb3ZlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lKTsNCitEUlZfRXJyb3IJSE1YX05WUkFNX0Rpcih2b2lkKTsNCisNCisNCisvKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCisNCisNCisvKkB9Ki8NCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5jIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9zeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ0MmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9zeXN0ZW0uYwpAQCAtMCwwICsxLDE1NTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX3N5c3RlbS5jICAkDQorICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQorICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQNCisgKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KKyAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCisgKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMNCisgKiBNb2R1bGU6DQorICogUmVtYXJrczoNCisgKi8NCisNCisvKioNCisgKiBAZGVmZ3JvdXAgVVBHUkFERV9TWVNURU0gU3lzdGVtIEFQSXMgZm9yIFVwZ3JhZGUgTW9kdWxlDQorICogQGluZ3JvdXAgVVBHUkFERQ0KKyAqLw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQorICogQGRhdGUgMzAgU2VwdCAyMDExDQorICovDQorDQorLyoqDQorICogQG5vdGUNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCisgKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQorICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQorICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KKyAqLw0KKw0KKyAvKkB7Ki8NCisNCisvKioNCisgKiBAZmlsZSBobXhfdXBncmFkZV9zeXN0ZW0uYw0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8NCisjaW5jbHVkZSAiaG14X3VwZ3JhZGVfc3lzdGVtLmgiDQorLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmZGVmIFRBU0tfREVCVUcNCisjZGVmaW5lIFByaW50RGVidWcoZm10LCAuLi4pIAkJcHJpbnRmIChmbXQsICMjIF9fVkFfQVJHU19fKQ0KKyNkZWZpbmUgUHJpbnRFcnJvcihmbXQsIC4uLikgICAgCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykNCisjZGVmaW5lIFByaW50RW50ZXIoLi4uKQkJCXByaW50ZigiKCspJXNcbiIsIF9fRlVOQ1RJT05fXykNCisjZGVmaW5lIFByaW50RXhpdCguLi4pCQkJCXByaW50ZigiKC0pJXNcbiIsIF9fRlVOQ1RJT05fXykNCisjZWxzZQ0KKyNkZWZpbmUgUHJpbnREZWJ1ZyhmbXQsIC4uLikgICAgCXdoaWxlICgwKSAoKGludCAoKikoY2hhciAqLCAuLi4pKSAwKQ0KKyNkZWZpbmUgUHJpbnRFcnJvcihmbXQsIC4uLikJCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykNCisjZGVmaW5lIFByaW50RW50ZXIoLi4uKSAJCQl3aGlsZSAoMCkgKChpbnQgKCopKGNoYXIgKiwgLi4uKSkgMCkNCisjZGVmaW5lIFByaW50RXhpdCguLi4pCQkJCXdoaWxlICgwKSAoKGludCAoKikoY2hhciAqLCAuLi4pKSAwKQ0KKyNlbmRpZg0KKw0KKw0KKyNkZWZpbmUgbGlzdF9zaXplKGxpc3QpICgobGlzdCktPmN1cnJfbXNnX2NvdW50XykNCisNCisjZGVmaW5lIGxpc3RfYml0bWFwX3NpemUobGlzdCwgaSkgKChsaXN0KS0+Yml0bWFwX2NvdW50WyhpKV0pDQorDQorI2RlZmluZSBsaXN0X2hlYWQobGlzdCwgaSkgKChsaXN0KS0+aGVhZFtpXSkNCisNCisjZGVmaW5lIGxpc3RfdGFpbChsaXN0LCBpKSAoKGxpc3QpLT50YWlsW2ldKQ0KKw0KKyNkZWZpbmUgbGlzdF9pc19oZWFkKGxpc3QsIGVsZW1lbnQpICgoZWxlbWVudCkgPT0gKGxpc3QpLT5oZWFkID8gMSA6IDApDQorDQorI2RlZmluZSBsaXN0X2lzX3RhaWwoZWxlbWVudCkgKChlbGVtZW50KS0+bmV4dCA9PSBOVUxMID8gMSA6IDApDQorDQorI2RlZmluZSBsaXN0X2RhdGEoZWxlbWVudCkgKChlbGVtZW50KS0+ZGF0YSkNCisNCisjZGVmaW5lIGxpc3RfbmV4dChlbGVtZW50KSAoKGVsZW1lbnQpLT5uZXh0KQ0KKw0KKyNkZWZpbmUgSEFQUFkoYSkgKHZvaWQpKGEpDQorDQorLyogRW5kICNkZWZpbmUgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCB0eXBlZGVmICovDQorLyogRW5kIHR5cGVkZWYgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8NCisNCisvKiBFbmQgZ2xvYmFsIHZhcmlhYmxlICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgc3RhdGljIHZhcmlhYmxlICovDQorLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBpbnQgUF9NU0dfQ2hlY2soc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIHVuc2lnbmVkIGxvbmcgcV9pZCk7DQorDQorDQorLyoNCisgICAgbGlzdF9maW5kX2hpZ2hlc3RfcHJpb3JpdHlfYml0bWFwDQorICAgIGJpdG1hcL+hvK0gsKHA5SCz9MC6IL/svLG8+MCnuKYgw6O0wrTZLg0KKyovDQordW5zaWduZWQgbG9uZyBsaXN0X2ZpbmRfaGlnaGVzdF9wcmlvcml0eV9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QpDQorew0KKyAgICBpbnQgaTsNCisNCisgICAgZm9yKGk9TVNHX1BSSU9SSVRZX01BWC0xOyBpPj0wOyBpLS0pDQorICAgIHsNCisgICAgICAgIGlmKGxpc3QtPmJpdG1hcFtpXSA9PSAxKQ0KKyAgICAgICAgICAgIHJldHVybiBpOw0KKyAgICB9DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCisNCisNCisvKg0KKyAgICBwcmludF9saXN0DQorICAgIEhNWF9NU0dfcXVldWUgsbjBtsO8IMD8w7y4piBQcmludMfRtNkuDQorKi8NCit2b2lkIHByaW50X2xpc3QoY29uc3Qgc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QpDQorew0KKyAgICBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICAgICAgICAgICAqZWxlbWVudDsNCisgICAgaW50ICAgICAgICAgICAgICAgICpkYXRhLCBpLCBjb3VudDsNCisNCisgICAgZnByaW50ZihzdGRvdXQsICJNc2cgUXVldWUgQ3VycmVudCB0b3RhbCBzaXplIGlzICVsZFxuIiwgbGlzdF9zaXplKGxpc3QpKTsNCisNCisgICAgZm9yKGNvdW50PTA7IGNvdW50PE1TR19QUklPUklUWV9NQVg7IGNvdW50KyspDQorICAgIHsNCisgICAgICAgIGkgPSAwOw0KKw0KKyAgICAgICAgaWYoIGxpc3QtPmJpdG1hcFtjb3VudF0gIT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBlbGVtZW50ID0gbGlzdF9oZWFkKGxpc3QsIGNvdW50KTsNCisNCisgICAgICAgICAgICB3aGlsZSAoMSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgZGF0YSA9IGxpc3RfZGF0YShlbGVtZW50KTsNCisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInByaW9yaXR5WyVkXSA6IHFsaXN0WyUwM2RdPSUwM2RcbiIsIGNvdW50LCBpLCAqZGF0YSk7DQorDQorICAgICAgICAgICAgICAgaSsrOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChsaXN0X2lzX3RhaWwoZWxlbWVudCkpDQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaXN0X25leHQoZWxlbWVudCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KKw0KKw0KKw0KKy8qDQorICAgIGxpc3Rfc2V0X2JpdG1hcA0KKyAgICC/7LyxvPjAp7+hIMfYtOfHz7TCILrxxq64ysC7IHNldCDH0bTZLg0KKyovDQordm9pZCBsaXN0X3NldF9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykNCit7DQorICAgIGxpc3QtPmJpdG1hcFtwcmlvXSA9IDE7DQorfQ0KKw0KKw0KKw0KKy8qDQorICAgIGxpc3RfY2xlYXJfYml0bWFwDQorICAgIL/svLG8+MCnv6Egx9i058fPtMIguvHGrrjKwLsgY2xlYXIgx9G02S4NCisqLw0KK3ZvaWQgbGlzdF9jbGVhcl9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykNCit7DQorICAgIGxpc3QtPmJpdG1hcFtwcmlvXSA9IDA7DQorfQ0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKy8qDQorICAgIGxpc3RfYml0bWFwX2NvdW50X2luY3JlYXNlDQorICAgIMfYtOfHz7TCIL/svLG8+MCnwMcgYml0bWFwIENvdW50uKYgwfWwoSC9w8WytNkuDQorKi8NCit2b2lkIGxpc3RfYml0bWFwX2NvdW50X2luY3JlYXNlKHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHByaW8pDQorew0KKyAgICBsaXN0LT5iaXRtYXBfY291bnRbcHJpb10rKzsNCit9DQorDQorDQorDQorLyoNCisgICAgbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2UNCisgICAgx9i058fPtMIgv+y8sbz4wKfAxyBiaXRtYXAgQ291bnS4piCwqLzSIL3DxbK02S4NCisqLw0KK3ZvaWQgbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2Uoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykNCit7DQorICAgIGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXS0tOw0KK30NCisNCisNCisvKg0KKyAgICBsaXN0X21hcHBpbmdfdGFza19wcmlvcml0eV90b19tc2dxDQorICAgIMXCvbrFqSC/7LyxvPjAp7imILHiwdjAuLfOILjevLzB9sWlIL/svLG8+MCnuKYgsOHBpMfRtNkuDQorKi8NCitpbnQgbGlzdF9maW5kX21zZ19xX3ByaW9yaXR5X2Zyb21fdGFza19wcmlvcml0eSh1bnNpZ25lZCBsb25nICpwcmlvKQ0KK3sNCisgICAgc3RydWN0IHNjaGVkX3BhcmFtCXBhcmFtOw0KKyAgICBpbnQgcG9saWN5ID0gMDsNCisgICAgaW50IHJjOw0KKw0KKyAgICByYyA9IHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSggcHRocmVhZF9zZWxmKCksICZwb2xpY3ksICZwYXJhbSk7DQorICAgIGlmKHJjICE9IEhNWF9PSykNCisgICAgew0KKwkJKnByaW8gPSBNU0dfUFJJT1JJVFkwOw0KKwkJcmV0dXJuIEhNWF9PSzsNCisgICAgfQ0KKyAgICBQcmludERlYnVnKCJwb2xpY3kgPSAlZFxuIiwgcG9saWN5KTsNCisgICAgUHJpbnREZWJ1ZygicGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAlZFxuIiwgcGFyYW0uc2NoZWRfcHJpb3JpdHkpOw0KKw0KKyAgICBzd2l0Y2gocGFyYW0uc2NoZWRfcHJpb3JpdHkpDQorICAgIHsNCisgICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTA6DQorICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMToNCisgICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkyOg0KKyAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTM6DQorICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkzOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZNDoNCisgICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk1Og0KKyAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZNTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTY6DQorICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk2Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZNzoNCisgICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTc7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk4Og0KKyAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZODsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTk6DQorICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk5Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTA6DQorICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxMDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTExOg0KKyAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTE7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxMjoNCisgICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTEyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTM6DQorICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxMzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTE0Og0KKyAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxNToNCisgICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE1Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE1Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorDQorICAgIHJldHVybiBITVhfT0s7DQorfQ0KKw0KKw0KKy8qDQorCXFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50DQorCXRlbXAgUWV1Zb+hIGVsZW1lbnS4piC/rLDhIMfRtNkuDQorKi8NCit2b2lkIHFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxLCBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICplbGVtZW50KQ0KK3sNCisJaWYocS0+dGVtcF90YWlsID09IE5VTEwpDQorCXsNCisJCXEtPnRlbXBfaGVhZCA9IGVsZW1lbnQ7DQorCQllbGVtZW50LT5uZXh0ID0gTlVMTDsNCisJCWVsZW1lbnQtPnByZXYgPSBOVUxMOw0KKwkJcS0+dGVtcF90YWlsID0gZWxlbWVudDsNCisJfQ0KKwllbHNlDQorCXsNCisJCXEtPnRlbXBfdGFpbC0+bmV4dCA9IGVsZW1lbnQ7DQorCQllbGVtZW50LT5uZXh0ID0gTlVMTDsNCisJCWVsZW1lbnQtPnByZXYgPSBxLT50ZW1wX3RhaWw7DQorCQlxLT50ZW1wX3RhaWwgPSBlbGVtZW50Ow0KKwl9DQorfQ0KKw0KKy8qDQorCXFfcmVtb3ZlX3RlbXBfdGFpbF9lbGVtZW50DQorCXRlbXAgUWV1Zb+hvK0guLbB9ri3IGVsZW1lbnS4piDBprDFx8+/qSCz0bDcwdi02S4NCisqLw0KK3ZvaWQgcV9yZW1vdmVfdGVtcF90YWlsX2VsZW1lbnQoc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIAlzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICoqZWxlbWVudCkNCit7DQorCVByaW50RW50ZXIoKTsNCisNCisgICAgICAJKmVsZW1lbnQgPSBxLT50ZW1wX3RhaWw7DQorDQorCWlmKHEtPnRlbXBfaGVhZC0+bmV4dCA9PSBOVUxMKSAvL2VsZW1lbnQgMbCzILOywLogsOa/7C4NCisJew0KKwkJcS0+dGVtcF9oZWFkID0gTlVMTDsNCisJCXEtPnRlbXBfdGFpbCA9IE5VTEw7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlxLT50ZW1wX3RhaWwtPnByZXYtPm5leHQgPSBOVUxMOw0KKwkJcS0+dGVtcF90YWlsID0gcS0+dGVtcF90YWlsLT5wcmV2Ow0KKwl9DQorCVByaW50RXhpdCgpOw0KK30NCisNCisvKg0KKwlxX2Rlc3RvcnlfdGVtcF90YWlsDQorCXRlbXAgUWV1ZcDHIGVsZW1lbnQgbWVtb3J5uKYgvNK46r3DxbK02S4NCisqLw0KK3ZvaWQgcV9kZXN0b3J5X3RlbXBfdGFpbChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSkNCit7DQorCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgKnFfZWxlbWVudDsNCisNCisJUHJpbnRFbnRlcigpOw0KKw0KKwlkbw0KKwl7DQorCQlxX2VsZW1lbnQgPSBxLT50ZW1wX3RhaWw7DQorCQlxLT50ZW1wX3RhaWwgPSBxLT50ZW1wX3RhaWwtPnByZXY7DQorDQorDQorCX0gd2hpbGUocS0+dGVtcF90YWlsICE9IE5VTEwpOw0KKwlpZiAocS0+cFBvb2wpDQorCXsNCisJCWZyZWUocS0+cFBvb2wpOw0KKwkJcS0+cFBvb2wgPSBOVUxMOw0KKwl9DQorCWlmIChxLT5wRGF0YVBvb2wpDQorCXsNCisJCWZyZWUocS0+cERhdGFQb29sKTsNCisJCXEtPnBEYXRhUG9vbCA9IE5VTEw7DQorCX0NCisNCisJUHJpbnRFeGl0KCk7DQorfQ0KKw0KKw0KKy8qDQorICAgIGxpc3RfcmVtX25leHQNCisgICAgZWxlbWVudL+hvK0gZGF0YbimILvowabH0bTZLg0KKyovDQoraW50IGxpc3RfcmVtX25leHQoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciB0aW1lb3V0ZmxhZywgc3RydWN0IHRpbWVzcGVjICp0aW1lbykNCit7DQorCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpvbGRfZWxlbWVudDsNCisJdW5zaWduZWQgbG9uZyBwcmlvOw0KKwlpbnQgcmMgPSAwOw0KKw0KKwlQcmludEVudGVyKCk7DQorDQorCWxpc3QtPnJlYWRlcl9jb3VudF8rKzsNCisNCisJaWYgKChsaXN0X3NpemUobGlzdCkgPT0gMCB8fCBsaXN0LT5yZWFkZXJfY291bnRfID4gMSkgJiYgMCA9PSByYykNCisJew0KKwkJaWYoVFJVRSA9PSB0aW1lb3V0ZmxhZykNCisJCXsNCisJCQlyYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmxpc3QtPnFfbm90X2VtcHR5XywgJmxpc3QtPnFfbG9ja18sIHRpbWVvKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlyYyA9IHB0aHJlYWRfY29uZF93YWl0KCZsaXN0LT5xX25vdF9lbXB0eV8sICZsaXN0LT5xX2xvY2tfKTsNCisJCX0NCisJfQ0KKw0KKwlsaXN0LT5yZWFkZXJfY291bnRfLS07DQorDQorCWlmKHJjICE9IDApDQorCXsNCisJCVByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCisJCXJldHVybiByYzsNCisJfQ0KKw0KKwlwcmlvID0gbGlzdF9maW5kX2hpZ2hlc3RfcHJpb3JpdHlfYml0bWFwKGxpc3QpOw0KKwlQcmludERlYnVnKCJsaXN0X2ZpbmRfaGlnaGVzdF9wcmlvcml0eV9iaXRtYXAgOiBwcmlvID0gJWRcbiIsIHByaW8pOw0KKw0KKwltZW1jcHkoZGF0YSwgbGlzdC0+aGVhZFtwcmlvXS0+ZGF0YSwgc2l6ZSk7DQorCW9sZF9lbGVtZW50ID0gbGlzdC0+aGVhZFtwcmlvXTsNCisJaWYoTlVMTCA9PSBsaXN0LT5oZWFkW3ByaW9dLT5uZXh0KQ0KKwl7DQorCQlsaXN0LT5oZWFkW3ByaW9dID0gTlVMTDsNCisJCWxpc3QtPnRhaWxbcHJpb10gPSBOVUxMOw0KKwl9DQorCWVsc2UNCisJew0KKwkJbGlzdC0+aGVhZFtwcmlvXSA9IGxpc3QtPmhlYWRbcHJpb10tPm5leHQ7DQorCX0NCisNCisJcV9pbnNlcnRfdGVtcF90YWlsX2VsZW1lbnQobGlzdCwgb2xkX2VsZW1lbnQpOw0KKwlsaXN0LT5jdXJyX21zZ19jb3VudF8tLTsNCisJbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2UobGlzdCwgcHJpbyk7DQorDQorCWlmKGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXSA9PSAwKQ0KKwkgICAgbGlzdF9jbGVhcl9iaXRtYXAobGlzdCwgcHJpbyk7DQorDQorCWlmIChsaXN0LT53cml0ZXJfY291bnRfID4gMCkNCisJICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxpc3QtPnFfbm90X2Z1bGxfKTsNCisNCisJUHJpbnRFeGl0KCk7DQorDQorCXJldHVybiByYzsNCit9DQorDQorDQorc3RhdGljIHZvaWQgKnRocmVhZF9mdW5jXyh2b2lkICphcmcpDQorew0KKwlzdHJ1Y3QgSE1YX1RBU0tfYXJnICpwID0gKHN0cnVjdCBITVhfVEFTS19hcmcgKilhcmc7DQorCWludCByYyA9IDA7DQorDQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwlwLT5waWQgPSBnZXRwaWQoKTsNCisJcC0+dGlkID0gKGxvbmcgaW50KXN5c2NhbGwoNDIyMik7DQorI2VuZGlmDQorDQorCXB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bG9ja18pOw0KKw0KKwl3aGlsZSAocC0+c3RhcnQgPT0gMCAmJiAwID09IHJjKSAvL3dhaXQgc2lnbmFsDQorCQlyYyA9IHB0aHJlYWRfY29uZF93YWl0KCZwLT5jb25kXywgJnAtPmxvY2tfKTsNCisNCisJcHRocmVhZF9tdXRleF91bmxvY2soJnAtPmxvY2tfKTsNCisNCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQorDQorCXAtPnRocmVhZF9pZCA9IHB0aHJlYWRfc2VsZigpOw0KKwlQcmludERlYnVnKCJbJXNdIHRhc2sgc3RhcnRlZC4uLlxuIiwgcC0+bmFtZSk7DQorI2VuZGlmDQorDQorCSgqcC0+c3RhcnRfZnVuY18pKHAtPmFyZ18pOw0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorDQorLyoNCisgICAgSE1YX1RBU0tfQ3JlYXRlDQorICAgIMXCvbrFqbimILv9vLrH0bTZLg0KKyovDQoraW50IEhNWF9UQVNLX0NyZWF0ZSh2b2lkICgqc3RhcnRfZnVuYykodm9pZCAqKSwgdW5zaWduZWQgbG9uZyBwcmlvLHVuc2lnbmVkIGxvbmcgc3RhY2tfc2l6ZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nICp0YXNrSWQsIGludCBJc0pvaW5hYmxlKQ0KK3sNCisgICAgaW50IHJjOw0KKyAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2s7DQorICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOw0KKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0Jc2NoUGFyYW07DQorICAgIHVuc2lnbmVkIGNoYXIgKnB1Y0RzdFN0YWNrQWRkciA9IE5VTEw7DQorCXVuc2lnbmVkIGNoYXIgKnB1Y1Rhc2tTdGFjazsNCisNCisgICAgcmMgPSBwdGhyZWFkX2F0dHJfaW5pdCAoJnRocmVhZF9hdHRyKTsNCisgICAgaWYgKHJjKSB7DQorICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KKyAgICB9DQorDQorCXJjID0gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5ICgmdGhyZWFkX2F0dHIsIEhNWF9UQVNLX1BUSFJFQURfREVGQVVMVF9QUklPKTsNCisJaWYgKHJjKSB7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCXB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnNjaFBhcmFtKTsNCisJc2NoUGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvOw0KKwlyYyA9IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtICgmdGhyZWFkX2F0dHIsICZzY2hQYXJhbSk7DQorCWlmIChyYykgew0KKwkJcmV0dXJuIEhNWF9FUlJPUjsNCisJfQ0KKw0KKyAgICBpZiAoc3RhY2tfc2l6ZSA8IEhNWF9UQVNLX1BUSFJFQURfU1RBQ0tfTUlOKQ0KKyAgICAgICAgc3RhY2tfc2l6ZSA9IEhNWF9UQVNLX1BUSFJFQURfU1RBQ0tfTUlOOw0KKw0KKwlwdWNUYXNrU3RhY2sgPSBtYWxsb2Moc3RhY2tfc2l6ZStITVhfVEFTS19TVEFDS19PVkVSSEVBRF9TSVpFK0hNWF9UQVNLX0dVQVJEX1NJWkUpOw0KKwlpZiAocHVjVGFza1N0YWNrID09IE5VTEwpDQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKyAgICBtZW1zZXQocHVjVGFza1N0YWNrLCAweEE1LCBzdGFja19zaXplK0hNWF9UQVNLX1NUQUNLX09WRVJIRUFEX1NJWkUrSE1YX1RBU0tfR1VBUkRfU0laRSApOw0KKw0KKyAgICBQcmludERlYnVnKCIlcyglZCkgOiBwdWNUYXNrU3RhY2sgPSAlcCwgc3RhY2tfc2l6ZT0gJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHB1Y1Rhc2tTdGFjaywgc3RhY2tfc2l6ZSk7DQorICAgIHJjID0gcHRocmVhZF9hdHRyX3NldHN0YWNrKCZ0aHJlYWRfYXR0ciwgKHZvaWQgKilwdWNUYXNrU3RhY2ssIHN0YWNrX3NpemUgKTsNCisgICAgaWYgKHJjKSB7DQorICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KKyAgICB9DQorDQorICAgIHJjID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCZ0aHJlYWRfYXR0ciwodm9pZCAqKSZwdWNEc3RTdGFja0FkZHIsIChzaXplX3QgKikmc3RhY2tfc2l6ZSApOw0KKyAgICBpZiAocmMpIHsNCisgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorICAgIH0NCisgICAgUHJpbnREZWJ1ZygiJXMoJWQpIDogcHVjRHN0U3RhY2tBZGRyID0gJXAsIHN0YWNrX3NpemU9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBwdWNEc3RTdGFja0FkZHIsIHN0YWNrX3NpemUpOw0KKw0KKyAgICBpZiAoSXNKb2luYWJsZSA9PSBUUlVFKQ0KKyAgICB7DQorICAgICAgICByYyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsNCisgICAgfQ0KKyAgICBlbHNlIGlmKElzSm9pbmFibGUgPT0gRkFMU0UpDQorICAgIHsNCisgICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiJXMoJXMpIDogSXNKb2luYWJsZSBQYXJhbWV0ZXIgRXJyb3IhIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsNCisgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorICAgIH0NCisNCisgICAgaWYgKHJjKSB7DQorICAgICAgICBQcmludEVycm9yICgiJXMoJWQpIDogRmFpbGVkIHRvIElzSm9pbmFibGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHN0cmVycm9yIChyYykpOw0KKyAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCisgICAgfQ0KKw0KKyAgICBpZiAodGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBITVhfVEFTSykpLCBOVUxMID09IHRhc2spIHsNCisgICAgICAgICp0YXNrSWQgPSAwOw0KKyAgICAgICAgZnJlZShwdWNUYXNrU3RhY2spOw0KKyAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCisgICAgfQ0KKw0KKyAgICB0YXNrLT50YXJnXy5zdGFydF9mdW5jXwk9IHN0YXJ0X2Z1bmM7DQorICAgIHRhc2stPnRhcmdfLmFyZ18gCQk9IGFyZzsNCisgICAgdGFzay0+dGFyZ18ucHJpb3JpdHlfCT0gcHJpbzsNCisgICAgdGFzay0+dGFyZ18uc3RhY2tTaXplXwk9IHN0YWNrX3NpemU7DQorICAgIHRhc2stPnRhcmdfLklzSm9pbmFibGUJPSBJc0pvaW5hYmxlOw0KKyAgICB0YXNrLT50YXJnXy5wdWNUYXNrU3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXB1Y1Rhc2tTdGFjazsNCisgICAgdGFzay0+dGFyZ18ucHVsU3RhY2tTdGFydEFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyAqKXB1Y0RzdFN0YWNrQWRkcjsNCisNCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZ0YXNrLT50YXJnXy5sb2NrXywgTlVMTCk7DQorICAgIHB0aHJlYWRfY29uZF9pbml0KCZ0YXNrLT50YXJnXy5jb25kXywgTlVMTCk7DQorICAgIHRhc2stPnRhcmdfLnN0YXJ0ID0gMDsNCisNCisgICAgc3RybmNweSh0YXNrLT50YXJnXy5uYW1lLCBuYW1lLCBzaXplb2YodGFzay0+dGFyZ18ubmFtZSktMSk7DQorDQorICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJnRhc2stPnRhc2tfLCAmdGhyZWFkX2F0dHIsIHRocmVhZF9mdW5jXywgJnRhc2stPnRhcmdfKTsNCisgICAgaWYgKHJjKSB7DQorICAgICAgICBmcmVlKHB1Y1Rhc2tTdGFjayk7DQorICAgICAgICBmcmVlKHRhc2spOw0KKyAgICAgICAgKnRhc2tJZCA9IDA7DQorICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KKyAgICB9DQorDQorICAgICp0YXNrSWQgPSAodW5zaWduZWQgbG9uZyl0YXNrOw0KKw0KKyNpZiBkZWZpbmVkKENPTkZJR19UQVNLX1BSSU9SSVRZKQ0KKwlwdGhyZWFkX3NldHNjaGVkcGFyYW0odGFzay0+dGFza18sIEhNWF9UQVNLX1BUSFJFQURfREVGQVVMVF9QUklPLCAmc2NoUGFyYW0pOw0KKyNlbmRpZg0KKw0KKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHIpOw0KKyAgICBQcmludERlYnVnKCIlcyglZCkgOiBzX3VjVGFza0NvdW50ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc191Y1Rhc2tDb3VudCk7DQorICAgIHJldHVybiBITVhfT0s7DQorfQ0KKw0KK2ludCBITVhfVEFTS19TdGFydCh1bnNpZ25lZCBsb25nIHRhc2tJZCkNCit7DQorICAgIHN0cnVjdCBITVhfVEFTSyAqdGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKil0YXNrSWQ7DQorICAgIFByaW50RW50ZXIoKTsNCisNCisgICAgaWYoTlVMTCA9PSB0YXNrKQ0KKyAgICB7DQorICAgICAgICBQcmludEVycm9yKCIlcyglZCkgOiB0YXNrIGlzIE5VTEwhIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsNCisgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorICAgIH0NCisNCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7DQorICAgIGlmICh0YXNrLT50YXJnXy5zdGFydCA9PSAwKSB7DQorICAgIAl0YXNrLT50YXJnXy5zdGFydCA9IDE7DQorICAgIAlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0YXNrLT50YXJnXy5jb25kXyk7DQorICAgIH0NCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCisgICAgUHJpbnRFeGl0KCk7DQorICAgIHJldHVybiBITVhfT0s7DQorfQ0KKw0KKy8qDQorICAgIEhNWF9UQVNLX1N0b3ANCisgICAgVGFza7imILz2x+C1yCDAzMjEv6EgwMwgx9S89rimIMijw+LH2LW1IFNUT1DAuiC1x8H2IL7KtMK02S4NCisgICAgtNzB9iBjb3VudLi4IDDAuLfOILi4tee02S4NCisqLw0KK2ludCBITVhfVEFTS19TdG9wKHVuc2lnbmVkIGxvbmcgdGFza0lkKQ0KK3sNCisgICAgc3RydWN0IEhNWF9UQVNLICp0YXNrID0gKHN0cnVjdCBITVhfVEFTSyAqKXRhc2tJZDsNCisNCisgICAgUHJpbnRFbnRlcigpOw0KKw0KKyAgICBpZiAodGFzayA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gSE1YX09LOw0KKyAgICB9DQorDQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOw0KKyAgICBpZiAodGFzay0+dGFyZ18uc3RhcnQgIT0gMCkNCisgICAgICAgIHRhc2stPnRhcmdfLnN0YXJ0ID0gMDsNCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCisNCisgICAgcmV0dXJuIEhNWF9PSzsNCit9DQorDQorLyoNCisgICAgc2xlZXANCisgICAgxcK9usWpuKYgwOHA57/utNkuDQorKi8NCitpbnQgSE1YX1NsZWVwKHVuc2lnbmVkIGxvbmcgdWx0aW1lKQ0KK3sNCisJc3RydWN0IHRpbWVzcGVjIGRlbGF5Ow0KKwlzdHJ1Y3QgdGltZXNwZWMgcmVtOw0KKwlpbnQgcmM7DQorDQorCWlmICh1bHRpbWUgIT0gMCkNCisJew0KKwkJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOw0KKwl9DQorCWRlbGF5LnR2X3NlYyA9IHVsdGltZSAvIDEwMDA7DQorCWRlbGF5LnR2X25zZWMgPSAodWx0aW1lICUgMTAwMCkgKiAxMDAwMDAwOw0KKw0KKwlmb3IgKDs7KSB7DQorCQlyYyA9IG5hbm9zbGVlcCgmZGVsYXksICZyZW0pOw0KKwkJaWYgKDAgIT0gcmMpIHsNCisJCQlpZiAoRUlOVFIgPT0gZXJybm8pIHsNCisJCQkJZGVsYXkgPSByZW07DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwkJfQ0KKwkJYnJlYWs7DQorCX0NCisNCisJcmV0dXJuIEhNWF9PSzsNCit9DQorDQorLyoNCisgICAgSE1YX1RBU0tfRGVzdHJveQ0KKyAgICDFwr26xam4piC80rjqx9G02S4NCisqLw0KK2ludCBITVhfVEFTS19EZXN0cm95KHVuc2lnbmVkIGxvbmcgdGFza0lkKQ0KK3sNCisgICAgaW50IHJjOw0KKyAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOw0KKw0KKyAgICBpZiggdGFza0lkID09ICh1bnNpZ25lZCBsb25nKU5VTEwgKQ0KKyAgICB7DQorICAgICAgICBQcmludERlYnVnKCIlcyglZCkgdGFza0lkID09IE5VTExcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOw0KKyAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOw0KKwkJaWYgKHRhc2stPnRhcmdfLnN0YXJ0ID09IDEpDQorCQl7DQorCQkJdGFzay0+dGFyZ18uc3RhcnQgPSAwOw0KKwkJfQ0KKwkJcmMgPSBwdGhyZWFkX2NhbmNlbCh0YXNrLT50YXNrXyk7DQorCQlpZiAocmMpDQorCQl7DQorCQkJUHJpbnRFcnJvcigiW0hNWF9UQVNLX0Rlc3Ryb3ldIHdhcm5pbmcgOiB0aGVyZSBpcyBubyB0aHJlYWQgaW4gcHRocmVhZCB0YXNrSWQoJTA4WCkgcHRocmVhZElkKCUwOFgpXG4iLCB0YXNrSWQsIHRhc2stPnRhc2tfKTsNCisJCX0NCisJCUhNWF9TbGVlcCgxKTsNCisjaWYgZGVmaW5lZChDT05GSUdfVEhSRUFEX0pPSU5fVEVNUE9SQVJZKQ0KKyNlbHNlDQorCQlpZiAodGFzay0+dGFyZ18uSXNKb2luYWJsZSkNCisjZW5kaWYNCisJCQlwdGhyZWFkX2pvaW4odGFzay0+dGFza18sIE5VTEwpOw0KKw0KKwkJZnJlZSh0YXNrLT50YXJnXy5wdWNUYXNrU3RhY2spOw0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCisgICAgfQ0KKw0KKyAgICBmcmVlKHRhc2spOw0KKw0KKyAgICByZXR1cm4gSE1YX09LOw0KK30NCisNCisvKg0KKyAgICBITVhfVEFTS19TZXRDdXJyZW50UHJpb3JpdHkNCisgICAgu/W3zr/uIL/svLG8+MCnuKYgvLzGw8fRtNkuDQorKi8NCitpbnQgSE1YX1RBU0tfU2V0Q3VycmVudFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgdGFza0lkLCB1bnNpZ25lZCBsb25nIG5ld3ByaW9yaXR5KQ0KK3sNCisJaW50IHJjOw0KKwlpbnQgcG9saWN5Ow0KKwlzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOw0KKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0Jc2NoUGFyYW07DQorDQorCWlmICh0YXNrID09IE5VTEwpDQorCXsNCisJCXJldHVybiBITVhfRVJST1I7DQorCX0NCisNCisJcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0odGFzay0+dGFza18sICZwb2xpY3ksICZzY2hQYXJhbSk7DQorCWlmIChzY2hQYXJhbS5zY2hlZF9wcmlvcml0eSA9PSAoaW50KW5ld3ByaW9yaXR5KQ0KKwl7DQorCQlyZXR1cm4gSE1YX09LOw0KKwl9DQorDQorCXNjaFBhcmFtLnNjaGVkX3ByaW9yaXR5IAk9IG5ld3ByaW9yaXR5Ow0KKw0KKwlwdGhyZWFkX211dGV4X2xvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCisJcmMgPSBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGFzay0+dGFza18sIHBvbGljeSwgJnNjaFBhcmFtKTsNCisJcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCisNCisJaWYgKHJjKSB7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KKw0KKw0KKy8qDQorICAgIGxpc3RfaW5pdA0KKyAgICBITVhfTVNHX3F1ZXVlILG4wbbDvLimIMPKseLIrSDH0bTZLg0KKyovDQordm9pZCBsaXN0X2luaXQoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgdWxTaXplLCB1bnNpZ25lZCBsb25nIHVsQ291bnQsIHVuc2lnbmVkIGNoYXIgdWNTdXNwZW5kVHlwZSkNCit7DQorICAgIGludCBpOw0KKw0KKyAgICBsaXN0LT5jdXJyX21zZ19jb3VudF8gPSAwOw0KKyAgICBsaXN0LT5tc2dfc2l6ZV8gPSB1bFNpemU7DQorICAgIGxpc3QtPm1zZ19jb3VudF8gPSB1bENvdW50Ow0KKyAgICBsaXN0LT53cml0ZXJfY291bnRfID0gMDsNCisgICAgbGlzdC0+cmVhZGVyX2NvdW50XyA9IDA7DQorICAgIGxpc3QtPnN1c3BlbmRfdHlwZV8gPSB1Y1N1c3BlbmRUeXBlOw0KKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmxpc3QtPnFfbG9ja18sIE5VTEwpOw0KKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbGlzdC0+cV9ub3RfZW1wdHlfLCBOVUxMKTsNCisgICAgcHRocmVhZF9jb25kX2luaXQoJmxpc3QtPnFfbm90X2Z1bGxfLCBOVUxMKTsNCisNCisgICAgbGlzdC0+dGVtcF9oZWFkID0gTlVMTDsNCisgICAgbGlzdC0+dGVtcF90YWlsID0gTlVMTDsNCisNCisgICAgZm9yKGk9MDsgaTxNU0dfUFJJT1JJVFlfTUFYOyBpKyspDQorICAgIHsNCisgICAgICAgIGxpc3QtPmhlYWRbaV0gPSBOVUxMOw0KKyAgICAgICAgbGlzdC0+dGFpbFtpXSA9IE5VTEw7DQorICAgICAgICBsaXN0LT5iaXRtYXBfY291bnRbaV0gPSAwOw0KKyAgICAgICAgbGlzdC0+Yml0bWFwW2ldID0gMDsNCisgICAgfQ0KKw0KKyNpZmRlZiBITVhfTVNHX0RFQlVHDQorICAgIGxpc3QtPnNlbmRUaWNrID0gMDsNCisgICAgbGlzdC0+cmVjZWl2ZVRpY2sgPSAwOw0KKyAgICBsaXN0LT5sYXN0U2VuZFRpY2sgPSAwOw0KKyAgICBsaXN0LT5sYXN0UmVjZWl2ZVRpY2sgPSAwOw0KKyNlbmRpZg0KKyAgICByZXR1cm47DQorfQ0KKw0KKw0KKw0KKy8qDQorICAgIGxpc3RfZGVzdHJveQ0KKyAgICBITVhfTVNHX3F1ZXVlILG4wbbDvLimILzSuOq9w8WytNkuDQorKi8NCit2b2lkIGxpc3RfZGVzdHJveShzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCkNCit7DQorCXZvaWQgICAgICAgICAgICAgICAqZGF0YTsNCisNCisJZGF0YSA9IChjaGFyICopbWFsbG9jKGxpc3QtPm1zZ19zaXplXyk7DQorDQorCXdoaWxlIChsaXN0X3NpemUobGlzdCkgPiAwKQ0KKwl7DQorCQlpZiAoIGxpc3RfcmVtX25leHQobGlzdCwgKHZvaWQgKilkYXRhLCBsaXN0LT5tc2dfc2l6ZV8sIEZBTFNFLCBGQUxTRSkgIT0gMCApDQorCQl7DQorCQkJUHJpbnRFcnJvcigiJXMgOiBsaXN0X3JlbV9uZXh0IEVycm9yISFcbiIsIF9fZnVuY19fKTsNCisJCX0NCisJfQ0KKw0KKwlmcmVlKGRhdGEpOw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKy8qDQorICAgIGxpc3RfaW5zX25leHQNCisgICAgZWxlbWVudL+hIGRhdGG4piDD37Chx9G02S4NCisqLw0KK2ludCBsaXN0X2luc19uZXh0KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHByaW8sIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciB0aW1lb3V0ZmxhZywgc3RydWN0IHRpbWVzcGVjICp0aW1lbykNCit7DQorCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpuZXdfZWxlbWVudDsNCisJaW50IHJjID0gMDsNCisNCisJUHJpbnRFbnRlcigpOw0KKw0KKwlsaXN0LT53cml0ZXJfY291bnRfKys7DQorDQorCXdoaWxlIChsaXN0LT5tc2dfY291bnRfID09IGxpc3QtPmN1cnJfbXNnX2NvdW50XyAmJiAwID09IHJjKQ0KKwl7DQorCSAgICBpZihUUlVFID09IHRpbWVvdXRmbGFnKQ0KKwkgICAgew0KKwkgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbGlzdC0+cV9ub3RfZnVsbF8sICZsaXN0LT5xX2xvY2tfLCB0aW1lbyk7DQorCSAgICB9DQorCSAgICBlbHNlDQorCSAgICB7DQorCSAgICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbGlzdC0+cV9ub3RfZnVsbF8sICZsaXN0LT5xX2xvY2tfKTsNCisJICAgIH0NCisJfQ0KKw0KKwlsaXN0LT53cml0ZXJfY291bnRfLS07DQorDQorCWlmKHJjICE9IDApDQorCXsNCisJICAgIFByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCisJICAgIHJldHVybiByYzsNCisJfQ0KKw0KKwlxX3JlbW92ZV90ZW1wX3RhaWxfZWxlbWVudChsaXN0LCAmbmV3X2VsZW1lbnQpOw0KKw0KKwltZW1jcHkobmV3X2VsZW1lbnQtPmRhdGEsIGRhdGEsIHNpemUpOw0KKw0KKwlpZihsaXN0LT50YWlsW3ByaW9dID09IE5VTEwpDQorCXsNCisJCWxpc3QtPmhlYWRbcHJpb10gPSBuZXdfZWxlbWVudDsNCisJCW5ld19lbGVtZW50LT5uZXh0ID0gTlVMTDsNCisJCW5ld19lbGVtZW50LT5wcmV2ID0gTlVMTDsNCisJCWxpc3QtPnRhaWxbcHJpb10gPSBuZXdfZWxlbWVudDsNCisJfQ0KKwllbHNlDQorCXsNCisJCWxpc3QtPnRhaWxbcHJpb10tPm5leHQgPSBuZXdfZWxlbWVudDsNCisJCW5ld19lbGVtZW50LT5uZXh0ID0gTlVMTDsNCisJCW5ld19lbGVtZW50LT5wcmV2ID0gbGlzdC0+dGFpbFtwcmlvXTsNCisJCWxpc3QtPnRhaWxbcHJpb10gPSBuZXdfZWxlbWVudDsNCisJfQ0KKw0KKwlsaXN0LT5jdXJyX21zZ19jb3VudF8rKzsNCisJbGlzdF9iaXRtYXBfY291bnRfaW5jcmVhc2UobGlzdCwgcHJpbyk7DQorCWxpc3Rfc2V0X2JpdG1hcChsaXN0LCBwcmlvKTsNCisNCisJaWYgKGxpc3QtPnJlYWRlcl9jb3VudF8gPiAwKQ0KKwkJcHRocmVhZF9jb25kX3NpZ25hbCgmbGlzdC0+cV9ub3RfZW1wdHlfKTsNCisNCisJUHJpbnRFeGl0KCk7DQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KKw0KKw0KKw0KKy8qDQorICAgIEhNWF9NU0dfSW5pdA0KKyAgICC43ry8wfYgxaW4piDDyrHiyK0gx9G02S4NCisqLw0KK2ludCBITVhfTVNHX0luaXQodm9pZCkNCit7DQorI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCisJVEFJTFFfSU5JVCgmbXNnX3FfbGlzdF9oZWFkKTsNCisjZW5kaWYNCisgICAgcmV0dXJuIEhNWF9PSzsNCit9DQorDQorDQorLyoNCisgICAgSE1YX01TR19DcmVhdGUNCisgICAguN68vMH2IMWluKYgu/28usfRtNkuDQorKi8NCitpbnQgSE1YX01TR19DcmVhdGUodW5zaWduZWQgbG9uZyBxX2NvdW50LCB1bnNpZ25lZCBsb25nIG1zZ19zaXplLA0KKwljb25zdCBjaGFyICpxX25hbWUsIHVuc2lnbmVkIGxvbmcgKnFfaWQsIEhNWF9TVVNQRU5EVFlQRSBzdXNwZW5kVHlwZSkNCit7DQorICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICAgICAgICAgICAgICAgKnE7DQorICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpxX2VsZW1lbnQ7DQorICAgIHVuc2lnbmVkIGxvbmcJCQkJCWk7DQorICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpxX2VsZW1lbnRfcG9vbDsNCisJdW5zaWduZWQgY2hhcgkJCQkJKmRhdGFfcG9vbDsNCisJSEFQUFkocV9uYW1lKTsNCisNCisgICAgUHJpbnRFbnRlcigpOw0KKw0KKyAgICBpZihzdXNwZW5kVHlwZSA+PSBITVhfU1VTUEVORFRZUEVfTUFYKQ0KKyAgICB7DQorICAgICAgICBQcmludEVycm9yKCIlc1slZF0gOiB1bFN1c3BlbmRUeXBlICVkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAgc3VzcGVuZFR5cGUpOw0KKyAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCisgICAgfQ0KKw0KKyAgICBpZigocSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfcXVldWUpKSkgPT0gTlVMTCkNCisgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogbWFsbG9jIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsNCisgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorICAgIH0NCisNCisJbWVtc2V0KHEsIDAsIHNpemVvZihzdHJ1Y3QgSE1YX01TR19xdWV1ZSkpOw0KKw0KKyAgICBsaXN0X2luaXQocSwgbXNnX3NpemUsIHFfY291bnQsIHN1c3BlbmRUeXBlKTsNCisJcV9lbGVtZW50X3Bvb2wgPSAoc3RydWN0IEhNWF9NU0dfZWxlbWVudCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfZWxlbWVudCkqcV9jb3VudCk7DQorCWRhdGFfcG9vbCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKG1zZ19zaXplKnFfY291bnQpOw0KKyAgICBmb3IoaT0wOyBpPHFfY291bnQ7IGkrKykNCisgICAgew0KKwkJcV9lbGVtZW50ID0gJnFfZWxlbWVudF9wb29sW2ldOw0KKwkJcV9lbGVtZW50LT5kYXRhID0gJmRhdGFfcG9vbFtpKm1zZ19zaXplXTsNCisgICAgICAgIHFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KHEsIHFfZWxlbWVudCk7DQorICAgIH0NCisJcS0+cERhdGFQb29sID0gZGF0YV9wb29sOw0KKwlxLT5wUG9vbCA9IHFfZWxlbWVudF9wb29sOw0KKw0KKyAgICAqcV9pZCA9ICh1bnNpZ25lZCBsb25nKXE7DQorDQorI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCisJVEFJTFFfSU5TRVJUX1RBSUwoJm1zZ19xX2xpc3RfaGVhZCwgcSwgZW50cmllcyk7DQorI2VuZGlmDQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwlpZiAocV9uYW1lKQ0KKwkJc3RybmNweShxLT5uYW1lLCBxX25hbWUsIHNpemVvZihxLT5uYW1lKS0xKTsNCisJZWxzZQ0KKwkJcS0+bmFtZVswXSA9IDA7DQorI2VuZGlmDQorCVByaW50RXhpdCgpOw0KKw0KKyAgICByZXR1cm4gSE1YX09LOw0KK30NCisNCisNCisvKg0KKyAgICBITVhfTVNHX0Rlc3Ryb3kNCisgICAguN68vMH2xaW4piC80rjqvcPFsrTZLg0KKyovDQoraW50IEhNWF9NU0dfRGVzdHJveSh1bnNpZ25lZCBsb25nIHFfaWQpDQorew0KKwlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcTsNCisNCisJUHJpbnRFbnRlcigpOw0KKw0KKwlxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsNCisNCisJaWYocSA9PSBOVUxMKQ0KKwl7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCXB0aHJlYWRfY29uZF9kZXN0cm95KCZxLT5xX25vdF9mdWxsXyk7DQorCXB0aHJlYWRfY29uZF9kZXN0cm95KCZxLT5xX25vdF9lbXB0eV8pOw0KKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnEtPnFfbG9ja18pOw0KKw0KKwlsaXN0X2Rlc3Ryb3kocSk7DQorCXFfZGVzdG9yeV90ZW1wX3RhaWwocSk7DQorDQorI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCisJVEFJTFFfUkVNT1ZFKCZtc2dfcV9saXN0X2hlYWQsIHEsIGVudHJpZXMpOw0KKyNlbmRpZg0KKw0KKwlpZihxICE9IE5VTEwpDQorCXsNCisJCWZyZWUocSk7DQorCX0NCisNCisJUHJpbnRFeGl0KCk7DQorDQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KK2ludCBITVhfTVNHX0NsZWFyKHVuc2lnbmVkIGxvbmcgcV9pZCkNCit7DQorCXN0cnVjdCBITVhfTVNHX3F1ZXVlIAkJCSAgKnE7DQorCWludCByYyA9IEhNWF9PSzsNCisJLy8JICBzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWU7DQorCWxvbmcgbG9uZyBleHBfbnNlYzsNCisJc3RydWN0IHRpbWVzcGVjIHRpbWVvLCBjdXJfdGltZTsNCisJdW5zaWduZWQgbG9uZyBzaXplOw0KKwl2b2lkCQkJKnBCdWY7DQorDQorDQorCVByaW50RW50ZXIoKTsNCisNCisJcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQorDQorCXNpemUgPSBxLT5tc2dfc2l6ZV87DQorCXBCdWYgPSBtYWxsb2Moc2l6ZSk7DQorCWlmIChwQnVmID09IE5VTEwpDQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKw0KKwkodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOw0KKwlkbw0KKwl7DQorDQorCQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpOw0KKwkJZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCArIChsb25nIGxvbmcpY3VyX3RpbWUudHZfbnNlYzsNCisJCXRpbWVvLnR2X3NlYyA9IGV4cF9uc2VjIC8gKDEwMDAgKiAxMDAwICogMTAwMCk7DQorCQl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsNCisNCisJCXJjID0gbGlzdF9yZW1fbmV4dChxLCBwQnVmLCBzaXplLCBUUlVFLCAmdGltZW8pOw0KKwkJaWYoSE1YX09LICE9IHJjKQ0KKwkJew0KKwkJCWlmKEVUSU1FRE9VVCA9PSByYykNCisJCQl7DQorCQkJCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCisJCQkJZnJlZShwQnVmKTsNCisJCQkJcmV0dXJuIEhNWF9PSzsNCisJCQl9DQorCQl9DQorCX13aGlsZSAoMSk7DQorI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UDQorCXByaW50X2xpc3QocSk7DQorI2VuZGlmDQorDQorCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCisNCisJZnJlZShwQnVmKTsNCisJUHJpbnRFeGl0KCk7DQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KKw0KKy8qDQorICAgIEhNWF9NU0dfU2VuZA0KKyAgICC43ry8wfa4piC6uLO9tNkuDQorKi8NCitpbnQgSE1YX01TR19TZW5kKHVuc2lnbmVkIGxvbmcgcV9pZCwgY29uc3Qgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKyAgICBzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcTsNCisgICAgaW50IHJjID0gSE1YX09LOw0KKyAgICB1bnNpZ25lZCBsb25nIHByaW87DQorDQorICAgIFByaW50RW50ZXIoKTsNCisNCisgICAgcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQorDQorICAgIGlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pDQorICAgIHsNCisgICAgICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IHNpemUgJWxkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplKTsNCisgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorICAgIH0NCisNCisJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOw0KKw0KKwlyYyA9IFBfTVNHX0NoZWNrKHEsIHFfaWQpOw0KKwlpZiAoSE1YX09LICE9IHJjKQ0KKwl7DQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7DQorI2VuZGlmDQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisgICAgaWYoSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZID09IHEtPnN1c3BlbmRfdHlwZV8pDQorICAgIHsNCisgICAgICAgIHJjID0gbGlzdF9maW5kX21zZ19xX3ByaW9yaXR5X2Zyb21fdGFza19wcmlvcml0eSgmcHJpbyk7DQorICAgICAgICBpZihyYyAhPSBITVhfT0spDQorICAgICAgICB7DQorCQkJcHJpbyA9IE1TR19QUklPUklUWTA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBwcmlvID0gTVNHX1BSSU9SSVRZMDsNCisgICAgfQ0KKw0KKyAgICAodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOw0KKw0KKyAgICByYyA9IGxpc3RfaW5zX25leHQocSwgcHJpbywgbXNnLCBzaXplLCBGQUxTRSwgTlVMTCk7DQorDQorICAgIGlmKEhNWF9PSyAhPSByYykNCisgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOw0KKyAgICAgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKyAgICAgICAgcmV0dXJuIHJjOw0KKyAgICB9DQorDQorI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UDQorICAgIHByaW50X2xpc3QocSk7DQorI2VuZGlmDQorDQorICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCisNCisjaWZkZWYgSE1YX01TR19ERUJVRw0KKyAgICBxLT5sYXN0U2VuZFRpY2sgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7DQorI2VuZGlmDQorDQorICAgIFByaW50RXhpdCgpOw0KKw0KKyAgICByZXR1cm4gSE1YX09LOw0KK30NCisNCisNCisNCisvKg0KKyAgICBITVhfTVNHX1NlbmRUaW1lb3V0DQorICAgILjevLzB9rimIFRpbWVvdXSzu7+hILq4s7202S4NCisqLw0KK2ludCBITVhfTVNHX1NlbmRUaW1lb3V0KHVuc2lnbmVkIGxvbmcgcV9pZCwgY29uc3Qgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkNCit7DQorCXN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOw0KKwlpbnQgcmMgPSBITVhfT0s7DQorCXVuc2lnbmVkIGxvbmcgcHJpbyA9IDA7DQorCXN0cnVjdCB0aW1lc3BlYyB0aW1lbzsNCisJc3RydWN0IHRpbWVzcGVjIGN1cl90aW1lOw0KKwlsb25nIGxvbmcgZXhwX25zZWM7DQorDQorCVByaW50RW50ZXIoKTsNCisNCisJaWYgKHRpbWVvdXQgIT0gMCkNCisJew0KKy8vCQlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7DQorCX0NCisJaWYgKHRpbWVvdXQgPT0gMHhGRkZGRkZGRikNCisJew0KKwkJcmV0dXJuIEhNWF9NU0dfU2VuZChxX2lkLCBtc2csIHNpemUpOw0KKwl9DQorDQorCXEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOw0KKw0KKwlpZihzaXplID4gcS0+bXNnX3NpemVfKQ0KKwl7DQorCQlQcmludEVycm9yKCIlc1slZF0gOiBzaXplICVsZCBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSk7DQorCQlyZXR1cm4gSE1YX0VSUk9SOw0KKwl9DQorDQorCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7DQorCWlmIChITVhfT0sgIT0gcmMpDQorCXsNCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQorCQlQcmludEVycm9yKCIlcyglZCkgOiBQX01TR19DaGVjayA6IEhNWF9NU0dfRlVMTCEhIHF1ZXVlIG5hbWUgOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBxLT5uYW1lKTsNCisjZW5kaWYNCisJCXJldHVybiByYzsNCisJfQ0KKw0KKwlpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykNCisJew0KKwkJcmMgPSBsaXN0X2ZpbmRfbXNnX3FfcHJpb3JpdHlfZnJvbV90YXNrX3ByaW9yaXR5KCZwcmlvKTsNCisJCWlmKHJjICE9IEhNWF9PSykNCisJCXsNCisJCQlwcmlvID0gTVNHX1BSSU9SSVRZMDsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCXByaW8gPSBNU0dfUFJJT1JJVFkwOw0KKwl9DQorDQorCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZjdXJfdGltZSk7DQorCWV4cF9uc2VjID0gKGxvbmcgbG9uZyljdXJfdGltZS50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDAgKyBjdXJfdGltZS50dl9uc2VjOw0KKwlpZiAodGltZW91dCAhPSAwKQ0KKwkJZXhwX25zZWMgKz0gKHRpbWVvdXQgKiAxMDAwIC0gOTk5KSAqIDEwMDA7DQorCXRpbWVvLnR2X3NlYyA9IGV4cF9uc2VjIC8gKDEwMDAgKiAxMDAwICogMTAwMCk7DQorCXRpbWVvLnR2X25zZWMgPSBleHBfbnNlYyAlICgxMDAwICogMTAwMCAqIDEwMDApOw0KKw0KKwkodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOw0KKw0KKwlyYyA9IGxpc3RfaW5zX25leHQocSwgcHJpbywgbXNnLCBzaXplLCBUUlVFLCAmdGltZW8pOw0KKwlpZihITVhfT0sgIT0gcmMpDQorCXsNCisJICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCisNCisJICAgIGlmKEVUSU1FRE9VVCA9PSByYykNCisJICAgIHsNCisJICAgICAgICBQcmludERlYnVnKCIlcyA6IGxpc3RfaW5zX25leHQoKSByY1slZF0gSE1YX1RJTUVPVVQhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7DQorCSAgICAgICAgcmV0dXJuIEhNWF9USU1FT1VUOw0KKwkgICAgfQ0KKwkgICAgZWxzZQ0KKwkgICAgew0KKwkgICAgICAgIFByaW50RXJyb3IoIiVzIDogbGlzdF9pbnNfbmV4dCgpIHJjWyVkXSBFcnJvciEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCisJICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KKwkgICAgfQ0KKwl9DQorDQorI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UDQorCXByaW50X2xpc3QocSk7DQorI2VuZGlmDQorDQorCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCisNCisJUHJpbnRFeGl0KCk7DQorDQorCXJldHVybiBITVhfT0s7DQorfQ0KKw0KKw0KKy8qDQorICAgIEhNWF9NU0dfU2VuZFVyZ2VudA0KKyAgICCx5LHeILjevLzB9rimILq4s7202S4NCisqLw0KK2ludCBITVhfTVNHX1NlbmRVcmdlbnQodW5zaWduZWQgbG9uZyBxX2lkLCBjb25zdCB2b2lkICptc2csIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOw0KKyAgICBpbnQgcmMgPSBITVhfT0s7DQorICAgIHVuc2lnbmVkIGxvbmcgcHJpbzsNCisNCisgICAgUHJpbnRFbnRlcigpOw0KKw0KKyAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsNCisNCisgICAgaWYoc2l6ZSA+IHEtPm1zZ19zaXplXykNCisgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogc2l6ZSAlbGQgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNpemUpOw0KKyAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCisgICAgfQ0KKw0KKwlyYyA9IFBfTVNHX0NoZWNrKHEsIHFfaWQpOw0KKwlpZiAoSE1YX09LICE9IHJjKQ0KKwl7DQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7DQorI2VuZGlmDQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisgICAgaWYoSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZID09IHEtPnN1c3BlbmRfdHlwZV8pDQorICAgIHsNCisgICAgICAgIHByaW8gPSBNU0dfUFJJT1JJVFlfTUFYLTE7IC8vsKHA5SCz9MC6IL/svLG8+MCnt84gurizvbTZLg0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgcHJpbyA9IE1TR19QUklPUklUWTA7DQorICAgIH0NCisNCisgICAgKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZxLT5xX2xvY2tfKTsNCisNCisgICAgcmMgPSBsaXN0X2luc19uZXh0KHEsIHByaW8sIG1zZywgc2l6ZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgaWYoSE1YX09LICE9IHJjKQ0KKyAgICB7DQorICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfaW5zX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7DQorICAgICAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7DQorICAgICAgICByZXR1cm4gcmM7DQorICAgIH0NCisNCisjaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCisgICAgcHJpbnRfbGlzdChxKTsNCisjZW5kaWYNCisNCisgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKyNpZmRlZiBITVhfTVNHX0RFQlVHDQorICAgIHEtPmxhc3RTZW5kVGljayA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsNCisjZW5kaWYNCisNCisgICAgUHJpbnRFeGl0KCk7DQorDQorICAgIHJldHVybiBITVhfT0s7DQorfQ0KKw0KKw0KKy8qDQorICAgIEhNWF9NU0dfU2VuZFVyZ2VudFRpbWVvdXQNCisgICAgseSx3iC43ry8wfa4piBUaW1lb3V0ILO7v6EgurizvbTZLg0KKyovDQoraW50IEhNWF9NU0dfU2VuZFVyZ2VudFRpbWVvdXQodW5zaWduZWQgbG9uZyBxX2lkLCBjb25zdCB2b2lkICptc2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQ0KK3sNCisJc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7DQorCWludCByYyA9IEhNWF9PSzsNCisJdW5zaWduZWQgbG9uZyBwcmlvID0gMDsNCisJc3RydWN0IHRpbWVzcGVjIHRpbWVvOw0KKwlzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWU7DQorCWxvbmcgbG9uZyBleHBfbnNlYzsNCisNCisJUHJpbnRFbnRlcigpOw0KKw0KKwlpZiAodGltZW91dCA9PSAweEZGRkZGRkZGKQ0KKwl7DQorCQlyZXR1cm4gSE1YX01TR19TZW5kVXJnZW50KHFfaWQsIG1zZywgc2l6ZSk7DQorCX0NCisNCisJcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQorDQorCWlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pDQorCXsNCisJICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IHNpemUgJWxkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplKTsNCisJICAgIHJldHVybiBITVhfRVJST1I7DQorCX0NCisNCisJcmMgPSBQX01TR19DaGVjayhxLCBxX2lkKTsNCisJaWYgKEhNWF9PSyAhPSByYykNCisJew0KKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCisJCVByaW50RXJyb3IoIiVzKCVkKSA6IFBfTVNHX0NoZWNrIDogSE1YX01TR19GVUxMISEgcXVldWUgbmFtZSglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7DQorI2VuZGlmDQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisJaWYoSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZID09IHEtPnN1c3BlbmRfdHlwZV8pDQorCXsNCisJICAgIHByaW8gPSBNU0dfUFJJT1JJVFlfTUFYLTE7IC8vsKHA5SCz9MC6IL/svLG8+MCnt84gurizvbTZLg0KKwl9DQorCWVsc2UNCisJew0KKwkgICAgcHJpbyA9IE1TR19QUklPUklUWTA7DQorCX0NCisNCisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsNCisJZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIGN1cl90aW1lLnR2X25zZWM7DQorCWlmICh0aW1lb3V0ICE9IDApDQorCQlleHBfbnNlYyArPSAodGltZW91dCAqIDEwMDAgLSA5OTkpICogMTAwMDsNCisJdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsNCisJdGltZW8udHZfbnNlYyA9IGV4cF9uc2VjICUgKDEwMDAgKiAxMDAwICogMTAwMCk7DQorDQorCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7DQorDQorCXJjID0gbGlzdF9pbnNfbmV4dChxLCBwcmlvLCBtc2csIHNpemUsIFRSVUUsICZ0aW1lbyk7DQorDQorCWlmKEhNWF9PSyAhPSByYykNCisJew0KKwkgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKwkgICAgaWYoRVRJTUVET1VUID09IHJjKQ0KKwkgICAgew0KKwkgICAgICAgIFByaW50RGVidWcoIiVzIDogbGlzdF9pbnNfbmV4dCgpIHJjWyVkXSBITVhfVElNRU9VVCEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCisJICAgICAgICByZXR1cm4gSE1YX1RJTUVPVVQ7DQorCSAgICB9DQorCSAgICBlbHNlDQorCSAgICB7DQorCSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOw0KKwkgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorCSAgICB9DQorCX0NCisNCisjaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCisJcHJpbnRfbGlzdChxKTsNCisjZW5kaWYNCisNCisJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKwlQcmludEV4aXQoKTsNCisNCisJcmV0dXJuIEhNWF9PSzsNCit9DQorDQorI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KKyNkZWZpbmUgSE1YX01TR19DUklUSUNBTF9ERUxBWV9USUNLCTIwDQorI2RlZmluZSBITVhfTVNHX05PUk1BTF9ERUxBWV9USUNLCTIwMA0KKyNlbmRpZg0KKy8qDQorICAgIEhNWF9NU0dfUmVjZWl2ZQ0KKyAgICC43ry8wfa4piC53rTCtNkuDQorKi8NCitpbnQgSE1YX01TR19SZWNlaXZlKHVuc2lnbmVkIGxvbmcgcV9pZCwgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKyAgICBzdHJ1Y3QgSE1YX01TR19xdWV1ZSAgICAgICAgICAgICAgICpxOw0KKy8vICB1bnNpZ25lZCBsb25nIHByaW87DQorICAgIGludCByYyA9IEhNWF9PSzsNCisNCisgICAgUHJpbnRFbnRlcigpOw0KKw0KKwlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7DQorDQorICAgIHEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOw0KKw0KKyAgICBpZihzaXplID4gcS0+bXNnX3NpemVfKQ0KKyAgICB7DQorICAgICAgICBQcmludEVycm9yKCIlcyA6IHNpemUgJWxkIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgc2l6ZSk7DQorICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KKyAgICB9DQorDQorICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7DQorDQorI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KKwlxLT5yZWNlaXZlVGljayA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsNCisJaWYgKHEtPmxhc3RSZWNlaXZlVGljayAhPSAwICYmIChxLT5yZWNlaXZlVGljayAtIHEtPmxhc3RSZWNlaXZlVGljayA+IEhNWF9NU0dfTk9STUFMX0RFTEFZX1RJQ0spKQ0KKwl7DQorCQlpZiAoKHEtPnJlY2VpdmVUaWNrIC0gdGlja0ZvclZrRGVidWcpID4gSE1YX01TR19DUklUSUNBTF9ERUxBWV9USUNLKQ0KKwkJew0KKwkJCVByaW50RXJyb3IoIkhNWF9NU0dfUmVjZWl2ZSA6IEl0IGhhcyBleGN1dGVkIHRvbyBsb25nIHRpbWUgKCVkKSBxdWV1ZSglcylcbiIsIHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrLCBxLT5uYW1lKTsNCisJCX0NCisJfQ0KKyNlbmRpZg0KKyAgICByYyA9IGxpc3RfcmVtX25leHQocSwgbXNnLCBzaXplLCBGQUxTRSwgTlVMTCk7DQorI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KKwlxLT5sYXN0UmVjZWl2ZVRpY2sgPSB0aWNrRm9yVmtEZWJ1ZyA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsNCisjZW5kaWYNCisgICAgaWYoSE1YX09LICE9IHJjKQ0KKyAgICB7DQorICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfcmVtX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7DQorICAgICAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7DQorICAgICAgICByZXR1cm4gcmM7DQorICAgIH0NCisNCisjaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCisgICAgcHJpbnRfbGlzdChxKTsNCisjZW5kaWYNCisgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKyAgICBQcmludEV4aXQoKTsNCisgICAgcmV0dXJuIEhNWF9PSzsNCit9DQorDQorLyoNCisgICAgSE1YX01TR19SZWNlaXZlVGltZW91dA0KKyAgICC43ry8wfa4piBUaW1lb3V0s7u/oSC53rTCtNkuDQorKi8NCitpbnQgSE1YX01TR19SZWNlaXZlVGltZW91dCh1bnNpZ25lZCBsb25nIHFfaWQsIHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpDQorew0KKwlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAgICAgICAgICAgICAgICpxOw0KKwlpbnQgcmMgPSBITVhfT0s7DQorCS8vICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZTsNCisJbG9uZyBsb25nIGV4cF9uc2VjOw0KKwlzdHJ1Y3QgdGltZXNwZWMgdGltZW8sIGN1cl90aW1lOw0KKw0KKwlQcmludEVudGVyKCk7DQorCWlmICh0aW1lb3V0ICE9IDApDQorCXsNCisJCUhNWF9UQVNLX0NoZWNrQ2FsbGJhY2soKTsNCisJfQ0KKw0KKwlpZiAodGltZW91dCA9PSAweEZGRkZGRkZGKQ0KKwl7DQorCQlyZXR1cm4gSE1YX01TR19SZWNlaXZlKHFfaWQsIG1zZywgc2l6ZSk7DQorCX0NCisNCisJcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQorDQorCWlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pDQorCXsNCisJCVByaW50RXJyb3IoIiVzIDogc2l6ZSAlbGQgRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCBzaXplKTsNCisJCXJldHVybiBITVhfRVJST1I7DQorCX0NCisNCisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsNCisJZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCArIChsb25nIGxvbmcpY3VyX3RpbWUudHZfbnNlYzsNCisJaWYgKHRpbWVvdXQgIT0gMCkNCisJCWV4cF9uc2VjICs9IChsb25nIGxvbmcpKHRpbWVvdXQgKiAobG9uZyBsb25nKTEwMDAgLSA5OTkpICogKGxvbmcgbG9uZykxMDAwOw0KKwl0aW1lby50dl9zZWMgPSBleHBfbnNlYyAvICgxMDAwICogMTAwMCAqIDEwMDApOw0KKwl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsNCisNCisJKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZxLT5xX2xvY2tfKTsNCisjaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKSAmJiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpDQorCXEtPnJlY2VpdmVUaWNrID0gVktfVElNRVJfR2V0U3lzdGVtVGljaygpOw0KKwlpZiAocS0+bGFzdFJlY2VpdmVUaWNrICE9IDAgJiYgKHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrID4gSE1YX01TR19OT1JNQUxfREVMQVlfVElDSykpDQorCXsNCisJCWlmICgocS0+cmVjZWl2ZVRpY2sgLSB0aWNrRm9yVmtEZWJ1ZykgPiBITVhfTVNHX0NSSVRJQ0FMX0RFTEFZX1RJQ0spDQorCQl7DQorCQkJUHJpbnRFcnJvcigiSE1YX01TR19SZWNlaXZlVGltZW91dCA6IEl0IGhhcyBleGN1dGVkIHRvbyBsb25nIHRpbWUgKCVkKSBxdWV1ZSglcylcbiIsIHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrLCBxLT5uYW1lKTsNCisJCX0NCisJfQ0KKyNlbmRpZg0KKw0KKwlyYyA9IGxpc3RfcmVtX25leHQocSwgbXNnLCBzaXplLCBUUlVFLCAmdGltZW8pOw0KKyNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpICYmIGRlZmluZWQoVktfVEFTS19ERUJVRykNCisJcS0+bGFzdFJlY2VpdmVUaWNrID0gdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7DQorI2VuZGlmDQorCWlmKEhNWF9PSyAhPSByYykNCisJew0KKyAgICAgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKyAgICAgICAgaWYoRVRJTUVET1VUID09IHJjKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFByaW50RGVidWcoIiVzIDogbGlzdF9yZW1fbmV4dCgpIHJjWyVkXSBITVhfVElNRU9VVCEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCisgICAgICAgICAgICByZXR1cm4gSE1YX1RJTUVPVVQ7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X3JlbV9uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOw0KKyAgICAgICAgICAgIHJldHVybiBITVhfRVJST1I7DQorICAgICAgICB9DQorCX0NCisNCisjaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCisJcHJpbnRfbGlzdChxKTsNCisjZW5kaWYNCisNCisJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKwlQcmludEV4aXQoKTsNCisJcmV0dXJuIEhNWF9PSzsNCit9DQorDQoraW50CUhNWF9NU0dfR2V0TWVzc2FnZUNvdW50KHVuc2lnbmVkIGxvbmcgcV9pZCwgdW5zaWduZWQgbG9uZyAqcHVsTXNnQ291bnQsIHVuc2lnbmVkIGxvbmcgKnB1bE1heE1zZ0NvdW50KQ0KK3sNCisgICAgc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7DQorDQorICAgIFByaW50RW50ZXIoKTsNCisNCisgICAgcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQorDQorCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7DQorCSpwdWxNc2dDb3VudCA9IHEtPmN1cnJfbXNnX2NvdW50XzsNCisJKnB1bE1heE1zZ0NvdW50ID0gcS0+bXNnX2NvdW50XzsNCisJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KKw0KKwlQcmludEV4aXQoKTsNCisJcmV0dXJuIEhNWF9PSzsNCit9DQorDQorc3RhdGljIGludCBQX01TR19DaGVjayhzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSwgdW5zaWduZWQgbG9uZyBxX2lkKQ0KK3sNCisJdW5zaWduZWQgbG9uZyB1bE5lYXJseUZ1bGxDb3VudDsNCisjaWYgIWRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwlVTlVTRUQocV9pZCk7DQorI2VuZGlmDQorDQorCXVsTmVhcmx5RnVsbENvdW50ID0gKHEtPm1zZ19jb3VudF8gKiAzKTsNCisJdWxOZWFybHlGdWxsQ291bnQgPSB1bE5lYXJseUZ1bGxDb3VudC80Ow0KKw0KKwlpZihxLT5tc2dfY291bnRfID09IHEtPmN1cnJfbXNnX2NvdW50XykNCisJew0KKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCisJCWlmIChWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCkgLSB0aWNrRm9yVmtEZWJ1ZyA+IDUwMDApDQorCQl7DQorCQkJdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7DQorCQkJLy8gcXVldWUgaXMgZnVsbC4NCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQorCQkJUHJpbnRFcnJvcigiXG4hIVxuISEhICVzKCk6IFdBUk5JTkc6IHF1ZXVlX2lkIDB4JVgsIG5hbWU6JXMgZnVsbCAhISElY1xuISEhXG4iLCBfX0ZVTkNUSU9OX18sIHFfaWQsIHEtPm5hbWUsIDcpOw0KKwkjaWYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KKwkJCVZLX1RBU0tfUHJpbnRUYXNrTGlzdCgpOw0KKwkjZW5kaWYNCisJI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCisJCQlITVhfTVNHX1ByaW50TXNnUUxpc3QoKTsNCisJI2VuZGlmDQorCSNpZiBkZWZpbmVkKFZLX1NFTV9ERUJVRykNCisJCQlWS19TRU1fUHJpbnRTZW1MaXN0KCk7DQorCSNlbmRpZg0KKyNlbHNlDQorCQkJUHJpbnRFcnJvcigiXG4hIVxuISEhICVzKCk6IFdBUk5JTkc6IHF1ZXVlX2lkIDB4JVgsIGZ1bGwgISEhJWNcbiEhIVxuIiwgX19GVU5DVElPTl9fLCBxX2lkLCA3KTsNCisjZW5kaWYNCisJCX0NCisjZW5kaWYNCisJCXJldHVybiBITVhfTVNHX0ZVTEw7DQorCX0NCisJZWxzZSBpZiggcS0+Y3Vycl9tc2dfY291bnRfID4gdWxOZWFybHlGdWxsQ291bnQgKQ0KKwl7DQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwkJUHJpbnRFcnJvcigiW0hNWF9NU0dfU2VuZF0gTXNnUXVlIGlzIG5lYXJseSBmdWxsIC0gU2VuZFRhc2s6JWQsIFF1ZUlkOjB4JVgsICglbGQsICVsZCksIG5hbWU6JXNcclxuIiwNCisJCQkJcHRocmVhZF9zZWxmKCksIHFfaWQsIHEtPm1zZ19jb3VudF8sIHEtPmN1cnJfbXNnX2NvdW50XywgcS0+bmFtZSk7DQorI2VuZGlmDQorCX0NCisNCisJcmV0dXJuIEhNWF9PSzsNCit9DQorDQorDQorLyoNCisgICAgSE1YX01TR19QcmludE1zZ1FMaXN0DQorICAgILjevLzB9sWlIMGkuri4piDD4rfCx9G02S4NCisqLw0KKyNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpDQordm9pZCBITVhfTVNHX1ByaW50TXNnUUxpc3Qodm9pZCkNCit7DQorCUhJTlQzMgl1bENudD0wOw0KKwlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcE1zZ1E7DQorDQorICAgIFByaW50RGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOw0KKyAgICBQcmludERlYnVnKCIgICAgICAgICAgICAgICAgTmFtZSBRaWQgICAgICAgIFNpemUgQ291bnQgQ3VyX0NvdW50IFR5cGVcbiIpOw0KKyAgICBmb3IgKHBNc2dRID0gbXNnX3FfbGlzdF9oZWFkLnRxaF9maXJzdDsgcE1zZ1EgIT0gTlVMTDsgcE1zZ1EgPSBwTXNnUS0+ZW50cmllcy50cWVfbmV4dCkNCisgICAgew0KKyAgICAgICAgUHJpbnREZWJ1ZygiWyUwM2RdJTIwcyAweCUwOFggJTA0ZCAlMDVkICUwOWQgJTA0ZFxuIix1bENudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2dRLT5uYW1lLCAodW5zaWduZWQgbG9uZylwTXNnUSwgcE1zZ1EtPm1zZ19zaXplXywgcE1zZ1EtPm1zZ19jb3VudF8sIHBNc2dRLT5jdXJyX21zZ19jb3VudF8sIHBNc2dRLT5zdXNwZW5kX3R5cGVfKTsNCisgICAgICAgIHVsQ250Kys7DQorICAgIH0NCisgICAgUHJpbnREZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7DQorfQ0KKyNlbmRpZg0KKw0KKw0KKy8qQH0qLw0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfc3lzdGVtLmggYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTFkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5oCkBAIC0wLDAgKzEsMjUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9zeXN0ZW0uaCAgJA0KKyAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJA0KKyAqIE9yaWdpbmFsIEF1dGhvcjogWWFuZyBIeXVuIFVrICQNCisgKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KKyAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCisgKiBGaWxlIERlc2NyaXB0aW9uOglVcGdyYWRlIEFQSXMNCisgKiBNb2R1bGU6DQorICogUmVtYXJrczoNCisgKi8NCisNCisNCisvKioNCisgKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQ0KKyAqIEBkYXRlIDMwIFNlcHQgMjAxMQ0KKyAqLw0KKw0KKy8qKg0KKyAqIEBub3RlDQorICogQ29weXJpZ2h0IChDKSAyMDExIEh1bWF4IENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiA8YnI+DQorICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbg0KKyAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlDQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYW55IGFwcGxpY2FibGUgbGljZW5zZQ0KKyAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4NCisgKi8NCisNCisgLypAeyovDQorDQorLyoqDQorICogQGZpbGUgaG14X3VwZ3JhZGVfc3lzdGVtLmgNCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8cHRocmVhZC5oPg0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNpbmNsdWRlIDxhc3NlcnQuaD4NCisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+DQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKy8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiBFeHRlcm4gdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgRXh0ZXJuIHZhcmlhYmxlZSAqLw0KKw0KKy8qIEVuZCBFeHRlcm4gdmFyaWFibGUgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBTdGFydCBNYWNybyBkZWZpbml0aW9uICovDQorI2RlZmluZSBITVhfVEFTS19DaGVja0NhbGxiYWNrKCkNCisjZGVmaW5lIEhNWF9PSwkwDQorI2RlZmluZSBITVhfRVJST1IJMQ0KKyNkZWZpbmUgSE1YX1RJTUVPVVQJCTINCisjZGVmaW5lIEhNWF9JTlZBTElEX0lECQkzDQorI2RlZmluZSBITVhfQUxMT0NfRVJST1IJCTQNCisjZGVmaW5lIEhNWF9OT19NU0cJCQk1DQorI2RlZmluZSBITVhfQ1JFQVRFX0VSUk9SCQkxMA0KKyNkZWZpbmUgSE1YX0RFU1RST1lfRVJST1IJMTENCisjZGVmaW5lIEhNWF9MT0NLX0VSUk9SCQkxMg0KKyNkZWZpbmUgSE1YX1VOTE9DS19FUlJPUgkJMTMNCisjZGVmaW5lIEhNWF9USU1FX0lORklOSVRFICAgIDE0DQorI2RlZmluZSBITVhfSU5WQUxJRF9DTE9DSwkxNQ0KKyNkZWZpbmUgSE1YX01TR19GVUxMCQkJMTcNCisNCisjZGVmaW5lIFRSVUUgMQ0KKyNkZWZpbmUgRkFMU0UgMA0KKw0KKw0KKyNkZWZpbmUgSE1YX1RBU0tfUFRIUkVBRF9TVEFDS19NSU4JKDE2KjEwMjQpDQorI2RlZmluZSBITVhfVEFTS19QVEhSRUFEX0RFRkFVTFRfUFJJTwlTQ0hFRF9SUg0KKw0KKyNkZWZpbmUgSE1YX1RBU0tfU1RBQ0tfT1ZFUkhFQURfU0laRSAJCQkweDIwMDANCisjZGVmaW5lIEhNWF9UQVNLX0dVQVJEX1NJWkUgCQkJMTYNCisNCisvKiBFbmQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFN0YXJ0IHR5cGVkZWYgKi8NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFRhc2sgUHJpb3JpdHkgU2V0DQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvKg0KKyAgICDB1sDHu+fH1w0KKyAgICBQcmlvcml0ebimIMH1sKEgvcPFsrTZuOkgVktfTVNHX1BSSU9SSVRZwMcgsKq1tSCwsMDMIMH1sKEgvcPE0b7fIMfRtNkuDQorICAgIFZLX01TR19QUklPUklUWcDHILCqwLogx9e78yBwcmlvcml0ecDHILCqILq4tNkgMSC4ub7Gvt8gsde3ob7fIFVyZ2VudCBtc2e4piDDs7iuIMfRtNkuDQorKi8NCisvKiBCYXNpYyBQcmlvcml0eSBTZXQgKi8NCisjZGVmaW5lCUJBU0VfUFJJT1JJVFkJCQk2MA0KKyNkZWZpbmUJSElHSEVTVF9QUklPUklUWQkJMTA4DQorDQorI2RlZmluZQlQUklPUklUWV9JTkNSRU1FTlQJMQ0KKw0KKy8vdGVtcCA6OiBOZXZlciB1c2UNCisjZGVmaW5lCVVTRVJfUFJJT1JJVFkwCQkJQkFTRV9QUklPUklUWQkJCQkJCQkvLyA2MA0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTEJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoxKQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTIJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoyKQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTMJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCozKQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTQJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo0KQ0KKw0KKy8vwM+03CBkZWZhdWx0IHByaW9yaXR5t84gNrn4ILvnv+sJNTDAuyCx4sHYwLi3ziA4wMwgwPu058fSILXtLg0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTUJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo1KQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTYJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo2KQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTcJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo3KQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTgJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo4KQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTkJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo5KQ0KKw0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTEwCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMTApCS8vIDgwDQorI2RlZmluZQlVU0VSX1BSSU9SSVRZMTEJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoxMSkNCisjZGVmaW5lCVVTRVJfUFJJT1JJVFkxMgkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjEyKQ0KKw0KKy8vdGVtcCA6OiBmb3IgdGhlIGhpZ2hlc3QgREQNCisjZGVmaW5lCVVTRVJfUFJJT1JJVFkxMwkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjEzKQ0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTE0CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMTQpDQorDQorLy9VU0VSX1BSSU9SSVRZMTW0wiC757/rx8/B9iC4uyCwzS4uLi4uIC8vMjAwNzEwMTEgVGVzdEJ5UG9vaA0KKy8vT25seSB0YXNrIHByaW9yaXR5IGFkanVzdA0KKyNkZWZpbmUJVVNFUl9QUklPUklUWTE1CQkJSElHSEVTVF9QUklPUklUWQ0KKw0KKw0KKw0KKy8vTVNHX1BSSU9SSVRZwMcgsKrAuiBUYXNrIFByaW9yaXR5wMcgsLm89rq4tNkgMbCzILi5vsa+3yDH0bTZLg0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgTVNHX1BSSU9SSVRZMCwNCisgICAgTVNHX1BSSU9SSVRZMSwNCisgICAgTVNHX1BSSU9SSVRZMiwNCisgICAgTVNHX1BSSU9SSVRZMywNCisgICAgTVNHX1BSSU9SSVRZNCwNCisgICAgTVNHX1BSSU9SSVRZNSwNCisgICAgTVNHX1BSSU9SSVRZNiwNCisgICAgTVNHX1BSSU9SSVRZNywNCisgICAgTVNHX1BSSU9SSVRZOCwNCisgICAgTVNHX1BSSU9SSVRZOSwNCisgICAgTVNHX1BSSU9SSVRZMTAsDQorICAgIE1TR19QUklPUklUWTExLA0KKyAgICBNU0dfUFJJT1JJVFkxMiwNCisgICAgTVNHX1BSSU9SSVRZMTMsDQorICAgIE1TR19QUklPUklUWTE0LA0KKyAgICBNU0dfUFJJT1JJVFkxNSwNCisgICAgTVNHX1BSSU9SSVRZMTYsDQorICAgIE1TR19QUklPUklUWV9NQVggICAvL8PWu/PAp8DHIFBSSU9SSVRZtMIgVXJnZW50t84gu+e/68fULi4NCit9SE1YX01TR19QUklPUklUWTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorCUhNWF9TVVNQRU5EVFlQRV9GSUZPLA0KKwlITVhfU1VTUEVORFRZUEVfUFJJT1JJVFksDQorCUhNWF9TVVNQRU5EVFlQRV9NQVgNCit9SE1YX1NVU1BFTkRUWVBFOw0KKw0KKw0KKy8qIEVuZCB0eXBlZGVmICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogU3RhcnQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCisNCisvKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCisNCisNCitzdHJ1Y3QgSE1YX1RBU0tfYXJnIHsNCisJcHRocmVhZF9tdXRleF90CWxvY2tfOw0KKwlwdGhyZWFkX2NvbmRfdAljb25kXzsNCisJdW5zaWduZWQgbG9uZwkJcHJpb3JpdHlfOw0KKwl1bnNpZ25lZCBsb25nCQlzdGFja1NpemVfOw0KKwlpbnQJCQkJCUlzSm9pbmFibGU7DQorCWludCAJCQkJc3RhcnQ7DQorCXVuc2lnbmVkIGxvbmcJCSpwdWNUYXNrU3RhY2s7DQorCXVuc2lnbmVkIGxvbmcJCSpwdWxTdGFja1N0YXJ0QWRkcmVzczsNCisJdm9pZCAoKnN0YXJ0X2Z1bmNfKSh2b2lkICopOw0KKwl2b2lkICphcmdfOw0KKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCisJcGlkX3QgcGlkOw0KKwlwaWRfdCB0aWQ7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KKwlpbnQgdGhyZWFkX2lkOw0KKyNlbmRpZg0KKwljaGFyIG5hbWVbMzJdOw0KK307DQorDQorc3RydWN0IEhNWF9UQVNLIHsNCisJcHRocmVhZF90IHRhc2tfOw0KKwlzdHJ1Y3QgSE1YX1RBU0tfYXJnIHRhcmdfOw0KK307DQorDQorc3RydWN0ICBITVhfTVNHX2VsZW1lbnQNCit7DQorICAgIHZvaWQgICAgICAgICAgICAgKmRhdGE7DQorICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICpuZXh0Ow0KKyAgICBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICAqcHJldjsNCit9Ow0KKw0KK3N0cnVjdCBITVhfTVNHX3F1ZXVlDQorew0KKw0KKyAgICBwdGhyZWFkX211dGV4X3QgICAgIHFfbG9ja187DQorICAgIHB0aHJlYWRfY29uZF90ICAgICAgcV9ub3RfZW1wdHlfOw0KKyAgICBwdGhyZWFkX2NvbmRfdCAgICAgIHFfbm90X2Z1bGxfOw0KKyAgICB1bnNpZ25lZCBsb25nICAgICAgIGN1cnJfbXNnX2NvdW50XzsNCisgICAgdW5zaWduZWQgbG9uZyAgICAgICBtc2dfc2l6ZV87DQorICAgIHVuc2lnbmVkIGxvbmcgICAgICAgbXNnX2NvdW50XzsNCisgICAgdW5zaWduZWQgbG9uZyAgICAgICBiaXRtYXBfY291bnRbTVNHX1BSSU9SSVRZX01BWF07DQorICAgIHVuc2lnbmVkIGNoYXIgICAgICAgYml0bWFwW01TR19QUklPUklUWV9NQVhdOw0KKyAgICB1bnNpZ25lZCBjaGFyICAgICAgIHN1c3BlbmRfdHlwZV87DQorCXZvaWQJCQkJKnBQb29sOw0KKwl2b2lkCQkJCSpwRGF0YVBvb2w7DQorDQorICAgIGludCB3cml0ZXJfY291bnRfOw0KKyAgICBpbnQgcmVhZGVyX2NvdW50XzsNCisNCisgICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAgKnRlbXBfaGVhZDsNCisgICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAgKnRlbXBfdGFpbDsNCisgICAgc3RydWN0ICBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgKmhlYWRbTVNHX1BSSU9SSVRZX01BWF07DQorICAgIHN0cnVjdCAgSE1YX01TR19lbGVtZW50ICAgICAgICAgICp0YWlsW01TR19QUklPUklUWV9NQVhdOw0KKw0KKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCisgICAgdW5zaWduZWQgbG9uZyBzZW5kVGljazsNCisgICAgdW5zaWduZWQgbG9uZyByZWNlaXZlVGljazsNCisgICAgdW5zaWduZWQgbG9uZyBsYXN0U2VuZFRpY2s7DQorICAgIHVuc2lnbmVkIGxvbmcgbGFzdFJlY2VpdmVUaWNrOw0KKyAgICBjaGFyIG5hbWVbMzJdOw0KKyAgICBUQUlMUV9FTlRSWShITVhfTVNHX3F1ZXVlKSBlbnRyaWVzOw0KKyNlbmRpZg0KK307DQorDQorI2lmIGRlZmluZWQoVktfTVNHX0RFQlVHKQ0KK1RBSUxRX0hFQUQobGlzdGhlYWQsIEhNWF9NU0dfcXVldWUpIG1zZ19xX2xpc3RfaGVhZDsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQordW5zaWduZWQgbG9uZwl0aWNrRm9yVmtEZWJ1ZzsNCisjZW5kaWYNCisNCisvKkB9Ki8NCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5jIGIvbGlidXBncmFkZS9saWJfcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU3MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS9saWJfcXVldWUuYwpAQCAtMCwwICsxLDIxOCBAQAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIEJyb2FkY29tIENvbW1vbiBGaXJtd2FyZSBFbnZpcm9ubWVudCAoQ0ZFKQorICAgICogIAorICAgICogIFF1ZXVlIE1hbmFnZW1lbnQgcm91dGluZXMJCUZpbGU6IGxpYl9xdWV1ZS5jCisgICAgKiAgCisgICAgKiAgUm91dGluZXMgdG8gbWFuYWdlIGRvdWJseS1saW5rZWQgcXVldWVzLgorICAgICogIAorICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnIChtcGxAYnJvYWRjb20uY29tKQorICAgICogIAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICAgKgorICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEKKyAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICAqICAKKyAgICAqICBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgCisgICAgKiAgY29waWVkIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIAorICAgICogIGNvbmRpdGlvbnMuICBTdWJqZWN0IHRvIHRoZXNlIGNvbmRpdGlvbnMsIHlvdSBtYXkgZG93bmxvYWQsIAorICAgICogIGNvcHksIGluc3RhbGwsIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQgCisgICAgKiAgY29waWVzIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gIE5vIHRpdGxlIAorICAgICogIG9yIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBoZXJlYnkuCisgICAgKiAgCisgICAgKiAgMSkgQW55IHNvdXJjZSBjb2RlIHVzZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIG11c3QgcmVwcm9kdWNlIAorICAgICogICAgIGFuZCByZXRhaW4gdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgCisgICAgKiAgICAgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgorICAgICogIAorICAgICogIDIpIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdXNlIGFueSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssIG9yIAorICAgICogICAgIGxvZ28gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJCcm9hZGNvbSAKKyAgICAqICAgICBDb3Jwb3JhdGlvbiIgbmFtZSBub3IgYW55IHRyYWRlbWFyayBvciBsb2dvIG9mIEJyb2FkY29tIAorICAgICogICAgIENvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAKKyAgICAqICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIAorICAgICogICAgIHBlcm1pc3Npb24gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgICAgKiAgCisgICAgKiAgMykgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBBTlkgRVhQUkVTUyBPUgorICAgICogICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgQU5ZIElNUExJRUQgCisgICAgKiAgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKKyAgICAqICAgICBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAgICAqICAgICBTSEFMTCBCUk9BRENPTSBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIEFORCBJTiAKKyAgICAqICAgICBQQVJUSUNVTEFSLCBCUk9BRENPTSBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBESVJFQ1QsIElORElSRUNULCAKKyAgICAqICAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyAgICAqICAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgCisgICAgKiAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICAgICogICAgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgCisgICAgKiAgICAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAKKyAgICAqICAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpLCBFVkVOIElGIEFEVklTRUQgT0YgCisgICAgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAibGliX3F1ZXVlLmgiCisKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIFFfRU5RVUVVRShxYixpdGVtKQkKKyAgICAqICAJCQkJCisgICAgKiAgQWRkIGl0ZW0gdG8gYSBxdWV1ZQorICAgICogIAkJCQkKKyAgICAqICBJbnB1dCBQYXJhbWV0ZXJzOiAJCisgICAgKiAgICAgIHFiIC0gcXVldWUgYmxvY2sJCisgICAgKiAgICAgIGl0ZW0gLSBpdGVtIHRvIGFkZAkKKyAgICAqICAgICAgCQkJCisgICAgKiAgUmV0dXJuIFZhbHVlOgkJCisgICAgKiAgICAgIE5vdGhpbmcuCQkKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBxX2VucXVldWUocXVldWVfdCAqcWIscXVldWVfdCAqaXRlbSkKK3sKKyAgICBxYi0+cV9wcmV2LT5xX25leHQgPSBpdGVtOworICAgIGl0ZW0tPnFfbmV4dCA9IHFiOworICAgIGl0ZW0tPnFfcHJldiA9IHFiLT5xX3ByZXY7CisgICAgcWItPnFfcHJldiA9IGl0ZW07Cit9CisKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIFFfREVRVUVVRShlbGVtZW50KQkKKyAgICAqICAJCQkJCisgICAgKiAgUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUKKyAgICAqICAJCQkJCQorICAgICogIElucHV0IFBhcmFtZXRlcnM6IAkJCisgICAgKiAgICAgIGVsZW1lbnQgLSBlbGVtZW50IHRvIHJlbW92ZQkKKyAgICAqICAgICAgCQkJCQorICAgICogIFJldHVybiBWYWx1ZToJCQkKKyAgICAqICAgICAgTm90aGluZy4JCQkKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBxX2RlcXVldWUocXVldWVfdCAqaXRlbSkKK3sKKyAgICBpdGVtLT5xX3ByZXYtPnFfbmV4dCA9IGl0ZW0tPnFfbmV4dDsKKyAgICBpdGVtLT5xX25leHQtPnFfcHJldiA9IGl0ZW0tPnFfcHJldjsKK30KKworCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgUV9ERVFORVhUKHFiKQorICAgICoKKyAgICAqICBEZXF1ZXVlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgcXVldWUKKyAgICAqIAorICAgICogIElucHV0IFBhcmFtZXRlcnM6IAkKKyAgICAqICAgICAgcWIgLSBxdWV1ZSBibG9jawkKKyAgICAqICAgICAgCQkJCisgICAgKiAgUmV0dXJuIFZhbHVlOgkJCisgICAgKiAgICAgIG5leHQgZWxlbWVudCwgb3IgTlVMTAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitxdWV1ZV90ICpxX2RlcW5leHQocXVldWVfdCAqcWIpCit7CisgICAgaWYgKHFiLT5xX25leHQgPT0gcWIpIHsKKwlyZXR1cm4gTlVMTDsKKwl9CisKKyAgICBxYiA9IHFiLT5xX25leHQ7CisKKyAgICBxYi0+cV9wcmV2LT5xX25leHQgPSBxYi0+cV9uZXh0OworICAgIHFiLT5xX25leHQtPnFfcHJldiA9IHFiLT5xX3ByZXY7CisKKyAgICByZXR1cm4gcWI7Cit9CisKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIFFfTUFQKHFiKQorICAgICogCisgICAgKiAgIk1hcCIgYSBxdWV1ZSwgY2FsbGluZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGZvciBlYWNoCisgICAgKiAgZWxlbWVudCBpbiB0aGUgcXVldWUKKyAgICAqICAKKyAgICAqICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBub256ZXJvLCBxX21hcCB3aWxsIHRlcm1pbmF0ZS4KKyAgICAqICAKKyAgICAqICBJbnB1dCBQYXJhbWV0ZXJzOiAJCQorICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCQkKKyAgICAqICAgICAgZm4gLSBmdW5jdGlvbiBwb2ludGVyCQorICAgICogICAgICBhLGIgLSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24KKyAgICAqICAKKyAgICAqICBSZXR1cm4gVmFsdWU6CQorICAgICogICAgICByZXR1cm4gdmFsdWUgZnJvbSBmdW5jdGlvbiwgb3IgemVybyBpZiBlbnRpcmUgcXVldWUgCisgICAgKiAgICAgIHdhcyBtYXBwZWQuCQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitpbnQgcV9tYXAocXVldWVfdCAqcWIsIGludCAoKmZ1bmMpKHF1ZXVlX3QgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgaW50KSwKKwkgIHVuc2lnbmVkIGludCBhLHVuc2lnbmVkIGludCBiKQoreworICAgIHF1ZXVlX3QgKnFlOworICAgIHF1ZXVlX3QgKm5leHRxOworICAgIGludCByZXM7CisKKyAgICBxZSA9IHFiOworCisgICAgcWUgPSBxYi0+cV9uZXh0OworCisgICAgd2hpbGUgKHFlICE9IHFiKSB7CisJbmV4dHEgPSBxZS0+cV9uZXh0OworCWlmICgocmVzID0gKCpmdW5jKShxZSxhLGIpKSkgcmV0dXJuIHJlczsKKwlxZSA9IG5leHRxOworCX0KKworICAgIHJldHVybiAwOworfQorCisKKworCisKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICBRX0NPVU5UKHFiKQkJCQkJCQkqCisgICAgKiAgCQkJCQkJCQkJKgorICAgICogIENvdW50cyB0aGUgZWxlbWVudHMgb24gYSBxdWV1ZSAobm90IGludGVybG9ja2VkKQkJCSoKKyAgICAqICAJCQkJCQkJCQkqCisgICAgKiAgSW5wdXQgUGFyYW1ldGVyczogCQkJCQkJKgorICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCQkJCQkJKgorICAgICogICAgICAJCQkJCQkJCSoKKyAgICAqICBSZXR1cm4gVmFsdWU6CQkJCQkJCSoKKyAgICAqICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzCQkJCQkJKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworaW50IHFfY291bnQocXVldWVfdCAqcWIpCit7CisgICAgcXVldWVfdCAqcWU7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICBxZSA9IHFiOworCisgICAgd2hpbGUgKHFlLT5xX25leHQgIT0gcWIpIHsKKwlxZSA9IHFlLT5xX25leHQ7CisJcmVzKys7CisJfQorCisgICAgcmV0dXJuIHJlczsKK30KKworCisKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIFFfRklORChxYixpdGVtKQorICAgICogIAorICAgICogIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIGVsZW1lbnQgaXMgb24gYSBxdWV1ZS4KKyAgICAqICAJCQkJCisgICAgKiAgSW5wdXQgUGFyYW1ldGVyczogCQorICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCisgICAgKiAgICAgIGl0ZW0gLSBxdWV1ZSBlbGVtZW50IAorICAgICogICAgICAJCisgICAgKiAgUmV0dXJuIFZhbHVlOgorICAgICogICAgICAwIC0gbm90IG9uIHF1ZXVlICAgICAgICAKKyAgICAqICAgICAgPjAgLSBwb3NpdGlvbiBvbiBxdWV1ZSAgCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitpbnQgcV9maW5kKHF1ZXVlX3QgKnFiLHF1ZXVlX3QgKml0ZW0pCit7CisgICAgcXVldWVfdCAqcTsKKyAgICBpbnQgcmVzID0gMTsKKworICAgIHEgPSBxYi0+cV9uZXh0OworCisgICAgd2hpbGUgKHEgIT0gaXRlbSkgeworCWlmIChxID09IHFiKSByZXR1cm4gMDsKKwlxID0gcS0+cV9uZXh0OworCXJlcysrOworCX0KKworICAgIHJldHVybiByZXM7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmggYi9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYWIyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgQnJvYWRjb20gQ29tbW9uIEZpcm13YXJlIEVudmlyb25tZW50IChDRkUpCisgICAgKiAgCisgICAgKiAgUXVldWUgbWFuYWdlbWVudCBwcm90b3R5cGVzCQlGaWxlOiBsaWJfcXVldWUuaAorICAgICogIAorICAgICogIENvbnN0YW50cywgc3RydWN0dXJlcywgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBxdWV1ZQorICAgICogIG1hbmFnZXIuCisgICAgKiAgCisgICAgKiAgQXV0aG9yOiAgTWl0Y2ggTGljaHRlbmJlcmcgKG1wbEBicm9hZGNvbS5jb20pCisgICAgKiAgCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgICAqCisgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMQorICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgICogIAorICAgICogIFRoaXMgc29mdHdhcmUgaXMgZnVybmlzaGVkIHVuZGVyIGxpY2Vuc2UgYW5kIG1heSBiZSB1c2VkIGFuZCAKKyAgICAqICBjb3BpZWQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgCisgICAgKiAgY29uZGl0aW9ucy4gIFN1YmplY3QgdG8gdGhlc2UgY29uZGl0aW9ucywgeW91IG1heSBkb3dubG9hZCwgCisgICAgKiAgY29weSwgaW5zdGFsbCwgdXNlLCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgb3IgdW5tb2RpZmllZCAKKyAgICAqICBjb3BpZXMgb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtLiAgTm8gdGl0bGUgCisgICAgKiAgb3Igb3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIGhlcmVieS4KKyAgICAqICAKKyAgICAqICAxKSBBbnkgc291cmNlIGNvZGUgdXNlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgbXVzdCByZXByb2R1Y2UgCisgICAgKiAgICAgYW5kIHJldGFpbiB0aGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpc3Qgb2YgY29uZGl0aW9ucyBhcyAKKyAgICAqICAgICB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGZpbGUuCisgICAgKiAgCisgICAgKiAgMikgTm8gcmlnaHQgaXMgZ3JhbnRlZCB0byB1c2UgYW55IHRyYWRlIG5hbWUsIHRyYWRlbWFyaywgb3IgCisgICAgKiAgICAgbG9nbyBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gTmVpdGhlciB0aGUgIkJyb2FkY29tIAorICAgICogICAgIENvcnBvcmF0aW9uIiBuYW1lIG5vciBhbnkgdHJhZGVtYXJrIG9yIGxvZ28gb2YgQnJvYWRjb20gCisgICAgKiAgICAgQ29ycG9yYXRpb24gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIAorICAgICogICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHByaW9yIHdyaXR0ZW4gCisgICAgKiAgICAgcGVybWlzc2lvbiBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAgICAqICAKKyAgICAqICAzKSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIEFOWSBFWFBSRVNTIE9SCisgICAgKiAgICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPLCBBTlkgSU1QTElFRCAKKyAgICAqICAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAorICAgICogICAgIFBVUlBPU0UsIE9SIE5PTi1JTkZSSU5HRU1FTlQgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICAgICogICAgIFNIQUxMIEJST0FEQ09NIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiwgQU5EIElOIAorICAgICogICAgIFBBUlRJQ1VMQVIsIEJST0FEQ09NIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIAorICAgICogICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorICAgICogICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSAKKyAgICAqICAgICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgICAgKiAgICAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSAKKyAgICAqICAgICBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIAorICAgICogICAgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSksIEVWRU4gSUYgQURWSVNFRCBPRiAKKyAgICAqICAgICBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworI2lmbmRlZiBfTElCX1FVRVVFX0gKKyNkZWZpbmUgX0xJQl9RVUVVRV9ICisKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICBNYWNyb3MKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBxX2luaXQocSkgKHEpLT5xX3ByZXYgPSAocSksIChxKS0+cV9uZXh0ID0gKHEpCisjZGVmaW5lIHFfaXNlbXB0eShxKSAoKHEpLT5xX25leHQgPT0gKHEpKQorI2RlZmluZSBxX2dldGZpcnN0KHEpICgocSktPnFfbmV4dCkKKyNkZWZpbmUgcV9nZXRsYXN0KHEpICgocSktPnFfcHJldikKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIFR5cGVzCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBxdWV1ZV9zIHsKKyAgICBzdHJ1Y3QgcXVldWVfcyAqcV9uZXh0OworICAgIHN0cnVjdCBxdWV1ZV9zICpxX3ByZXY7Cit9IHF1ZXVlX3Q7CisKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIFByb3RvdHlwZXMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordm9pZCBxX2VucXVldWUocXVldWVfdCAqLHF1ZXVlX3QgKik7Cit2b2lkIHFfZGVxdWV1ZShxdWV1ZV90ICopOworcXVldWVfdCAqcV9kZXFuZXh0KHF1ZXVlX3QgKik7CitpbnQgcV9tYXAocXVldWVfdCAqcWIsaW50ICgqZnVuYykocXVldWVfdCAqLHVuc2lnbmVkIGludCx1bnNpZ25lZCBpbnQpLAorCSAgdW5zaWduZWQgaW50IGEsdW5zaWduZWQgaW50IGIpOworaW50IHFfY291bnQocXVldWVfdCAqKTsKK2ludCBxX2ZpbmQocXVldWVfdCAqLHF1ZXVlX3QgKik7CisKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS91dGlsLmMgYi9saWJ1cGdyYWRlL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE1YjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS91dGlsLmMKQEAgLTAsMCArMSw3MTUgQEAKKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIFdvcmtmaWxlICAgOiB1dGlsLmMNCisgKiBQcm9qZWN0ICAgIDogS3Jha2VuDQorICogQXV0aG9yICAgICA6IGtod29vDQorICogRGVzY3JpcHRpb246IENvbW1hbmRzIFRlbXBsYXRlDQorICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBIVU1BWCBDby4sIEx0ZC4NCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyNkZWZpbmUgX19fX0hFQURFUl9GSUxFU19fX18NCisjaW5jbHVkZSAiaHR5cGUuaCINCisjaW5jbHVkZSAidXRpbC5oIg0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19NQUNST19ERUZJTklUSU9OX19fXw0KKw0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19FWFRFUk5BTF9WQVJJQUJMRV9ERUZJTklUSU9OX19fXw0KKw0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19FWFRFUk5BTF9GVU5DVElPTl9ERUZJTklUSU9OX19fXw0KKw0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19UWVBFX0RFRklOSVRJT05fX19fDQorDQorDQorI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyNkZWZpbmUgX19fX0dMT0JBTF9WQVJJQUJMRV9ERUZJTklUSU9OX19fXw0KKw0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19TVEFUSUNfVkFSSUFCTEVfREVGSU5JVElPTl9fX18NCitjb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ1JDXzE2X1RBQkxFWzI1Nl0gPQ0KK3sNCisJMHgwMDAwLCAweGMwYzEsIDB4YzE4MSwgMHgwMTQwLCAweGMzMDEsIDB4MDNjMCwgMHgwMjgwLCAweGMyNDEsDQorCTB4YzYwMSwgMHgwNmMwLCAweDA3ODAsIDB4Yzc0MSwgMHgwNTAwLCAweGM1YzEsIDB4YzQ4MSwgMHgwNDQwLA0KKwkweGNjMDEsIDB4MGNjMCwgMHgwZDgwLCAweGNkNDEsIDB4MGYwMCwgMHhjZmMxLCAweGNlODEsIDB4MGU0MCwNCisJMHgwYTAwLCAweGNhYzEsIDB4Y2I4MSwgMHgwYjQwLCAweGM5MDEsIDB4MDljMCwgMHgwODgwLCAweGM4NDEsDQorCTB4ZDgwMSwgMHgxOGMwLCAweDE5ODAsIDB4ZDk0MSwgMHgxYjAwLCAweGRiYzEsIDB4ZGE4MSwgMHgxYTQwLA0KKwkweDFlMDAsIDB4ZGVjMSwgMHhkZjgxLCAweDFmNDAsIDB4ZGQwMSwgMHgxZGMwLCAweDFjODAsIDB4ZGM0MSwNCisJMHgxNDAwLCAweGQ0YzEsIDB4ZDU4MSwgMHgxNTQwLCAweGQ3MDEsIDB4MTdjMCwgMHgxNjgwLCAweGQ2NDEsDQorCTB4ZDIwMSwgMHgxMmMwLCAweDEzODAsIDB4ZDM0MSwgMHgxMTAwLCAweGQxYzEsIDB4ZDA4MSwgMHgxMDQwLA0KKwkweGYwMDEsIDB4MzBjMCwgMHgzMTgwLCAweGYxNDEsIDB4MzMwMCwgMHhmM2MxLCAweGYyODEsIDB4MzI0MCwNCisJMHgzNjAwLCAweGY2YzEsIDB4Zjc4MSwgMHgzNzQwLCAweGY1MDEsIDB4MzVjMCwgMHgzNDgwLCAweGY0NDEsDQorCTB4M2MwMCwgMHhmY2MxLCAweGZkODEsIDB4M2Q0MCwgMHhmZjAxLCAweDNmYzAsIDB4M2U4MCwgMHhmZTQxLA0KKwkweGZhMDEsIDB4M2FjMCwgMHgzYjgwLCAweGZiNDEsIDB4MzkwMCwgMHhmOWMxLCAweGY4ODEsIDB4Mzg0MCwNCisJMHgyODAwLCAweGU4YzEsIDB4ZTk4MSwgMHgyOTQwLCAweGViMDEsIDB4MmJjMCwgMHgyYTgwLCAweGVhNDEsDQorCTB4ZWUwMSwgMHgyZWMwLCAweDJmODAsIDB4ZWY0MSwgMHgyZDAwLCAweGVkYzEsIDB4ZWM4MSwgMHgyYzQwLA0KKwkweGU0MDEsIDB4MjRjMCwgMHgyNTgwLCAweGU1NDEsIDB4MjcwMCwgMHhlN2MxLCAweGU2ODEsIDB4MjY0MCwNCisJMHgyMjAwLCAweGUyYzEsIDB4ZTM4MSwgMHgyMzQwLCAweGUxMDEsIDB4MjFjMCwgMHgyMDgwLCAweGUwNDEsDQorCTB4YTAwMSwgMHg2MGMwLCAweDYxODAsIDB4YTE0MSwgMHg2MzAwLCAweGEzYzEsIDB4YTI4MSwgMHg2MjQwLA0KKwkweDY2MDAsIDB4YTZjMSwgMHhhNzgxLCAweDY3NDAsIDB4YTUwMSwgMHg2NWMwLCAweDY0ODAsIDB4YTQ0MSwNCisJMHg2YzAwLCAweGFjYzEsIDB4YWQ4MSwgMHg2ZDQwLCAweGFmMDEsIDB4NmZjMCwgMHg2ZTgwLCAweGFlNDEsDQorCTB4YWEwMSwgMHg2YWMwLCAweDZiODAsIDB4YWI0MSwgMHg2OTAwLCAweGE5YzEsIDB4YTg4MSwgMHg2ODQwLA0KKwkweDc4MDAsIDB4YjhjMSwgMHhiOTgxLCAweDc5NDAsIDB4YmIwMSwgMHg3YmMwLCAweDdhODAsIDB4YmE0MSwNCisJMHhiZTAxLCAweDdlYzAsIDB4N2Y4MCwgMHhiZjQxLCAweDdkMDAsIDB4YmRjMSwgMHhiYzgxLCAweDdjNDAsDQorCTB4YjQwMSwgMHg3NGMwLCAweDc1ODAsIDB4YjU0MSwgMHg3NzAwLCAweGI3YzEsIDB4YjY4MSwgMHg3NjQwLA0KKwkweDcyMDAsIDB4YjJjMSwgMHhiMzgxLCAweDczNDAsIDB4YjEwMSwgMHg3MWMwLCAweDcwODAsIDB4YjA0MSwNCisJMHg1MDAwLCAweDkwYzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNjMCwgMHg1MjgwLCAweDkyNDEsDQorCTB4OTYwMSwgMHg1NmMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1YzEsIDB4OTQ4MSwgMHg1NDQwLA0KKwkweDljMDEsIDB4NWNjMCwgMHg1ZDgwLCAweDlkNDEsIDB4NWYwMCwgMHg5ZmMxLCAweDllODEsIDB4NWU0MCwNCisJMHg1YTAwLCAweDlhYzEsIDB4OWI4MSwgMHg1YjQwLCAweDk5MDEsIDB4NTljMCwgMHg1ODgwLCAweDk4NDEsDQorCTB4ODgwMSwgMHg0OGMwLCAweDQ5ODAsIDB4ODk0MSwgMHg0YjAwLCAweDhiYzEsIDB4OGE4MSwgMHg0YTQwLA0KKwkweDRlMDAsIDB4OGVjMSwgMHg4ZjgxLCAweDRmNDAsIDB4OGQwMSwgMHg0ZGMwLCAweDRjODAsIDB4OGM0MSwNCisJMHg0NDAwLCAweDg0YzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdjMCwgMHg0NjgwLCAweDg2NDEsDQorCTB4ODIwMSwgMHg0MmMwLCAweDQzODAsIDB4ODM0MSwgMHg0MTAwLCAweDgxYzEsIDB4ODA4MSwgMHg0MDQwDQorfTsNCisNCitjb25zdCBzdGF0aWMgdW5zaWduZWQgbG9uZwlfY3JjMzJUYmxbMjU2XSA9DQorew0KKwkweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLA0KKwkweDA3NmRjNDE5LCAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLA0KKwkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LA0KKwkweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LCAweDkwYmYxZDkxLA0KKwkweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLA0KKwkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LA0KKwkweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLA0KKwkweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LA0KKwkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLA0KKwkweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLA0KKwkweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLA0KKwkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LA0KKwkweDI2ZDkzMGFjLCAweDUxZGUwMDNhLCAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LA0KKwkweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LCAweGI4YmRhNTBmLA0KKwkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LA0KKwkweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLA0KKwkweDc2ZGM0MTkwLCAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLA0KKwkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLA0KKwkweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LA0KKwkweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLA0KKwkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLA0KKwkweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LA0KKwkweDY1YjBkOWM2LCAweDEyYjdlOTUwLCAweDhiYmViOGVhLCAweGZjYjk4ODdjLA0KKwkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LA0KKwkweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLA0KKwkweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLA0KKwkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLA0KKwkweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LA0KKwkweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLCAweGM5MGMyMDg2LA0KKwkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLA0KKwkweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LA0KKwkweDU5YjMzZDE3LCAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLA0KKwkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLA0KKwkweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLA0KKwkweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LA0KKwkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLA0KKwkweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLA0KKwkweGY3NjI1NzVkLCAweDgwNjU2N2NiLCAweDE5NmMzNjcxLCAweDZlNmIwNmU3LA0KKwkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLA0KKwkweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LA0KKwkweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLA0KKwkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLA0KKwkweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLA0KKwkweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LA0KKwkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LA0KKwkweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLA0KKwkweGM1YmEzYmJlLCAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LA0KKwkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLA0KKwkweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLA0KKwkweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLA0KKwkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LA0KKwkweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLA0KKwkweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLCAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLA0KKwkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LA0KKwkweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLA0KKwkweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LA0KKwkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLA0KKwkweGE3NjcyNjYxLCAweGQwNjAxNmY3LCAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLA0KKwkweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLA0KKwkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LA0KKwkweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LA0KKwkweGJhZDAzNjA1LCAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLA0KKwkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LA0KKwkweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkLA0KK307CS8qIF9jcmMzMlRibCAqLw0KKw0KKyNkZWZpbmUgTl9CSVRfQnl0ZQkJOA0KKyNkZWZpbmUgU0laRV9CaXRCdWYgCShOX0JJVF9CeXRlICogc2l6ZW9mKF9iaXRCdWYpKQ0KKyNkZWZpbmUgTl9CSVRfRGljCQkxMw0KKyNkZWZpbmUgU0laRV9EaWMJCSgxIDw8IE5fQklUX0RpYykNCisjZGVmaW5lIE1BWF9NYXRjaAkJMjU2DQorI2RlZmluZSBUSFJFU0hPTEQJCTMNCisjZGVmaW5lIE1BWF9CeXRlTnVtIAkyNTUNCisjZGVmaW5lIE5DCQkJCShNQVhfQnl0ZU51bSArIE1BWF9NYXRjaCsyLVRIUkVTSE9MRCkNCisjZGVmaW5lIE5fQklUX0MgCQk5DQorI2RlZmluZSBOX0JJVF9Db2RlCQkxNg0KKw0KKw0KKyNkZWZpbmUgTlAJCQkJKE5fQklUX0RpYysxKQ0KKyNkZWZpbmUgTlQJCQkJKE5fQklUX0NvZGUrMykNCisjZGVmaW5lIFBCSVQJCQk0CQkJCS8vIHNtYWxsZXN0IGludGVnZXIgc3VjaCB0aGF0ICgxVTw8UEJJVCkgPiBOUA0KKyNkZWZpbmUgVEJJVAkJCTUJCQkJLy8gc21hbGxlc3QgaW50ZWdlciBzdWNoIHRoYXQgKDFVPDxUQklUKSA+IE5UDQorI2lmIE5UPk5QDQorCSNkZWZpbmUgTlBUIAkJTlQNCisjZWxzZQ0KKwkjZGVmaW5lIE5QVCAJCU5QDQorI2VuZGlmDQorDQorZXh0ZXJuCXVuc2lnbmVkIGxvbmcJX2NvbXBEYXRhU2l6ZSA7CQkJLy8gY29tcHJlc3NlZCBkYXRhIHNpemUNCitleHRlcm4JdW5zaWduZWQgbG9uZwlfb3JnRGF0YVNpemUgOwkJCS8vIG9yaWdpbmFsIGRhdGEgc2l6ZQ0KK2V4dGVybgl1bnNpZ25lZCBjaGFyCV9kZWNvbXBCdWZbMHg4MDAwXSA7CS8vIGRlY29tcHJlc3MgYnVmZmVyDQorDQordW5zaWduZWQgY2hhcglfY0xlbltOQ10sIF9wdExlbltOUFQgKyAxMDBdLCAqX29yZ0RhdGEsIF9kaWNCdWZbU0laRV9EaWNdOw0KK3Vuc2lnbmVkIHNob3J0CV9sZWZ0WzIqTkMtMV0sIF9yaWdodFsyKk5DLTFdLCBfYmxrU2l6ZSwgX2NUYmxbNDA5Nl0sDQorCQkJCV9wdFRibFsyNTZdLCBfYml0QnVmLCBfc3ViQml0QnVmLA0KKwkJCQlfc3RhcnRbMThdLCBfY291bnRbMTddLCBfd2VpZ2h0WzE3XTsNCitzaG9ydAkJCV9iaXRDb3VudDsNCit1bnNpZ25lZCBzaG9ydAlfY29tcFNpemU7DQorDQorDQorI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyNkZWZpbmUgX19fX1NUQVRJQ19GVU5DVElPTl9ERUZJTklUSU9OX19fXw0KKw0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19TVEFUSUNfRlVOQ1RJT05fQk9EWV9fX18NCisNCisNCisjZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorI2RlZmluZSBfX19fR0xPQkFMX0ZVTkNUSU9OX0JPRFlfX19fDQorDQordW5zaWduZWQgc2hvcnQgR2V0Q1JDMTYodW5zaWduZWQgY2hhciAqQnVmZmVyUHRyLCB1bnNpZ25lZCBsb25nIE51bWJlck9mQnl0ZSkNCit7DQorCXVuc2lnbmVkIHNob3J0CQlDUkMgOw0KKw0KKwlDUkMgPSAwOw0KKwl3aGlsZSAoTnVtYmVyT2ZCeXRlLS0pDQorCXsNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7DQorCX0NCisNCisJcmV0dXJuIENSQyA7DQorfSAvKiBHZXRDcmMxNiAqLw0KKw0KK3Vuc2lnbmVkIHNob3J0IEdldENSQzE2RmFzdCh2b2lkICppblAsIHVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlKQ0KK3sNCisJdW5zaWduZWQgc2hvcnQJCUNSQyA7DQorCXVuc2lnbmVkIGxvbmcgKmFsaWduZWRfNDsNCisJdW5zaWduZWQgbG9uZyBwcmVfY291bnQsIGVuZF9jb3VudCxsb29wXzQ7DQorCXVuc2lnbmVkIGxvbmcgZGF0YTsNCisJdW5zaWduZWQgY2hhciAqQnVmZmVyUHRyID0gaW5QOw0KKw0KKwlpZiAoTnVtYmVyT2ZCeXRlIDwgNCkNCisJew0KKwkJcmV0dXJuIEdldENSQzE2KGluUCwgTnVtYmVyT2ZCeXRlKTsNCisJfQ0KKwlwcmVfY291bnQgPSAoKHVuc2lnbmVkIGxvbmcpQnVmZmVyUHRyICYgMHgwMyk7DQorCWlmKHByZV9jb3VudCE9MCkNCisJCXByZV9jb3VudCA9IDQtcHJlX2NvdW50Ow0KKwlhbGlnbmVkXzQgPSAodW5zaWduZWQgbG9uZyAqKSgodW5zaWduZWQgbG9uZylCdWZmZXJQdHIgKyBwcmVfY291bnQpOw0KKwlsb29wXzQgPSAoTnVtYmVyT2ZCeXRlLXByZV9jb3VudCk+PjI7DQorCWVuZF9jb3VudCA9IE51bWJlck9mQnl0ZS0obG9vcF80PDwyKS1wcmVfY291bnQ7DQorDQorCUNSQz0wOw0KKwl3aGlsZSgocHJlX2NvdW50LS0pIT0wKQ0KKwl7DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAqQnVmZmVyUHRyKyspICYgMHhmZl0gOw0KKwl9DQorDQorCUJ1ZmZlclB0cj0odW5zaWduZWQgY2hhciAqKWFsaWduZWRfNCsobG9vcF80PDwyKTsNCisNCisJd2hpbGUoKGxvb3BfNC0tKSE9MCkNCisJew0KKwkJZGF0YT0gKmFsaWduZWRfNCsrOw0KKyNpZiBkZWZpbmVkKENPTkZJR19CSUdfRU5ESUFOKQ0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PjI0KSkgJiAweGZmXTsNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeIChkYXRhPj4xNikpICYgMHhmZl07DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+IDgpKSAmIDB4ZmZdOw0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGEJKSkgJiAweGZmXTsNCisjZWxzZQ0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGEJKSkgJiAweGZmXTsNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeIChkYXRhPj4gOCkpICYgMHhmZl07DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+MTYpKSAmIDB4ZmZdOw0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PjI0KSkgJiAweGZmXTsNCisjZW5kaWYNCisJfQ0KKw0KKwl3aGlsZSgoZW5kX2NvdW50LS0pIT0wKQ0KKwl7DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAqQnVmZmVyUHRyKyspICYgMHhmZl07DQorCX0NCisNCisJcmV0dXJuIENSQyA7DQorDQorfSAvKiBHZXRDcmMxNiAqLw0KKw0KK3Vuc2lnbmVkIGxvbmcgR2V0Q3JjMzIodW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgbG9uZyBuKQ0KK3sNCisJdW5zaWduZWQgbG9uZwljcmMsICp0Ymw7DQorCXVuc2lnbmVkIGxvbmcJbGVuOw0KKw0KKwlsZW4gPSBuOw0KKw0KKwljcmMgPSAweEZGRkZGRkZGOw0KKwl0YmwgPSAodW5zaWduZWQgbG9uZyopX2NyYzMyVGJsOw0KKwl3aGlsZSAobi0tKQ0KKwl7DQorCQkgIGNyYyA9IChjcmMgPj4gOCkgXiB0YmxbKGNyYyBeICpwKSAmIDB4ZmZdOw0KKwkJICBwKys7DQorCX0NCisJcmV0dXJuIH5jcmM7DQorfSAvKiBHZXRDcmMzMiAqLw0KKw0KK3Vuc2lnbmVkIGxvbmcgR2V0Q1JDMzJGYXN0KHZvaWQgKmluUCwgdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGUpDQorew0KKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nCQlDUkMgOw0KKwl1bnNpZ25lZCBsb25nICphbGlnbmVkXzQ7DQorCXVuc2lnbmVkIGxvbmcgcHJlX2NvdW50LCBlbmRfY291bnQsbG9vcF80Ow0KKwl1bnNpZ25lZCBsb25nIGRhdGE7DQorCXVuc2lnbmVkIGNoYXIgKkJ1ZmZlclB0ciA9IGluUDsNCisNCisJaWYgKE51bWJlck9mQnl0ZSA8IDQpDQorCXsNCisJCXJldHVybiBHZXRDcmMzMihpblAsIE51bWJlck9mQnl0ZSk7DQorCX0NCisJcHJlX2NvdW50ID0gKCh1bnNpZ25lZCBsb25nKUJ1ZmZlclB0ciAmIDB4MDMpOw0KKwlpZihwcmVfY291bnQhPTApDQorCQlwcmVfY291bnQgPSA0LXByZV9jb3VudDsNCisJYWxpZ25lZF80ID0gKHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpQnVmZmVyUHRyICsgcHJlX2NvdW50KTsNCisJbG9vcF80ID0gKE51bWJlck9mQnl0ZS1wcmVfY291bnQpPj4yOw0KKwllbmRfY291bnQgPSBOdW1iZXJPZkJ5dGUtKGxvb3BfNDw8MiktcHJlX2NvdW50Ow0KKw0KKwlDUkMgPSAweEZGRkZGRkZGOw0KKwl3aGlsZSgocHJlX2NvdW50LS0pIT0wKQ0KKwl7DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAqQnVmZmVyUHRyKyspICYgMHhmZl0gOw0KKwl9DQorDQorCUJ1ZmZlclB0cj0odW5zaWduZWQgY2hhciAqKWFsaWduZWRfNCsobG9vcF80PDwyKTsNCisNCisJd2hpbGUoKGxvb3BfNC0tKSE9MCkNCisJew0KKwkJZGF0YT0gKmFsaWduZWRfNCsrOw0KKyNpZiBkZWZpbmVkKENPTkZJR19CSUdfRU5ESUFOKQ0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKGRhdGE+PjI0KSkgJiAweGZmXTsNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeIChkYXRhPj4xNikpICYgMHhmZl07DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+IDgpKSAmIDB4ZmZdOw0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKGRhdGEJICkpICYgMHhmZl07DQorI2Vsc2UNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeIChkYXRhCSApKSAmIDB4ZmZdOw0KKwkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKGRhdGE+PiA4KSkgJiAweGZmXTsNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeIChkYXRhPj4xNikpICYgMHhmZl07DQorCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOw0KKyNlbmRpZg0KKwl9DQorDQorCXdoaWxlKChlbmRfY291bnQtLSkhPTApDQorCXsNCisJCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7DQorCX0NCisNCisJcmV0dXJuIH5DUkMgOw0KKw0KK30gLyogR2V0Q3JjMTYgKi8NCisNCisNCit1bnNpZ25lZCBzaG9ydCBHZXQxMkJpdHModW5zaWduZWQgY2hhciAqIGJhc2UpDQorew0KKwl1bnNpZ25lZCBzaG9ydCB0ZW1wID0gMCA7DQorDQorCXRlbXAgfD0gKihiYXNlICsgMCkgOw0KKwl0ZW1wIDw8PSA4IDsNCisJdGVtcCB8PSAqKGJhc2UgKyAxKSA7DQorDQorCXJldHVybiB0ZW1wICYgMHgwRkZGIDsNCit9IC8qIEdldDEyQml0cyAqLw0KKw0KK3Vuc2lnbmVkIHNob3J0IEdldDE2Qml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKQ0KK3sNCisJdW5zaWduZWQgc2hvcnQgdGVtcCA9IDAgOw0KKw0KKwl0ZW1wIHw9ICooYmFzZSArIDApIDsNCisJdGVtcCA8PD0gOCA7DQorCXRlbXAgfD0gKihiYXNlICsgMSkgOw0KKw0KKwlyZXR1cm4gdGVtcCA7DQorfSAvKiBHZXQxNkJpdHMgKi8NCisNCit1bnNpZ25lZCBsb25nICBHZXQyNEJpdHModW5zaWduZWQgY2hhciAqYmFzZSkNCit7DQorCXVuc2lnbmVkIGxvbmcgdGVtcCA9IDAgOw0KKw0KKwl0ZW1wIHw9ICooYmFzZSArIDApIDsNCisJdGVtcCA8PD0gOCA7DQorCXRlbXAgfD0gKihiYXNlICsgMSkgOw0KKwl0ZW1wIDw8PSA4IDsNCisJdGVtcCB8PSAqKGJhc2UgKyAyKSA7DQorDQorCXJldHVybiB0ZW1wIDsNCit9IC8qIEdldDI0Qml0cyAqLw0KKw0KK3Vuc2lnbmVkIGxvbmcgR2V0MzJCaXRzKHVuc2lnbmVkIGNoYXIgKmJhc2UpDQorew0KKwl1bnNpZ25lZCBsb25nIHRlbXAgPSAwIDsNCisNCisJdGVtcCB8PSAqKGJhc2UgKyAwKSA7DQorCXRlbXAgPDw9IDggOw0KKwl0ZW1wIHw9ICooYmFzZSArIDEpIDsNCisJdGVtcCA8PD0gOCA7DQorCXRlbXAgfD0gKihiYXNlICsgMikgOw0KKwl0ZW1wIDw8PSA4IDsNCisJdGVtcCB8PSAqKGJhc2UgKyAzKSA7DQorDQorCXJldHVybiB0ZW1wIDsNCit9IC8qIEdldDMyQml0cyAqLw0KKw0KK3Vuc2lnbmVkIHNob3J0IFNXQVAxNih1bnNpZ25lZCBzaG9ydCBBKQ0KK3sNCisJcmV0dXJuICgoKEEgPj4gOCkgfCAoQSA8PCA4KSkpOw0KK30NCisNCit1bnNpZ25lZCBpbnQgU1dBUDMyKHVuc2lnbmVkIGxvbmcgQSkNCit7DQorCXJldHVybiAoKEEgPDwgMjQpIHwgKChBIDw8IDgpICYgIDB4RkYwMDAwKSB8ICgoQSA+PiA4KSAmICAweEZGMDApIHwoQSA+PiAyNCkpOw0KK30NCisNCit2b2lkIE1ha2VUYmwodW5zaWduZWQgc2hvcnQgbkNoYXIsIHVuc2lnbmVkIGNoYXIgKmJpdExlbiwgdW5zaWduZWQgc2hvcnQgdGJsQml0cywgdW5zaWduZWQgc2hvcnQgKnRibCkNCit7DQorCXVuc2lnbmVkIHNob3J0CSp3cCwgKndwcCwgKndwcHAsIGksIGssIGF2YWlsLCBtYXNrOw0KKwl1bnNpZ25lZCBzaG9ydAlsZW4sIGNoLCBqdXRCaXRzLCBuZXh0Q29kZTsNCisJdW5zaWduZWQgY2hhcgkqYnA7DQorDQorCWZvciAod3A9Jl9jb3VudFsxXSxpPTE7IGk8PTE2OyBpKyspDQorCQkqd3ArKyA9IDA7DQorCWZvciAod3A9X2NvdW50LCBicD1iaXRMZW4sIGk9MDsgaTxuQ2hhcjsgaSsrKQ0KKwkJd3BbKmJwKytdKys7DQorDQorCWZvciAod3A9Jl9zdGFydFsxXSx3cHA9Jl9jb3VudFsxXSwqd3A9MCxpPTEsaz0xNTsgaTw9MTY7IGkrKyxrLS0sd3ArKykNCisJCXdwWzFdID0gKndwICsgKCp3cHArKyA8PCBrKTsNCisNCisJaWYgKF9zdGFydFsxN10gIT0gKHVuc2lnbmVkIHNob3J0KSgxVSA8PCAxNikpDQorCQlwcmludGYoIlxuXG5EZWNvbXByZXNzaW9uIGVycm9yOiBCQUQgVEFCTEVcclxuXHJcbiIpOw0KKw0KKwlqdXRCaXRzID0gMTYtdGJsQml0czsNCisNCisJZm9yICh3cD0mX3N0YXJ0WzFdLHdwcD0mX3dlaWdodFsxXSxpPTEsaz10YmxCaXRzLTE7IGk8PXRibEJpdHM7IGkrKyxrLS0pDQorCXsNCisJCSp3cCA+Pj0ganV0Qml0czsNCisJCXdwKys7DQorCQkqd3BwKysgPSAxVSA8PCBrOw0KKwl9DQorDQorCWZvciAoaz0xNi1pLHdwPSZfd2VpZ2h0W2ldOyBpPD0xNjsgaSsrLGstLSkNCisJCSp3cCsrID0gMVUgPDwgazsNCisNCisJaSA9IF9zdGFydFt0YmxCaXRzKzFdID4+IGp1dEJpdHM7DQorCWlmIChpICE9ICh1bnNpZ25lZCBzaG9ydCkoMVUgPDwgMTYpKQ0KKwl7DQorCQlrID0gMVUgPDwgdGJsQml0czsNCisJCXdoaWxlIChpIT1rKQ0KKwkJCXRibFtpKytdID0gMDsNCisJfQ0KKw0KKwlhdmFpbCA9IG5DaGFyOw0KKwltYXNrID0gMVUgPDwgKDE1LXRibEJpdHMpOw0KKwl3cHAgPSBfcmlnaHQ7DQorCXdwcHAgPSBfbGVmdDsNCisJZm9yIChjaD0wLGJwPWJpdExlbjsgY2g8bkNoYXI7IGNoKyspDQorCXsNCisJCWlmICgobGVuID0gKmJwKyspID09IDApDQorCQkJY29udGludWU7DQorDQorCQlrID0gX3N0YXJ0W2xlbl07DQorCQluZXh0Q29kZSA9IGsgKyBfd2VpZ2h0W2xlbl07DQorDQorCQlpZiAobGVuIDw9IHRibEJpdHMpDQorCQl7DQorCQkJZm9yICh3cD10YmwrazsgazxuZXh0Q29kZTsgaysrKQ0KKwkJCQkqd3ArKyA9IGNoOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXdwID0gdGJsICsgKGsgPj4ganV0Qml0cyk7DQorCQkJaSA9IGxlbi10YmxCaXRzOw0KKwkJCXdoaWxlIChpICE9IDApDQorCQkJew0KKwkJCQlpZiAoKndwID09IDApDQorCQkJCXsNCisJCQkJCXdwcFthdmFpbF0gPSB3cHBwW2F2YWlsXSA9IDA7DQorCQkJCQkqd3AgPSBhdmFpbCsrOw0KKwkJCQl9DQorCQkJCXdwID0gKGsmbWFzayA/IHdwcCA6IHdwcHApICsgKndwOw0KKwkJCQlrIDw8PSAxOw0KKwkJCQlpLS07DQorCQkJfQ0KKwkJCSp3cCA9IGNoOw0KKwkJfQ0KKwkJX3N0YXJ0W2xlbl0gPSBuZXh0Q29kZTsNCisJfQ0KK30gLyogTWFrZVRibCAqLw0KKw0KKw0KK3ZvaWQgRmlsbEJ1Zih1bnNpZ25lZCBzaG9ydCBuKQkvKiBTaGlmdCBfYml0QnVmIG4gYml0cyBsZWZ0LCByZWFkIG4gYml0cyAqLw0KK3sNCisJX2JpdEJ1ZiA8PD0gbjsNCisJd2hpbGUgKG4gPiBfYml0Q291bnQpDQorCXsNCisJCW4gLT0gX2JpdENvdW50Ow0KKwkJX2JpdEJ1ZiB8PSBfc3ViQml0QnVmIDw8IG47DQorCQlpZiAoX2NvbXBTaXplICE9IDApDQorCQl7DQorCQkJX2NvbXBTaXplLS07DQorCQkJX3N1YkJpdEJ1ZiA9ICpfb3JnRGF0YSsrOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJCV9zdWJCaXRCdWYgPSAwOw0KKwkJX2JpdENvdW50ID0gTl9CSVRfQnl0ZTsNCisJfQ0KKwlfYml0Q291bnQgLT0gbjsNCisJX2JpdEJ1ZiB8PSBfc3ViQml0QnVmID4+IF9iaXRDb3VudDsNCit9IC8qIEZpbGxCdWYgKi8NCisNCisNCit1bnNpZ25lZCBzaG9ydCBHZXRCaXRzKHVuc2lnbmVkIHNob3J0IG4pDQorew0KKwl1bnNpZ25lZCBzaG9ydAl4Ow0KKw0KKwl4ID0gX2JpdEJ1ZiA+PiAoU0laRV9CaXRCdWYtbik7DQorCUZpbGxCdWYobik7DQorDQorCXJldHVybiB4Ow0KK30gLyogR2V0Qml0cyAqLw0KKw0KKw0KK3ZvaWQgUmVhZFB0TGVuKHNpZ25lZCBzaG9ydCBubiwgc2lnbmVkIHNob3J0IG5CaXQsIHNpZ25lZCBzaG9ydCBpU3BlY2lhbCkNCit7DQorCXNpZ25lZCBzaG9ydAlpLGMsbjsNCisJdW5zaWduZWQgc2hvcnQJbWFzaywgKndwOw0KKwl1bnNpZ25lZCBjaGFyCSpicDsNCisNCisJbiA9IEdldEJpdHMobkJpdCk7DQorCWlmIChuID09IDApDQorCXsNCisJCWMgPSBHZXRCaXRzKG5CaXQpOw0KKw0KKwkJZm9yIChicD1fcHRMZW4saT0wOyBpPG5uOyBpKyspDQorCQkJKmJwKysgPSAwOw0KKwkJZm9yICh3cD1fcHRUYmwsaT0wOyBpPDI1NjsgaSsrKQ0KKwkJCSp3cCsrID0gYzsNCisJfQ0KKwllbHNlDQorCXsNCisJCWkgPSAwOw0KKwkJYnAgPSBfcHRMZW47DQorCQl3aGlsZSAoaSA8IG4pDQorCQl7DQorCQkJYyA9IF9iaXRCdWYgPj4gKFNJWkVfQml0QnVmLTMpOw0KKwkJCWlmIChjID09IDcpDQorCQkJew0KKwkJCQltYXNrID0gMVUgPDwgKFNJWkVfQml0QnVmLTEtMyk7DQorCQkJCXdoaWxlIChtYXNrICYgX2JpdEJ1ZikNCisJCQkJew0KKwkJCQkJbWFzayA+Pj0gMTsNCisJCQkJCWMrKzsNCisJCQkJfQ0KKwkJCX0NCisJCQlGaWxsQnVmKGM8NyA/IDMgOiBjLTMpOw0KKwkJCWJwW2krK10gPSAodW5zaWduZWQgY2hhciljOw0KKwkJCWlmIChpID09IGlTcGVjaWFsKQ0KKwkJCXsNCisJCQkJYyA9IEdldEJpdHMoMik7DQorCQkJCXdoaWxlICgtLWMgPj0gMCkNCisJCQkJCWJwW2krK10gPSAwOw0KKwkJCX0NCisJCX0NCisJCXdoaWxlIChpPG5uKQ0KKwkJCWJwW2krK10gPSAwOw0KKwkJTWFrZVRibChubiwgYnAsIDgsIF9wdFRibCk7DQorCX0NCit9IC8qIFJlYWRQdExlbiAqLw0KKw0KKw0KK3ZvaWQgUmVhZENMZW4odm9pZCkNCit7DQorCXNpZ25lZCBzaG9ydAlpLCBjLCBuOw0KKwl1bnNpZ25lZCBzaG9ydAltYXNrLCAqd3AsICp3cHA7DQorCXVuc2lnbmVkIGNoYXIJKmJwLCAqYnBwOw0KKw0KKwluID0gR2V0Qml0cyhOX0JJVF9DKTsNCisJYnAgPSBfY0xlbjsNCisJaWYgKG4gPT0gMCkNCisJew0KKwkJYyA9IEdldEJpdHMoTl9CSVRfQyk7DQorCQlmb3IgKGk9MDsgaTxOQzsgaSsrKQ0KKwkJCSpicCsrID0gMDsNCisJCWZvciAod3A9X2NUYmwsaT0wOyBpPDQwOTY7IGkrKykNCisJCQkqd3ArKyA9IGM7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpID0gMDsNCisJCWJwcCA9IF9wdExlbjsNCisJCXdwID0gX3JpZ2h0Ow0KKwkJd3BwID0gX2xlZnQ7DQorCQl3aGlsZSAoaSA8IG4pDQorCQl7DQorCQkJYyA9IF9wdFRibFtfYml0QnVmPj4oU0laRV9CaXRCdWYtOCldOw0KKwkJCWlmIChjID49IE5UKQ0KKwkJCXsNCisJCQkJbWFzayA9IDFVIDw8IChTSVpFX0JpdEJ1Zi0xLTgpOw0KKwkJCQlkbw0KKwkJCQl7DQorCQkJCQljID0gKF9iaXRCdWYgJiBtYXNrKSA/IHdwW2NdIDogd3BwW2NdOw0KKwkJCQkJbWFzayA+Pj0gMTsNCisJCQkJfSB3aGlsZSAoYyA+PSBOVCk7DQorCQkJfQ0KKwkJCUZpbGxCdWYoYnBwW2NdKTsNCisJCQlpZiAoYyA8PSAyKQ0KKwkJCXsNCisJCQkJaWYgKGMgPT0gMCkgYyA9IDE7DQorCQkJCWVsc2UgaWYgKGMgPT0gMSkgYyA9IEdldEJpdHMoNCkgKyAzOw0KKwkJCQllbHNlCQljID0gR2V0Qml0cyhOX0JJVF9DKSArIDIwOw0KKw0KKwkJCQl3aGlsZSAoLS1jID49IDApDQorCQkJCQlicFtpKytdPTA7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJYnBbaSsrXSA9IGMtMjsNCisJCX0NCisJCXdoaWxlIChpIDwgTkMpDQorCQkJYnBbaSsrXSA9IDA7DQorCQlNYWtlVGJsKE5DLCBicCwgMTIsIF9jVGJsKTsNCisJfQ0KK30gLyogUmVhZENMZW4gKi8NCisNCisNCit1bnNpZ25lZCBzaG9ydCBEZWNvZGVDKHZvaWQpDQorew0KKwl1bnNpZ25lZCBzaG9ydAlpLCBtYXNrLCAqd3AsICp3cHA7DQorDQorCWlmIChfYmxrU2l6ZSA9PSAwKQ0KKwl7DQorCQlfYmxrU2l6ZSA9IEdldEJpdHMoMTYpOw0KKwkJUmVhZFB0TGVuKE5ULCBUQklULCAzKTsNCisJCVJlYWRDTGVuKCk7DQorCQlSZWFkUHRMZW4oTlAsIFBCSVQsICh1bnNpZ25lZCBzaG9ydCktMSk7DQorCX0NCisJX2Jsa1NpemUtLTsNCisJaSA9IF9jVGJsW19iaXRCdWYgPj4gKFNJWkVfQml0QnVmLTEyKV07DQorCWlmIChpID49IE5DKQ0KKwl7DQorCQltYXNrID0gMVUgPDwgKFNJWkVfQml0QnVmLTEtMTIpOw0KKwkJd3AgPSBfcmlnaHQ7DQorCQl3cHAgPSBfbGVmdDsNCisJCWRvDQorCQl7DQorCQkJaSA9IChfYml0QnVmICYgbWFzaykgPyB3cFtpXSA6IHdwcFtpXTsNCisJCQltYXNrID4+PSAxOw0KKwkJfSB3aGlsZSAoaSA+PSBOQyk7DQorCX0NCisJRmlsbEJ1ZihfY0xlbltpXSk7DQorDQorCXJldHVybiBpOw0KK30gLyogRGVjb2RlQyAqLw0KKw0KKw0KK3Vuc2lnbmVkIHNob3J0IERlY29kZVAodm9pZCkNCit7DQorCXVuc2lnbmVkIHNob3J0CWksIG1hc2ssICp3cCwgKndwcDsNCisNCisJaSA9IF9wdFRibFtfYml0QnVmID4+IChTSVpFX0JpdEJ1Zi04KV07DQorCWlmIChpID49IE5QKQ0KKwl7DQorCQltYXNrID0gMVUgPDwgKFNJWkVfQml0QnVmLTEtOCk7DQorCQl3cCA9IF9yaWdodDsNCisJCXdwcCA9IF9sZWZ0Ow0KKwkJZG8NCisJCXsNCisJCQlpID0gKF9iaXRCdWYgJiBtYXNrKSA/IHdwW2ldIDogd3BwW2ldOw0KKwkJCW1hc2sgPj49IDE7DQorCQl9IHdoaWxlIChpID49IE5QKTsNCisJfQ0KKwlGaWxsQnVmKF9wdExlbltpXSk7DQorCWlmIChpICE9IDApDQorCQlpID0gKDFVIDw8IChpLTEpKSArIEdldEJpdHMoaS0xKTsNCisNCisJcmV0dXJuIGk7DQorfSAvKiBEZWNvZGVQICovDQorDQorDQordW5zaWduZWQgY2hhciAqRGVjb21wcmVzc0RhdGEodW5zaWduZWQgY2hhciAqZGF0YSkNCit7DQorCXNpZ25lZCBzaG9ydAlyZW0sIG4sIGksIHIsIGM7CS8vIHJlbTogcmVtYWluaW5nIHVuc2lnbmVkIGNoYXJzIHRvIGNvcHkNCisJdW5zaWduZWQgY2hhcgkqZGljQnVmLCAqZGVjb21wQnVmOw0KKwl1bnNpZ25lZCBzaG9ydAlvcmdTaXplOw0KKw0KKwlfb3JnRGF0YQk9IGRhdGE7DQorCW9yZ1NpemUJCT0gKHVuc2lnbmVkIHNob3J0KV9vcmdEYXRhU2l6ZTsNCisJX2NvbXBTaXplCT0gKHVuc2lnbmVkIHNob3J0KV9jb21wRGF0YVNpemU7DQorCWRlY29tcEJ1Zgk9IF9kZWNvbXBCdWY7DQorDQorCV9iaXRCdWYgPSBfc3ViQml0QnVmID0gMDsNCisJX2JpdENvdW50ID0gMDsNCisJRmlsbEJ1ZihTSVpFX0JpdEJ1Zik7DQorCV9ibGtTaXplID0gMDsNCisJcmVtID0gMDsNCisJaSA9IDA7DQorDQorCXdoaWxlIChvcmdTaXplICE9IDApDQorCXsNCisJCWRpY0J1ZiA9IF9kaWNCdWY7DQorDQorCQluID0gKG9yZ1NpemUgPiBTSVpFX0RpYykgPyBTSVpFX0RpYyA6IG9yZ1NpemU7DQorDQorCQlyID0gMDsNCisJCXdoaWxlICgtLXJlbSA+PSAwKQ0KKwkJew0KKwkJCWRpY0J1ZltyXSA9IGRpY0J1ZltpXTsNCisJCQlpID0gKGkrMSkgJiAoU0laRV9EaWMtMSk7DQorCQkJaWYgKCsrciA9PSBuKQ0KKwkJCQlnb3RvIE5FWFQ7DQorCQl9DQorDQorCQl3aGlsZSgxKQ0KKwkJew0KKwkJCWMgPSBEZWNvZGVDKCk7DQorCQkJaWYgKGMgPD0gTUFYX0J5dGVOdW0pDQorCQkJew0KKwkJCQlkaWNCdWZbcl0gPSAodW5zaWduZWQgY2hhciljOw0KKwkJCQlpZiAoKytyID09IG4pDQorCQkJCQlnb3RvIE5FWFQ7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJlbSA9IGMgLSAoTUFYX0J5dGVOdW0rMS1USFJFU0hPTEQpOw0KKwkJCQlpID0gKHItRGVjb2RlUCgpLTEpICYgKFNJWkVfRGljLTEpOw0KKwkJCQl3aGlsZSAoLS1yZW0gPj0gMCkNCisJCQkJew0KKwkJCQkJZGljQnVmW3JdID0gZGljQnVmW2ldOw0KKwkJCQkJaSA9IChpKzEpICYgKFNJWkVfRGljLTEpOw0KKwkJCQkJaWYgKCsrciA9PSBuKQ0KKwkJCQkJCWdvdG8gTkVYVDsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCU5FWFQ6DQorDQorCQlmb3IgKHI9MDsgcjxuOyByKyspDQorCQkJKmRlY29tcEJ1ZisrID0gKmRpY0J1ZisrOw0KKw0KKwkJb3JnU2l6ZSAtPSBuOw0KKwl9DQorDQorLy8JRFNJX3ByaW50ZigwLCAiRGVjb21wIGVuZFxyXG4iKTsNCisNCisJcmV0dXJuIF9kZWNvbXBCdWY7DQorfSAvKiBEZWNvbXByZXNzICovDQorDQpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS91dGlsLmggYi9saWJ1cGdyYWRlL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk2ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXBncmFkZS91dGlsLmgKQEAgLTAsMCArMSw1MCBAQAorDQorI2lmbmRlZiBfVVRJTF9IXw0KKyNkZWZpbmUgX1VUSUxfSF8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBXb3JrZmlsZSAgIDogdXRpbC5oDQorICogUHJvamVjdCAgICA6IEtyYWtlbg0KKyAqIEF1dGhvciAgICAgOiBraHdvbw0KKyAqIERlc2NyaXB0aW9uOiBDb21tYW5kcyBUZW1wbGF0ZQ0KKyAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgSFVNQVggQ28uLCBMdGQuDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisjZGVmaW5lIF9fX19IRUFERVJfRklMRVNfX19fDQorDQorDQorI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyNkZWZpbmUgX19fX01BQ1JPX0RFRklOSVRJT05fX19fDQorDQorDQorI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyNkZWZpbmUgX19fX1RZUEVfREVGSU5JVElPTl9fX18NCisNCisNCisjZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorI2RlZmluZSBfX19fRVhURVJOQUxfVkFSSUFCTEVfREVGSU5JVElPTl9fX18NCisNCisNCisjZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorI2RlZmluZSBfX19fRVhURVJOQUxfRlVOQ1RJT05fREVGSU5JVElPTl9fX18NCit1bnNpZ25lZCBzaG9ydCBHZXRDUkMxNih1bnNpZ25lZCBjaGFyICpCdWZmZXJQdHIsIHVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlKTsNCit1bnNpZ25lZCBzaG9ydCBHZXRDUkMxNkZhc3Qodm9pZCAqaW5QLCB1bnNpZ25lZCBsb25nIE51bWJlck9mQnl0ZSk7DQordW5zaWduZWQgbG9uZyBHZXRDcmMzMih1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIG4pOw0KK3Vuc2lnbmVkIGxvbmcgR2V0Q1JDMzJGYXN0KHZvaWQgKmluUCwgdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGUpOw0KK3Vuc2lnbmVkIHNob3J0IEdldDEyQml0cyh1bnNpZ25lZCBjaGFyICogYmFzZSk7DQordW5zaWduZWQgc2hvcnQgR2V0MTZCaXRzKHVuc2lnbmVkIGNoYXIgKmJhc2UpOw0KK3Vuc2lnbmVkIGxvbmcgIEdldDI0Qml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKTsNCit1bnNpZ25lZCBsb25nIEdldDMyQml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKTsNCit1bnNpZ25lZCBzaG9ydCBTV0FQMTYodW5zaWduZWQgc2hvcnQgQSk7DQordW5zaWduZWQgaW50IFNXQVAzMih1bnNpZ25lZCBsb25nIEEpOw0KKw0KK3Vuc2lnbmVkIGNoYXIgKkRlY29tcHJlc3NEYXRhKHVuc2lnbmVkIGNoYXIgKmRhdGEpOw0KKw0KKy8vbG9uZyBhdG9sKGNvbnN0IGNoYXIgKmRlc3QpOw0KKy8vY2hhciB0b2xvd2VyKGNoYXIgYyk7DQorDQorI2VuZGlmIC8qIF9VVElMX0hfICovDQorDQorDQo=